From 12a5ddf456ba8549645a8cb28a8b4ed6197a14da Mon Sep 17 00:00:00 2001 From: Matthew Vogt Date: Mon, 30 Jan 2012 14:16:15 +1000 Subject: Import relevant source from Qt 4.8 Change-Id: I5078db4081d95290c54f39d3c0efc2fc2f62e6a6 --- tests/auto/declarative/declarative.pro | 85 + tests/auto/declarative/examples/data/dummytest.qml | 6 + .../examples/data/webbrowser/webbrowser.qml | 6 + tests/auto/declarative/examples/examples.pro | 21 + tests/auto/declarative/examples/tst_examples.cpp | 230 + .../declarative/moduleqt47/data/importqt47.qml | 80 + tests/auto/declarative/moduleqt47/moduleqt47.pro | 16 + .../auto/declarative/moduleqt47/tst_moduleqt47.cpp | 136 + .../auto/declarative/parserstress/parserstress.pro | 16 + .../declarative/parserstress/tst_parserstress.cpp | 165 + .../qdeclarativeanchors/data/anchors.qml | 162 + .../data/anchorsqgraphicswidget.qml | 162 + .../qdeclarativeanchors/data/centerin.qml | 12 + .../qdeclarativeanchors/data/crash1.qml | 11 + .../declarative/qdeclarativeanchors/data/fill.qml | 14 + .../qdeclarativeanchors/data/hvCenter.qml | 11 + .../declarative/qdeclarativeanchors/data/loop1.qml | 8 + .../declarative/qdeclarativeanchors/data/loop2.qml | 20 + .../qdeclarativeanchors/data/margins.qml | 13 + .../qdeclarativeanchors/qdeclarativeanchors.pro | 15 + .../tst_qdeclarativeanchors.cpp | 771 +++ .../qdeclarativeanimatedimage/data/colors.gif | Bin 0 -> 505 bytes .../qdeclarativeanimatedimage/data/colors.qml | 5 + .../qdeclarativeanimatedimage/data/hearts.gif | Bin 0 -> 6524 bytes .../qdeclarativeanimatedimage/data/hearts.qml | 6 + .../qdeclarativeanimatedimage/data/qmldir | 1 + .../qdeclarativeanimatedimage/data/qtbug-16520.qml | 17 + .../qdeclarativeanimatedimage/data/stickman.gif | Bin 0 -> 164923 bytes .../qdeclarativeanimatedimage/data/stickman.qml | 5 + .../data/stickmanerror1.qml | 6 + .../data/stickmanpause.qml | 7 + .../data/stickmanscaled.qml | 7 + .../data/stickmanstopped.qml | 6 + .../qdeclarativeanimatedimage.pro | 16 + .../tst_qdeclarativeanimatedimage.cpp | 387 ++ .../qdeclarativeanimations/data/Double.qml | 14 + .../qdeclarativeanimations/data/attached.qml | 34 + .../qdeclarativeanimations/data/badproperty1.qml | 21 + .../qdeclarativeanimations/data/badproperty2.qml | 21 + .../qdeclarativeanimations/data/badtype1.qml | 12 + .../qdeclarativeanimations/data/badtype2.qml | 12 + .../qdeclarativeanimations/data/badtype3.qml | 12 + .../qdeclarativeanimations/data/badtype4.qml | 27 + .../qdeclarativeanimations/data/dontAutoStart.qml | 18 + .../qdeclarativeanimations/data/dontStart.qml | 19 + .../qdeclarativeanimations/data/dontStart2.qml | 19 + .../qdeclarativeanimations/data/dotproperty.qml | 24 + .../data/doubleRegistrationBug.qml | 8 + .../qdeclarativeanimations/data/mixedtype1.qml | 25 + .../qdeclarativeanimations/data/mixedtype2.qml | 25 + .../data/nonTransitionBug.qml | 30 + .../qdeclarativeanimations/data/properties.qml | 14 + .../qdeclarativeanimations/data/properties2.qml | 14 + .../qdeclarativeanimations/data/properties3.qml | 14 + .../qdeclarativeanimations/data/properties4.qml | 14 + .../qdeclarativeanimations/data/properties5.qml | 14 + .../data/propertiesTransition.qml | 29 + .../data/propertiesTransition2.qml | 29 + .../data/propertiesTransition3.qml | 29 + .../data/propertiesTransition4.qml | 29 + .../data/propertiesTransition5.qml | 29 + .../data/propertiesTransition6.qml | 29 + .../data/propertiesTransition7.qml | 29 + .../data/registrationBug.qml | 18 + .../qdeclarativeanimations/data/rotation.qml | 48 + .../qdeclarativeanimations/data/runningTrueBug.qml | 30 + .../data/transitionAssignmentBug.qml | 12 + .../qdeclarativeanimations/data/valuesource.qml | 14 + .../qdeclarativeanimations/data/valuesource2.qml | 14 + .../qdeclarativeanimations.pro | 15 + .../tst_qdeclarativeanimations.cpp | 862 +++ .../qdeclarativeapplication.pro | 5 + .../tst_qdeclarativeapplication.cpp | 123 + .../qdeclarativebehaviors/data/binding.qml | 26 + .../qdeclarativebehaviors/data/color.qml | 24 + .../qdeclarativebehaviors/data/cpptrigger.qml | 11 + .../data/delayedRegistration.qml | 25 + .../qdeclarativebehaviors/data/disabled.qml | 27 + .../qdeclarativebehaviors/data/dontStart.qml | 18 + .../qdeclarativebehaviors/data/empty.qml | 23 + .../qdeclarativebehaviors/data/explicit.qml | 26 + .../qdeclarativebehaviors/data/groupProperty.qml | 23 + .../qdeclarativebehaviors/data/groupProperty2.qml | 23 + .../data/groupedPropertyCrash.qml | 10 + .../qdeclarativebehaviors/data/loop.qml | 19 + .../qdeclarativebehaviors/data/nonSelecting2.qml | 26 + .../qdeclarativebehaviors/data/parent.qml | 28 + .../qdeclarativebehaviors/data/qtbug12295.qml | 17 + .../data/reassignedAnimation.qml | 32 + .../qdeclarativebehaviors/data/runningTrue.qml | 20 + .../qdeclarativebehaviors/data/scripttrigger.qml | 16 + .../qdeclarativebehaviors/data/simple.qml | 26 + .../qdeclarativebehaviors/data/startup.qml | 17 + .../qdeclarativebehaviors/data/startup2.qml | 16 + .../qdeclarativebehaviors.pro | 15 + .../tst_qdeclarativebehaviors.cpp | 435 ++ .../qdeclarativebinding/data/deletedObject.qml | 24 + .../qdeclarativebinding/data/test-binding.qml | 16 + .../qdeclarativebinding/data/test-binding2.qml | 16 + .../qdeclarativebinding/qdeclarativebinding.pro | 16 + .../tst_qdeclarativebinding.cpp | 135 + .../data/colors-round-remote.sci | 7 + .../qdeclarativeborderimage/data/colors-round.sci | 7 + .../qdeclarativeborderimage/data/colors.png | Bin 0 -> 1655 bytes .../qdeclarativeborderimage/data/heart200.png | Bin 0 -> 7943 bytes .../qdeclarativeborderimage/data/invalid.sci | 7 + .../qdeclarativeborderimage.pro | 18 + .../tst_qdeclarativeborderimage.cpp | 426 ++ .../qdeclarativecomponent/data/createObject.qml | 16 + .../data/createObjectWithScript.qml | 43 + .../qdeclarativecomponent.pro | 13 + .../tst_qdeclarativecomponent.cpp | 173 + .../data/connection-targetchange.qml | 25 + .../data/connection-unknownsignals-ignored.qml | 8 + .../data/connection-unknownsignals-notarget.qml | 7 + .../data/connection-unknownsignals-parent.qml | 7 + .../data/connection-unknownsignals.qml | 7 + .../qdeclarativeconnection/data/error-object.qml | 7 + .../qdeclarativeconnection/data/error-property.qml | 5 + .../data/error-property2.qml | 5 + .../qdeclarativeconnection/data/error-syntax.qml | 9 + .../data/test-connection.qml | 10 + .../data/test-connection2.qml | 3 + .../data/test-connection3.qml | 3 + .../qdeclarativeconnection/data/trimming.qml | 10 + .../qdeclarativeconnection.pro | 16 + .../tst_qdeclarativeconnection.cpp | 234 + .../qdeclarativecontext/qdeclarativecontext.pro | 11 + .../tst_qdeclarativecontext.cpp | 468 ++ .../qdeclarativedebug/qdeclarativedebug.pro | 10 + .../qdeclarativedebug/tst_qdeclarativedebug.cpp | 1220 ++++ .../qdeclarativedebugclient.pro | 9 + .../tst_qdeclarativedebugclient.cpp | 154 + .../private_headers/qdeclarativedebughelper_p.h | 71 + .../qdeclarativedebughelper.pro | 5 + .../tst_qdeclarativedebughelper.cpp | 122 + .../declarative/qdeclarativedebugjs/app/app.pro | 13 + .../declarative/qdeclarativedebugjs/app/main.cpp | 69 + .../qdeclarativedebugjs/data/backtrace1.js | 28 + .../qdeclarativedebugjs/data/backtrace1.qml | 41 + .../qdeclarativedebugjs/qdeclarativedebugjs.pro | 4 + .../tst_qdeclarativedebugjs.cpp | 1443 +++++ .../tst_qdeclarativedebugjs.pro | 26 + .../qdeclarativedebugservice.pro | 10 + .../tst_qdeclarativedebugservice.cpp | 198 + .../qdeclarativedom/data/MyComponent.qml | 4 + .../declarative/qdeclarativedom/data/MyItem.qml | 4 + .../qdeclarativedom/data/import/Bar.qml | 2 + .../qdeclarativedom/data/importlib/sublib/Foo.qml | 2 + .../qdeclarativedom/data/importlib/sublib/qmldir | 2 + .../auto/declarative/qdeclarativedom/data/top.qml | 6 + .../qdeclarativedom/qdeclarativedom.pro | 16 + .../qdeclarativedom/tst_qdeclarativedom.cpp | 1326 +++++ .../data/AliasBindingsAssignCorrectlyType.qml | 9 + .../data/AliasBindingsOverrideTargetType.qml | 14 + .../data/AliasBindingsOverrideTargetType3.qml | 9 + .../data/ConstantsOverrideBindings.qml | 12 + .../qdeclarativeecmascript/data/CustomObject.qml | 5 + .../qdeclarativeecmascript/data/MethodsObject.qml | 6 + .../data/NestedTypeTransientErrors.qml | 11 + .../qdeclarativeecmascript/data/ScopeObject.qml | 12 + .../data/SpuriousWarning.qml | 5 + .../data/TypeForDynamicCreation.qml | 2 + .../data/aliasBindingsAssignCorrectly.qml | 59 + .../data/aliasBindingsOverrideTarget.2.qml | 29 + .../data/aliasBindingsOverrideTarget.3.qml | 24 + .../data/aliasBindingsOverrideTarget.qml | 28 + .../data/aliasPropertyAndBinding.qml | 14 + .../data/aliasWritesOverrideBindings.2.qml | 29 + .../data/aliasWritesOverrideBindings.3.qml | 23 + .../data/aliasWritesOverrideBindings.qml | 23 + .../data/assignBasicTypes.2.qml | 26 + .../data/assignBasicTypes.qml | 29 + .../data/attachedProperty.2.qml | 22 + .../data/attachedProperty.qml | 11 + .../data/attachedPropertyScope.qml | 9 + .../qdeclarativeecmascript/data/bindingLoop.qml | 14 + .../qdeclarativeecmascript/data/blank.js | 0 .../data/boolPropertiesEvaluateAsBool.1.qml | 5 + .../data/boolPropertiesEvaluateAsBool.2.qml | 5 + .../qdeclarativeecmascript/data/bug.1.qml | 10 + .../data/canAssignNullToQObject.1.qml | 9 + .../data/canAssignNullToQObject.2.qml | 11 + .../qdeclarativeecmascript/data/compiled.qml | 48 + .../data/compositePropertyType.qml | 8 + .../data/constantsOverrideBindings.1.qml | 8 + .../data/constantsOverrideBindings.2.qml | 11 + .../data/constantsOverrideBindings.3.qml | 7 + .../data/constantsOverrideBindings.4.qml | 11 + .../data/declarativeToString.qml | 11 + .../data/deferredProperties.qml | 10 + .../data/deferredPropertiesErrors.qml | 10 + .../qdeclarativeecmascript/data/deleteLater.qml | 14 + .../qdeclarativeecmascript/data/deletedEngine.qml | 11 + .../qdeclarativeecmascript/data/deletedObject.qml | 25 + .../data/dynamicCreation.helper.qml | 6 + .../data/dynamicCreation.qml | 27 + .../data/dynamicDeletion.qml | 20 + .../qdeclarativeecmascript/data/enums.1.qml | 20 + .../qdeclarativeecmascript/data/enums.2.qml | 8 + .../qdeclarativeecmascript/data/eval.qml | 27 + .../qdeclarativeecmascript/data/exception.js | 1 + .../data/exceptionClearsOnReeval.qml | 6 + .../data/exceptionProducesWarning.qml | 8 + .../data/exceptionProducesWarning2.qml | 7 + .../data/extendedObjectPropertyLookup.qml | 8 + .../data/extensionObjects.qml | 19 + .../data/extensionObjectsPropertyOverride.qml | 7 + .../qdeclarativeecmascript/data/function.qml | 23 + .../data/functionAssignment.1.qml | 5 + .../data/functionAssignment.2.qml | 73 + .../data/functionAssignment.js | 17 + .../qdeclarativeecmascript/data/functionErrors.qml | 10 + .../data/idShortcutInvalidates.1.qml | 13 + .../data/idShortcutInvalidates.qml | 12 + .../declarative/qdeclarativeecmascript/data/in.qml | 7 + .../qdeclarativeecmascript/data/include.js | 8 + .../qdeclarativeecmascript/data/include.qml | 23 + .../data/include_callback.js | 11 + .../data/include_callback.qml | 15 + .../qdeclarativeecmascript/data/include_pragma.qml | 11 + .../data/include_pragma_inner.js | 5 + .../data/include_pragma_outer.js | 6 + .../qdeclarativeecmascript/data/include_remote.js | 26 + .../qdeclarativeecmascript/data/include_remote.qml | 21 + .../data/include_remote_missing.js | 13 + .../data/include_remote_missing.qml | 12 + .../qdeclarativeecmascript/data/include_shared.js | 12 + .../qdeclarativeecmascript/data/include_shared.qml | 22 + .../data/invokableObjectArg.qml | 9 + .../data/invokableObjectRet.qml | 11 + .../qdeclarativeecmascript/data/js/include2.js | 4 + .../qdeclarativeecmascript/data/js/include3.js | 3 + .../qdeclarativeecmascript/data/jsObject.qml | 12 + .../data/libraryScriptAssert.js | 6 + .../data/libraryScriptAssert.qml | 7 + .../qdeclarativeecmascript/data/listProperties.qml | 24 + .../qdeclarativeecmascript/data/listToVariant.qml | 5 + .../data/metaobjectRevision.qml | 7 + .../data/metaobjectRevision2.qml | 9 + .../data/metaobjectRevision3.qml | 8 + .../data/metaobjectRevision4.qml | 14 + .../data/metaobjectRevisionErrors.qml | 14 + .../data/metaobjectRevisionErrors2.qml | 24 + .../data/metaobjectRevisionErrors3.qml | 36 + .../qdeclarativeecmascript/data/methods.1.qml | 6 + .../qdeclarativeecmascript/data/methods.2.qml | 6 + .../qdeclarativeecmascript/data/methods.3.qml | 7 + .../qdeclarativeecmascript/data/methods.4.qml | 11 + .../qdeclarativeecmascript/data/methods.5.qml | 9 + .../data/multiEngineObject.qml | 5 + .../data/noSpuriousWarningsAtShutdown.2.qml | 10 + .../data/noSpuriousWarningsAtShutdown.qml | 9 + .../data/nonExistentAttachedObject.qml | 5 + .../qdeclarativeecmascript/data/nonscriptable.qml | 19 + .../data/nullObjectBinding.qml | 8 + .../data/numberAssignment.qml | 18 + .../qdeclarativeecmascript/data/objectName.qml | 8 + .../data/objectsCompareAsEqual.qml | 15 + .../data/outerBindingOverridesInnerBinding.qml | 15 + .../qdeclarativeecmascript/data/ownership.qml | 5 + .../data/propertyAssignmentErrors.qml | 22 + .../data/propertySplicing.qml | 10 + .../data/qlistqobjectMethods.qml | 6 + .../qdeclarativeecmascript/data/qtbug_10696.qml | 26 + .../qdeclarativeecmascript/data/qtbug_11600.js | 1 + .../qdeclarativeecmascript/data/qtbug_11600.qml | 8 + .../qdeclarativeecmascript/data/qtbug_11606.qml | 12 + .../qdeclarativeecmascript/data/qtbug_20648.qml | 7 + .../qdeclarativeecmascript/data/qtbug_9792.qml | 5 + .../data/qtcreatorbug_1289.qml | 13 + .../qdeclarativeecmascript/data/realToInt.qml | 11 + .../qdeclarativeecmascript/data/regExp.qml | 7 + .../qdeclarativeecmascript/data/remote_file.js | 2 + .../qdeclarativeecmascript/data/scope.2.qml | 40 + .../qdeclarativeecmascript/data/scope.3.qml | 13 + .../qdeclarativeecmascript/data/scope.4.qml | 12 + .../qdeclarativeecmascript/data/scope.qml | 44 + .../qdeclarativeecmascript/data/scriptConnect.1.js | 4 + .../data/scriptConnect.1.qml | 10 + .../qdeclarativeecmascript/data/scriptConnect.2.js | 5 + .../data/scriptConnect.2.qml | 16 + .../data/scriptConnect.3.qml | 15 + .../data/scriptConnect.4.qml | 12 + .../data/scriptConnect.5.qml | 11 + .../qdeclarativeecmascript/data/scriptConnect.6.js | 3 + .../data/scriptConnect.6.qml | 15 + .../data/scriptDisconnect.1.js | 6 + .../data/scriptDisconnect.1.qml | 13 + .../data/scriptDisconnect.2.qml | 14 + .../data/scriptDisconnect.3.qml | 14 + .../data/scriptDisconnect.4.qml | 13 + .../qdeclarativeecmascript/data/scriptErrors.js | 4 + .../qdeclarativeecmascript/data/scriptErrors.qml | 15 + .../data/selfDeletingBinding.2.qml | 17 + .../data/selfDeletingBinding.qml | 18 + .../data/sharedAttachedObject.qml | 16 + .../qdeclarativeecmascript/data/shutdownErrors.qml | 13 + .../data/signalAssignment.1.qml | 5 + .../data/signalAssignment.2.qml | 5 + .../data/signalParameterTypes.qml | 18 + .../data/signalTriggeredBindings.qml | 20 + .../data/signalWithUnknownTypes.qml | 5 + .../qdeclarativeecmascript/data/strictlyEquals.qml | 17 + .../data/transientErrors.2.qml | 14 + .../data/transientErrors.qml | 10 + .../data/undefinedResetsProperty.2.qml | 10 + .../data/undefinedResetsProperty.qml | 7 + .../data/valueTypeFunctions.qml | 6 + .../data/variantsAssignedUndefined.qml | 9 + .../data/writeAttachedProperty.qml | 6 + .../data/writeRemovesBinding.qml | 46 + .../qdeclarativeecmascript.pro | 24 + .../qdeclarativeecmascript/testtypes.cpp | 134 + .../declarative/qdeclarativeecmascript/testtypes.h | 915 +++ .../tst_qdeclarativeecmascript.cpp | 3105 ++++++++++ .../qdeclarativeengine/qdeclarativeengine.pro | 12 + .../qdeclarativeengine/tst_qdeclarativeengine.cpp | 333 ++ .../qdeclarativeerror/qdeclarativeerror.pro | 12 + tests/auto/declarative/qdeclarativeerror/test.txt | 3 + .../qdeclarativeerror/tst_qdeclarativeerror.cpp | 247 + .../qdeclarativeflickable/data/disabledcontent.qml | 8 + .../qdeclarativeflickable/data/flickable01.qml | 4 + .../qdeclarativeflickable/data/flickable02.qml | 14 + .../qdeclarativeflickable/data/flickable03.qml | 14 + .../qdeclarativeflickable/data/flickable04.qml | 22 + .../data/flickableqgraphicswidget.qml | 7 + .../data/nestedPressDelay.qml | 33 + .../qdeclarativeflickable/data/resize.qml | 27 + .../qdeclarativeflickable/data/wheel.qml | 21 + .../qdeclarativeflickable.pro | 16 + .../tst_qdeclarativeflickable.cpp | 554 ++ .../qdeclarativeflipable/data/crash.qml | 9 + .../qdeclarativeflipable/data/flipable-abort.qml | 10 + .../qdeclarativeflipable/data/test-flipable.qml | 9 + .../qdeclarativeflipable/qdeclarativeflipable.pro | 16 + .../tst_qdeclarativeflipable.cpp | 143 + .../qdeclarativefocusscope/data/chain.qml | 28 + .../data/forceActiveFocus.qml | 26 + .../qdeclarativefocusscope/data/forcefocus.qml | 81 + .../qdeclarativefocusscope/data/qtBug13380.qml | 24 + .../qdeclarativefocusscope/data/signalEmission.qml | 33 + .../qdeclarativefocusscope/data/test.qml | 77 + .../qdeclarativefocusscope/data/test2.qml | 39 + .../qdeclarativefocusscope/data/test3.qml | 52 + .../qdeclarativefocusscope/data/test4.qml | 76 + .../qdeclarativefocusscope/data/test5.qml | 84 + .../qdeclarativefocusscope.pro | 13 + .../tst_qdeclarativefocusscope.cpp | 546 ++ .../qdeclarativefolderlistmodel/data/basic.qml | 5 + .../qdeclarativefolderlistmodel/data/dummy.qml | 1 + .../qdeclarativefolderlistmodel.pro | 15 + .../tst_qdeclarativefolderlistmodel.cpp | 152 + .../qdeclarativefontloader/data/daniel.ttf | Bin 0 -> 51984 bytes .../qdeclarativefontloader/data/dummy.ttf | 0 .../qdeclarativefontloader/data/tarzeau_ocr_a.ttf | Bin 0 -> 24544 bytes .../qdeclarativefontloader.pro | 17 + .../tst_qdeclarativefontloader.cpp | 230 + .../qdeclarativegridview/data/attachedSignals.qml | 27 + .../qdeclarativegridview/data/displaygrid.qml | 39 + .../qdeclarativegridview/data/footer.qml | 40 + .../data/gridview-enforcerange.qml | 58 + .../data/gridview-initCurrent.qml | 52 + .../data/gridview-noCurrent.qml | 52 + .../qdeclarativegridview/data/gridview1.qml | 66 + .../qdeclarativegridview/data/gridview2.qml | 26 + .../qdeclarativegridview/data/gridview3.qml | 6 + .../qdeclarativegridview/data/header.qml | 40 + .../qdeclarativegridview/data/manual-highlight.qml | 48 + .../qdeclarativegridview/data/mirroring.qml | 43 + .../data/propertychangestest.qml | 69 + .../qdeclarativegridview/data/setindex.qml | 29 + .../qdeclarativegridview/qdeclarativegridview.pro | 16 + .../tst_qdeclarativegridview.cpp | 2213 +++++++ .../qdeclarativeimage/data/aspectratio.qml | 10 + .../declarative/qdeclarativeimage/data/big.jpeg | Bin 0 -> 1700081 bytes .../declarative/qdeclarativeimage/data/big256.png | Bin 0 -> 3566 bytes .../declarative/qdeclarativeimage/data/colors.png | Bin 0 -> 1655 bytes .../declarative/qdeclarativeimage/data/colors1.png | Bin 0 -> 1655 bytes .../declarative/qdeclarativeimage/data/green.png | Bin 0 -> 314 bytes .../qdeclarativeimage/data/heart-win32.png | Bin 0 -> 12621 bytes .../declarative/qdeclarativeimage/data/heart.png | Bin 0 -> 12577 bytes .../declarative/qdeclarativeimage/data/heart.svg | 55 + .../qdeclarativeimage/data/heart200-win32.png | Bin 0 -> 8062 bytes .../qdeclarativeimage/data/heart200.png | Bin 0 -> 8063 bytes .../qdeclarativeimage/data/qtbug_16389.qml | 30 + .../qdeclarativeimage/data/qtbug_22125.qml | 44 + .../declarative/qdeclarativeimage/data/rect.png | Bin 0 -> 171 bytes .../declarative/qdeclarativeimage/data/tiling.qml | 16 + .../qdeclarativeimage/qdeclarativeimage.pro | 18 + .../qdeclarativeimage/tst_qdeclarativeimage.cpp | 839 +++ .../qdeclarativeimageprovider.pro | 16 + .../tst_qdeclarativeimageprovider.cpp | 432 ++ .../qdeclarativeinfo/data/NestedObject.qml | 8 + .../qdeclarativeinfo/data/nestedQmlObject.qml | 8 + .../qdeclarativeinfo/data/qmlObject.qml | 8 + .../qdeclarativeinfo/qdeclarativeinfo.pro | 16 + .../qdeclarativeinfo/tst_qdeclarativeinfo.cpp | 208 + .../qdeclarativeinstruction.pro | 11 + .../tst_qdeclarativeinstruction.cpp | 609 ++ .../qdeclarativeitem/data/childrenProperty.qml | 14 + .../qdeclarativeitem/data/childrenRect.qml | 27 + .../qdeclarativeitem/data/childrenRectBug.qml | 23 + .../qdeclarativeitem/data/childrenRectBug2.qml | 53 + .../qdeclarativeitem/data/childrenRectBug3.qml | 15 + .../qdeclarativeitem/data/implicitsize.qml | 19 + .../qdeclarativeitem/data/keynavigationtest.qml | 87 + .../qdeclarativeitem/data/keyspriority.qml | 9 + .../declarative/qdeclarativeitem/data/keystest.qml | 24 + .../qdeclarativeitem/data/layoutmirroring.qml | 54 + .../qdeclarativeitem/data/mapCoordinates.qml | 43 + .../qdeclarativeitem/data/mouseFocus.qml | 20 + .../qdeclarativeitem/data/propertychanges.qml | 10 + .../qdeclarativeitem/data/qtbug_16871.qml | 5 + .../qdeclarativeitem/data/resourcesProperty.qml | 21 + .../qdeclarativeitem/data/transformCrash.qml | 13 + .../qdeclarativeitem/qdeclarativeitem.pro | 16 + .../qdeclarativeitem/tst_qdeclarativeitem.cpp | 1256 ++++ .../qdeclarativelanguage/data/Alias.qml | 8 + .../qdeclarativelanguage/data/Alias2.qml | 9 + .../qdeclarativelanguage/data/Alias3.qml | 12 + .../qdeclarativelanguage/data/Alias4.qml | 5 + .../data/AliasPropertyChangeSignalsType.qml | 20 + .../data/ComponentComposite.qml | 5 + .../qdeclarativelanguage/data/CompositeType.qml | 4 + .../qdeclarativelanguage/data/CompositeType2.qml | 5 + .../qdeclarativelanguage/data/CompositeType3.qml | 5 + .../qdeclarativelanguage/data/CompositeType4.qml | 6 + .../data/DontDoubleCallClassBeginItem.qml | 4 + .../data/DynamicPropertiesNestedType.qml | 6 + .../qdeclarativelanguage/data/HelperAlias.qml | 9 + .../declarative/qdeclarativelanguage/data/I18n.qml | 6 + .../qdeclarativelanguage/data/I18nType30.qml | 5 + .../data/InlineAssignmentsOverrideBindingsType.qml | 7 + .../InlineAssignmentsOverrideBindingsType2.qml | 5 + .../qdeclarativelanguage/data/LocalLast.qml | 2 + .../qdeclarativelanguage/data/MyComponent.qml | 6 + .../data/MyCompositeValueSource.qml | 6 + .../data/MyContainerComponent.qml | 5 + .../qdeclarativelanguage/data/NestedAlias.qml | 14 + .../data/NestedComponentRoot.qml | 6 + .../qdeclarativelanguage/data/NestedErrorsType.qml | 5 + .../qdeclarativelanguage/data/OnCompletedType.qml | 8 + .../data/OnDestructionType.qml | 8 + .../qdeclarativelanguage/data/alias.1.qml | 8 + .../qdeclarativelanguage/data/alias.10.qml | 8 + .../qdeclarativelanguage/data/alias.11.qml | 8 + .../qdeclarativelanguage/data/alias.2.qml | 8 + .../qdeclarativelanguage/data/alias.3.qml | 10 + .../qdeclarativelanguage/data/alias.4.qml | 6 + .../qdeclarativelanguage/data/alias.5.qml | 13 + .../qdeclarativelanguage/data/alias.6.qml | 8 + .../qdeclarativelanguage/data/alias.7.qml | 14 + .../qdeclarativelanguage/data/alias.8.qml | 9 + .../qdeclarativelanguage/data/alias.9.qml | 9 + .../data/aliasPropertiesAndSignals.qml | 14 + .../data/aliasPropertyChangeSignals.2.qml | 10 + .../data/aliasPropertyChangeSignals.qml | 16 + .../data/allowedRevisionOverloads.qml | 6 + .../qdeclarativelanguage/data/assignBasicTypes.qml | 27 + .../data/assignCompositeToType.qml | 18 + .../data/assignLiteralSignalProperty.qml | 4 + .../data/assignLiteralToVariant.qml | 16 + .../data/assignObjectToSignal.qml | 4 + .../data/assignObjectToVariant.qml | 7 + .../data/assignQmlComponent.qml | 4 + .../qdeclarativelanguage/data/assignSignal.qml | 5 + .../data/assignToNamespace.errors.txt | 1 + .../data/assignToNamespace.qml | 5 + .../data/assignTypeExtremes.qml | 5 + .../data/assignValueToSignal.errors.txt | 1 + .../data/assignValueToSignal.qml | 6 + .../data/attachedProperties.qml | 8 + .../data/autoComponentCreation.qml | 4 + .../data/autoNotifyConnection.qml | 6 + .../data/component.1.errors.txt | 1 + .../qdeclarativelanguage/data/component.1.qml | 4 + .../data/component.2.errors.txt | 1 + .../qdeclarativelanguage/data/component.2.qml | 9 + .../data/component.3.errors.txt | 1 + .../qdeclarativelanguage/data/component.3.qml | 9 + .../data/component.4.errors.txt | 1 + .../qdeclarativelanguage/data/component.4.qml | 6 + .../data/component.5.errors.txt | 1 + .../qdeclarativelanguage/data/component.5.qml | 6 + .../data/component.6.errors.txt | 1 + .../qdeclarativelanguage/data/component.6.qml | 6 + .../data/component.7.errors.txt | 1 + .../qdeclarativelanguage/data/component.7.qml | 7 + .../data/component.8.errors.txt | 1 + .../qdeclarativelanguage/data/component.8.qml | 7 + .../data/component.9.errors.txt | 1 + .../qdeclarativelanguage/data/component.9.qml | 7 + .../data/componentCompositeType.qml | 8 + .../qdeclarativelanguage/data/cppnamespace.2.qml | 5 + .../qdeclarativelanguage/data/cppnamespace.qml | 4 + .../qdeclarativelanguage/data/crash2.qml | 5 + .../qdeclarativelanguage/data/customOnProperty.qml | 7 + .../data/customParserIdNotAllowed.errors.txt | 1 + .../data/customParserIdNotAllowed.qml | 5 + .../data/customParserTypes.qml | 5 + .../data/customVariantTypes.qml | 4 + .../data/declaredPropertyValues.qml | 8 + .../data/defaultGrouped.errors.txt | 1 + .../qdeclarativelanguage/data/defaultGrouped.qml | 10 + .../data/defaultPropertyListOrder.qml | 29 + .../data/destroyedSignal.errors.txt | 1 + .../qdeclarativelanguage/data/destroyedSignal.qml | 5 + .../data/disallowedRevisionOverloads.errors.txt | 1 + .../data/disallowedRevisionOverloads.qml | 7 + .../data/dontDoubleCallClassBegin.qml | 5 + .../data/doubleSignal.errors.txt | 1 + .../qdeclarativelanguage/data/doubleSignal.qml | 7 + .../data/duplicateIDs.errors.txt | 1 + .../qdeclarativelanguage/data/duplicateIDs.qml | 6 + .../data/dynamicMeta.1.errors.txt | 1 + .../qdeclarativelanguage/data/dynamicMeta.1.qml | 6 + .../data/dynamicMeta.2.errors.txt | 1 + .../qdeclarativelanguage/data/dynamicMeta.2.qml | 6 + .../data/dynamicMeta.3.errors.txt | 1 + .../qdeclarativelanguage/data/dynamicMeta.3.qml | 6 + .../data/dynamicMeta.4.errors.txt | 1 + .../qdeclarativelanguage/data/dynamicMeta.4.qml | 6 + .../data/dynamicMeta.5.errors.txt | 1 + .../qdeclarativelanguage/data/dynamicMeta.5.qml | 5 + .../qdeclarativelanguage/data/dynamicObject.1.qml | 8 + .../data/dynamicObjectProperties.2.qml | 11 + .../data/dynamicObjectProperties.qml | 13 + .../data/dynamicProperties.qml | 13 + .../data/dynamicPropertiesNested.qml | 9 + .../data/dynamicSignalsAndSlots.qml | 10 + .../qdeclarativelanguage/data/empty.errors.txt | 2 + .../qdeclarativelanguage/data/empty.qml | 0 .../data/emptySignal.errors.txt | 1 + .../qdeclarativelanguage/data/emptySignal.qml | 7 + .../qdeclarativelanguage/data/enumTypes.errors.txt | 1 + .../qdeclarativelanguage/data/enumTypes.qml | 4 + .../data/failingComponent.errors.txt | 1 + .../data/failingComponentTest.qml | 4 + .../data/fakeDotProperty.errors.txt | 1 + .../qdeclarativelanguage/data/fakeDotProperty.qml | 4 + .../data/finalOverride.errors.txt | 1 + .../qdeclarativelanguage/data/finalOverride.qml | 4 + .../data/i18nDeclaredPropertyNames.qml | 6 + .../data/i18nDeclaredPropertyUse.qml | 3 + .../qdeclarativelanguage/data/i18nNameSpace.qml | 5 + .../qdeclarativelanguage/data/i18nScript.qml | 9 + .../qdeclarativelanguage/data/i18nStrings.qml | 5 + .../qdeclarativelanguage/data/i18nType.qml | 1 + .../qdeclarativelanguage/data/idProperty.qml | 8 + .../data/importFile.errors.txt | 1 + .../qdeclarativelanguage/data/importFile.qml | 3 + .../data/importIncorrectCase.qml | 5 + .../data/importNamespaceConflict.errors.txt | 1 + .../data/importNamespaceConflict.qml | 4 + .../data/importNewerVersion.errors.txt | 1 + .../data/importNewerVersion.qml | 3 + .../data/importNonExist.errors.txt | 1 + .../qdeclarativelanguage/data/importNonExist.qml | 5 + .../data/importNonExistOlder.errors.txt | 1 + .../data/importNonExistOlder.qml | 3 + .../data/importVersionMissingBuiltIn.errors.txt | 1 + .../data/importVersionMissingBuiltIn.qml | 7 + .../data/importVersionMissingInstalled.errors.txt | 1 + .../data/importVersionMissingInstalled.qml | 3 + .../data/importscript.1.errors.txt | 1 + .../qdeclarativelanguage/data/importscript.1.qml | 3 + .../data/incorrectCase.errors.insensitive.txt | 2 + .../data/incorrectCase.errors.sensitive.txt | 1 + .../qdeclarativelanguage/data/incorrectCase.qml | 4 + .../data/incorrectCaseType.qml | 4 + .../data/inlineAssignmentsOverrideBindings.qml | 6 + .../data/inlineQmlComponents.qml | 10 + .../data/insertedSemicolon.1.errors.txt | 1 + .../data/insertedSemicolon.1.qml | 10 + .../data/interfaceProperty.qml | 5 + .../qdeclarativelanguage/data/interfaceQList.qml | 7 + .../data/invalidAlias.1.errors.txt | 1 + .../qdeclarativelanguage/data/invalidAlias.1.qml | 5 + .../data/invalidAlias.10.errors.txt | 1 + .../qdeclarativelanguage/data/invalidAlias.10.qml | 6 + .../data/invalidAlias.2.errors.txt | 1 + .../qdeclarativelanguage/data/invalidAlias.2.qml | 6 + .../data/invalidAlias.3.errors.txt | 1 + .../qdeclarativelanguage/data/invalidAlias.3.qml | 6 + .../data/invalidAlias.4.errors.txt | 1 + .../qdeclarativelanguage/data/invalidAlias.4.qml | 7 + .../data/invalidAlias.5.errors.txt | 1 + .../qdeclarativelanguage/data/invalidAlias.5.qml | 7 + .../data/invalidAlias.6.errors.txt | 1 + .../qdeclarativelanguage/data/invalidAlias.6.qml | 7 + .../data/invalidAlias.7.errors.txt | 1 + .../qdeclarativelanguage/data/invalidAlias.7.qml | 6 + .../data/invalidAlias.8.errors.txt | 1 + .../qdeclarativelanguage/data/invalidAlias.8.qml | 7 + .../data/invalidAlias.9.errors.txt | 1 + .../qdeclarativelanguage/data/invalidAlias.9.qml | 6 + .../data/invalidAttachedProperty.1.errors.txt | 1 + .../data/invalidAttachedProperty.1.qml | 7 + .../data/invalidAttachedProperty.10.errors.txt | 1 + .../data/invalidAttachedProperty.10.qml | 6 + .../data/invalidAttachedProperty.11.errors.txt | 1 + .../data/invalidAttachedProperty.11.qml | 7 + .../data/invalidAttachedProperty.12.errors.txt | 1 + .../data/invalidAttachedProperty.12.qml | 6 + .../data/invalidAttachedProperty.13.errors.txt | 1 + .../data/invalidAttachedProperty.13.qml | 8 + .../data/invalidAttachedProperty.2.errors.txt | 1 + .../data/invalidAttachedProperty.2.qml | 6 + .../data/invalidAttachedProperty.3.errors.txt | 1 + .../data/invalidAttachedProperty.3.qml | 8 + .../data/invalidAttachedProperty.4.errors.txt | 1 + .../data/invalidAttachedProperty.4.qml | 7 + .../data/invalidAttachedProperty.5.errors.txt | 1 + .../data/invalidAttachedProperty.5.qml | 7 + .../data/invalidAttachedProperty.6.errors.txt | 1 + .../data/invalidAttachedProperty.6.qml | 7 + .../data/invalidAttachedProperty.7.errors.txt | 1 + .../data/invalidAttachedProperty.7.qml | 6 + .../data/invalidAttachedProperty.8.errors.txt | 1 + .../data/invalidAttachedProperty.8.qml | 6 + .../data/invalidAttachedProperty.9.errors.txt | 1 + .../data/invalidAttachedProperty.9.qml | 7 + .../data/invalidGroupedProperty.1.errors.txt | 1 + .../data/invalidGroupedProperty.1.qml | 6 + .../data/invalidGroupedProperty.10.errors.txt | 1 + .../data/invalidGroupedProperty.10.qml | 7 + .../data/invalidGroupedProperty.2.errors.txt | 1 + .../data/invalidGroupedProperty.2.qml | 7 + .../data/invalidGroupedProperty.3.errors.txt | 1 + .../data/invalidGroupedProperty.3.qml | 5 + .../data/invalidGroupedProperty.4.errors.txt | 1 + .../data/invalidGroupedProperty.4.qml | 5 + .../data/invalidGroupedProperty.5.errors.txt | 1 + .../data/invalidGroupedProperty.5.qml | 5 + .../data/invalidGroupedProperty.6.errors.txt | 1 + .../data/invalidGroupedProperty.6.qml | 6 + .../data/invalidGroupedProperty.7.errors.txt | 1 + .../data/invalidGroupedProperty.7.qml | 5 + .../data/invalidGroupedProperty.8.errors.txt | 1 + .../data/invalidGroupedProperty.8.qml | 6 + .../data/invalidGroupedProperty.9.errors.txt | 1 + .../data/invalidGroupedProperty.9.qml | 6 + .../data/invalidID.2.errors.txt | 2 + .../qdeclarativelanguage/data/invalidID.2.qml | 5 + .../data/invalidID.3.errors.txt | 1 + .../qdeclarativelanguage/data/invalidID.3.qml | 5 + .../data/invalidID.4.errors.txt | 1 + .../qdeclarativelanguage/data/invalidID.4.qml | 6 + .../data/invalidID.5.errors.txt | 1 + .../qdeclarativelanguage/data/invalidID.5.qml | 6 + .../data/invalidID.6.errors.txt | 1 + .../qdeclarativelanguage/data/invalidID.6.qml | 5 + .../data/invalidID.7.errors.txt | 1 + .../qdeclarativelanguage/data/invalidID.7.qml | 5 + .../data/invalidID.8.errors.txt | 1 + .../qdeclarativelanguage/data/invalidID.8.qml | 5 + .../data/invalidID.9.errors.txt | 1 + .../qdeclarativelanguage/data/invalidID.9.qml | 5 + .../qdeclarativelanguage/data/invalidID.errors.txt | 1 + .../qdeclarativelanguage/data/invalidID.qml | 4 + .../data/invalidImportID.errors.txt | 1 + .../qdeclarativelanguage/data/invalidImportID.qml | 4 + .../qdeclarativelanguage/data/invalidOn.errors.txt | 1 + .../qdeclarativelanguage/data/invalidOn.qml | 4 + .../data/invalidProperty.errors.txt | 1 + .../qdeclarativelanguage/data/invalidProperty.qml | 5 + .../data/invalidRoot.errors.txt | 1 + .../qdeclarativelanguage/data/invalidRoot.qml | 2 + .../lib/com/nokia/installedtest/InstalledTest.qml | 2 + .../lib/com/nokia/installedtest/InstalledTest2.qml | 2 + .../data/lib/com/nokia/installedtest/LocalLast.qml | 2 + .../lib/com/nokia/installedtest/PrivateType.qml | 2 + .../data/lib/com/nokia/installedtest/qmldir | 4 + .../lib/com/nokia/installedtest0/InstalledTest.qml | 2 + .../com/nokia/installedtest0/InstalledTest2.qml | 2 + .../data/lib/com/nokia/installedtest0/qmldir | 2 + .../data/listAssignment.1.errors.txt | 1 + .../qdeclarativelanguage/data/listAssignment.1.qml | 6 + .../data/listAssignment.2.errors.txt | 2 + .../qdeclarativelanguage/data/listAssignment.2.qml | 4 + .../data/listAssignment.3.errors.txt | 1 + .../qdeclarativelanguage/data/listAssignment.3.qml | 6 + .../data/listItemDeleteSelf.qml | 38 + .../qdeclarativelanguage/data/listProperties.qml | 9 + .../data/metaobjectRevision.1.errors.txt | 1 + .../data/metaobjectRevision.1.qml | 9 + .../data/metaobjectRevision.2.errors.txt | 1 + .../data/metaobjectRevision.2.qml | 7 + .../data/metaobjectRevision.3.errors.txt | 1 + .../data/metaobjectRevision.3.qml | 10 + .../qdeclarativelanguage/data/method.1.errors.txt | 1 + .../qdeclarativelanguage/data/method.1.qml | 5 + .../data/missingObject.errors.txt | 1 + .../qdeclarativelanguage/data/missingObject.qml | 1 + .../data/missingSignal.errors.txt | 1 + .../qdeclarativelanguage/data/missingSignal.qml | 5 + .../data/missingValueTypeProperty.errors.txt | 1 + .../data/missingValueTypeProperty.qml | 5 + .../data/multiSet.1.errors.txt | 1 + .../qdeclarativelanguage/data/multiSet.1.qml | 7 + .../data/multiSet.10.errors.txt | 1 + .../qdeclarativelanguage/data/multiSet.10.qml | 6 + .../data/multiSet.11.errors.txt | 1 + .../qdeclarativelanguage/data/multiSet.11.qml | 6 + .../data/multiSet.2.errors.txt | 1 + .../qdeclarativelanguage/data/multiSet.2.qml | 7 + .../data/multiSet.3.errors.txt | 1 + .../qdeclarativelanguage/data/multiSet.3.qml | 7 + .../data/multiSet.4.errors.txt | 1 + .../qdeclarativelanguage/data/multiSet.4.qml | 7 + .../data/multiSet.5.errors.txt | 1 + .../qdeclarativelanguage/data/multiSet.5.qml | 6 + .../data/multiSet.6.errors.txt | 1 + .../qdeclarativelanguage/data/multiSet.6.qml | 7 + .../data/multiSet.7.errors.txt | 1 + .../qdeclarativelanguage/data/multiSet.7.qml | 7 + .../data/multiSet.8.errors.txt | 1 + .../qdeclarativelanguage/data/multiSet.8.qml | 8 + .../data/multiSet.9.errors.txt | 1 + .../qdeclarativelanguage/data/multiSet.9.qml | 6 + .../data/nestedComponentRoots.qml | 4 + .../data/nestedErrors.errors.txt | 2 + .../qdeclarativelanguage/data/nestedErrors.qml | 6 + .../data/noCreation.errors.txt | 1 + .../qdeclarativelanguage/data/noCreation.qml | 4 + .../data/nonScriptableProperty.errors.txt | 1 + .../data/nonScriptableProperty.qml | 5 + .../data/nonexistantProperty.1.errors.txt | 1 + .../data/nonexistantProperty.1.qml | 2 + .../data/nonexistantProperty.2.errors.txt | 1 + .../data/nonexistantProperty.2.qml | 4 + .../data/nonexistantProperty.3.errors.txt | 1 + .../data/nonexistantProperty.3.qml | 4 + .../data/nonexistantProperty.4.errors.txt | 1 + .../data/nonexistantProperty.4.qml | 4 + .../data/nonexistantProperty.5.errors.txt | 1 + .../data/nonexistantProperty.5.qml | 4 + .../data/nonexistantProperty.6.errors.txt | 1 + .../data/nonexistantProperty.6.qml | 4 + .../data/notAvailable.errors.txt | 1 + .../qdeclarativelanguage/data/notAvailable.qml | 4 + .../data/nullDotProperty.errors.txt | 1 + .../qdeclarativelanguage/data/nullDotProperty.qml | 4 + .../data/objectValueTypeProperty.errors.txt | 1 + .../data/objectValueTypeProperty.qml | 6 + .../qdeclarativelanguage/data/onCompleted.qml | 17 + .../qdeclarativelanguage/data/onDestruction.qml | 17 + .../data/property.1.errors.txt | 1 + .../qdeclarativelanguage/data/property.1.qml | 5 + .../data/property.2.errors.txt | 1 + .../qdeclarativelanguage/data/property.2.qml | 6 + .../data/property.3.errors.txt | 1 + .../qdeclarativelanguage/data/property.3.qml | 7 + .../data/property.4.errors.txt | 1 + .../qdeclarativelanguage/data/property.4.qml | 5 + .../data/property.5.errors.txt | 1 + .../qdeclarativelanguage/data/property.5.qml | 6 + .../data/property.6.errors.txt | 1 + .../qdeclarativelanguage/data/property.6.qml | 6 + .../data/property.7.errors.txt | 1 + .../qdeclarativelanguage/data/property.7.qml | 5 + .../data/propertyValueSource.2.qml | 5 + .../data/propertyValueSource.qml | 4 + .../data/qmlAttachedPropertiesObjectMethod.1.qml | 5 + .../data/qmlAttachedPropertiesObjectMethod.2.qml | 6 + .../data/readOnly.1.errors.txt | 1 + .../qdeclarativelanguage/data/readOnly.1.qml | 4 + .../data/readOnly.2.errors.txt | 1 + .../qdeclarativelanguage/data/readOnly.2.qml | 4 + .../data/readOnly.3.errors.txt | 1 + .../qdeclarativelanguage/data/readOnly.3.qml | 8 + .../data/readOnly.4.errors.txt | 1 + .../qdeclarativelanguage/data/readOnly.4.qml | 4 + .../data/readOnly.5.errors.txt | 1 + .../qdeclarativelanguage/data/readOnly.5.qml | 4 + .../qdeclarativelanguage/data/revisions11.qml | 10 + .../data/revisionsbasesub11.qml | 16 + .../qdeclarativelanguage/data/revisionssub11.qml | 12 + .../data/rootAsQmlComponent.qml | 6 + .../data/scriptString.1.errors.txt | 1 + .../qdeclarativelanguage/data/scriptString.1.qml | 5 + .../data/scriptString.2.errors.txt | 1 + .../qdeclarativelanguage/data/scriptString.2.qml | 6 + .../qdeclarativelanguage/data/scriptString.qml | 6 + .../qdeclarativelanguage/data/scriptString2.qml | 5 + .../qdeclarativelanguage/data/scriptString3.qml | 5 + .../qdeclarativelanguage/data/scriptString4.qml | 5 + .../qdeclarativelanguage/data/signal.1.errors.txt | 1 + .../qdeclarativelanguage/data/signal.1.qml | 5 + .../qdeclarativelanguage/data/signal.2.errors.txt | 1 + .../qdeclarativelanguage/data/signal.2.qml | 6 + .../qdeclarativelanguage/data/signal.3.errors.txt | 1 + .../qdeclarativelanguage/data/signal.3.qml | 6 + .../qdeclarativelanguage/data/signal.4.errors.txt | 1 + .../qdeclarativelanguage/data/signal.4.qml | 6 + .../qdeclarativelanguage/data/simpleBindings.qml | 18 + .../qdeclarativelanguage/data/simpleContainer.qml | 5 + .../qdeclarativelanguage/data/simpleObject.qml | 2 + .../data/singularProperty.2.errors.txt | 1 + .../data/singularProperty.2.qml | 7 + .../data/singularProperty.errors.txt | 1 + .../qdeclarativelanguage/data/singularProperty.qml | 6 + .../qdeclarativelanguage/data/subdir/Test.qml | 2 + .../data/subdir/subsubdir/SubTest.qml | 2 + .../declarative/qdeclarativelanguage/data/test.js | 0 .../declarative/qdeclarativelanguage/data/test2.js | 0 .../data/unregisteredObject.errors.txt | 1 + .../data/unregisteredObject.qml | 2 + .../data/unsupportedProperty.errors.txt | 1 + .../data/unsupportedProperty.qml | 4 + .../qdeclarativelanguage/data/valueTypes.qml | 13 + .../qdeclarativelanguage/data/variantNotify.qml | 13 + .../qdeclarativelanguage/data/versionedbase.qml | 8 + .../data/wrongType.1.errors.txt | 1 + .../qdeclarativelanguage/data/wrongType.1.qml | 4 + .../data/wrongType.10.errors.txt | 1 + .../qdeclarativelanguage/data/wrongType.10.qml | 5 + .../data/wrongType.11.errors.txt | 1 + .../qdeclarativelanguage/data/wrongType.11.qml | 5 + .../data/wrongType.12.errors.txt | 1 + .../qdeclarativelanguage/data/wrongType.12.qml | 5 + .../data/wrongType.13.errors.txt | 1 + .../qdeclarativelanguage/data/wrongType.13.qml | 4 + .../data/wrongType.14.errors.txt | 1 + .../qdeclarativelanguage/data/wrongType.14.qml | 5 + .../data/wrongType.15.errors.txt | 1 + .../qdeclarativelanguage/data/wrongType.15.qml | 4 + .../data/wrongType.16.errors.txt | 1 + .../qdeclarativelanguage/data/wrongType.16.qml | 5 + .../data/wrongType.2.errors.txt | 1 + .../qdeclarativelanguage/data/wrongType.2.qml | 4 + .../data/wrongType.3.errors.txt | 1 + .../qdeclarativelanguage/data/wrongType.3.qml | 4 + .../data/wrongType.4.errors.txt | 1 + .../qdeclarativelanguage/data/wrongType.4.qml | 4 + .../data/wrongType.5.errors.txt | 1 + .../qdeclarativelanguage/data/wrongType.5.qml | 5 + .../data/wrongType.6.errors.txt | 1 + .../qdeclarativelanguage/data/wrongType.6.qml | 5 + .../data/wrongType.7.errors.txt | 1 + .../qdeclarativelanguage/data/wrongType.7.qml | 5 + .../data/wrongType.8.errors.txt | 1 + .../qdeclarativelanguage/data/wrongType.8.qml | 5 + .../data/wrongType.9.errors.txt | 1 + .../qdeclarativelanguage/data/wrongType.9.qml | 5 + .../qdeclarativelanguage/qdeclarativelanguage.pro | 22 + .../declarative/qmllanguage/LocalInternal.qml | 3 + .../qtest/declarative/qmllanguage/Test.qml | 2 + .../qtest/declarative/qmllanguage/TestLocal.qml | 1 + .../qtest/declarative/qmllanguage/TestNamed.qml | 1 + .../qtest/declarative/qmllanguage/TestSubDir.qml | 2 + .../declarative/qmllanguage/UndeclaredLocal.qml | 3 + .../declarative/qmllanguage/WrongTestLocal.qml | 1 + .../declarative/qmllanguage/noqmldir/Test.qml | 2 + .../qtest/declarative/qmllanguage/pics/blue.png | Bin 0 -> 84 bytes .../qtest/declarative/qmllanguage/qmldir | 5 + .../declarative/qmllanguage/subdir/SubTest.qml | 3 + .../qtest/declarative/qmllanguage/subdir/qmldir | 1 + .../declarative/qdeclarativelanguage/testtypes.cpp | 81 + .../declarative/qdeclarativelanguage/testtypes.h | 807 +++ .../tst_qdeclarativelanguage.cpp | 2028 +++++++ .../qdeclarativelayoutitem/data/layoutItem.qml | 9 + .../qdeclarativelayoutitem.pro | 13 + .../tst_qdeclarativelayoutitem.cpp | 125 + .../qdeclarativelistmodel/data/enumerate.qml | 24 + .../qdeclarativelistmodel/data/model.qml | 22 + .../qdeclarativelistmodel/data/multipleroles.qml | 25 + .../qdeclarativelistmodel/data/script.js | 13 + .../data/setmodelcachelist.qml | 20 + .../qdeclarativelistmodel.pro | 17 + .../tst_qdeclarativelistmodel.cpp | 1141 ++++ .../qdeclarativelistreference/data/MyType.qml | 5 + .../qdeclarativelistreference/data/engineTypes.qml | 9 + .../data/variantToList.qml | 10 + .../qdeclarativelistreference.pro | 8 + .../tst_qdeclarativelistreference.cpp | 579 ++ .../qdeclarativelistview/data/attachedSignals.qml | 24 + .../qdeclarativelistview/data/displaylist.qml | 50 + .../qdeclarativelistview/data/footer.qml | 38 + .../qdeclarativelistview/data/header.qml | 38 + .../qdeclarativelistview/data/header1.qml | 33 + .../qdeclarativelistview/data/headerfooter.qml | 26 + .../qdeclarativelistview/data/itemlist.qml | 43 + .../data/listview-enforcerange.qml | 55 + .../data/listview-initCurrent.qml | 51 + .../data/listview-noCurrent.qml | 50 + .../data/listview-sections.qml | 64 + .../data/listview-sections_delegate.qml | 69 + .../qdeclarativelistview/data/listviewtest.qml | 133 + .../qdeclarativelistview/data/manual-highlight.qml | 47 + .../qdeclarativelistview/data/orientchange.qml | 7 + .../data/propertychangestest.qml | 71 + .../qdeclarativelistview/data/qtbug14821.qml | 31 + .../qdeclarativelistview/data/qtbug16037.qml | 37 + .../qdeclarativelistview/data/rightToLeft.qml | 42 + .../qdeclarativelistview/data/sizelessthan1.qml | 26 + .../data/strictlyenforcerange.qml | 29 + .../qdeclarativelistview/incrementalmodel.cpp | 89 + .../qdeclarativelistview/incrementalmodel.h | 68 + .../qdeclarativelistview/qdeclarativelistview.pro | 16 + .../tst_qdeclarativelistview.cpp | 2837 +++++++++ .../qdeclarativeloader/data/AnchoredLoader.qml | 14 + .../qdeclarativeloader/data/BlueRect.qml | 8 + .../data/CreationContextLoader.qml | 15 + .../data/GraphicsWidget250x250.qml | 5 + .../qdeclarativeloader/data/GreenRect.qml | 7 + .../qdeclarativeloader/data/NoResize.qml | 8 + .../data/NoResizeGraphicsWidget.qml | 9 + .../qdeclarativeloader/data/QTBUG_16928.qml | 23 + .../qdeclarativeloader/data/QTBUG_17114.qml | 18 + .../qdeclarativeloader/data/Rect120x60.qml | 6 + .../qdeclarativeloader/data/SetSourceComponent.qml | 9 + .../data/SizeGraphicsWidgetToLoader.qml | 7 + .../data/SizeLoaderToGraphicsWidget.qml | 5 + .../qdeclarativeloader/data/SizeToItem.qml | 5 + .../qdeclarativeloader/data/SizeToLoader.qml | 6 + .../qdeclarativeloader/data/VmeError.qml | 7 + .../declarative/qdeclarativeloader/data/crash.qml | 14 + .../qdeclarativeloader/data/creationContext.qml | 8 + .../qdeclarativeloader/data/differentorigin.qml | 3 + .../qdeclarativeloader/data/implicitSize.qml | 28 + .../qdeclarativeloader/data/nonItem.qml | 5 + .../declarative/qdeclarativeloader/data/qmldir | 1 + .../qdeclarativeloader/data/sameorigin-load.qml | 3 + .../qdeclarativeloader/data/sameorigin.qml | 3 + .../qdeclarativeloader/data/vmeErrors.qml | 6 + .../qdeclarativeloader/qdeclarativeloader.pro | 19 + .../qdeclarativeloader/tst_qdeclarativeloader.cpp | 637 ++ .../qdeclarativemetatype/qdeclarativemetatype.pro | 11 + .../tst_qdeclarativemetatype.cpp | 387 ++ .../data/importsMixedQmlCppPlugin.2.qml | 21 + .../data/importsMixedQmlCppPlugin.qml | 13 + .../data/incorrectCase.qml | 4 + .../data/pluginWithQmlFile.qml | 3 + .../data/versionNotInstalled.2.errors.txt | 1 + .../data/versionNotInstalled.2.qml | 5 + .../data/versionNotInstalled.errors.txt | 1 + .../data/versionNotInstalled.qml | 6 + .../qdeclarativemoduleplugin/data/works.qml | 3 + .../qdeclarativemoduleplugin/data/works2.qml | 3 + .../qdeclarativemoduleplugin/data/works21.qml | 3 + .../nokia/AutoTestPluginWithQmlFile/MyQmlFile.qml | 3 + .../com/nokia/AutoTestPluginWithQmlFile/qmldir | 3 + .../com/nokia/AutoTestQmlMixedPluginType/Foo.qml | 5 + .../com/nokia/AutoTestQmlMixedPluginType/qmldir | 2 + .../com/nokia/AutoTestQmlPluginType.2.1/qmldir | 1 + .../com/nokia/AutoTestQmlPluginType.2/qmldir | 1 + .../imports/com/nokia/AutoTestQmlPluginType/qmldir | 1 + .../com/nokia/AutoTestQmlVersionPluginType/qmldir | 1 + .../imports/com/nokia/PureQmlModule/ComponentA.qml | 3 + .../imports/com/nokia/PureQmlModule/ComponentB.qml | 4 + .../imports/com/nokia/PureQmlModule/qmldir | 3 + .../imports/com/nokia/WrongCase/qmldir | 1 + .../plugin.2.1/plugin.2.1.pro | 9 + .../qdeclarativemoduleplugin/plugin.2.1/plugin.cpp | 84 + .../qdeclarativemoduleplugin/plugin.2/plugin.2.pro | 9 + .../qdeclarativemoduleplugin/plugin.2/plugin.cpp | 84 + .../qdeclarativemoduleplugin/plugin/plugin.cpp | 83 + .../qdeclarativemoduleplugin/plugin/plugin.pro | 9 + .../pluginMixed/plugin.cpp | 73 + .../pluginMixed/pluginMixed.pro | 9 + .../pluginVersion/plugin.cpp | 73 + .../pluginVersion/pluginVersion.pro | 9 + .../pluginWithQmlFile/plugin.cpp | 58 + .../pluginWithQmlFile/pluginWithQmlFile.pro | 9 + .../pluginWrongCase/plugin.cpp | 83 + .../pluginWrongCase/pluginWrongCase.pro | 10 + .../qdeclarativemoduleplugin.pro | 8 + .../tst_qdeclarativemoduleplugin.cpp | 338 ++ .../tst_qdeclarativemoduleplugin.pro | 15 + .../qdeclarativemousearea/data/clickandhold.qml | 13 + .../qdeclarativemousearea/data/clicktwice.qml | 16 + .../qdeclarativemousearea/data/doubleclick.qml | 16 + .../qdeclarativemousearea/data/dragging.qml | 28 + .../qdeclarativemousearea/data/dragproperties.qml | 28 + .../qdeclarativemousearea/data/dragreset.qml | 28 + .../qdeclarativemousearea/data/pressedOrdering.qml | 28 + .../data/preventContextMenu.qml | 22 + .../qdeclarativemousearea/data/preventstealing.qml | 24 + .../qdeclarativemousearea/data/rejectEvent.qml | 28 + .../data/updateMousePosOnClick.qml | 20 + .../data/updateMousePosOnResize.qml | 38 + .../qdeclarativemousearea.pro | 17 + .../tst_qdeclarativemousearea.cpp | 705 +++ .../qdeclarativeparticles/data/particle.png | Bin 0 -> 262 bytes .../data/particlemotiontest.qml | 35 + .../qdeclarativeparticles/data/particlestest.qml | 17 + .../qdeclarativeparticles.pro | 16 + .../tst_qdeclarativeparticles.cpp | 219 + .../qdeclarativepathview/data/closedPath.qml | 24 + .../qdeclarativepathview/data/datamodel.qml | 38 + .../qdeclarativepathview/data/displaypath.qml | 59 + .../qdeclarativepathview/data/dragpath.qml | 19 + .../qdeclarativepathview/data/emptymodel.qml | 5 + .../qdeclarativepathview/data/openPath.qml | 10 + .../qdeclarativepathview/data/pathUpdate.qml | 18 + .../data/pathUpdateOnStartChanged.qml | 38 + .../qdeclarativepathview/data/pathtest.qml | 14 + .../qdeclarativepathview/data/pathview0.qml | 84 + .../qdeclarativepathview/data/pathview1.qml | 4 + .../qdeclarativepathview/data/pathview2.qml | 57 + .../qdeclarativepathview/data/pathview3.qml | 59 + .../qdeclarativepathview/data/pathview_package.qml | 88 + .../qdeclarativepathview/data/propertychanges.qml | 116 + .../qdeclarativepathview/data/treemodel.qml | 19 + .../qdeclarativepathview/data/undefinedpath.qml | 17 + .../declarative/qdeclarativepathview/data/vdm.qml | 28 + .../qdeclarativepathview/qdeclarativepathview.pro | 16 + .../tst_qdeclarativepathview.cpp | 1065 ++++ .../qdeclarativepincharea/data/flickresize.qml | 50 + .../qdeclarativepincharea/data/pinchproperties.qml | 46 + .../qdeclarativepincharea.pro | 16 + .../tst_qdeclarativepincharea.cpp | 388 ++ .../qdeclarativepixmapcache/data/exists.png | Bin 0 -> 2738 bytes .../qdeclarativepixmapcache/data/exists1.png | Bin 0 -> 2738 bytes .../qdeclarativepixmapcache/data/exists2.png | Bin 0 -> 2738 bytes .../qdeclarativepixmapcache/data/http/exists.png | Bin 0 -> 2738 bytes .../qdeclarativepixmapcache/data/http/exists1.png | Bin 0 -> 2738 bytes .../qdeclarativepixmapcache/data/http/exists2.png | Bin 0 -> 2738 bytes .../qdeclarativepixmapcache/data/http/exists3.png | Bin 0 -> 2738 bytes .../qdeclarativepixmapcache/data/http/exists4.png | Bin 0 -> 2738 bytes .../qdeclarativepixmapcache/data/http/exists5.png | Bin 0 -> 2738 bytes .../qdeclarativepixmapcache/data/massive.png | Bin 0 -> 31834 bytes .../qdeclarativepixmapcache.pro | 24 + .../tst_qdeclarativepixmapcache.cpp | 396 ++ .../data/flow-testimplicitsize.qml | 19 + .../data/flowtest-toptobottom.qml | 44 + .../qdeclarativepositioners/data/flowtest.qml | 43 + .../qdeclarativepositioners/data/grid-animated.qml | 64 + .../qdeclarativepositioners/data/grid-spacing.qml | 41 + .../data/grid-toptobottom.qml | 41 + .../qdeclarativepositioners/data/gridtest.qml | 42 + .../data/gridzerocolumns.qml | 40 + .../data/horizontal-animated.qml | 44 + .../data/horizontal-spacing.qml | 31 + .../qdeclarativepositioners/data/horizontal.qml | 29 + .../data/propertychangestest.qml | 39 + .../qdeclarativepositioners/data/repeatertest.qml | 38 + .../data/vertical-animated.qml | 41 + .../data/vertical-spacing.qml | 28 + .../qdeclarativepositioners/data/vertical.qml | 27 + .../data/verticalqgraphicswidget.qml | 24 + .../qdeclarativepositioners.pro | 15 + .../tst_qdeclarativepositioners.cpp | 1342 +++++ .../qdeclarativeproperty/data/TestType.qml | 6 + .../data/aliasPropertyBindings.qml | 19 + .../data/readSynthesizedObject.qml | 9 + .../qdeclarativeproperty/qdeclarativeproperty.pro | 16 + .../tst_qdeclarativeproperty.cpp | 1494 +++++ .../qdeclarativepropertymap.pro | 8 + .../tst_qdeclarativepropertymap.cpp | 223 + .../auto/declarative/qdeclarativeqt/data/atob.qml | 7 + .../auto/declarative/qdeclarativeqt/data/btoa.qml | 6 + .../declarative/qdeclarativeqt/data/consoleLog.qml | 8 + .../qdeclarativeqt/data/createComponent.qml | 20 + .../qdeclarativeqt/data/createComponentData.qml | 5 + .../qdeclarativeqt/data/createComponent_lib.js | 11 + .../qdeclarativeqt/data/createComponent_lib.qml | 12 + .../qdeclarativeqt/data/createQmlObject.qml | 31 + .../declarative/qdeclarativeqt/data/darker.qml | 12 + .../auto/declarative/qdeclarativeqt/data/enums.qml | 9 + .../qdeclarativeqt/data/fontFamilies.qml | 6 + .../declarative/qdeclarativeqt/data/formatting.qml | 44 + .../auto/declarative/qdeclarativeqt/data/hsla.qml | 11 + .../declarative/qdeclarativeqt/data/isQtObject.qml | 14 + .../declarative/qdeclarativeqt/data/lighter.qml | 11 + tests/auto/declarative/qdeclarativeqt/data/md5.qml | 6 + .../qdeclarativeqt/data/openUrlExternally.qml | 8 + .../qdeclarativeqt/data/openUrlExternally_lib.js | 9 + .../qdeclarativeqt/data/openUrlExternally_lib.qml | 9 + .../auto/declarative/qdeclarativeqt/data/point.qml | 9 + .../auto/declarative/qdeclarativeqt/data/quit.qml | 5 + .../auto/declarative/qdeclarativeqt/data/rect.qml | 9 + .../auto/declarative/qdeclarativeqt/data/rgba.qml | 10 + .../auto/declarative/qdeclarativeqt/data/size.qml | 11 + .../auto/declarative/qdeclarativeqt/data/tint.qml | 9 + .../declarative/qdeclarativeqt/data/vector.qml | 8 + .../declarative/qdeclarativeqt/qdeclarativeqt.pro | 18 + .../qdeclarativeqt/tst_qdeclarativeqt.cpp | 608 ++ .../qdeclarativerepeater/data/intmodel.qml | 29 + .../qdeclarativerepeater/data/itemlist.qml | 68 + .../qdeclarativerepeater/data/modelChanged.qml | 26 + .../qdeclarativerepeater/data/objlist.qml | 21 + .../qdeclarativerepeater/data/properties.qml | 11 + .../qdeclarativerepeater/data/repeater1.qml | 28 + .../qdeclarativerepeater/data/repeater2.qml | 36 + .../qdeclarativerepeater/qdeclarativerepeater.pro | 15 + .../tst_qdeclarativerepeater.cpp | 736 +++ .../data/smoothedanimation1.qml | 3 + .../data/smoothedanimation2.qml | 5 + .../data/smoothedanimation3.qml | 6 + .../data/smoothedanimationBehavior.qml | 24 + .../data/smoothedanimationValueSource.qml | 13 + .../qdeclarativesmoothedanimation.pro | 16 + .../tst_qdeclarativesmoothedanimation.cpp | 212 + .../data/springanimation1.qml | 4 + .../data/springanimation2.qml | 9 + .../data/springanimation3.qml | 8 + .../qdeclarativespringanimation.pro | 16 + .../tst_qdeclarativespringanimation.cpp | 136 + .../qdeclarativestates/data/ExtendedRectangle.qml | 19 + .../data/Implementation/MyType.qml | 32 + .../data/Implementation/images/qt-logo.png | Bin 0 -> 5149 bytes .../qdeclarativestates/data/QTBUG-14830.qml | 29 + .../qdeclarativestates/data/anchorChanges1.qml | 23 + .../qdeclarativestates/data/anchorChanges2.qml | 21 + .../qdeclarativestates/data/anchorChanges3.qml | 29 + .../qdeclarativestates/data/anchorChanges4.qml | 22 + .../qdeclarativestates/data/anchorChanges5.qml | 22 + .../qdeclarativestates/data/anchorChangesCrash.qml | 14 + .../qdeclarativestates/data/anchorRewindBug.qml | 37 + .../qdeclarativestates/data/anchorRewindBug2.qml | 25 + .../data/attachedPropertyChanges.qml | 20 + .../data/autoStateAtStartupRestoreBug.qml | 18 + .../qdeclarativestates/data/basicBinding.qml | 12 + .../qdeclarativestates/data/basicBinding2.qml | 12 + .../qdeclarativestates/data/basicBinding3.qml | 13 + .../qdeclarativestates/data/basicBinding4.qml | 17 + .../qdeclarativestates/data/basicChanges.qml | 10 + .../qdeclarativestates/data/basicChanges2.qml | 15 + .../qdeclarativestates/data/basicChanges3.qml | 15 + .../qdeclarativestates/data/basicChanges4.qml | 19 + .../qdeclarativestates/data/basicExtension.qml | 16 + .../qdeclarativestates/data/deleting.qml | 11 + .../qdeclarativestates/data/deletingState.qml | 13 + .../qdeclarativestates/data/editProperties.qml | 34 + .../qdeclarativestates/data/explicit.qml | 15 + .../qdeclarativestates/data/extendsBug.qml | 26 + .../qdeclarativestates/data/fakeExtension.qml | 16 + .../qdeclarativestates/data/illegalObj.qml | 12 + .../qdeclarativestates/data/illegalTempState.qml | 21 + .../declarative/qdeclarativestates/data/image.png | Bin 0 -> 173 bytes .../qdeclarativestates/data/legalTempState.qml | 23 + .../qdeclarativestates/data/nonExistantProp.qml | 11 + .../qdeclarativestates/data/parentChange1.qml | 37 + .../qdeclarativestates/data/parentChange2.qml | 31 + .../qdeclarativestates/data/parentChange3.qml | 42 + .../qdeclarativestates/data/parentChange4.qml | 30 + .../qdeclarativestates/data/parentChange5.qml | 30 + .../qdeclarativestates/data/parentChange6.qml | 30 + .../qdeclarativestates/data/propertyErrors.qml | 10 + .../declarative/qdeclarativestates/data/reset.qml | 19 + .../qdeclarativestates/data/restoreEntryValues.qml | 14 + .../qdeclarativestates/data/returnToBase.qml | 21 + .../declarative/qdeclarativestates/data/script.qml | 10 + .../qdeclarativestates/data/signalOverride.qml | 18 + .../qdeclarativestates/data/signalOverride2.qml | 9 + .../data/signalOverrideCrash.qml | 15 + .../data/signalOverrideCrash2.qml | 24 + .../data/signalOverrideCrash3.qml | 27 + .../qdeclarativestates/data/unnamedWhen.qml | 14 + .../qdeclarativestates/data/urlResolution.qml | 12 + .../qdeclarativestates/data/whenOrdering.qml | 11 + .../qdeclarativestates/qdeclarativestates.pro | 15 + .../qdeclarativestates/tst_qdeclarativestates.cpp | 1531 +++++ .../qdeclarativestyledtext.pro | 11 + .../tst_qdeclarativestyledtext.cpp | 101 + .../qdeclarativesystempalette.pro | 12 + .../tst_qdeclarativesystempalette.cpp | 192 + .../qdeclarativetext/data/alignments.qml | 41 + .../qdeclarativetext/data/alignments_cb.png | Bin 0 -> 496 bytes .../qdeclarativetext/data/alignments_cc.png | Bin 0 -> 556 bytes .../qdeclarativetext/data/alignments_ct.png | Bin 0 -> 533 bytes .../qdeclarativetext/data/alignments_lb.png | Bin 0 -> 496 bytes .../qdeclarativetext/data/alignments_lc.png | Bin 0 -> 535 bytes .../qdeclarativetext/data/alignments_lt.png | Bin 0 -> 514 bytes .../qdeclarativetext/data/alignments_rb.png | Bin 0 -> 505 bytes .../qdeclarativetext/data/alignments_rc.png | Bin 0 -> 559 bytes .../qdeclarativetext/data/alignments_rt.png | Bin 0 -> 539 bytes .../qdeclarativetext/data/elideimplicitwidth.qml | 7 + .../qdeclarativetext/data/embeddedImagesLocal.qml | 5 + .../data/embeddedImagesLocalError.qml | 5 + .../qdeclarativetext/data/embeddedImagesRemote.qml | 5 + .../data/embeddedImagesRemoteError.qml | 5 + .../data/horizontalAlignment_RightToLeft.qml | 23 + .../qdeclarativetext/data/http/exists.png | Bin 0 -> 2738 bytes .../qdeclarativetext/data/lineCount.qml | 15 + .../qdeclarativetext/data/lineHeight.qml | 15 + .../qdeclarativetext/data/qtbug_14734.qml | 10 + .../declarative/qdeclarativetext/data/rotated.qml | 18 + .../qdeclarativetext/qdeclarativetext.pro | 21 + .../qdeclarativetext/tst_qdeclarativetext.cpp | 1340 +++++ .../qdeclarativetextedit/data/CursorRect.qml | 8 + .../qdeclarativetextedit/data/alignments.qml | 41 + .../qdeclarativetextedit/data/alignments_cb.png | Bin 0 -> 496 bytes .../qdeclarativetextedit/data/alignments_cc.png | Bin 0 -> 556 bytes .../qdeclarativetextedit/data/alignments_ct.png | Bin 0 -> 533 bytes .../qdeclarativetextedit/data/alignments_lb.png | Bin 0 -> 496 bytes .../qdeclarativetextedit/data/alignments_lc.png | Bin 0 -> 535 bytes .../qdeclarativetextedit/data/alignments_lt.png | Bin 0 -> 514 bytes .../qdeclarativetextedit/data/alignments_rb.png | Bin 0 -> 505 bytes .../qdeclarativetextedit/data/alignments_rc.png | Bin 0 -> 559 bytes .../qdeclarativetextedit/data/alignments_rt.png | Bin 0 -> 539 bytes .../qdeclarativetextedit/data/cursorTest.qml | 9 + .../qdeclarativetextedit/data/geometrySignals.qml | 12 + .../data/horizontalAlignment_RightToLeft.qml | 24 + .../qdeclarativetextedit/data/http/ErrItem.qml | 7 + .../qdeclarativetextedit/data/http/NormItem.qml | 6 + .../data/http/cursorHttpTest.qml | 22 + .../data/http/cursorHttpTestFail1.qml | 18 + .../data/http/cursorHttpTestFail2.qml | 18 + .../data/http/cursorHttpTestPass.qml | 18 + .../qdeclarativetextedit/data/http/qmldir | 4 + .../data/httpfail/FailItem.qml | 5 + .../data/httpslow/WaitItem.qml | 5 + .../qdeclarativetextedit/data/inputmethodhints.qml | 6 + .../data/mouseselection_default.qml | 7 + .../data/mouseselection_false.qml | 7 + .../data/mouseselection_false_readonly.qml | 8 + .../data/mouseselection_false_words.qml | 8 + .../data/mouseselection_multiline.qml | 8 + .../data/mouseselection_true.qml | 7 + .../data/mouseselection_true_readonly.qml | 8 + .../data/mouseselection_true_words.qml | 8 + .../data/mouseselectionmode_characters.qml | 8 + .../data/mouseselectionmode_default.qml | 7 + .../data/mouseselectionmode_words.qml | 8 + .../qdeclarativetextedit/data/navigation.qml | 24 + .../qdeclarativetextedit/data/positionAt.qml | 9 + .../qdeclarativetextedit/data/readOnly.qml | 12 + .../qdeclarativetextedit/qdeclarativetextedit.pro | 14 + .../tst_qdeclarativetextedit.cpp | 2819 +++++++++ .../qdeclarativetextinput/data/cursorTest.qml | 8 + .../qdeclarativetextinput/data/echoMode.qml | 11 + .../qdeclarativetextinput/data/geometrySignals.qml | 12 + .../qdeclarativetextinput/data/halign_center.png | Bin 0 -> 293 bytes .../qdeclarativetextinput/data/halign_left.png | Bin 0 -> 291 bytes .../qdeclarativetextinput/data/halign_right.png | Bin 0 -> 292 bytes .../data/horizontalAlignment.qml | 22 + .../data/horizontalAlignment_RightToLeft.qml | 24 + .../qdeclarativetextinput/data/inputmethods.qml | 7 + .../qdeclarativetextinput/data/masks.qml | 7 + .../qdeclarativetextinput/data/maxLength.qml | 7 + .../data/mouseselection_default.qml | 7 + .../data/mouseselection_false.qml | 7 + .../data/mouseselection_false_readonly.qml | 8 + .../data/mouseselection_false_words.qml | 7 + .../data/mouseselection_true.qml | 7 + .../data/mouseselection_true_readonly.qml | 8 + .../data/mouseselection_true_words.qml | 7 + .../data/mouseselectionmode_characters.qml | 8 + .../data/mouseselectionmode_default.qml | 7 + .../data/mouseselectionmode_words.qml | 8 + .../qdeclarativetextinput/data/navigation.qml | 24 + .../qdeclarativetextinput/data/positionAt.qml | 8 + .../qdeclarativetextinput/data/readOnly.qml | 12 + .../qdeclarativetextinput/data/validators.qml | 22 + .../qdeclarativetextinput.pro | 14 + .../tst_qdeclarativetextinput.cpp | 2935 ++++++++++ .../qdeclarativetimer/qdeclarativetimer.pro | 13 + .../qdeclarativetimer/tst_qdeclarativetimer.cpp | 344 ++ .../data/BindingsSpliceCorrectlyType.qml | 7 + .../data/BindingsSpliceCorrectlyType4.qml | 7 + .../data/BindingsSpliceCorrectlyType5.qml | 7 + .../data/autoBindingRemoval.2.qml | 9 + .../data/autoBindingRemoval.3.qml | 10 + .../data/autoBindingRemoval.qml | 9 + .../data/bindingAssignment.qml | 7 + .../data/bindingConflict.qml | 8 + .../qdeclarativevaluetypes/data/bindingRead.qml | 5 + .../data/bindingVariantCopy.qml | 13 + .../data/bindingsSpliceCorrectly.1.qml | 29 + .../data/bindingsSpliceCorrectly.2.qml | 31 + .../data/bindingsSpliceCorrectly.3.qml | 36 + .../data/bindingsSpliceCorrectly.4.qml | 27 + .../data/bindingsSpliceCorrectly.5.qml | 27 + .../qdeclarativevaluetypes/data/conflicting.1.qml | 42 + .../qdeclarativevaluetypes/data/conflicting.2.qml | 42 + .../qdeclarativevaluetypes/data/conflicting.3.qml | 42 + .../qdeclarativevaluetypes/data/deletedObject.js | 13 + .../qdeclarativevaluetypes/data/deletedObject.qml | 11 + .../qdeclarativevaluetypes/data/enums.1.qml | 6 + .../qdeclarativevaluetypes/data/enums.2.qml | 6 + .../qdeclarativevaluetypes/data/enums.3.qml | 6 + .../qdeclarativevaluetypes/data/enums.4.qml | 7 + .../qdeclarativevaluetypes/data/enums.5.qml | 10 + .../qdeclarativevaluetypes/data/font_read.qml | 18 + .../qdeclarativevaluetypes/data/font_write.2.qml | 6 + .../qdeclarativevaluetypes/data/font_write.3.qml | 7 + .../qdeclarativevaluetypes/data/font_write.4.qml | 7 + .../qdeclarativevaluetypes/data/font_write.5.qml | 14 + .../qdeclarativevaluetypes/data/font_write.qml | 16 + .../qdeclarativevaluetypes/data/matrix4x4_read.qml | 22 + .../data/matrix4x4_write.qml | 21 + .../qdeclarativevaluetypes/data/point_read.qml | 7 + .../qdeclarativevaluetypes/data/point_write.qml | 6 + .../qdeclarativevaluetypes/data/pointf_read.qml | 8 + .../qdeclarativevaluetypes/data/pointf_write.qml | 6 + .../data/quaternion_read.qml | 10 + .../data/quaternion_write.qml | 9 + .../qdeclarativevaluetypes/data/rect_read.qml | 10 + .../qdeclarativevaluetypes/data/rect_write.qml | 9 + .../qdeclarativevaluetypes/data/rectf_read.qml | 10 + .../qdeclarativevaluetypes/data/rectf_write.qml | 9 + .../qdeclarativevaluetypes/data/returnValues.qml | 17 + .../qdeclarativevaluetypes/data/scriptAccess.qml | 9 + .../data/scriptVariantCopy.qml | 14 + .../qdeclarativevaluetypes/data/size_read.qml | 8 + .../qdeclarativevaluetypes/data/size_write.qml | 7 + .../qdeclarativevaluetypes/data/sizef_read.qml | 9 + .../qdeclarativevaluetypes/data/sizef_write.qml | 6 + .../data/sizereadonly_read.qml | 8 + .../data/sizereadonly_writeerror.qml | 6 + .../data/sizereadonly_writeerror2.qml | 7 + .../data/sizereadonly_writeerror3.qml | 7 + .../data/sizereadonly_writeerror4.qml | 10 + .../data/staticAssignment.qml | 5 + .../data/valueInterceptors.qml | 8 + .../qdeclarativevaluetypes/data/valueSources.qml | 5 + .../qdeclarativevaluetypes/data/varAssignment.qml | 14 + .../qdeclarativevaluetypes/data/variant_read.qml | 9 + .../qdeclarativevaluetypes/data/vector2d_read.qml | 8 + .../qdeclarativevaluetypes/data/vector2d_write.qml | 7 + .../qdeclarativevaluetypes/data/vector3d_read.qml | 9 + .../qdeclarativevaluetypes/data/vector3d_write.qml | 8 + .../qdeclarativevaluetypes/data/vector4d_read.qml | 10 + .../qdeclarativevaluetypes/data/vector4d_write.qml | 9 + .../qdeclarativevaluetypes.pro | 19 + .../qdeclarativevaluetypes/testtypes.cpp | 48 + .../declarative/qdeclarativevaluetypes/testtypes.h | 190 + .../tst_qdeclarativevaluetypes.cpp | 1017 ++++ .../declarative/qdeclarativeview/data/error1.qml | 5 + .../data/resizemodedeclarativeitem.qml | 5 + .../data/resizemodegraphicswidget.qml | 5 + .../qdeclarativeview/qdeclarativeview.pro | 13 + .../qdeclarativeview/tst_qdeclarativeview.cpp | 321 ++ .../qdeclarativeviewer/data/orientation.qml | 19 + .../qdeclarativeviewer/qdeclarativeviewer.pro | 19 + .../qdeclarativeviewer/tst_qdeclarativeviewer.cpp | 373 ++ .../qdeclarativevisualdatamodel/data/datalist.qml | 19 + .../data/modelproperties.qml | 17 + .../data/modelproperties2.qml | 17 + .../data/objectlist.qml | 19 + .../data/singlerole1.qml | 11 + .../data/singlerole2.qml | 11 + .../data/visualdatamodel.qml | 11 + .../qdeclarativevisualdatamodel.pro | 16 + .../tst_qdeclarativevisualdatamodel.cpp | 606 ++ .../qdeclarativeworkerscript/data/BaseWorker.qml | 24 + .../qdeclarativeworkerscript/data/Global.js | 1 + .../qdeclarativeworkerscript/data/script.js | 4 + .../data/script_error_onCall.js | 6 + .../data/script_error_onLoad.js | 5 + .../data/script_fixed_return.js | 4 + .../data/script_include.js | 5 + .../qdeclarativeworkerscript/data/script_pragma.js | 6 + .../qdeclarativeworkerscript/data/worker.qml | 5 + .../data/worker_error_onCall.qml | 6 + .../data/worker_error_onLoad.qml | 7 + .../data/worker_include.qml | 5 + .../data/worker_pragma.qml | 6 + .../qdeclarativeworkerscript.pro | 16 + .../tst_qdeclarativeworkerscript.cpp | 292 + .../qdeclarativexmlhttprequest/data/abort.expect | 10 + .../qdeclarativexmlhttprequest/data/abort.qml | 44 + .../qdeclarativexmlhttprequest/data/abort.reply | 3 + .../data/abort_opened.qml | 60 + .../data/abort_unsent.qml | 55 + .../qdeclarativexmlhttprequest/data/attr.qml | 78 + .../qdeclarativexmlhttprequest/data/attr.xml | 1 + .../data/callbackException.qml | 25 + .../qdeclarativexmlhttprequest/data/cdata.qml | 133 + .../qdeclarativexmlhttprequest/data/cdata.xml | 2 + .../data/constructor.qml | 14 + .../data/defaultState.qml | 30 + .../qdeclarativexmlhttprequest/data/document.qml | 56 + .../qdeclarativexmlhttprequest/data/document.xml | 3 + .../data/domExceptionCodes.qml | 60 + .../qdeclarativexmlhttprequest/data/element.qml | 145 + .../qdeclarativexmlhttprequest/data/element.xml | 1 + .../data/getAllResponseHeaders.qml | 66 + .../data/getAllResponseHeaders_args.qml | 23 + .../data/getAllResponseHeaders_sent.qml | 20 + .../data/getAllResponseHeaders_unsent.qml | 16 + .../data/getResponseHeader.expect | 7 + .../data/getResponseHeader.qml | 76 + .../data/getResponseHeader.reply | 8 + .../data/getResponseHeader_args.qml | 23 + .../data/getResponseHeader_sent.qml | 20 + .../data/getResponseHeader_unsent.qml | 16 + .../data/instanceStateValues.qml | 33 + .../data/invalidMethodUsage.qml | 160 + .../qdeclarativexmlhttprequest/data/open.qml | 54 + .../data/open_arg_count.1.qml | 18 + .../data/open_arg_count.2.qml | 18 + .../data/open_invalid_method.qml | 16 + .../data/open_network.expect | 7 + .../data/open_network.reply | 3 + .../data/open_network.wait | 0 .../qdeclarativexmlhttprequest/data/open_sync.qml | 17 + .../qdeclarativexmlhttprequest/data/open_user.qml | 54 + .../data/open_username.qml | 54 + .../data/redirectError.qml | 23 + .../data/redirectRecur.qml | 23 + .../qdeclarativexmlhttprequest/data/redirects.qml | 22 + .../data/redirecttarget.html | 1 + .../data/responseText.qml | 54 + .../data/responseXML_invalid.qml | 24 + .../data/seconddocument.html | 1 + .../data/send_alreadySent.qml | 28 + .../data/send_data.1.expect | 10 + .../data/send_data.1.qml | 22 + .../data/send_data.2.qml | 24 + .../data/send_data.3.qml | 24 + .../data/send_data.4.expect | 10 + .../data/send_data.4.qml | 24 + .../data/send_data.5.qml | 24 + .../data/send_data.6.expect | 10 + .../data/send_data.6.qml | 22 + .../data/send_data.7.qml | 24 + .../data/send_data.reply | 3 + .../data/send_ignoreData.qml | 27 + .../data/send_ignoreData.reply | 3 + .../data/send_ignoreData_GET.expect | 7 + .../data/send_ignoreData_PUT.expect | 7 + .../data/send_unsent.qml | 16 + .../data/setRequestHeader.expect | 9 + .../data/setRequestHeader.qml | 29 + .../data/setRequestHeader.reply | 3 + .../data/setRequestHeader_args.qml | 18 + .../data/setRequestHeader_illegalName.qml | 58 + .../data/setRequestHeader_sent.qml | 32 + .../data/setRequestHeader_unsent.qml | 17 + .../data/staticStateValues.qml | 24 + .../data/status.200.reply | 3 + .../data/status.404.reply | 3 + .../qdeclarativexmlhttprequest/data/status.expect | 7 + .../qdeclarativexmlhttprequest/data/status.qml | 79 + .../qdeclarativexmlhttprequest/data/statusText.qml | 79 + .../data/testdocument.html | 1 + .../qdeclarativexmlhttprequest/data/text.qml | 129 + .../qdeclarativexmlhttprequest/data/text.xml | 1 + .../qdeclarativexmlhttprequest/data/utf16.html | 1 + .../qdeclarativexmlhttprequest/data/utf16.qml | 29 + .../qdeclarativexmlhttprequest/data/utf16.xml | Bin 0 -> 154 bytes .../qdeclarativexmlhttprequest.pro | 21 + .../tst_qdeclarativexmlhttprequest.cpp | 1129 ++++ .../qdeclarativexmllistmodel/data/model.qml | 10 + .../qdeclarativexmllistmodel/data/model.xml | 54 + .../qdeclarativexmllistmodel/data/model2.xml | 14 + .../data/propertychanges.qml | 10 + .../qdeclarativexmllistmodel/data/recipes.qml | 10 + .../qdeclarativexmllistmodel/data/recipes.xml | 90 + .../qdeclarativexmllistmodel/data/roleCrash.qml | 7 + .../qdeclarativexmllistmodel/data/roleErrors.qml | 10 + .../qdeclarativexmllistmodel/data/roleKeys.qml | 13 + .../qdeclarativexmllistmodel/data/testtypes.qml | 8 + .../qdeclarativexmllistmodel/data/unique.qml | 8 + .../qdeclarativexmllistmodel.pro | 20 + .../tst_qdeclarativexmllistmodel.cpp | 988 ++++ .../qmetaobjectbuilder/qmetaobjectbuilder.pro | 8 + .../qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp | 1268 ++++ tests/auto/declarative/qmlshadersplugin/main.qml | 80 + .../qmlshadersplugin/qmlshadersplugin.pro | 18 + .../qmlshadersplugin/tst_qmlshadersplugin.cpp | 205 + .../auto/declarative/qmlvisual/ListView/basic1.qml | 30 + .../auto/declarative/qmlvisual/ListView/basic2.qml | 34 + .../auto/declarative/qmlvisual/ListView/basic3.qml | 32 + .../auto/declarative/qmlvisual/ListView/basic4.qml | 36 + .../qmlvisual/ListView/data/basic1.0.png | Bin 0 -> 948 bytes .../declarative/qmlvisual/ListView/data/basic1.qml | 11 + .../qmlvisual/ListView/data/basic2.0.png | Bin 0 -> 948 bytes .../declarative/qmlvisual/ListView/data/basic2.qml | 11 + .../qmlvisual/ListView/data/basic3.0.png | Bin 0 -> 948 bytes .../declarative/qmlvisual/ListView/data/basic3.qml | 11 + .../qmlvisual/ListView/data/basic4.0.png | Bin 0 -> 948 bytes .../declarative/qmlvisual/ListView/data/basic4.qml | 11 + .../qmlvisual/ListView/data/enforcerange.0.png | Bin 0 -> 680 bytes .../qmlvisual/ListView/data/enforcerange.1.png | Bin 0 -> 680 bytes .../qmlvisual/ListView/data/enforcerange.2.png | Bin 0 -> 704 bytes .../qmlvisual/ListView/data/enforcerange.3.png | Bin 0 -> 695 bytes .../qmlvisual/ListView/data/enforcerange.4.png | Bin 0 -> 680 bytes .../qmlvisual/ListView/data/enforcerange.5.png | Bin 0 -> 710 bytes .../qmlvisual/ListView/data/enforcerange.6.png | Bin 0 -> 705 bytes .../qmlvisual/ListView/data/enforcerange.qml | 2119 +++++++ .../qmlvisual/ListView/data/itemlist.0.png | Bin 0 -> 976 bytes .../qmlvisual/ListView/data/itemlist.1.png | Bin 0 -> 976 bytes .../qmlvisual/ListView/data/itemlist.2.png | Bin 0 -> 986 bytes .../qmlvisual/ListView/data/itemlist.3.png | Bin 0 -> 977 bytes .../qmlvisual/ListView/data/itemlist.4.png | Bin 0 -> 977 bytes .../qmlvisual/ListView/data/itemlist.5.png | Bin 0 -> 977 bytes .../qmlvisual/ListView/data/itemlist.6.png | Bin 0 -> 990 bytes .../qmlvisual/ListView/data/itemlist.7.png | Bin 0 -> 976 bytes .../qmlvisual/ListView/data/itemlist.qml | 2203 +++++++ .../qmlvisual/ListView/data/listview.0.png | Bin 0 -> 1525 bytes .../qmlvisual/ListView/data/listview.1.png | Bin 0 -> 1647 bytes .../qmlvisual/ListView/data/listview.2.png | Bin 0 -> 1584 bytes .../qmlvisual/ListView/data/listview.3.png | Bin 0 -> 1648 bytes .../qmlvisual/ListView/data/listview.4.png | Bin 0 -> 1613 bytes .../qmlvisual/ListView/data/listview.5.png | Bin 0 -> 1663 bytes .../qmlvisual/ListView/data/listview.6.png | Bin 0 -> 1666 bytes .../qmlvisual/ListView/data/listview.7.png | Bin 0 -> 1579 bytes .../qmlvisual/ListView/data/listview.8.png | Bin 0 -> 1579 bytes .../qmlvisual/ListView/data/listview.qml | 2227 +++++++ .../qmlvisual/ListView/enforcerange.qml | 31 + .../declarative/qmlvisual/ListView/itemlist.qml | 40 + .../declarative/qmlvisual/ListView/listview.qml | 86 + .../Package_Views/data/packageviews.0.png | Bin 0 -> 766 bytes .../Package_Views/data/packageviews.1.png | Bin 0 -> 797 bytes .../Package_Views/data/packageviews.2.png | Bin 0 -> 794 bytes .../Package_Views/data/packageviews.3.png | Bin 0 -> 822 bytes .../Package_Views/data/packageviews.4.png | Bin 0 -> 801 bytes .../Package_Views/data/packageviews.5.png | Bin 0 -> 803 bytes .../Package_Views/data/packageviews.6.png | Bin 0 -> 774 bytes .../qmlvisual/Package_Views/data/packageviews.qml | 1767 ++++++ .../qmlvisual/Package_Views/packageviews.qml | 82 + tests/auto/declarative/qmlvisual/TEST_GUIDELINES | 7 + .../bindinganimation/bindinganimation.qml | 36 + .../bindinganimation/data/bindinganimation.0.png | Bin 0 -> 832 bytes .../bindinganimation/data/bindinganimation.1.png | Bin 0 -> 830 bytes .../bindinganimation/data/bindinganimation.2.png | Bin 0 -> 829 bytes .../bindinganimation/data/bindinganimation.3.png | Bin 0 -> 830 bytes .../bindinganimation/data/bindinganimation.4.png | Bin 0 -> 830 bytes .../bindinganimation/data/bindinganimation.5.png | Bin 0 -> 832 bytes .../bindinganimation/data/bindinganimation.qml | 1055 ++++ .../colorAnimation/colorAnimation-visual.qml | 41 + .../data-X11/colorAnimation-visual.0.png | Bin 0 -> 622 bytes .../data-X11/colorAnimation-visual.1.png | Bin 0 -> 627 bytes .../data-X11/colorAnimation-visual.2.png | Bin 0 -> 626 bytes .../data-X11/colorAnimation-visual.3.png | Bin 0 -> 625 bytes .../data-X11/colorAnimation-visual.qml | 951 +++ .../data/colorAnimation-visual.0.png | Bin 0 -> 622 bytes .../data/colorAnimation-visual.1.png | Bin 0 -> 627 bytes .../data/colorAnimation-visual.2.png | Bin 0 -> 626 bytes .../data/colorAnimation-visual.3.png | Bin 0 -> 625 bytes .../colorAnimation/data/colorAnimation-visual.qml | 951 +++ .../qmlvisual/animation/easing/data/easing.0.png | Bin 0 -> 1267 bytes .../qmlvisual/animation/easing/data/easing.1.png | Bin 0 -> 1648 bytes .../qmlvisual/animation/easing/data/easing.2.png | Bin 0 -> 1617 bytes .../qmlvisual/animation/easing/data/easing.3.png | Bin 0 -> 1267 bytes .../qmlvisual/animation/easing/data/easing.qml | 863 +++ .../qmlvisual/animation/easing/easing.qml | 194 + .../qmlvisual/animation/loop/data/loop.0.png | Bin 0 -> 502 bytes .../qmlvisual/animation/loop/data/loop.1.png | Bin 0 -> 508 bytes .../qmlvisual/animation/loop/data/loop.2.png | Bin 0 -> 507 bytes .../qmlvisual/animation/loop/data/loop.3.png | Bin 0 -> 508 bytes .../qmlvisual/animation/loop/data/loop.4.png | Bin 0 -> 508 bytes .../qmlvisual/animation/loop/data/loop.5.png | Bin 0 -> 507 bytes .../qmlvisual/animation/loop/data/loop.6.png | Bin 0 -> 508 bytes .../qmlvisual/animation/loop/data/loop.qml | 1471 +++++ .../declarative/qmlvisual/animation/loop/loop.qml | 24 + .../data/parallelAnimation-visual.0.png | Bin 0 -> 379 bytes .../data/parallelAnimation-visual.qml | 243 + .../parallelAnimation/parallelAnimation-visual.qml | 52 + .../data/parentAnimation-visual.0.png | Bin 0 -> 1635 bytes .../data/parentAnimation-visual.1.png | Bin 0 -> 1619 bytes .../data/parentAnimation-visual.2.png | Bin 0 -> 1586 bytes .../data/parentAnimation-visual.3.png | Bin 0 -> 1635 bytes .../data/parentAnimation-visual.4.png | Bin 0 -> 1653 bytes .../data/parentAnimation-visual.qml | 1223 ++++ .../parentAnimation/parentAnimation-visual.qml | 68 + .../parentAnimation2/data/parentAnimation2.0.png | Bin 0 -> 2011 bytes .../parentAnimation2/data/parentAnimation2.1.png | Bin 0 -> 2047 bytes .../parentAnimation2/data/parentAnimation2.2.png | Bin 0 -> 2058 bytes .../parentAnimation2/data/parentAnimation2.3.png | Bin 0 -> 2052 bytes .../parentAnimation2/data/parentAnimation2.qml | 1023 ++++ .../parentAnimation2/parentAnimation2.qml | 64 + .../data/pauseAnimation-visual.0.png | Bin 0 -> 3224 bytes .../data/pauseAnimation-visual.1.png | Bin 0 -> 3226 bytes .../data/pauseAnimation-visual.2.png | Bin 0 -> 3229 bytes .../data/pauseAnimation-visual.3.png | Bin 0 -> 3224 bytes .../data/pauseAnimation-visual.4.png | Bin 0 -> 3226 bytes .../data/pauseAnimation-visual.5.png | Bin 0 -> 3229 bytes .../data/pauseAnimation-visual.6.png | Bin 0 -> 3229 bytes .../pauseAnimation/data/pauseAnimation-visual.qml | 1619 ++++++ .../pauseAnimation/data/pauseAnimation.0.png | Bin 0 -> 3211 bytes .../pauseAnimation/data/pauseAnimation.1.png | Bin 0 -> 3214 bytes .../pauseAnimation/data/pauseAnimation.2.png | Bin 0 -> 3209 bytes .../pauseAnimation/data/pauseAnimation.3.png | Bin 0 -> 3211 bytes .../pauseAnimation/data/pauseAnimation.4.png | Bin 0 -> 3214 bytes .../pauseAnimation/data/pauseAnimation.5.png | Bin 0 -> 3214 bytes .../pauseAnimation/pauseAnimation-visual.qml | 36 + .../animation/pauseAnimation/pics/qtlogo.png | Bin 0 -> 2738 bytes .../data/propertyAction-visual.0.png | Bin 0 -> 336 bytes .../data/propertyAction-visual.1.png | Bin 0 -> 335 bytes .../data/propertyAction-visual.2.png | Bin 0 -> 344 bytes .../data/propertyAction-visual.3.png | Bin 0 -> 336 bytes .../propertyAction/data/propertyAction-visual.qml | 815 +++ .../propertyAction/propertyAction-visual.qml | 40 + .../animation/qtbug10586/data/qtbug10586.0.png | Bin 0 -> 1131 bytes .../animation/qtbug10586/data/qtbug10586.1.png | Bin 0 -> 1135 bytes .../animation/qtbug10586/data/qtbug10586.2.png | Bin 0 -> 1141 bytes .../animation/qtbug10586/data/qtbug10586.3.png | Bin 0 -> 1147 bytes .../animation/qtbug10586/data/qtbug10586.4.png | Bin 0 -> 1132 bytes .../animation/qtbug10586/data/qtbug10586.qml | 1107 ++++ .../qmlvisual/animation/qtbug10586/qtbug10586.qml | 23 + .../animation/qtbug13398/data/qtbug13398.0.png | Bin 0 -> 1281 bytes .../animation/qtbug13398/data/qtbug13398.1.png | Bin 0 -> 1265 bytes .../animation/qtbug13398/data/qtbug13398.qml | 447 ++ .../qmlvisual/animation/qtbug13398/qtbug13398.qml | 68 + .../animation/reanchor/data/reanchor.0.png | Bin 0 -> 637 bytes .../animation/reanchor/data/reanchor.1.png | Bin 0 -> 637 bytes .../animation/reanchor/data/reanchor.2.png | Bin 0 -> 642 bytes .../animation/reanchor/data/reanchor.3.png | Bin 0 -> 647 bytes .../animation/reanchor/data/reanchor.4.png | Bin 0 -> 637 bytes .../animation/reanchor/data/reanchor.5.png | Bin 0 -> 646 bytes .../animation/reanchor/data/reanchor.6.png | Bin 0 -> 637 bytes .../animation/reanchor/data/reanchor.7.png | Bin 0 -> 637 bytes .../animation/reanchor/data/reanchor.8.png | Bin 0 -> 647 bytes .../animation/reanchor/data/reanchor.9.png | Bin 0 -> 642 bytes .../qmlvisual/animation/reanchor/data/reanchor.qml | 2471 ++++++++ .../qmlvisual/animation/reanchor/reanchor.qml | 69 + .../animation/reanchorRTL/data/reanchor.0.png | Bin 0 -> 637 bytes .../animation/reanchorRTL/data/reanchor.1.png | Bin 0 -> 637 bytes .../animation/reanchorRTL/data/reanchor.10.png | Bin 0 -> 647 bytes .../animation/reanchorRTL/data/reanchor.11.png | Bin 0 -> 637 bytes .../animation/reanchorRTL/data/reanchor.12.png | Bin 0 -> 636 bytes .../animation/reanchorRTL/data/reanchor.2.png | Bin 0 -> 636 bytes .../animation/reanchorRTL/data/reanchor.3.png | Bin 0 -> 647 bytes .../animation/reanchorRTL/data/reanchor.4.png | Bin 0 -> 641 bytes .../animation/reanchorRTL/data/reanchor.5.png | Bin 0 -> 637 bytes .../animation/reanchorRTL/data/reanchor.6.png | Bin 0 -> 637 bytes .../animation/reanchorRTL/data/reanchor.7.png | Bin 0 -> 636 bytes .../animation/reanchorRTL/data/reanchor.8.png | Bin 0 -> 637 bytes .../animation/reanchorRTL/data/reanchor.9.png | Bin 0 -> 637 bytes .../animation/reanchorRTL/data/reanchor.qml | 1499 +++++ .../qmlvisual/animation/reanchorRTL/reanchor.qml | 69 + .../scriptAction/data/scriptAction-visual.0.png | Bin 0 -> 334 bytes .../scriptAction/data/scriptAction-visual.1.png | Bin 0 -> 335 bytes .../scriptAction/data/scriptAction-visual.2.png | Bin 0 -> 335 bytes .../scriptAction/data/scriptAction-visual.qml | 515 ++ .../animation/scriptAction/scriptAction-visual.qml | 40 + .../qmlvisual/fillmode/data/fillmode.0.png | Bin 0 -> 16855 bytes .../qmlvisual/fillmode/data/fillmode.qml | 11 + tests/auto/declarative/qmlvisual/fillmode/face.png | Bin 0 -> 1011 bytes .../declarative/qmlvisual/fillmode/fillmode.qml | 21 + .../qmlvisual/focusscope/data/test.0.png | Bin 0 -> 1974 bytes .../qmlvisual/focusscope/data/test.1.png | Bin 0 -> 1968 bytes .../qmlvisual/focusscope/data/test.2.png | Bin 0 -> 1968 bytes .../qmlvisual/focusscope/data/test.3.png | Bin 0 -> 1974 bytes .../declarative/qmlvisual/focusscope/data/test.qml | 923 +++ .../qmlvisual/focusscope/data/test2.0.png | Bin 0 -> 439 bytes .../qmlvisual/focusscope/data/test2.1.png | Bin 0 -> 439 bytes .../qmlvisual/focusscope/data/test2.qml | 323 ++ .../qmlvisual/focusscope/data/test3.0.png | Bin 0 -> 487 bytes .../qmlvisual/focusscope/data/test3.1.png | Bin 0 -> 509 bytes .../qmlvisual/focusscope/data/test3.2.png | Bin 0 -> 491 bytes .../qmlvisual/focusscope/data/test3.3.png | Bin 0 -> 499 bytes .../qmlvisual/focusscope/data/test3.4.png | Bin 0 -> 487 bytes .../qmlvisual/focusscope/data/test3.qml | 1327 +++++ .../auto/declarative/qmlvisual/focusscope/test.qml | 81 + .../declarative/qmlvisual/focusscope/test2.qml | 38 + .../declarative/qmlvisual/focusscope/test3.qml | 52 + .../qdeclarativeborderimage/animated-smooth.qml | 66 + .../qmlvisual/qdeclarativeborderimage/animated.qml | 58 + .../qmlvisual/qdeclarativeborderimage/borders.qml | 18 + .../content/MyBorderImage.qml | 38 + .../qdeclarativeborderimage/content/bw.png | Bin 0 -> 1357 bytes .../content/colors-round.sci | 7 + .../content/colors-stretch.sci | 5 + .../qdeclarativeborderimage/content/colors.png | Bin 0 -> 713 bytes .../qdeclarativeborderimage/content/qmldir | 1 + .../data/animated-smooth.0.png | Bin 0 -> 4686 bytes .../data/animated-smooth.1.png | Bin 0 -> 25454 bytes .../data/animated-smooth.qml | 319 + .../qdeclarativeborderimage/data/animated.0.png | Bin 0 -> 4686 bytes .../qdeclarativeborderimage/data/animated.1.png | Bin 0 -> 9642 bytes .../qdeclarativeborderimage/data/animated.qml | 343 ++ .../qdeclarativeborderimage/data/borders.0.png | Bin 0 -> 28741 bytes .../qdeclarativeborderimage/data/borders.qml | 11 + .../data-MAC/flickable-horizontal.0.png | Bin 0 -> 1439 bytes .../data-MAC/flickable-horizontal.1.png | Bin 0 -> 1424 bytes .../data-MAC/flickable-horizontal.2.png | Bin 0 -> 1428 bytes .../data-MAC/flickable-horizontal.3.png | Bin 0 -> 1396 bytes .../data-MAC/flickable-horizontal.4.png | Bin 0 -> 1454 bytes .../data-MAC/flickable-horizontal.qml | 1575 +++++ .../data/flickable-horizontal.0.png | Bin 0 -> 1436 bytes .../data/flickable-horizontal.1.png | Bin 0 -> 1426 bytes .../data/flickable-horizontal.2.png | Bin 0 -> 1429 bytes .../data/flickable-horizontal.3.png | Bin 0 -> 1395 bytes .../data/flickable-horizontal.4.png | Bin 0 -> 1454 bytes .../data/flickable-horizontal.qml | 1575 +++++ .../data/flickable-nested.0.png | Bin 0 -> 1710 bytes .../data/flickable-nested.1.png | Bin 0 -> 1710 bytes .../data/flickable-nested.2.png | Bin 0 -> 1727 bytes .../data/flickable-nested.3.png | Bin 0 -> 1727 bytes .../data/flickable-nested.4.png | Bin 0 -> 1727 bytes .../data/flickable-nested.5.png | Bin 0 -> 1731 bytes .../data/flickable-nested.qml | 2159 +++++++ .../data/flickable-vertical.0.png | Bin 0 -> 1070 bytes .../data/flickable-vertical.1.png | Bin 0 -> 1064 bytes .../data/flickable-vertical.2.png | Bin 0 -> 1079 bytes .../data/flickable-vertical.3.png | Bin 0 -> 1079 bytes .../data/flickable-vertical.4.png | Bin 0 -> 1057 bytes .../data/flickable-vertical.5.png | Bin 0 -> 1080 bytes .../data/flickable-vertical.6.png | Bin 0 -> 1030 bytes .../data/flickable-vertical.7.png | Bin 0 -> 1070 bytes .../data/flickable-vertical.8.png | Bin 0 -> 1055 bytes .../data/flickable-vertical.qml | 3647 ++++++++++++ .../qdeclarativeflickable/flickable-horizontal.qml | 37 + .../qdeclarativeflickable/flickable-nested.qml | 50 + .../qdeclarativeflickable/flickable-vertical.qml | 90 + .../qdeclarativeflipable/data/test-flipable.0.png | Bin 0 -> 942 bytes .../qdeclarativeflipable/data/test-flipable.1.png | Bin 0 -> 1111 bytes .../qdeclarativeflipable/data/test-flipable.2.png | Bin 0 -> 1152 bytes .../qdeclarativeflipable/data/test-flipable.3.png | Bin 0 -> 976 bytes .../qdeclarativeflipable/data/test-flipable.4.png | Bin 0 -> 1096 bytes .../qdeclarativeflipable/data/test-flipable.5.png | Bin 0 -> 1154 bytes .../qdeclarativeflipable/data/test-flipable.6.png | Bin 0 -> 984 bytes .../qdeclarativeflipable/data/test-flipable.qml | 1623 ++++++ .../data/test_flipable_resize.0.png | Bin 0 -> 1649 bytes .../data/test_flipable_resize.qml | 207 + .../qdeclarativeflipable/test-flipable.qml | 79 + .../qdeclarativeflipable/test_flipable_resize.qml | 62 + .../qdeclarativegridview/data/gridview.0.png | Bin 0 -> 1318 bytes .../qdeclarativegridview/data/gridview.1.png | Bin 0 -> 1318 bytes .../qdeclarativegridview/data/gridview.10.png | Bin 0 -> 1318 bytes .../qdeclarativegridview/data/gridview.2.png | Bin 0 -> 1332 bytes .../qdeclarativegridview/data/gridview.3.png | Bin 0 -> 1331 bytes .../qdeclarativegridview/data/gridview.4.png | Bin 0 -> 1321 bytes .../qdeclarativegridview/data/gridview.5.png | Bin 0 -> 1325 bytes .../qdeclarativegridview/data/gridview.6.png | Bin 0 -> 1321 bytes .../qdeclarativegridview/data/gridview.7.png | Bin 0 -> 1341 bytes .../qdeclarativegridview/data/gridview.8.png | Bin 0 -> 1341 bytes .../qdeclarativegridview/data/gridview.9.png | Bin 0 -> 1359 bytes .../qdeclarativegridview/data/gridview.qml | 2859 +++++++++ .../qdeclarativegridview/data/gridview2.0.png | Bin 0 -> 1325 bytes .../qdeclarativegridview/data/gridview2.1.png | Bin 0 -> 1325 bytes .../qdeclarativegridview/data/gridview2.10.png | Bin 0 -> 1313 bytes .../qdeclarativegridview/data/gridview2.2.png | Bin 0 -> 1337 bytes .../qdeclarativegridview/data/gridview2.3.png | Bin 0 -> 1360 bytes .../qdeclarativegridview/data/gridview2.4.png | Bin 0 -> 1406 bytes .../qdeclarativegridview/data/gridview2.5.png | Bin 0 -> 1337 bytes .../qdeclarativegridview/data/gridview2.6.png | Bin 0 -> 1340 bytes .../qdeclarativegridview/data/gridview2.7.png | Bin 0 -> 1327 bytes .../qdeclarativegridview/data/gridview2.8.png | Bin 0 -> 1353 bytes .../qdeclarativegridview/data/gridview2.9.png | Bin 0 -> 1325 bytes .../qdeclarativegridview/data/gridview2.qml | 2479 ++++++++ .../qmlvisual/qdeclarativegridview/gridview.qml | 51 + .../qmlvisual/qdeclarativegridview/gridview2.qml | 62 + .../qdeclarativemousearea/data/drag.0.png | Bin 0 -> 1578 bytes .../qdeclarativemousearea/data/drag.1.png | Bin 0 -> 1578 bytes .../qdeclarativemousearea/data/drag.2.png | Bin 0 -> 1585 bytes .../qdeclarativemousearea/data/drag.3.png | Bin 0 -> 1568 bytes .../qdeclarativemousearea/data/drag.4.png | Bin 0 -> 1578 bytes .../qdeclarativemousearea/data/drag.5.png | Bin 0 -> 1583 bytes .../qdeclarativemousearea/data/drag.6.png | Bin 0 -> 1581 bytes .../qdeclarativemousearea/data/drag.7.png | Bin 0 -> 1582 bytes .../qdeclarativemousearea/data/drag.8.png | Bin 0 -> 1581 bytes .../qmlvisual/qdeclarativemousearea/data/drag.qml | 5207 +++++++++++++++++ .../data/mousearea-flickable.0.png | Bin 0 -> 1701 bytes .../data/mousearea-flickable.1.png | Bin 0 -> 1701 bytes .../data/mousearea-flickable.10.png | Bin 0 -> 1701 bytes .../data/mousearea-flickable.11.png | Bin 0 -> 1721 bytes .../data/mousearea-flickable.12.png | Bin 0 -> 1705 bytes .../data/mousearea-flickable.13.png | Bin 0 -> 1705 bytes .../data/mousearea-flickable.14.png | Bin 0 -> 1701 bytes .../data/mousearea-flickable.2.png | Bin 0 -> 1701 bytes .../data/mousearea-flickable.3.png | Bin 0 -> 1704 bytes .../data/mousearea-flickable.4.png | Bin 0 -> 1704 bytes .../data/mousearea-flickable.5.png | Bin 0 -> 1705 bytes .../data/mousearea-flickable.6.png | Bin 0 -> 1705 bytes .../data/mousearea-flickable.7.png | Bin 0 -> 1701 bytes .../data/mousearea-flickable.8.png | Bin 0 -> 1701 bytes .../data/mousearea-flickable.9.png | Bin 0 -> 1705 bytes .../data/mousearea-flickable.qml | 5127 +++++++++++++++++ .../data/mousearea-visual.0.png | Bin 0 -> 486 bytes .../data/mousearea-visual.1.png | Bin 0 -> 486 bytes .../data/mousearea-visual.10.png | Bin 0 -> 494 bytes .../data/mousearea-visual.11.png | Bin 0 -> 494 bytes .../data/mousearea-visual.12.png | Bin 0 -> 494 bytes .../data/mousearea-visual.13.png | Bin 0 -> 494 bytes .../data/mousearea-visual.14.png | Bin 0 -> 494 bytes .../data/mousearea-visual.15.png | Bin 0 -> 494 bytes .../data/mousearea-visual.2.png | Bin 0 -> 489 bytes .../data/mousearea-visual.3.png | Bin 0 -> 489 bytes .../data/mousearea-visual.4.png | Bin 0 -> 489 bytes .../data/mousearea-visual.5.png | Bin 0 -> 496 bytes .../data/mousearea-visual.6.png | Bin 0 -> 496 bytes .../data/mousearea-visual.7.png | Bin 0 -> 496 bytes .../data/mousearea-visual.8.png | Bin 0 -> 496 bytes .../data/mousearea-visual.9.png | Bin 0 -> 494 bytes .../data/mousearea-visual.qml | 5867 +++++++++++++++++++ .../qdeclarativemousearea/data/mouseregion.0.png | Bin 0 -> 471 bytes .../qdeclarativemousearea/data/mouseregion.1.png | Bin 0 -> 474 bytes .../qdeclarativemousearea/data/mouseregion.10.png | Bin 0 -> 479 bytes .../qdeclarativemousearea/data/mouseregion.11.png | Bin 0 -> 479 bytes .../qdeclarativemousearea/data/mouseregion.12.png | Bin 0 -> 479 bytes .../qdeclarativemousearea/data/mouseregion.13.png | Bin 0 -> 479 bytes .../qdeclarativemousearea/data/mouseregion.14.png | Bin 0 -> 479 bytes .../qdeclarativemousearea/data/mouseregion.15.png | Bin 0 -> 479 bytes .../qdeclarativemousearea/data/mouseregion.16.png | Bin 0 -> 1454 bytes .../qdeclarativemousearea/data/mouseregion.17.png | Bin 0 -> 1454 bytes .../qdeclarativemousearea/data/mouseregion.18.png | Bin 0 -> 1454 bytes .../qdeclarativemousearea/data/mouseregion.19.png | Bin 0 -> 1454 bytes .../qdeclarativemousearea/data/mouseregion.2.png | Bin 0 -> 474 bytes .../qdeclarativemousearea/data/mouseregion.20.png | Bin 0 -> 1454 bytes .../qdeclarativemousearea/data/mouseregion.21.png | Bin 0 -> 1454 bytes .../qdeclarativemousearea/data/mouseregion.22.png | Bin 0 -> 1454 bytes .../qdeclarativemousearea/data/mouseregion.3.png | Bin 0 -> 474 bytes .../qdeclarativemousearea/data/mouseregion.4.png | Bin 0 -> 481 bytes .../qdeclarativemousearea/data/mouseregion.5.png | Bin 0 -> 481 bytes .../qdeclarativemousearea/data/mouseregion.6.png | Bin 0 -> 481 bytes .../qdeclarativemousearea/data/mouseregion.7.png | Bin 0 -> 481 bytes .../qdeclarativemousearea/data/mouseregion.8.png | Bin 0 -> 479 bytes .../qdeclarativemousearea/data/mouseregion.9.png | Bin 0 -> 479 bytes .../qdeclarativemousearea/data/nested.0.png | Bin 0 -> 1360 bytes .../qdeclarativemousearea/data/nested.1.png | Bin 0 -> 1367 bytes .../qdeclarativemousearea/data/nested.2.png | Bin 0 -> 1367 bytes .../qdeclarativemousearea/data/nested.3.png | Bin 0 -> 1372 bytes .../qdeclarativemousearea/data/nested.4.png | Bin 0 -> 1382 bytes .../qdeclarativemousearea/data/nested.5.png | Bin 0 -> 1379 bytes .../qdeclarativemousearea/data/nested.6.png | Bin 0 -> 1390 bytes .../qdeclarativemousearea/data/nested.7.png | Bin 0 -> 1379 bytes .../qdeclarativemousearea/data/nested.8.png | Bin 0 -> 1380 bytes .../qdeclarativemousearea/data/nested.9.png | Bin 0 -> 1379 bytes .../qdeclarativemousearea/data/nested.qml | 5039 ++++++++++++++++ .../qmlvisual/qdeclarativemousearea/drag.qml | 26 + .../qdeclarativemousearea/mousearea-flickable.qml | 52 + .../qdeclarativemousearea/mousearea-visual.qml | 135 + .../qmlvisual/qdeclarativemousearea/nested.qml | 62 + .../qdeclarativeparticles/data/particles.0.png | Bin 0 -> 1055 bytes .../qdeclarativeparticles/data/particles.1.png | Bin 0 -> 10086 bytes .../qdeclarativeparticles/data/particles.2.png | Bin 0 -> 14829 bytes .../qdeclarativeparticles/data/particles.3.png | Bin 0 -> 14095 bytes .../qdeclarativeparticles/data/particles.qml | 775 +++ .../qmlvisual/qdeclarativeparticles/particles.qml | 56 + .../qmlvisual/qdeclarativeparticles/star.png | Bin 0 -> 262 bytes .../data/test-pathview-2.0.png | Bin 0 -> 1114 bytes .../data/test-pathview-2.1.png | Bin 0 -> 1119 bytes .../data/test-pathview-2.2.png | Bin 0 -> 1102 bytes .../data/test-pathview-2.3.png | Bin 0 -> 1092 bytes .../data/test-pathview-2.4.png | Bin 0 -> 1140 bytes .../data/test-pathview-2.5.png | Bin 0 -> 1140 bytes .../qdeclarativepathview/data/test-pathview-2.qml | 1855 ++++++ .../qdeclarativepathview/data/test-pathview.0.png | Bin 0 -> 1169 bytes .../qdeclarativepathview/data/test-pathview.1.png | Bin 0 -> 1172 bytes .../qdeclarativepathview/data/test-pathview.2.png | Bin 0 -> 1201 bytes .../qdeclarativepathview/data/test-pathview.3.png | Bin 0 -> 1164 bytes .../qdeclarativepathview/data/test-pathview.4.png | Bin 0 -> 1227 bytes .../qdeclarativepathview/data/test-pathview.5.png | Bin 0 -> 1184 bytes .../qdeclarativepathview/data/test-pathview.6.png | Bin 0 -> 1189 bytes .../qdeclarativepathview/data/test-pathview.qml | 2567 +++++++++ .../qdeclarativepathview/test-pathview-2.qml | 70 + .../qdeclarativepathview/test-pathview.qml | 70 + .../qdeclarativepositioners/data/dynamic.0.png | Bin 0 -> 263 bytes .../qdeclarativepositioners/data/dynamic.1.png | Bin 0 -> 280 bytes .../qdeclarativepositioners/data/dynamic.2.png | Bin 0 -> 270 bytes .../qdeclarativepositioners/data/dynamic.3.png | Bin 0 -> 280 bytes .../qdeclarativepositioners/data/dynamic.4.png | Bin 0 -> 280 bytes .../qdeclarativepositioners/data/dynamic.5.png | Bin 0 -> 283 bytes .../qdeclarativepositioners/data/dynamic.6.png | Bin 0 -> 281 bytes .../qdeclarativepositioners/data/dynamic.qml | 1603 ++++++ .../data/usingRepeater.0.png | Bin 0 -> 1199 bytes .../qdeclarativepositioners/data/usingRepeater.qml | 135 + .../qmlvisual/qdeclarativepositioners/dynamic.qml | 70 + .../qdeclarativepositioners/usingRepeater.qml | 16 + .../data/smoothedfollow.0.png | Bin 0 -> 1513 bytes .../data/smoothedfollow.1.png | Bin 0 -> 1537 bytes .../data/smoothedfollow.2.png | Bin 0 -> 1537 bytes .../data/smoothedfollow.3.png | Bin 0 -> 1537 bytes .../data/smoothedfollow.qml | 795 +++ .../smoothedfollow.qml | 128 + .../qdeclarativespringanimation/clock.qml | 64 + .../content/background.png | Bin 0 -> 46895 bytes .../qdeclarativespringanimation/content/center.png | Bin 0 -> 765 bytes .../qdeclarativespringanimation/content/clock.png | Bin 0 -> 20653 bytes .../qdeclarativespringanimation/content/hour.png | Bin 0 -> 625 bytes .../qdeclarativespringanimation/content/minute.png | Bin 0 -> 625 bytes .../qdeclarativespringanimation/content/second.png | Bin 0 -> 303 bytes .../data-MAC/follow.0.png | Bin 0 -> 941 bytes .../data-MAC/follow.1.png | Bin 0 -> 975 bytes .../data-MAC/follow.2.png | Bin 0 -> 1235 bytes .../data-MAC/follow.3.png | Bin 0 -> 1225 bytes .../data-MAC/follow.4.png | Bin 0 -> 1247 bytes .../data-MAC/follow.5.png | Bin 0 -> 1243 bytes .../data-MAC/follow.6.png | Bin 0 -> 1234 bytes .../data-MAC/follow.7.png | Bin 0 -> 1242 bytes .../data-MAC/follow.qml | 1763 ++++++ .../data-X11/follow.0.png | Bin 0 -> 950 bytes .../data-X11/follow.1.png | Bin 0 -> 983 bytes .../data-X11/follow.2.png | Bin 0 -> 1243 bytes .../data-X11/follow.3.png | Bin 0 -> 1235 bytes .../data-X11/follow.4.png | Bin 0 -> 1253 bytes .../data-X11/follow.5.png | Bin 0 -> 1249 bytes .../data-X11/follow.6.png | Bin 0 -> 1241 bytes .../data-X11/follow.7.png | Bin 0 -> 1251 bytes .../data-X11/follow.qml | 1763 ++++++ .../qdeclarativespringanimation/data/clock.0.png | Bin 0 -> 16333 bytes .../qdeclarativespringanimation/data/clock.1.png | Bin 0 -> 16437 bytes .../qdeclarativespringanimation/data/clock.2.png | Bin 0 -> 16543 bytes .../qdeclarativespringanimation/data/clock.qml | 615 ++ .../qdeclarativespringanimation/data/follow.0.png | Bin 0 -> 941 bytes .../qdeclarativespringanimation/data/follow.1.png | Bin 0 -> 975 bytes .../qdeclarativespringanimation/data/follow.2.png | Bin 0 -> 1235 bytes .../qdeclarativespringanimation/data/follow.3.png | Bin 0 -> 1225 bytes .../qdeclarativespringanimation/data/follow.4.png | Bin 0 -> 1247 bytes .../qdeclarativespringanimation/data/follow.5.png | Bin 0 -> 1243 bytes .../qdeclarativespringanimation/data/follow.6.png | Bin 0 -> 1234 bytes .../qdeclarativespringanimation/data/follow.7.png | Bin 0 -> 1242 bytes .../qdeclarativespringanimation/data/follow.qml | 1763 ++++++ .../qdeclarativespringanimation/follow.qml | 79 + .../qdeclarativetext/align/data-MAC/justify.0.png | Bin 0 -> 7233 bytes .../qdeclarativetext/align/data-MAC/justify.qml | 11 + .../align/data-MAC/multilineAlign.0.png | Bin 0 -> 2388 bytes .../align/data-MAC/multilineAlign.qml | 247 + .../align/data-X11/multilineAlign.0.png | Bin 0 -> 762 bytes .../align/data-X11/multilineAlign.qml | 247 + .../align/data/multilineAlign.0.png | Bin 0 -> 1895 bytes .../qdeclarativetext/align/data/multilineAlign.qml | 247 + .../qmlvisual/qdeclarativetext/align/justify.qml | 22 + .../qdeclarativetext/align/multilineAlign.qml | 25 + .../baseline/data-MAC/parentanchor.0.png | Bin 0 -> 1392 bytes .../baseline/data-MAC/parentanchor.qml | 131 + .../baseline/data-X11/parentanchor.0.png | Bin 0 -> 1313 bytes .../baseline/data-X11/parentanchor.qml | 131 + .../baseline/data/parentanchor.qml | 131 + .../qdeclarativetext/baseline/parentanchor.qml | 15 + .../qdeclarativetext/bugs/QTBUG-14469.qml | 23 + .../bugs/data-MAC/QTBUG-14469.0.png | Bin 0 -> 210 bytes .../bugs/data-MAC/QTBUG-14469.1.png | Bin 0 -> 270 bytes .../qdeclarativetext/bugs/data-MAC/QTBUG-14469.qml | 475 ++ .../bugs/data-X11/QTBUG-14469.0.png | Bin 0 -> 210 bytes .../qdeclarativetext/bugs/data-X11/QTBUG-14469.qml | 475 ++ .../qdeclarativetext/bugs/data/QTBUG-14469.0.png | Bin 0 -> 422 bytes .../qdeclarativetext/bugs/data/QTBUG-14469.qml | 475 ++ .../qdeclarativetext/data-MAC/qtbug_14865.0.png | Bin 0 -> 1640 bytes .../qdeclarativetext/data-MAC/qtbug_14865.1.png | Bin 0 -> 625 bytes .../qdeclarativetext/data-MAC/qtbug_14865.qml | 447 ++ .../qdeclarativetext/data-X11/qtbug_14865.0.png | Bin 0 -> 303 bytes .../qdeclarativetext/data-X11/qtbug_14865.1.png | Bin 0 -> 303 bytes .../qdeclarativetext/data-X11/qtbug_14865.qml | 447 ++ .../qdeclarativetext/data/qtbug_14865.0.png | Bin 0 -> 1400 bytes .../qdeclarativetext/data/qtbug_14865.qml | 447 ++ .../qdeclarativetext/elide/data-MAC/elide.0.png | Bin 0 -> 491 bytes .../qdeclarativetext/elide/data-MAC/elide.1.png | Bin 0 -> 491 bytes .../qdeclarativetext/elide/data-MAC/elide.qml | 279 + .../qdeclarativetext/elide/data-MAC/elide2.0.png | Bin 0 -> 1240 bytes .../qdeclarativetext/elide/data-MAC/elide2.1.png | Bin 0 -> 1106 bytes .../qdeclarativetext/elide/data-MAC/elide2.2.png | Bin 0 -> 999 bytes .../qdeclarativetext/elide/data-MAC/elide2.3.png | Bin 0 -> 864 bytes .../qdeclarativetext/elide/data-MAC/elide2.4.png | Bin 0 -> 703 bytes .../qdeclarativetext/elide/data-MAC/elide2.qml | 991 ++++ .../elide/data-MAC/multilength.0.png | Bin 0 -> 791 bytes .../elide/data-MAC/multilength.1.png | Bin 0 -> 854 bytes .../elide/data-MAC/multilength.qml | 303 + .../qdeclarativetext/elide/data-X11/elide.0.png | Bin 0 -> 581 bytes .../qdeclarativetext/elide/data-X11/elide.1.png | Bin 0 -> 483 bytes .../qdeclarativetext/elide/data-X11/elide.qml | 279 + .../qdeclarativetext/elide/data-X11/elide2.0.png | Bin 0 -> 1189 bytes .../qdeclarativetext/elide/data-X11/elide2.1.png | Bin 0 -> 1068 bytes .../qdeclarativetext/elide/data-X11/elide2.2.png | Bin 0 -> 948 bytes .../qdeclarativetext/elide/data-X11/elide2.3.png | Bin 0 -> 819 bytes .../qdeclarativetext/elide/data-X11/elide2.4.png | Bin 0 -> 682 bytes .../qdeclarativetext/elide/data-X11/elide2.qml | 991 ++++ .../elide/data-X11/multilength.0.png | Bin 0 -> 903 bytes .../elide/data-X11/multilength.1.png | Bin 0 -> 814 bytes .../elide/data-X11/multilength.2.png | Bin 0 -> 809 bytes .../elide/data-X11/multilength.3.png | Bin 0 -> 527 bytes .../elide/data-X11/multilength.4.png | Bin 0 -> 526 bytes .../elide/data-X11/multilength.5.png | Bin 0 -> 399 bytes .../elide/data-X11/multilength.qml | 1323 +++++ .../qmlvisual/qdeclarativetext/elide/elide.qml | 32 + .../qmlvisual/qdeclarativetext/elide/elide2.qml | 13 + .../qdeclarativetext/elide/multilength.qml | 20 + .../qdeclarativetext/font/BorderedText.qml | 9 + .../qdeclarativetext/font/data-MAC/plaintext.0.png | Bin 0 -> 14238 bytes .../qdeclarativetext/font/data-MAC/plaintext.qml | 11 + .../font/data-MAC/plaintext2.0.png | Bin 0 -> 3481 bytes .../qdeclarativetext/font/data-MAC/plaintext2.qml | 11 + .../font/data-MAC/plaintext3.0.png | Bin 0 -> 53503 bytes .../qdeclarativetext/font/data-MAC/plaintext3.qml | 11 + .../qdeclarativetext/font/data-MAC/richtext.0.png | Bin 0 -> 9321 bytes .../qdeclarativetext/font/data-MAC/richtext.qml | 11 + .../qdeclarativetext/font/data-MAC/richtext2.0.png | Bin 0 -> 10663 bytes .../qdeclarativetext/font/data-MAC/richtext2.qml | 11 + .../qdeclarativetext/font/data-X11/plaintext.0.png | Bin 0 -> 13140 bytes .../qdeclarativetext/font/data-X11/plaintext.qml | 11 + .../font/data-X11/plaintext2.0.png | Bin 0 -> 1503 bytes .../qdeclarativetext/font/data-X11/plaintext2.qml | 11 + .../font/data-X11/plaintext3.0.png | Bin 0 -> 6368 bytes .../qdeclarativetext/font/data-X11/plaintext3.qml | 11 + .../qdeclarativetext/font/data-X11/richtext.0.png | Bin 0 -> 9297 bytes .../qdeclarativetext/font/data-X11/richtext.qml | 11 + .../qdeclarativetext/font/data-X11/richtext2.0.png | Bin 0 -> 10626 bytes .../qdeclarativetext/font/data-X11/richtext2.qml | 11 + .../qdeclarativetext/font/data/plaintext.0.png | Bin 0 -> 77181 bytes .../qdeclarativetext/font/data/plaintext.qml | 11 + .../qdeclarativetext/font/data/plaintext2.0.png | Bin 0 -> 2778 bytes .../qdeclarativetext/font/data/plaintext2.qml | 11 + .../qdeclarativetext/font/data/plaintext3.0.png | Bin 0 -> 53503 bytes .../qdeclarativetext/font/data/plaintext3.qml | 11 + .../qdeclarativetext/font/data/richtext.0.png | Bin 0 -> 103375 bytes .../qdeclarativetext/font/data/richtext.qml | 11 + .../qdeclarativetext/font/data/richtext2.0.png | Bin 0 -> 10671 bytes .../qdeclarativetext/font/data/richtext2.qml | 11 + .../qmlvisual/qdeclarativetext/font/plaintext.qml | 101 + .../qmlvisual/qdeclarativetext/font/plaintext2.qml | 23 + .../qmlvisual/qdeclarativetext/font/plaintext3.qml | 62 + .../qmlvisual/qdeclarativetext/font/richtext.qml | 47 + .../qmlvisual/qdeclarativetext/font/richtext2.qml | 43 + .../maximumLineCount/data-X11/newLines.0.png | Bin 0 -> 343 bytes .../maximumLineCount/data-X11/newLines.qml | 11 + .../maximumLineCount/data-X11/newLines_wrap.0.png | Bin 0 -> 465 bytes .../maximumLineCount/data-X11/newLines_wrap.qml | 11 + .../data-X11/newLines_wrap_elide.0.png | Bin 0 -> 469 bytes .../data-X11/newLines_wrap_elide.qml | 11 + .../maximumLineCount/data-X11/wrap.0.png | Bin 0 -> 557 bytes .../maximumLineCount/data-X11/wrap.qml | 11 + .../maximumLineCount/data-X11/wrap_elide.0.png | Bin 0 -> 537 bytes .../maximumLineCount/data-X11/wrap_elide.qml | 11 + .../maximumLineCount/data/newLines.0.png | Bin 0 -> 343 bytes .../maximumLineCount/data/newLines.qml | 11 + .../maximumLineCount/data/newLines_wrap.0.png | Bin 0 -> 465 bytes .../maximumLineCount/data/newLines_wrap.qml | 11 + .../data/newLines_wrap_elide.0.png | Bin 0 -> 469 bytes .../maximumLineCount/data/newLines_wrap_elide.qml | 11 + .../maximumLineCount/data/wrap.0.png | Bin 0 -> 557 bytes .../maximumLineCount/data/wrap.qml | 11 + .../maximumLineCount/data/wrap_elide.0.png | Bin 0 -> 537 bytes .../maximumLineCount/data/wrap_elide.qml | 11 + .../qdeclarativetext/maximumLineCount/newLines.qml | 13 + .../maximumLineCount/newLines_wrap.qml | 14 + .../maximumLineCount/newLines_wrap_elide.qml | 15 + .../qdeclarativetext/maximumLineCount/wrap.qml | 14 + .../maximumLineCount/wrap_elide.qml | 15 + .../qmlvisual/qdeclarativetext/qtbug_14865.qml | 18 + .../qdeclarativetextedit/MultilineEdit.qml | 76 + .../qdeclarativetextedit/cursorDelegate.qml | 36 + .../data-MAC/cursorDelegate.0.png | Bin 0 -> 1177 bytes .../data-MAC/cursorDelegate.1.png | Bin 0 -> 1254 bytes .../data-MAC/cursorDelegate.2.png | Bin 0 -> 1199 bytes .../data-MAC/cursorDelegate.3.png | Bin 0 -> 1198 bytes .../data-MAC/cursorDelegate.4.png | Bin 0 -> 1195 bytes .../data-MAC/cursorDelegate.5.png | Bin 0 -> 1197 bytes .../data-MAC/cursorDelegate.6.png | Bin 0 -> 3145 bytes .../data-MAC/cursorDelegate.7.png | Bin 0 -> 3146 bytes .../data-MAC/cursorDelegate.8.png | Bin 0 -> 3144 bytes .../data-MAC/cursorDelegate.9.png | Bin 0 -> 3135 bytes .../data-MAC/cursorDelegate.qml | 1499 +++++ .../qdeclarativetextedit/data-MAC/justify.0.png | Bin 0 -> 7233 bytes .../qdeclarativetextedit/data-MAC/justify.qml | 11 + .../qdeclarativetextedit/data-MAC/qt-669.0.png | Bin 0 -> 737 bytes .../qdeclarativetextedit/data-MAC/qt-669.1.png | Bin 0 -> 740 bytes .../qdeclarativetextedit/data-MAC/qt-669.2.png | Bin 0 -> 746 bytes .../qdeclarativetextedit/data-MAC/qt-669.3.png | Bin 0 -> 739 bytes .../qdeclarativetextedit/data-MAC/qt-669.4.png | Bin 0 -> 737 bytes .../qdeclarativetextedit/data-MAC/qt-669.qml | 1371 +++++ .../data-MAC/usingMultilineEdit.0.png | Bin 0 -> 5123 bytes .../data-MAC/usingMultilineEdit.1.png | Bin 0 -> 5500 bytes .../data-MAC/usingMultilineEdit.10.png | Bin 0 -> 8641 bytes .../data-MAC/usingMultilineEdit.11.png | Bin 0 -> 8641 bytes .../data-MAC/usingMultilineEdit.12.png | Bin 0 -> 2037 bytes .../data-MAC/usingMultilineEdit.2.png | Bin 0 -> 6163 bytes .../data-MAC/usingMultilineEdit.3.png | Bin 0 -> 6785 bytes .../data-MAC/usingMultilineEdit.4.png | Bin 0 -> 6943 bytes .../data-MAC/usingMultilineEdit.5.png | Bin 0 -> 7043 bytes .../data-MAC/usingMultilineEdit.6.png | Bin 0 -> 7428 bytes .../data-MAC/usingMultilineEdit.7.png | Bin 0 -> 6860 bytes .../data-MAC/usingMultilineEdit.8.png | Bin 0 -> 8659 bytes .../data-MAC/usingMultilineEdit.9.png | Bin 0 -> 8641 bytes .../data-MAC/usingMultilineEdit.qml | 4687 +++++++++++++++ .../qdeclarativetextedit/data-MAC/wrap.0.png | Bin 0 -> 11626 bytes .../qdeclarativetextedit/data-MAC/wrap.1.png | Bin 0 -> 11869 bytes .../qdeclarativetextedit/data-MAC/wrap.2.png | Bin 0 -> 12264 bytes .../qdeclarativetextedit/data-MAC/wrap.3.png | Bin 0 -> 12607 bytes .../qdeclarativetextedit/data-MAC/wrap.4.png | Bin 0 -> 13243 bytes .../qdeclarativetextedit/data-MAC/wrap.5.png | Bin 0 -> 13260 bytes .../qdeclarativetextedit/data-MAC/wrap.6.png | Bin 0 -> 13260 bytes .../qdeclarativetextedit/data-MAC/wrap.7.png | Bin 0 -> 4238 bytes .../qdeclarativetextedit/data-MAC/wrap.qml | 2467 ++++++++ .../data-X11/cursorDelegate.0.png | Bin 0 -> 1173 bytes .../data-X11/cursorDelegate.1.png | Bin 0 -> 1249 bytes .../data-X11/cursorDelegate.2.png | Bin 0 -> 1331 bytes .../data-X11/cursorDelegate.3.png | Bin 0 -> 1212 bytes .../data-X11/cursorDelegate.4.png | Bin 0 -> 1208 bytes .../data-X11/cursorDelegate.5.png | Bin 0 -> 1213 bytes .../data-X11/cursorDelegate.6.png | Bin 0 -> 3145 bytes .../data-X11/cursorDelegate.7.png | Bin 0 -> 3146 bytes .../data-X11/cursorDelegate.8.png | Bin 0 -> 3144 bytes .../data-X11/cursorDelegate.9.png | Bin 0 -> 3135 bytes .../data-X11/cursorDelegate.qml | 1499 +++++ .../data-X11/linkActivated.0.png | Bin 0 -> 609 bytes .../data-X11/linkActivated.1.png | Bin 0 -> 677 bytes .../data-X11/linkActivated.qml | 191 + .../qdeclarativetextedit/data-X11/qt-669.0.png | Bin 0 -> 688 bytes .../qdeclarativetextedit/data-X11/qt-669.1.png | Bin 0 -> 693 bytes .../qdeclarativetextedit/data-X11/qt-669.2.png | Bin 0 -> 695 bytes .../qdeclarativetextedit/data-X11/qt-669.3.png | Bin 0 -> 694 bytes .../qdeclarativetextedit/data-X11/qt-669.4.png | Bin 0 -> 688 bytes .../qdeclarativetextedit/data-X11/qt-669.qml | 1371 +++++ .../data-X11/usingMultilineEdit.0.png | Bin 0 -> 1357 bytes .../data-X11/usingMultilineEdit.1.png | Bin 0 -> 1371 bytes .../data-X11/usingMultilineEdit.10.png | Bin 0 -> 2020 bytes .../data-X11/usingMultilineEdit.11.png | Bin 0 -> 2020 bytes .../data-X11/usingMultilineEdit.12.png | Bin 0 -> 2020 bytes .../data-X11/usingMultilineEdit.2.png | Bin 0 -> 1451 bytes .../data-X11/usingMultilineEdit.3.png | Bin 0 -> 1565 bytes .../data-X11/usingMultilineEdit.4.png | Bin 0 -> 1691 bytes .../data-X11/usingMultilineEdit.5.png | Bin 0 -> 1763 bytes .../data-X11/usingMultilineEdit.6.png | Bin 0 -> 1779 bytes .../data-X11/usingMultilineEdit.7.png | Bin 0 -> 1836 bytes .../data-X11/usingMultilineEdit.8.png | Bin 0 -> 1825 bytes .../data-X11/usingMultilineEdit.9.png | Bin 0 -> 2008 bytes .../data-X11/usingMultilineEdit.qml | 4687 +++++++++++++++ .../qdeclarativetextedit/data-X11/wrap.0.png | Bin 0 -> 3481 bytes .../qdeclarativetextedit/data-X11/wrap.1.png | Bin 0 -> 3606 bytes .../qdeclarativetextedit/data-X11/wrap.2.png | Bin 0 -> 3676 bytes .../qdeclarativetextedit/data-X11/wrap.3.png | Bin 0 -> 3754 bytes .../qdeclarativetextedit/data-X11/wrap.4.png | Bin 0 -> 3828 bytes .../qdeclarativetextedit/data-X11/wrap.5.png | Bin 0 -> 3927 bytes .../qdeclarativetextedit/data-X11/wrap.6.png | Bin 0 -> 3930 bytes .../qdeclarativetextedit/data-X11/wrap.7.png | Bin 0 -> 3943 bytes .../qdeclarativetextedit/data-X11/wrap.qml | 2467 ++++++++ .../qdeclarativetextedit/data/cursorDelegate.0.png | Bin 0 -> 3171 bytes .../qdeclarativetextedit/data/cursorDelegate.1.png | Bin 0 -> 3603 bytes .../qdeclarativetextedit/data/cursorDelegate.2.png | Bin 0 -> 3152 bytes .../qdeclarativetextedit/data/cursorDelegate.3.png | Bin 0 -> 3147 bytes .../qdeclarativetextedit/data/cursorDelegate.4.png | Bin 0 -> 3145 bytes .../qdeclarativetextedit/data/cursorDelegate.5.png | Bin 0 -> 3147 bytes .../qdeclarativetextedit/data/cursorDelegate.6.png | Bin 0 -> 3145 bytes .../qdeclarativetextedit/data/cursorDelegate.7.png | Bin 0 -> 3146 bytes .../qdeclarativetextedit/data/cursorDelegate.8.png | Bin 0 -> 3144 bytes .../qdeclarativetextedit/data/cursorDelegate.9.png | Bin 0 -> 3135 bytes .../qdeclarativetextedit/data/cursorDelegate.qml | 1499 +++++ .../qdeclarativetextedit/data/flickableEdit.0.png | Bin 0 -> 850 bytes .../qdeclarativetextedit/data/flickableEdit.1.png | Bin 0 -> 859 bytes .../qdeclarativetextedit/data/flickableEdit.2.png | Bin 0 -> 1049 bytes .../qdeclarativetextedit/data/flickableEdit.3.png | Bin 0 -> 1051 bytes .../qdeclarativetextedit/data/flickableEdit.4.png | Bin 0 -> 698 bytes .../qdeclarativetextedit/data/flickableEdit.5.png | Bin 0 -> 698 bytes .../qdeclarativetextedit/data/flickableEdit.6.png | Bin 0 -> 1063 bytes .../qdeclarativetextedit/data/flickableEdit.qml | 3551 ++++++++++++ .../qdeclarativetextedit/data/linkActivated.0.png | Bin 0 -> 609 bytes .../qdeclarativetextedit/data/linkActivated.1.png | Bin 0 -> 677 bytes .../qdeclarativetextedit/data/linkActivated.qml | 191 + .../qdeclarativetextedit/data/qt-669.0.png | Bin 0 -> 4802 bytes .../qdeclarativetextedit/data/qt-669.1.png | Bin 0 -> 4804 bytes .../qdeclarativetextedit/data/qt-669.2.png | Bin 0 -> 4801 bytes .../qdeclarativetextedit/data/qt-669.3.png | Bin 0 -> 4791 bytes .../qmlvisual/qdeclarativetextedit/data/qt-669.qml | 1371 +++++ .../data/usingMultilineEdit.0.png | Bin 0 -> 4006 bytes .../data/usingMultilineEdit.1.png | Bin 0 -> 4293 bytes .../data/usingMultilineEdit.10.png | Bin 0 -> 6074 bytes .../data/usingMultilineEdit.11.png | Bin 0 -> 6074 bytes .../data/usingMultilineEdit.2.png | Bin 0 -> 4683 bytes .../data/usingMultilineEdit.3.png | Bin 0 -> 5114 bytes .../data/usingMultilineEdit.4.png | Bin 0 -> 5270 bytes .../data/usingMultilineEdit.5.png | Bin 0 -> 5401 bytes .../data/usingMultilineEdit.6.png | Bin 0 -> 5591 bytes .../data/usingMultilineEdit.7.png | Bin 0 -> 5261 bytes .../data/usingMultilineEdit.8.png | Bin 0 -> 6072 bytes .../data/usingMultilineEdit.9.png | Bin 0 -> 6074 bytes .../data/usingMultilineEdit.qml | 4687 +++++++++++++++ .../qmlvisual/qdeclarativetextedit/data/wrap.0.png | Bin 0 -> 1110 bytes .../qmlvisual/qdeclarativetextedit/data/wrap.1.png | Bin 0 -> 1110 bytes .../qmlvisual/qdeclarativetextedit/data/wrap.2.png | Bin 0 -> 1110 bytes .../qmlvisual/qdeclarativetextedit/data/wrap.3.png | Bin 0 -> 1110 bytes .../qmlvisual/qdeclarativetextedit/data/wrap.4.png | Bin 0 -> 1110 bytes .../qmlvisual/qdeclarativetextedit/data/wrap.5.png | Bin 0 -> 1110 bytes .../qmlvisual/qdeclarativetextedit/data/wrap.6.png | Bin 0 -> 1110 bytes .../qmlvisual/qdeclarativetextedit/data/wrap.qml | 2467 ++++++++ .../qdeclarativetextedit/flickableEdit.qml | 20 + .../qmlvisual/qdeclarativetextedit/justify.qml | 22 + .../qdeclarativetextedit/linkActivated.qml | 15 + .../qmlvisual/qdeclarativetextedit/qt-669.qml | 19 + .../qdeclarativetextedit/usingMultilineEdit.qml | 14 + .../qmlvisual/qdeclarativetextedit/wrap.qml | 35 + .../qmlvisual/qdeclarativetextinput/LineEdit.qml | 69 + .../qdeclarativetextinput/cursorDelegate.qml | 37 + .../data-MAC/cursorDelegate.0.png | Bin 0 -> 1177 bytes .../data-MAC/cursorDelegate.1.png | Bin 0 -> 1148 bytes .../data-MAC/cursorDelegate.2.png | Bin 0 -> 1312 bytes .../data-MAC/cursorDelegate.3.png | Bin 0 -> 1256 bytes .../data-MAC/cursorDelegate.4.png | Bin 0 -> 1197 bytes .../data-MAC/cursorDelegate.5.png | Bin 0 -> 1197 bytes .../data-MAC/cursorDelegate.6.png | Bin 0 -> 801 bytes .../data-MAC/cursorDelegate.7.png | Bin 0 -> 802 bytes .../data-MAC/cursorDelegate.8.png | Bin 0 -> 802 bytes .../data-MAC/cursorDelegate.qml | 1551 +++++ .../qdeclarativetextinput/data-MAC/echoMode.0.png | Bin 0 -> 703 bytes .../qdeclarativetextinput/data-MAC/echoMode.1.png | Bin 0 -> 1360 bytes .../qdeclarativetextinput/data-MAC/echoMode.2.png | Bin 0 -> 2031 bytes .../qdeclarativetextinput/data-MAC/echoMode.3.png | Bin 0 -> 539 bytes .../qdeclarativetextinput/data-MAC/echoMode.qml | 1043 ++++ .../qdeclarativetextinput/data-MAC/hAlign.0.png | Bin 0 -> 3987 bytes .../qdeclarativetextinput/data-MAC/hAlign.qml | 107 + .../data-MAC/usingLineEdit.0.png | Bin 0 -> 1254 bytes .../data-MAC/usingLineEdit.1.png | Bin 0 -> 1328 bytes .../data-MAC/usingLineEdit.10.png | Bin 0 -> 1345 bytes .../data-MAC/usingLineEdit.11.png | Bin 0 -> 1433 bytes .../data-MAC/usingLineEdit.2.png | Bin 0 -> 1328 bytes .../data-MAC/usingLineEdit.3.png | Bin 0 -> 1328 bytes .../data-MAC/usingLineEdit.4.png | Bin 0 -> 1316 bytes .../data-MAC/usingLineEdit.5.png | Bin 0 -> 1318 bytes .../data-MAC/usingLineEdit.6.png | Bin 0 -> 1321 bytes .../data-MAC/usingLineEdit.7.png | Bin 0 -> 1316 bytes .../data-MAC/usingLineEdit.8.png | Bin 0 -> 1362 bytes .../data-MAC/usingLineEdit.9.png | Bin 0 -> 1423 bytes .../data-MAC/usingLineEdit.qml | 4335 ++++++++++++++ .../data-X11/cursorDelegate.0.png | Bin 0 -> 1173 bytes .../data-X11/cursorDelegate.1.png | Bin 0 -> 1143 bytes .../data-X11/cursorDelegate.2.png | Bin 0 -> 1312 bytes .../data-X11/cursorDelegate.3.png | Bin 0 -> 1250 bytes .../data-X11/cursorDelegate.4.png | Bin 0 -> 1193 bytes .../data-X11/cursorDelegate.5.png | Bin 0 -> 1193 bytes .../data-X11/cursorDelegate.qml | 1551 +++++ .../qdeclarativetextinput/data-X11/echoMode.0.png | Bin 0 -> 358 bytes .../qdeclarativetextinput/data-X11/echoMode.1.png | Bin 0 -> 446 bytes .../qdeclarativetextinput/data-X11/echoMode.2.png | Bin 0 -> 553 bytes .../qdeclarativetextinput/data-X11/echoMode.3.png | Bin 0 -> 622 bytes .../qdeclarativetextinput/data-X11/echoMode.qml | 1043 ++++ .../qdeclarativetextinput/data-X11/hAlign.0.png | Bin 0 -> 3685 bytes .../qdeclarativetextinput/data-X11/hAlign.qml | 107 + .../data-X11/qtbug-15818.0.png | Bin 0 -> 573 bytes .../data-X11/qtbug-15818.1.png | Bin 0 -> 573 bytes .../data-X11/qtbug-15818.2.png | Bin 0 -> 573 bytes .../data-X11/qtbug-15818.3.png | Bin 0 -> 647 bytes .../data-X11/qtbug-15818.4.png | Bin 0 -> 647 bytes .../data-X11/qtbug-15818.5.png | Bin 0 -> 625 bytes .../qdeclarativetextinput/data-X11/qtbug-15818.qml | 1039 ++++ .../data-X11/usingLineEdit.0.png | Bin 0 -> 1265 bytes .../data-X11/usingLineEdit.1.png | Bin 0 -> 1337 bytes .../data-X11/usingLineEdit.10.png | Bin 0 -> 1389 bytes .../data-X11/usingLineEdit.11.png | Bin 0 -> 1455 bytes .../data-X11/usingLineEdit.2.png | Bin 0 -> 1337 bytes .../data-X11/usingLineEdit.3.png | Bin 0 -> 1279 bytes .../data-X11/usingLineEdit.4.png | Bin 0 -> 1368 bytes .../data-X11/usingLineEdit.5.png | Bin 0 -> 1367 bytes .../data-X11/usingLineEdit.6.png | Bin 0 -> 1377 bytes .../data-X11/usingLineEdit.7.png | Bin 0 -> 1368 bytes .../data-X11/usingLineEdit.8.png | Bin 0 -> 1384 bytes .../data-X11/usingLineEdit.9.png | Bin 0 -> 1471 bytes .../data-X11/usingLineEdit.qml | 4335 ++++++++++++++ .../qdeclarativetextinput/data/cursorDelegate.qml | 1551 +++++ .../qdeclarativetextinput/data/echoMode.qml | 1043 ++++ .../data/flickableInput.0.png | Bin 0 -> 850 bytes .../data/flickableInput.1.png | Bin 0 -> 1037 bytes .../data/flickableInput.2.png | Bin 0 -> 1042 bytes .../data/flickableInput.3.png | Bin 0 -> 850 bytes .../data/flickableInput.4.png | Bin 0 -> 850 bytes .../data/flickableInput.5.png | Bin 0 -> 632 bytes .../data/flickableInput.6.png | Bin 0 -> 830 bytes .../data/flickableInput.7.png | Bin 0 -> 849 bytes .../qdeclarativetextinput/data/flickableInput.qml | 3279 +++++++++++ .../qdeclarativetextinput/data/hAlign.qml | 107 + .../qmlvisual/qdeclarativetextinput/echoMode.qml | 11 + .../qdeclarativetextinput/flickableInput.qml | 21 + .../qmlvisual/qdeclarativetextinput/hAlign.qml | 41 + .../qdeclarativetextinput/qtbug-15818.qml | 13 + .../qdeclarativetextinput/usingLineEdit.qml | 10 + tests/auto/declarative/qmlvisual/qmlvisual.pro | 37 + .../declarative/qmlvisual/rect/GradientRect.qml | 25 + tests/auto/declarative/qmlvisual/rect/MyRect.qml | 21 + .../qmlvisual/rect/data/GradientRect.0.png | Bin 0 -> 248 bytes .../qmlvisual/rect/data/GradientRect.qml | 11 + .../declarative/qmlvisual/rect/data/MyRect.0.png | Bin 0 -> 135 bytes .../declarative/qmlvisual/rect/data/MyRect.qml | 11 + .../qmlvisual/rect/data/rect-painting.0.png | Bin 0 -> 15366 bytes .../qmlvisual/rect/data/rect-painting.qml | 11 + .../declarative/qmlvisual/rect/rect-painting.qml | 55 + .../auto/declarative/qmlvisual/repeater/basic1.qml | 31 + .../auto/declarative/qmlvisual/repeater/basic2.qml | 35 + .../auto/declarative/qmlvisual/repeater/basic3.qml | 33 + .../auto/declarative/qmlvisual/repeater/basic4.qml | 37 + .../qmlvisual/repeater/data/basic1.0.png | Bin 0 -> 707 bytes .../declarative/qmlvisual/repeater/data/basic1.qml | 11 + .../qmlvisual/repeater/data/basic2.0.png | Bin 0 -> 707 bytes .../declarative/qmlvisual/repeater/data/basic2.qml | 11 + .../qmlvisual/repeater/data/basic3.0.png | Bin 0 -> 707 bytes .../declarative/qmlvisual/repeater/data/basic3.qml | 11 + .../qmlvisual/repeater/data/basic4.0.png | Bin 0 -> 707 bytes .../declarative/qmlvisual/repeater/data/basic4.qml | 11 + .../selftest_noimages/data/selftest_noimages.qml | 356 ++ .../selftest_noimages/selftest_noimages.qml | 9 + .../qmlvisual/shared/DejaVuSansMono.ttf | Bin 0 -> 237788 bytes tests/auto/declarative/qmlvisual/shared/README | 7 + .../auto/declarative/qmlvisual/shared/TestText.qml | 8 + .../declarative/qmlvisual/shared/TestTextEdit.qml | 14 + .../declarative/qmlvisual/shared/TestTextInput.qml | 14 + tests/auto/declarative/qmlvisual/shared/qmldir | 3 + tests/auto/declarative/qmlvisual/tst_qmlvisual.cpp | 422 ++ .../qmlvisual/webview/autosize/autosize.qml | 62 + .../webview/autosize/data-X11/autosize.0.png | Bin 0 -> 10185 bytes .../webview/autosize/data-X11/autosize.1.png | Bin 0 -> 10185 bytes .../webview/autosize/data-X11/autosize.2.png | Bin 0 -> 10185 bytes .../webview/autosize/data-X11/autosize.3.png | Bin 0 -> 10185 bytes .../webview/autosize/data-X11/autosize.4.png | Bin 0 -> 10185 bytes .../qmlvisual/webview/autosize/data/autosize.0.png | Bin 0 -> 10185 bytes .../qmlvisual/webview/autosize/data/autosize.1.png | Bin 0 -> 10185 bytes .../qmlvisual/webview/autosize/data/autosize.2.png | Bin 0 -> 10185 bytes .../qmlvisual/webview/autosize/data/autosize.3.png | Bin 0 -> 10185 bytes .../qmlvisual/webview/autosize/data/autosize.4.png | Bin 0 -> 10185 bytes .../qmlvisual/webview/autosize/data/autosize.qml | 115 + .../webview/flickable/data/flickweb.0.png | Bin 0 -> 2812 bytes .../webview/flickable/data/flickweb.1.png | Bin 0 -> 2812 bytes .../webview/flickable/data/flickweb.10.png | Bin 0 -> 2829 bytes .../webview/flickable/data/flickweb.2.png | Bin 0 -> 3466 bytes .../webview/flickable/data/flickweb.3.png | Bin 0 -> 2812 bytes .../webview/flickable/data/flickweb.4.png | Bin 0 -> 2829 bytes .../webview/flickable/data/flickweb.5.png | Bin 0 -> 2829 bytes .../webview/flickable/data/flickweb.6.png | Bin 0 -> 2768 bytes .../webview/flickable/data/flickweb.7.png | Bin 0 -> 2829 bytes .../webview/flickable/data/flickweb.8.png | Bin 0 -> 2829 bytes .../webview/flickable/data/flickweb.9.png | Bin 0 -> 2829 bytes .../qmlvisual/webview/flickable/data/flickweb.qml | 6083 ++++++++++++++++++++ .../qmlvisual/webview/flickable/flickweb.qml | 35 + .../qmlvisual/webview/flickable/qtlogo.png | Bin 0 -> 2738 bytes .../qmlvisual/webview/flickable/test.html | 3 + .../javascript/data/evaluateJavaScript.0.png | Bin 0 -> 7999 bytes .../javascript/data/evaluateJavaScript.1.png | Bin 0 -> 8020 bytes .../javascript/data/evaluateJavaScript.2.png | Bin 0 -> 8143 bytes .../javascript/data/evaluateJavaScript.3.png | Bin 0 -> 8158 bytes .../javascript/data/evaluateJavaScript.4.png | Bin 0 -> 8284 bytes .../javascript/data/evaluateJavaScript.5.png | Bin 0 -> 8284 bytes .../javascript/data/evaluateJavaScript.6.png | Bin 0 -> 8284 bytes .../javascript/data/evaluateJavaScript.7.png | Bin 0 -> 8284 bytes .../javascript/data/evaluateJavaScript.8.png | Bin 0 -> 8284 bytes .../webview/javascript/data/evaluateJavaScript.qml | 3759 ++++++++++++ .../webview/javascript/data/windowObjects.0.png | Bin 0 -> 7991 bytes .../webview/javascript/data/windowObjects.1.png | Bin 0 -> 7991 bytes .../webview/javascript/data/windowObjects.2.png | Bin 0 -> 7643 bytes .../webview/javascript/data/windowObjects.3.png | Bin 0 -> 7733 bytes .../webview/javascript/data/windowObjects.4.png | Bin 0 -> 8116 bytes .../webview/javascript/data/windowObjects.qml | 2643 +++++++++ .../webview/javascript/evaluateJavaScript.qml | 33 + .../qmlvisual/webview/javascript/test-objects.html | 12 + .../qmlvisual/webview/javascript/windowObjects.qml | 28 + .../webview/settings/data/fontFamily.0.png | Bin 0 -> 3774 bytes .../qmlvisual/webview/settings/data/fontFamily.qml | 395 ++ .../qmlvisual/webview/settings/data/fontSize.0.png | Bin 0 -> 32180 bytes .../qmlvisual/webview/settings/data/fontSize.qml | 339 ++ .../webview/settings/data/noAutoLoadImages.0.png | Bin 0 -> 6609 bytes .../webview/settings/data/noAutoLoadImages.1.png | Bin 0 -> 6609 bytes .../webview/settings/data/noAutoLoadImages.qml | 595 ++ .../webview/settings/data/setFontFamily.0.png | Bin 0 -> 12132 bytes .../webview/settings/data/setFontFamily.qml | 351 ++ .../qmlvisual/webview/settings/fontFamily.qml | 18 + .../qmlvisual/webview/settings/fontSize.qml | 72 + .../webview/settings/noAutoLoadImages.qml | 22 + .../qmlvisual/webview/settings/qtlogo.png | Bin 0 -> 2738 bytes .../qmlvisual/webview/settings/setFontFamily.qml | 12 + .../qmlvisual/webview/settings/tarzeau_ocr_a.ttf | Bin 0 -> 24544 bytes .../qmlvisual/webview/settings/test-img.html | 6 + .../qmlvisual/webview/settings/test.html | 9 + .../qmlvisual/webview/zooming/data/pageWidth.qml | 227 + .../webview/zooming/data/renderControl.0.png | Bin 0 -> 7589 bytes .../webview/zooming/data/renderControl.qml | 415 ++ .../webview/zooming/data/resolution.0.png | Bin 0 -> 6275 bytes .../webview/zooming/data/resolution.1.png | Bin 0 -> 3553 bytes .../webview/zooming/data/resolution.2.png | Bin 0 -> 5838 bytes .../webview/zooming/data/resolution.3.png | Bin 0 -> 8005 bytes .../webview/zooming/data/resolution.4.png | Bin 0 -> 6087 bytes .../qmlvisual/webview/zooming/data/resolution.qml | 1319 +++++ .../webview/zooming/data/zoomTextOnly.0.png | Bin 0 -> 5589 bytes .../webview/zooming/data/zoomTextOnly.1.png | Bin 0 -> 6848 bytes .../webview/zooming/data/zoomTextOnly.qml | 655 +++ .../qmlvisual/webview/zooming/data/zooming.0.png | Bin 0 -> 735 bytes .../qmlvisual/webview/zooming/data/zooming.1.png | Bin 0 -> 735 bytes .../qmlvisual/webview/zooming/data/zooming.2.png | Bin 0 -> 735 bytes .../qmlvisual/webview/zooming/data/zooming.3.png | Bin 0 -> 735 bytes .../qmlvisual/webview/zooming/data/zooming.qml | 2115 +++++++ .../qmlvisual/webview/zooming/pageWidth.qml | 11 + .../qmlvisual/webview/zooming/qtlogo.png | Bin 0 -> 2738 bytes .../qmlvisual/webview/zooming/renderControl.html | 7 + .../qmlvisual/webview/zooming/renderControl.qml | 22 + .../qmlvisual/webview/zooming/resolution.html | 6 + .../qmlvisual/webview/zooming/resolution.qml | 19 + .../qmlvisual/webview/zooming/zoomTextOnly.html | 7 + .../qmlvisual/webview/zooming/zoomTextOnly.qml | 17 + .../qmlvisual/webview/zooming/zooming.html | 6 + .../qmlvisual/webview/zooming/zooming.qml | 19 + .../qpacketprotocol/qpacketprotocol.pro | 9 + .../qpacketprotocol/tst_qpacketprotocol.cpp | 263 + .../qperformancetimer/qperformancetimer.pro | 7 + .../qperformancetimer/tst_qperformancetimer.cpp | 68 + tests/auto/declarative/runall.sh | 100 + tests/auto/declarative/shared/debugutil.cpp | 104 + tests/auto/declarative/shared/debugutil_p.h | 94 + tests/auto/declarative/shared/testhttpserver.cpp | 324 ++ tests/auto/declarative/shared/testhttpserver.h | 93 + tests/auto/declarative/symbianlibs.pri | 9 + 2373 files changed, 240370 insertions(+) create mode 100644 tests/auto/declarative/declarative.pro create mode 100644 tests/auto/declarative/examples/data/dummytest.qml create mode 100644 tests/auto/declarative/examples/data/webbrowser/webbrowser.qml create mode 100644 tests/auto/declarative/examples/examples.pro create mode 100644 tests/auto/declarative/examples/tst_examples.cpp create mode 100644 tests/auto/declarative/moduleqt47/data/importqt47.qml create mode 100644 tests/auto/declarative/moduleqt47/moduleqt47.pro create mode 100644 tests/auto/declarative/moduleqt47/tst_moduleqt47.cpp create mode 100644 tests/auto/declarative/parserstress/parserstress.pro create mode 100644 tests/auto/declarative/parserstress/tst_parserstress.cpp create mode 100644 tests/auto/declarative/qdeclarativeanchors/data/anchors.qml create mode 100644 tests/auto/declarative/qdeclarativeanchors/data/anchorsqgraphicswidget.qml create mode 100644 tests/auto/declarative/qdeclarativeanchors/data/centerin.qml create mode 100644 tests/auto/declarative/qdeclarativeanchors/data/crash1.qml create mode 100644 tests/auto/declarative/qdeclarativeanchors/data/fill.qml create mode 100644 tests/auto/declarative/qdeclarativeanchors/data/hvCenter.qml create mode 100644 tests/auto/declarative/qdeclarativeanchors/data/loop1.qml create mode 100644 tests/auto/declarative/qdeclarativeanchors/data/loop2.qml create mode 100644 tests/auto/declarative/qdeclarativeanchors/data/margins.qml create mode 100644 tests/auto/declarative/qdeclarativeanchors/qdeclarativeanchors.pro create mode 100644 tests/auto/declarative/qdeclarativeanchors/tst_qdeclarativeanchors.cpp create mode 100644 tests/auto/declarative/qdeclarativeanimatedimage/data/colors.gif create mode 100644 tests/auto/declarative/qdeclarativeanimatedimage/data/colors.qml create mode 100644 tests/auto/declarative/qdeclarativeanimatedimage/data/hearts.gif create mode 100644 tests/auto/declarative/qdeclarativeanimatedimage/data/hearts.qml create mode 100644 tests/auto/declarative/qdeclarativeanimatedimage/data/qmldir create mode 100644 tests/auto/declarative/qdeclarativeanimatedimage/data/qtbug-16520.qml create mode 100644 tests/auto/declarative/qdeclarativeanimatedimage/data/stickman.gif create mode 100644 tests/auto/declarative/qdeclarativeanimatedimage/data/stickman.qml create mode 100644 tests/auto/declarative/qdeclarativeanimatedimage/data/stickmanerror1.qml create mode 100644 tests/auto/declarative/qdeclarativeanimatedimage/data/stickmanpause.qml create mode 100644 tests/auto/declarative/qdeclarativeanimatedimage/data/stickmanscaled.qml create mode 100644 tests/auto/declarative/qdeclarativeanimatedimage/data/stickmanstopped.qml create mode 100644 tests/auto/declarative/qdeclarativeanimatedimage/qdeclarativeanimatedimage.pro create mode 100644 tests/auto/declarative/qdeclarativeanimatedimage/tst_qdeclarativeanimatedimage.cpp create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/Double.qml create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/attached.qml create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/badproperty1.qml create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/badproperty2.qml create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/badtype1.qml create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/badtype2.qml create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/badtype3.qml create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/badtype4.qml create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/dontAutoStart.qml create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/dontStart.qml create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/dontStart2.qml create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/dotproperty.qml create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/doubleRegistrationBug.qml create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/mixedtype1.qml create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/mixedtype2.qml create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/nonTransitionBug.qml create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/properties.qml create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/properties2.qml create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/properties3.qml create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/properties4.qml create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/properties5.qml create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/propertiesTransition.qml create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/propertiesTransition2.qml create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/propertiesTransition3.qml create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/propertiesTransition4.qml create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/propertiesTransition5.qml create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/propertiesTransition6.qml create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/propertiesTransition7.qml create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/registrationBug.qml create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/rotation.qml create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/runningTrueBug.qml create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/transitionAssignmentBug.qml create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/valuesource.qml create mode 100644 tests/auto/declarative/qdeclarativeanimations/data/valuesource2.qml create mode 100644 tests/auto/declarative/qdeclarativeanimations/qdeclarativeanimations.pro create mode 100644 tests/auto/declarative/qdeclarativeanimations/tst_qdeclarativeanimations.cpp create mode 100644 tests/auto/declarative/qdeclarativeapplication/qdeclarativeapplication.pro create mode 100644 tests/auto/declarative/qdeclarativeapplication/tst_qdeclarativeapplication.cpp create mode 100644 tests/auto/declarative/qdeclarativebehaviors/data/binding.qml create mode 100644 tests/auto/declarative/qdeclarativebehaviors/data/color.qml create mode 100644 tests/auto/declarative/qdeclarativebehaviors/data/cpptrigger.qml create mode 100644 tests/auto/declarative/qdeclarativebehaviors/data/delayedRegistration.qml create mode 100644 tests/auto/declarative/qdeclarativebehaviors/data/disabled.qml create mode 100644 tests/auto/declarative/qdeclarativebehaviors/data/dontStart.qml create mode 100644 tests/auto/declarative/qdeclarativebehaviors/data/empty.qml create mode 100644 tests/auto/declarative/qdeclarativebehaviors/data/explicit.qml create mode 100644 tests/auto/declarative/qdeclarativebehaviors/data/groupProperty.qml create mode 100644 tests/auto/declarative/qdeclarativebehaviors/data/groupProperty2.qml create mode 100644 tests/auto/declarative/qdeclarativebehaviors/data/groupedPropertyCrash.qml create mode 100644 tests/auto/declarative/qdeclarativebehaviors/data/loop.qml create mode 100644 tests/auto/declarative/qdeclarativebehaviors/data/nonSelecting2.qml create mode 100644 tests/auto/declarative/qdeclarativebehaviors/data/parent.qml create mode 100644 tests/auto/declarative/qdeclarativebehaviors/data/qtbug12295.qml create mode 100644 tests/auto/declarative/qdeclarativebehaviors/data/reassignedAnimation.qml create mode 100644 tests/auto/declarative/qdeclarativebehaviors/data/runningTrue.qml create mode 100644 tests/auto/declarative/qdeclarativebehaviors/data/scripttrigger.qml create mode 100644 tests/auto/declarative/qdeclarativebehaviors/data/simple.qml create mode 100644 tests/auto/declarative/qdeclarativebehaviors/data/startup.qml create mode 100644 tests/auto/declarative/qdeclarativebehaviors/data/startup2.qml create mode 100644 tests/auto/declarative/qdeclarativebehaviors/qdeclarativebehaviors.pro create mode 100644 tests/auto/declarative/qdeclarativebehaviors/tst_qdeclarativebehaviors.cpp create mode 100644 tests/auto/declarative/qdeclarativebinding/data/deletedObject.qml create mode 100644 tests/auto/declarative/qdeclarativebinding/data/test-binding.qml create mode 100644 tests/auto/declarative/qdeclarativebinding/data/test-binding2.qml create mode 100644 tests/auto/declarative/qdeclarativebinding/qdeclarativebinding.pro create mode 100644 tests/auto/declarative/qdeclarativebinding/tst_qdeclarativebinding.cpp create mode 100644 tests/auto/declarative/qdeclarativeborderimage/data/colors-round-remote.sci create mode 100644 tests/auto/declarative/qdeclarativeborderimage/data/colors-round.sci create mode 100644 tests/auto/declarative/qdeclarativeborderimage/data/colors.png create mode 100644 tests/auto/declarative/qdeclarativeborderimage/data/heart200.png create mode 100644 tests/auto/declarative/qdeclarativeborderimage/data/invalid.sci create mode 100644 tests/auto/declarative/qdeclarativeborderimage/qdeclarativeborderimage.pro create mode 100644 tests/auto/declarative/qdeclarativeborderimage/tst_qdeclarativeborderimage.cpp create mode 100644 tests/auto/declarative/qdeclarativecomponent/data/createObject.qml create mode 100644 tests/auto/declarative/qdeclarativecomponent/data/createObjectWithScript.qml create mode 100644 tests/auto/declarative/qdeclarativecomponent/qdeclarativecomponent.pro create mode 100644 tests/auto/declarative/qdeclarativecomponent/tst_qdeclarativecomponent.cpp create mode 100644 tests/auto/declarative/qdeclarativeconnection/data/connection-targetchange.qml create mode 100644 tests/auto/declarative/qdeclarativeconnection/data/connection-unknownsignals-ignored.qml create mode 100644 tests/auto/declarative/qdeclarativeconnection/data/connection-unknownsignals-notarget.qml create mode 100644 tests/auto/declarative/qdeclarativeconnection/data/connection-unknownsignals-parent.qml create mode 100644 tests/auto/declarative/qdeclarativeconnection/data/connection-unknownsignals.qml create mode 100644 tests/auto/declarative/qdeclarativeconnection/data/error-object.qml create mode 100644 tests/auto/declarative/qdeclarativeconnection/data/error-property.qml create mode 100644 tests/auto/declarative/qdeclarativeconnection/data/error-property2.qml create mode 100644 tests/auto/declarative/qdeclarativeconnection/data/error-syntax.qml create mode 100644 tests/auto/declarative/qdeclarativeconnection/data/test-connection.qml create mode 100644 tests/auto/declarative/qdeclarativeconnection/data/test-connection2.qml create mode 100644 tests/auto/declarative/qdeclarativeconnection/data/test-connection3.qml create mode 100644 tests/auto/declarative/qdeclarativeconnection/data/trimming.qml create mode 100644 tests/auto/declarative/qdeclarativeconnection/qdeclarativeconnection.pro create mode 100644 tests/auto/declarative/qdeclarativeconnection/tst_qdeclarativeconnection.cpp create mode 100644 tests/auto/declarative/qdeclarativecontext/qdeclarativecontext.pro create mode 100644 tests/auto/declarative/qdeclarativecontext/tst_qdeclarativecontext.cpp create mode 100644 tests/auto/declarative/qdeclarativedebug/qdeclarativedebug.pro create mode 100644 tests/auto/declarative/qdeclarativedebug/tst_qdeclarativedebug.cpp create mode 100644 tests/auto/declarative/qdeclarativedebugclient/qdeclarativedebugclient.pro create mode 100644 tests/auto/declarative/qdeclarativedebugclient/tst_qdeclarativedebugclient.cpp create mode 100644 tests/auto/declarative/qdeclarativedebughelper/private_headers/qdeclarativedebughelper_p.h create mode 100644 tests/auto/declarative/qdeclarativedebughelper/qdeclarativedebughelper.pro create mode 100644 tests/auto/declarative/qdeclarativedebughelper/tst_qdeclarativedebughelper.cpp create mode 100644 tests/auto/declarative/qdeclarativedebugjs/app/app.pro create mode 100644 tests/auto/declarative/qdeclarativedebugjs/app/main.cpp create mode 100644 tests/auto/declarative/qdeclarativedebugjs/data/backtrace1.js create mode 100644 tests/auto/declarative/qdeclarativedebugjs/data/backtrace1.qml create mode 100644 tests/auto/declarative/qdeclarativedebugjs/qdeclarativedebugjs.pro create mode 100644 tests/auto/declarative/qdeclarativedebugjs/tst_qdeclarativedebugjs.cpp create mode 100644 tests/auto/declarative/qdeclarativedebugjs/tst_qdeclarativedebugjs.pro create mode 100644 tests/auto/declarative/qdeclarativedebugservice/qdeclarativedebugservice.pro create mode 100644 tests/auto/declarative/qdeclarativedebugservice/tst_qdeclarativedebugservice.cpp create mode 100644 tests/auto/declarative/qdeclarativedom/data/MyComponent.qml create mode 100644 tests/auto/declarative/qdeclarativedom/data/MyItem.qml create mode 100644 tests/auto/declarative/qdeclarativedom/data/import/Bar.qml create mode 100644 tests/auto/declarative/qdeclarativedom/data/importlib/sublib/Foo.qml create mode 100644 tests/auto/declarative/qdeclarativedom/data/importlib/sublib/qmldir create mode 100644 tests/auto/declarative/qdeclarativedom/data/top.qml create mode 100644 tests/auto/declarative/qdeclarativedom/qdeclarativedom.pro create mode 100644 tests/auto/declarative/qdeclarativedom/tst_qdeclarativedom.cpp create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/AliasBindingsAssignCorrectlyType.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/AliasBindingsOverrideTargetType.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/AliasBindingsOverrideTargetType3.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/ConstantsOverrideBindings.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/CustomObject.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/MethodsObject.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/NestedTypeTransientErrors.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/ScopeObject.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/SpuriousWarning.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/TypeForDynamicCreation.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/aliasBindingsAssignCorrectly.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/aliasBindingsOverrideTarget.2.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/aliasBindingsOverrideTarget.3.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/aliasBindingsOverrideTarget.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/aliasPropertyAndBinding.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/aliasWritesOverrideBindings.2.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/aliasWritesOverrideBindings.3.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/aliasWritesOverrideBindings.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/assignBasicTypes.2.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/assignBasicTypes.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/attachedProperty.2.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/attachedProperty.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/attachedPropertyScope.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/bindingLoop.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/blank.js create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/boolPropertiesEvaluateAsBool.1.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/boolPropertiesEvaluateAsBool.2.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/bug.1.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/canAssignNullToQObject.1.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/canAssignNullToQObject.2.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/compiled.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/compositePropertyType.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/constantsOverrideBindings.1.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/constantsOverrideBindings.2.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/constantsOverrideBindings.3.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/constantsOverrideBindings.4.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/declarativeToString.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/deferredProperties.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/deferredPropertiesErrors.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/deleteLater.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/deletedEngine.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/deletedObject.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/dynamicCreation.helper.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/dynamicCreation.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/dynamicDeletion.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/enums.1.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/enums.2.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/eval.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/exception.js create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/exceptionClearsOnReeval.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/exceptionProducesWarning.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/exceptionProducesWarning2.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/extendedObjectPropertyLookup.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/extensionObjects.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/extensionObjectsPropertyOverride.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/function.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/functionAssignment.1.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/functionAssignment.2.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/functionAssignment.js create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/functionErrors.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/idShortcutInvalidates.1.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/idShortcutInvalidates.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/in.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/include.js create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/include.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/include_callback.js create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/include_callback.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/include_pragma.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/include_pragma_inner.js create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/include_pragma_outer.js create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/include_remote.js create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/include_remote.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/include_remote_missing.js create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/include_remote_missing.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/include_shared.js create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/include_shared.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/invokableObjectArg.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/invokableObjectRet.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/js/include2.js create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/js/include3.js create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/jsObject.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/libraryScriptAssert.js create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/libraryScriptAssert.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/listProperties.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/listToVariant.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevision.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevision2.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevision3.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevision4.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevisionErrors.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevisionErrors2.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevisionErrors3.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/methods.1.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/methods.2.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/methods.3.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/methods.4.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/methods.5.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/multiEngineObject.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/noSpuriousWarningsAtShutdown.2.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/noSpuriousWarningsAtShutdown.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/nonExistentAttachedObject.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/nonscriptable.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/nullObjectBinding.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/numberAssignment.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/objectName.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/objectsCompareAsEqual.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/outerBindingOverridesInnerBinding.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/ownership.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/propertyAssignmentErrors.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/propertySplicing.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/qlistqobjectMethods.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/qtbug_10696.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/qtbug_11600.js create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/qtbug_11600.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/qtbug_11606.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/qtbug_20648.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/qtbug_9792.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/qtcreatorbug_1289.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/realToInt.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/regExp.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/remote_file.js create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scope.2.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scope.3.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scope.4.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scope.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.1.js create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.1.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.2.js create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.2.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.3.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.4.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.5.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.6.js create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.6.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scriptDisconnect.1.js create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scriptDisconnect.1.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scriptDisconnect.2.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scriptDisconnect.3.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scriptDisconnect.4.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scriptErrors.js create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/scriptErrors.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/selfDeletingBinding.2.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/selfDeletingBinding.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/sharedAttachedObject.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/shutdownErrors.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/signalAssignment.1.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/signalAssignment.2.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/signalParameterTypes.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/signalTriggeredBindings.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/signalWithUnknownTypes.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/strictlyEquals.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/transientErrors.2.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/transientErrors.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/undefinedResetsProperty.2.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/undefinedResetsProperty.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/valueTypeFunctions.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/variantsAssignedUndefined.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/writeAttachedProperty.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/writeRemovesBinding.qml create mode 100644 tests/auto/declarative/qdeclarativeecmascript/qdeclarativeecmascript.pro create mode 100644 tests/auto/declarative/qdeclarativeecmascript/testtypes.cpp create mode 100644 tests/auto/declarative/qdeclarativeecmascript/testtypes.h create mode 100644 tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp create mode 100644 tests/auto/declarative/qdeclarativeengine/qdeclarativeengine.pro create mode 100644 tests/auto/declarative/qdeclarativeengine/tst_qdeclarativeengine.cpp create mode 100644 tests/auto/declarative/qdeclarativeerror/qdeclarativeerror.pro create mode 100644 tests/auto/declarative/qdeclarativeerror/test.txt create mode 100644 tests/auto/declarative/qdeclarativeerror/tst_qdeclarativeerror.cpp create mode 100644 tests/auto/declarative/qdeclarativeflickable/data/disabledcontent.qml create mode 100644 tests/auto/declarative/qdeclarativeflickable/data/flickable01.qml create mode 100644 tests/auto/declarative/qdeclarativeflickable/data/flickable02.qml create mode 100644 tests/auto/declarative/qdeclarativeflickable/data/flickable03.qml create mode 100644 tests/auto/declarative/qdeclarativeflickable/data/flickable04.qml create mode 100644 tests/auto/declarative/qdeclarativeflickable/data/flickableqgraphicswidget.qml create mode 100644 tests/auto/declarative/qdeclarativeflickable/data/nestedPressDelay.qml create mode 100644 tests/auto/declarative/qdeclarativeflickable/data/resize.qml create mode 100644 tests/auto/declarative/qdeclarativeflickable/data/wheel.qml create mode 100644 tests/auto/declarative/qdeclarativeflickable/qdeclarativeflickable.pro create mode 100644 tests/auto/declarative/qdeclarativeflickable/tst_qdeclarativeflickable.cpp create mode 100644 tests/auto/declarative/qdeclarativeflipable/data/crash.qml create mode 100644 tests/auto/declarative/qdeclarativeflipable/data/flipable-abort.qml create mode 100644 tests/auto/declarative/qdeclarativeflipable/data/test-flipable.qml create mode 100644 tests/auto/declarative/qdeclarativeflipable/qdeclarativeflipable.pro create mode 100644 tests/auto/declarative/qdeclarativeflipable/tst_qdeclarativeflipable.cpp create mode 100644 tests/auto/declarative/qdeclarativefocusscope/data/chain.qml create mode 100644 tests/auto/declarative/qdeclarativefocusscope/data/forceActiveFocus.qml create mode 100644 tests/auto/declarative/qdeclarativefocusscope/data/forcefocus.qml create mode 100644 tests/auto/declarative/qdeclarativefocusscope/data/qtBug13380.qml create mode 100644 tests/auto/declarative/qdeclarativefocusscope/data/signalEmission.qml create mode 100644 tests/auto/declarative/qdeclarativefocusscope/data/test.qml create mode 100644 tests/auto/declarative/qdeclarativefocusscope/data/test2.qml create mode 100644 tests/auto/declarative/qdeclarativefocusscope/data/test3.qml create mode 100644 tests/auto/declarative/qdeclarativefocusscope/data/test4.qml create mode 100644 tests/auto/declarative/qdeclarativefocusscope/data/test5.qml create mode 100644 tests/auto/declarative/qdeclarativefocusscope/qdeclarativefocusscope.pro create mode 100644 tests/auto/declarative/qdeclarativefocusscope/tst_qdeclarativefocusscope.cpp create mode 100644 tests/auto/declarative/qdeclarativefolderlistmodel/data/basic.qml create mode 100644 tests/auto/declarative/qdeclarativefolderlistmodel/data/dummy.qml create mode 100644 tests/auto/declarative/qdeclarativefolderlistmodel/qdeclarativefolderlistmodel.pro create mode 100644 tests/auto/declarative/qdeclarativefolderlistmodel/tst_qdeclarativefolderlistmodel.cpp create mode 100644 tests/auto/declarative/qdeclarativefontloader/data/daniel.ttf create mode 100644 tests/auto/declarative/qdeclarativefontloader/data/dummy.ttf create mode 100644 tests/auto/declarative/qdeclarativefontloader/data/tarzeau_ocr_a.ttf create mode 100644 tests/auto/declarative/qdeclarativefontloader/qdeclarativefontloader.pro create mode 100644 tests/auto/declarative/qdeclarativefontloader/tst_qdeclarativefontloader.cpp create mode 100644 tests/auto/declarative/qdeclarativegridview/data/attachedSignals.qml create mode 100644 tests/auto/declarative/qdeclarativegridview/data/displaygrid.qml create mode 100644 tests/auto/declarative/qdeclarativegridview/data/footer.qml create mode 100644 tests/auto/declarative/qdeclarativegridview/data/gridview-enforcerange.qml create mode 100644 tests/auto/declarative/qdeclarativegridview/data/gridview-initCurrent.qml create mode 100644 tests/auto/declarative/qdeclarativegridview/data/gridview-noCurrent.qml create mode 100644 tests/auto/declarative/qdeclarativegridview/data/gridview1.qml create mode 100644 tests/auto/declarative/qdeclarativegridview/data/gridview2.qml create mode 100644 tests/auto/declarative/qdeclarativegridview/data/gridview3.qml create mode 100644 tests/auto/declarative/qdeclarativegridview/data/header.qml create mode 100644 tests/auto/declarative/qdeclarativegridview/data/manual-highlight.qml create mode 100644 tests/auto/declarative/qdeclarativegridview/data/mirroring.qml create mode 100644 tests/auto/declarative/qdeclarativegridview/data/propertychangestest.qml create mode 100644 tests/auto/declarative/qdeclarativegridview/data/setindex.qml create mode 100644 tests/auto/declarative/qdeclarativegridview/qdeclarativegridview.pro create mode 100644 tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp create mode 100644 tests/auto/declarative/qdeclarativeimage/data/aspectratio.qml create mode 100644 tests/auto/declarative/qdeclarativeimage/data/big.jpeg create mode 100644 tests/auto/declarative/qdeclarativeimage/data/big256.png create mode 100644 tests/auto/declarative/qdeclarativeimage/data/colors.png create mode 100644 tests/auto/declarative/qdeclarativeimage/data/colors1.png create mode 100644 tests/auto/declarative/qdeclarativeimage/data/green.png create mode 100644 tests/auto/declarative/qdeclarativeimage/data/heart-win32.png create mode 100644 tests/auto/declarative/qdeclarativeimage/data/heart.png create mode 100644 tests/auto/declarative/qdeclarativeimage/data/heart.svg create mode 100644 tests/auto/declarative/qdeclarativeimage/data/heart200-win32.png create mode 100644 tests/auto/declarative/qdeclarativeimage/data/heart200.png create mode 100644 tests/auto/declarative/qdeclarativeimage/data/qtbug_16389.qml create mode 100644 tests/auto/declarative/qdeclarativeimage/data/qtbug_22125.qml create mode 100644 tests/auto/declarative/qdeclarativeimage/data/rect.png create mode 100644 tests/auto/declarative/qdeclarativeimage/data/tiling.qml create mode 100644 tests/auto/declarative/qdeclarativeimage/qdeclarativeimage.pro create mode 100644 tests/auto/declarative/qdeclarativeimage/tst_qdeclarativeimage.cpp create mode 100644 tests/auto/declarative/qdeclarativeimageprovider/qdeclarativeimageprovider.pro create mode 100644 tests/auto/declarative/qdeclarativeimageprovider/tst_qdeclarativeimageprovider.cpp create mode 100644 tests/auto/declarative/qdeclarativeinfo/data/NestedObject.qml create mode 100644 tests/auto/declarative/qdeclarativeinfo/data/nestedQmlObject.qml create mode 100644 tests/auto/declarative/qdeclarativeinfo/data/qmlObject.qml create mode 100644 tests/auto/declarative/qdeclarativeinfo/qdeclarativeinfo.pro create mode 100644 tests/auto/declarative/qdeclarativeinfo/tst_qdeclarativeinfo.cpp create mode 100644 tests/auto/declarative/qdeclarativeinstruction/qdeclarativeinstruction.pro create mode 100644 tests/auto/declarative/qdeclarativeinstruction/tst_qdeclarativeinstruction.cpp create mode 100644 tests/auto/declarative/qdeclarativeitem/data/childrenProperty.qml create mode 100644 tests/auto/declarative/qdeclarativeitem/data/childrenRect.qml create mode 100644 tests/auto/declarative/qdeclarativeitem/data/childrenRectBug.qml create mode 100644 tests/auto/declarative/qdeclarativeitem/data/childrenRectBug2.qml create mode 100644 tests/auto/declarative/qdeclarativeitem/data/childrenRectBug3.qml create mode 100644 tests/auto/declarative/qdeclarativeitem/data/implicitsize.qml create mode 100644 tests/auto/declarative/qdeclarativeitem/data/keynavigationtest.qml create mode 100644 tests/auto/declarative/qdeclarativeitem/data/keyspriority.qml create mode 100644 tests/auto/declarative/qdeclarativeitem/data/keystest.qml create mode 100644 tests/auto/declarative/qdeclarativeitem/data/layoutmirroring.qml create mode 100644 tests/auto/declarative/qdeclarativeitem/data/mapCoordinates.qml create mode 100644 tests/auto/declarative/qdeclarativeitem/data/mouseFocus.qml create mode 100644 tests/auto/declarative/qdeclarativeitem/data/propertychanges.qml create mode 100644 tests/auto/declarative/qdeclarativeitem/data/qtbug_16871.qml create mode 100644 tests/auto/declarative/qdeclarativeitem/data/resourcesProperty.qml create mode 100644 tests/auto/declarative/qdeclarativeitem/data/transformCrash.qml create mode 100644 tests/auto/declarative/qdeclarativeitem/qdeclarativeitem.pro create mode 100644 tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/Alias.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/Alias2.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/Alias3.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/Alias4.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/AliasPropertyChangeSignalsType.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/ComponentComposite.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/CompositeType.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/CompositeType2.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/CompositeType3.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/CompositeType4.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/DontDoubleCallClassBeginItem.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/DynamicPropertiesNestedType.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/HelperAlias.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/I18n.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/I18nType30.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/InlineAssignmentsOverrideBindingsType.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/InlineAssignmentsOverrideBindingsType2.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/LocalLast.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/MyComponent.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/MyCompositeValueSource.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/MyContainerComponent.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/NestedAlias.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/NestedComponentRoot.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/NestedErrorsType.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/OnCompletedType.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/OnDestructionType.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/alias.1.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/alias.10.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/alias.11.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/alias.2.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/alias.3.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/alias.4.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/alias.5.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/alias.6.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/alias.7.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/alias.8.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/alias.9.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/aliasPropertiesAndSignals.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/aliasPropertyChangeSignals.2.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/aliasPropertyChangeSignals.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/allowedRevisionOverloads.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/assignBasicTypes.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/assignCompositeToType.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/assignLiteralSignalProperty.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/assignLiteralToVariant.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/assignObjectToSignal.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/assignObjectToVariant.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/assignQmlComponent.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/assignSignal.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/assignToNamespace.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/assignToNamespace.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/assignTypeExtremes.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/assignValueToSignal.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/assignValueToSignal.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/attachedProperties.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/autoComponentCreation.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/autoNotifyConnection.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/component.1.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/component.1.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/component.2.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/component.2.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/component.3.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/component.3.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/component.4.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/component.4.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/component.5.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/component.5.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/component.6.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/component.6.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/component.7.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/component.7.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/component.8.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/component.8.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/component.9.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/component.9.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/componentCompositeType.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/cppnamespace.2.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/cppnamespace.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/crash2.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/customOnProperty.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/customParserIdNotAllowed.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/customParserIdNotAllowed.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/customParserTypes.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/customVariantTypes.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/declaredPropertyValues.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/defaultGrouped.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/defaultGrouped.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/defaultPropertyListOrder.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/destroyedSignal.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/destroyedSignal.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/disallowedRevisionOverloads.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/disallowedRevisionOverloads.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/dontDoubleCallClassBegin.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/doubleSignal.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/doubleSignal.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/duplicateIDs.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/duplicateIDs.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.1.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.1.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.2.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.2.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.3.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.3.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.4.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.4.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.5.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.5.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/dynamicObject.1.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/dynamicObjectProperties.2.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/dynamicObjectProperties.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/dynamicProperties.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/dynamicPropertiesNested.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/dynamicSignalsAndSlots.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/empty.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/empty.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/emptySignal.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/emptySignal.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/enumTypes.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/enumTypes.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/failingComponent.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/failingComponentTest.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/fakeDotProperty.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/fakeDotProperty.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/finalOverride.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/finalOverride.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/i18nDeclaredPropertyNames.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/i18nDeclaredPropertyUse.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/i18nNameSpace.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/i18nScript.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/i18nStrings.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/i18nType.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/idProperty.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/importFile.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/importFile.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/importIncorrectCase.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/importNamespaceConflict.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/importNamespaceConflict.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/importNewerVersion.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/importNewerVersion.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/importNonExist.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/importNonExist.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/importNonExistOlder.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/importNonExistOlder.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/importVersionMissingBuiltIn.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/importVersionMissingBuiltIn.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/importVersionMissingInstalled.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/importVersionMissingInstalled.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/importscript.1.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/importscript.1.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/incorrectCase.errors.insensitive.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/incorrectCase.errors.sensitive.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/incorrectCase.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/incorrectCaseType.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/inlineAssignmentsOverrideBindings.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/inlineQmlComponents.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/insertedSemicolon.1.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/insertedSemicolon.1.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/interfaceProperty.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/interfaceQList.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.1.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.1.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.10.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.10.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.2.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.2.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.3.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.3.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.4.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.4.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.5.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.5.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.6.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.6.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.7.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.7.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.8.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.8.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.9.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.9.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.1.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.1.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.10.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.10.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.11.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.11.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.12.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.12.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.13.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.13.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.2.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.2.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.3.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.3.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.4.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.4.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.5.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.5.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.6.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.6.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.7.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.7.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.8.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.8.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.9.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.9.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.1.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.1.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.10.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.10.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.2.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.2.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.3.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.3.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.4.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.4.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.5.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.5.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.6.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.6.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.7.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.7.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.8.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.8.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.9.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.9.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidID.2.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidID.2.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidID.3.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidID.3.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidID.4.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidID.4.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidID.5.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidID.5.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidID.6.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidID.6.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidID.7.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidID.7.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidID.8.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidID.8.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidID.9.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidID.9.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidID.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidID.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidImportID.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidImportID.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidOn.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidOn.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidProperty.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidProperty.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidRoot.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/invalidRoot.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/lib/com/nokia/installedtest/InstalledTest.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/lib/com/nokia/installedtest/InstalledTest2.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/lib/com/nokia/installedtest/LocalLast.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/lib/com/nokia/installedtest/PrivateType.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/lib/com/nokia/installedtest/qmldir create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/lib/com/nokia/installedtest0/InstalledTest.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/lib/com/nokia/installedtest0/InstalledTest2.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/lib/com/nokia/installedtest0/qmldir create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/listAssignment.1.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/listAssignment.1.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/listAssignment.2.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/listAssignment.2.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/listAssignment.3.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/listAssignment.3.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/listItemDeleteSelf.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/listProperties.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.1.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.1.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.2.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.2.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.3.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.3.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/method.1.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/method.1.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/missingObject.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/missingObject.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/missingSignal.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/missingSignal.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/missingValueTypeProperty.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/missingValueTypeProperty.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/multiSet.1.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/multiSet.1.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/multiSet.10.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/multiSet.10.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/multiSet.11.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/multiSet.11.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/multiSet.2.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/multiSet.2.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/multiSet.3.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/multiSet.3.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/multiSet.4.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/multiSet.4.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/multiSet.5.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/multiSet.5.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/multiSet.6.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/multiSet.6.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/multiSet.7.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/multiSet.7.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/multiSet.8.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/multiSet.8.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/multiSet.9.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/multiSet.9.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/nestedComponentRoots.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/nestedErrors.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/nestedErrors.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/noCreation.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/noCreation.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/nonScriptableProperty.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/nonScriptableProperty.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.1.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.1.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.2.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.2.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.3.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.3.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.4.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.4.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.5.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.5.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.6.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.6.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/notAvailable.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/notAvailable.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/nullDotProperty.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/nullDotProperty.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/objectValueTypeProperty.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/objectValueTypeProperty.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/onCompleted.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/onDestruction.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/property.1.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/property.1.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/property.2.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/property.2.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/property.3.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/property.3.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/property.4.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/property.4.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/property.5.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/property.5.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/property.6.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/property.6.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/property.7.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/property.7.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/propertyValueSource.2.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/propertyValueSource.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/qmlAttachedPropertiesObjectMethod.1.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/qmlAttachedPropertiesObjectMethod.2.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/readOnly.1.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/readOnly.1.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/readOnly.2.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/readOnly.2.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/readOnly.3.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/readOnly.3.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/readOnly.4.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/readOnly.4.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/readOnly.5.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/readOnly.5.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/revisions11.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/revisionsbasesub11.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/revisionssub11.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/rootAsQmlComponent.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/scriptString.1.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/scriptString.1.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/scriptString.2.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/scriptString.2.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/scriptString.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/scriptString2.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/scriptString3.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/scriptString4.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/signal.1.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/signal.1.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/signal.2.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/signal.2.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/signal.3.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/signal.3.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/signal.4.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/signal.4.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/simpleBindings.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/simpleContainer.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/simpleObject.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/singularProperty.2.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/singularProperty.2.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/singularProperty.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/singularProperty.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/subdir/Test.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/subdir/subsubdir/SubTest.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/test.js create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/test2.js create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/unregisteredObject.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/unregisteredObject.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/unsupportedProperty.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/unsupportedProperty.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/valueTypes.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/variantNotify.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/versionedbase.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/wrongType.1.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/wrongType.1.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/wrongType.10.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/wrongType.10.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/wrongType.11.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/wrongType.11.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/wrongType.12.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/wrongType.12.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/wrongType.13.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/wrongType.13.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/wrongType.14.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/wrongType.14.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/wrongType.15.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/wrongType.15.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/wrongType.16.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/wrongType.16.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/wrongType.2.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/wrongType.2.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/wrongType.3.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/wrongType.3.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/wrongType.4.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/wrongType.4.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/wrongType.5.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/wrongType.5.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/wrongType.6.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/wrongType.6.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/wrongType.7.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/wrongType.7.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/wrongType.8.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/wrongType.8.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/wrongType.9.errors.txt create mode 100644 tests/auto/declarative/qdeclarativelanguage/data/wrongType.9.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/qdeclarativelanguage.pro create mode 100644 tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/LocalInternal.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/Test.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/TestLocal.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/TestNamed.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/TestSubDir.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/UndeclaredLocal.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/WrongTestLocal.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/noqmldir/Test.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/pics/blue.png create mode 100644 tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/qmldir create mode 100644 tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/subdir/SubTest.qml create mode 100644 tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/subdir/qmldir create mode 100644 tests/auto/declarative/qdeclarativelanguage/testtypes.cpp create mode 100644 tests/auto/declarative/qdeclarativelanguage/testtypes.h create mode 100644 tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp create mode 100644 tests/auto/declarative/qdeclarativelayoutitem/data/layoutItem.qml create mode 100644 tests/auto/declarative/qdeclarativelayoutitem/qdeclarativelayoutitem.pro create mode 100644 tests/auto/declarative/qdeclarativelayoutitem/tst_qdeclarativelayoutitem.cpp create mode 100644 tests/auto/declarative/qdeclarativelistmodel/data/enumerate.qml create mode 100644 tests/auto/declarative/qdeclarativelistmodel/data/model.qml create mode 100644 tests/auto/declarative/qdeclarativelistmodel/data/multipleroles.qml create mode 100644 tests/auto/declarative/qdeclarativelistmodel/data/script.js create mode 100644 tests/auto/declarative/qdeclarativelistmodel/data/setmodelcachelist.qml create mode 100644 tests/auto/declarative/qdeclarativelistmodel/qdeclarativelistmodel.pro create mode 100644 tests/auto/declarative/qdeclarativelistmodel/tst_qdeclarativelistmodel.cpp create mode 100644 tests/auto/declarative/qdeclarativelistreference/data/MyType.qml create mode 100644 tests/auto/declarative/qdeclarativelistreference/data/engineTypes.qml create mode 100644 tests/auto/declarative/qdeclarativelistreference/data/variantToList.qml create mode 100644 tests/auto/declarative/qdeclarativelistreference/qdeclarativelistreference.pro create mode 100644 tests/auto/declarative/qdeclarativelistreference/tst_qdeclarativelistreference.cpp create mode 100644 tests/auto/declarative/qdeclarativelistview/data/attachedSignals.qml create mode 100644 tests/auto/declarative/qdeclarativelistview/data/displaylist.qml create mode 100644 tests/auto/declarative/qdeclarativelistview/data/footer.qml create mode 100644 tests/auto/declarative/qdeclarativelistview/data/header.qml create mode 100644 tests/auto/declarative/qdeclarativelistview/data/header1.qml create mode 100644 tests/auto/declarative/qdeclarativelistview/data/headerfooter.qml create mode 100644 tests/auto/declarative/qdeclarativelistview/data/itemlist.qml create mode 100644 tests/auto/declarative/qdeclarativelistview/data/listview-enforcerange.qml create mode 100644 tests/auto/declarative/qdeclarativelistview/data/listview-initCurrent.qml create mode 100644 tests/auto/declarative/qdeclarativelistview/data/listview-noCurrent.qml create mode 100644 tests/auto/declarative/qdeclarativelistview/data/listview-sections.qml create mode 100644 tests/auto/declarative/qdeclarativelistview/data/listview-sections_delegate.qml create mode 100644 tests/auto/declarative/qdeclarativelistview/data/listviewtest.qml create mode 100644 tests/auto/declarative/qdeclarativelistview/data/manual-highlight.qml create mode 100644 tests/auto/declarative/qdeclarativelistview/data/orientchange.qml create mode 100644 tests/auto/declarative/qdeclarativelistview/data/propertychangestest.qml create mode 100644 tests/auto/declarative/qdeclarativelistview/data/qtbug14821.qml create mode 100644 tests/auto/declarative/qdeclarativelistview/data/qtbug16037.qml create mode 100644 tests/auto/declarative/qdeclarativelistview/data/rightToLeft.qml create mode 100644 tests/auto/declarative/qdeclarativelistview/data/sizelessthan1.qml create mode 100644 tests/auto/declarative/qdeclarativelistview/data/strictlyenforcerange.qml create mode 100644 tests/auto/declarative/qdeclarativelistview/incrementalmodel.cpp create mode 100644 tests/auto/declarative/qdeclarativelistview/incrementalmodel.h create mode 100644 tests/auto/declarative/qdeclarativelistview/qdeclarativelistview.pro create mode 100644 tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp create mode 100644 tests/auto/declarative/qdeclarativeloader/data/AnchoredLoader.qml create mode 100644 tests/auto/declarative/qdeclarativeloader/data/BlueRect.qml create mode 100644 tests/auto/declarative/qdeclarativeloader/data/CreationContextLoader.qml create mode 100644 tests/auto/declarative/qdeclarativeloader/data/GraphicsWidget250x250.qml create mode 100644 tests/auto/declarative/qdeclarativeloader/data/GreenRect.qml create mode 100644 tests/auto/declarative/qdeclarativeloader/data/NoResize.qml create mode 100644 tests/auto/declarative/qdeclarativeloader/data/NoResizeGraphicsWidget.qml create mode 100644 tests/auto/declarative/qdeclarativeloader/data/QTBUG_16928.qml create mode 100644 tests/auto/declarative/qdeclarativeloader/data/QTBUG_17114.qml create mode 100644 tests/auto/declarative/qdeclarativeloader/data/Rect120x60.qml create mode 100644 tests/auto/declarative/qdeclarativeloader/data/SetSourceComponent.qml create mode 100644 tests/auto/declarative/qdeclarativeloader/data/SizeGraphicsWidgetToLoader.qml create mode 100644 tests/auto/declarative/qdeclarativeloader/data/SizeLoaderToGraphicsWidget.qml create mode 100644 tests/auto/declarative/qdeclarativeloader/data/SizeToItem.qml create mode 100644 tests/auto/declarative/qdeclarativeloader/data/SizeToLoader.qml create mode 100644 tests/auto/declarative/qdeclarativeloader/data/VmeError.qml create mode 100644 tests/auto/declarative/qdeclarativeloader/data/crash.qml create mode 100644 tests/auto/declarative/qdeclarativeloader/data/creationContext.qml create mode 100644 tests/auto/declarative/qdeclarativeloader/data/differentorigin.qml create mode 100644 tests/auto/declarative/qdeclarativeloader/data/implicitSize.qml create mode 100644 tests/auto/declarative/qdeclarativeloader/data/nonItem.qml create mode 100644 tests/auto/declarative/qdeclarativeloader/data/qmldir create mode 100644 tests/auto/declarative/qdeclarativeloader/data/sameorigin-load.qml create mode 100644 tests/auto/declarative/qdeclarativeloader/data/sameorigin.qml create mode 100644 tests/auto/declarative/qdeclarativeloader/data/vmeErrors.qml create mode 100644 tests/auto/declarative/qdeclarativeloader/qdeclarativeloader.pro create mode 100644 tests/auto/declarative/qdeclarativeloader/tst_qdeclarativeloader.cpp create mode 100644 tests/auto/declarative/qdeclarativemetatype/qdeclarativemetatype.pro create mode 100644 tests/auto/declarative/qdeclarativemetatype/tst_qdeclarativemetatype.cpp create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/data/importsMixedQmlCppPlugin.2.qml create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/data/importsMixedQmlCppPlugin.qml create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/data/incorrectCase.qml create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/data/pluginWithQmlFile.qml create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.2.errors.txt create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.2.qml create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.errors.txt create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.qml create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/data/works.qml create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/data/works2.qml create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/data/works21.qml create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestPluginWithQmlFile/MyQmlFile.qml create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestPluginWithQmlFile/qmldir create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlMixedPluginType/Foo.qml create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlMixedPluginType/qmldir create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlPluginType.2.1/qmldir create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlPluginType.2/qmldir create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlPluginType/qmldir create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlVersionPluginType/qmldir create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/PureQmlModule/ComponentA.qml create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/PureQmlModule/ComponentB.qml create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/PureQmlModule/qmldir create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/WrongCase/qmldir create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/plugin.2.1/plugin.2.1.pro create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/plugin.2.1/plugin.cpp create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/plugin.2/plugin.2.pro create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/plugin.2/plugin.cpp create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/plugin/plugin.cpp create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/plugin/plugin.pro create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/pluginMixed/plugin.cpp create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/pluginMixed/pluginMixed.pro create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/pluginVersion/plugin.cpp create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/pluginVersion/pluginVersion.pro create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/pluginWithQmlFile/plugin.cpp create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/pluginWithQmlFile/pluginWithQmlFile.pro create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/pluginWrongCase/plugin.cpp create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/pluginWrongCase/pluginWrongCase.pro create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/qdeclarativemoduleplugin.pro create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.cpp create mode 100644 tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.pro create mode 100644 tests/auto/declarative/qdeclarativemousearea/data/clickandhold.qml create mode 100644 tests/auto/declarative/qdeclarativemousearea/data/clicktwice.qml create mode 100644 tests/auto/declarative/qdeclarativemousearea/data/doubleclick.qml create mode 100644 tests/auto/declarative/qdeclarativemousearea/data/dragging.qml create mode 100644 tests/auto/declarative/qdeclarativemousearea/data/dragproperties.qml create mode 100644 tests/auto/declarative/qdeclarativemousearea/data/dragreset.qml create mode 100644 tests/auto/declarative/qdeclarativemousearea/data/pressedOrdering.qml create mode 100644 tests/auto/declarative/qdeclarativemousearea/data/preventContextMenu.qml create mode 100644 tests/auto/declarative/qdeclarativemousearea/data/preventstealing.qml create mode 100644 tests/auto/declarative/qdeclarativemousearea/data/rejectEvent.qml create mode 100644 tests/auto/declarative/qdeclarativemousearea/data/updateMousePosOnClick.qml create mode 100644 tests/auto/declarative/qdeclarativemousearea/data/updateMousePosOnResize.qml create mode 100644 tests/auto/declarative/qdeclarativemousearea/qdeclarativemousearea.pro create mode 100644 tests/auto/declarative/qdeclarativemousearea/tst_qdeclarativemousearea.cpp create mode 100644 tests/auto/declarative/qdeclarativeparticles/data/particle.png create mode 100644 tests/auto/declarative/qdeclarativeparticles/data/particlemotiontest.qml create mode 100644 tests/auto/declarative/qdeclarativeparticles/data/particlestest.qml create mode 100644 tests/auto/declarative/qdeclarativeparticles/qdeclarativeparticles.pro create mode 100644 tests/auto/declarative/qdeclarativeparticles/tst_qdeclarativeparticles.cpp create mode 100644 tests/auto/declarative/qdeclarativepathview/data/closedPath.qml create mode 100644 tests/auto/declarative/qdeclarativepathview/data/datamodel.qml create mode 100644 tests/auto/declarative/qdeclarativepathview/data/displaypath.qml create mode 100644 tests/auto/declarative/qdeclarativepathview/data/dragpath.qml create mode 100644 tests/auto/declarative/qdeclarativepathview/data/emptymodel.qml create mode 100644 tests/auto/declarative/qdeclarativepathview/data/openPath.qml create mode 100644 tests/auto/declarative/qdeclarativepathview/data/pathUpdate.qml create mode 100644 tests/auto/declarative/qdeclarativepathview/data/pathUpdateOnStartChanged.qml create mode 100644 tests/auto/declarative/qdeclarativepathview/data/pathtest.qml create mode 100644 tests/auto/declarative/qdeclarativepathview/data/pathview0.qml create mode 100644 tests/auto/declarative/qdeclarativepathview/data/pathview1.qml create mode 100644 tests/auto/declarative/qdeclarativepathview/data/pathview2.qml create mode 100644 tests/auto/declarative/qdeclarativepathview/data/pathview3.qml create mode 100644 tests/auto/declarative/qdeclarativepathview/data/pathview_package.qml create mode 100644 tests/auto/declarative/qdeclarativepathview/data/propertychanges.qml create mode 100644 tests/auto/declarative/qdeclarativepathview/data/treemodel.qml create mode 100644 tests/auto/declarative/qdeclarativepathview/data/undefinedpath.qml create mode 100644 tests/auto/declarative/qdeclarativepathview/data/vdm.qml create mode 100644 tests/auto/declarative/qdeclarativepathview/qdeclarativepathview.pro create mode 100644 tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp create mode 100644 tests/auto/declarative/qdeclarativepincharea/data/flickresize.qml create mode 100644 tests/auto/declarative/qdeclarativepincharea/data/pinchproperties.qml create mode 100644 tests/auto/declarative/qdeclarativepincharea/qdeclarativepincharea.pro create mode 100644 tests/auto/declarative/qdeclarativepincharea/tst_qdeclarativepincharea.cpp create mode 100644 tests/auto/declarative/qdeclarativepixmapcache/data/exists.png create mode 100644 tests/auto/declarative/qdeclarativepixmapcache/data/exists1.png create mode 100644 tests/auto/declarative/qdeclarativepixmapcache/data/exists2.png create mode 100644 tests/auto/declarative/qdeclarativepixmapcache/data/http/exists.png create mode 100644 tests/auto/declarative/qdeclarativepixmapcache/data/http/exists1.png create mode 100644 tests/auto/declarative/qdeclarativepixmapcache/data/http/exists2.png create mode 100644 tests/auto/declarative/qdeclarativepixmapcache/data/http/exists3.png create mode 100644 tests/auto/declarative/qdeclarativepixmapcache/data/http/exists4.png create mode 100644 tests/auto/declarative/qdeclarativepixmapcache/data/http/exists5.png create mode 100644 tests/auto/declarative/qdeclarativepixmapcache/data/massive.png create mode 100644 tests/auto/declarative/qdeclarativepixmapcache/qdeclarativepixmapcache.pro create mode 100644 tests/auto/declarative/qdeclarativepixmapcache/tst_qdeclarativepixmapcache.cpp create mode 100644 tests/auto/declarative/qdeclarativepositioners/data/flow-testimplicitsize.qml create mode 100644 tests/auto/declarative/qdeclarativepositioners/data/flowtest-toptobottom.qml create mode 100644 tests/auto/declarative/qdeclarativepositioners/data/flowtest.qml create mode 100644 tests/auto/declarative/qdeclarativepositioners/data/grid-animated.qml create mode 100644 tests/auto/declarative/qdeclarativepositioners/data/grid-spacing.qml create mode 100644 tests/auto/declarative/qdeclarativepositioners/data/grid-toptobottom.qml create mode 100644 tests/auto/declarative/qdeclarativepositioners/data/gridtest.qml create mode 100644 tests/auto/declarative/qdeclarativepositioners/data/gridzerocolumns.qml create mode 100644 tests/auto/declarative/qdeclarativepositioners/data/horizontal-animated.qml create mode 100644 tests/auto/declarative/qdeclarativepositioners/data/horizontal-spacing.qml create mode 100644 tests/auto/declarative/qdeclarativepositioners/data/horizontal.qml create mode 100644 tests/auto/declarative/qdeclarativepositioners/data/propertychangestest.qml create mode 100644 tests/auto/declarative/qdeclarativepositioners/data/repeatertest.qml create mode 100644 tests/auto/declarative/qdeclarativepositioners/data/vertical-animated.qml create mode 100644 tests/auto/declarative/qdeclarativepositioners/data/vertical-spacing.qml create mode 100644 tests/auto/declarative/qdeclarativepositioners/data/vertical.qml create mode 100644 tests/auto/declarative/qdeclarativepositioners/data/verticalqgraphicswidget.qml create mode 100644 tests/auto/declarative/qdeclarativepositioners/qdeclarativepositioners.pro create mode 100644 tests/auto/declarative/qdeclarativepositioners/tst_qdeclarativepositioners.cpp create mode 100644 tests/auto/declarative/qdeclarativeproperty/data/TestType.qml create mode 100644 tests/auto/declarative/qdeclarativeproperty/data/aliasPropertyBindings.qml create mode 100644 tests/auto/declarative/qdeclarativeproperty/data/readSynthesizedObject.qml create mode 100644 tests/auto/declarative/qdeclarativeproperty/qdeclarativeproperty.pro create mode 100644 tests/auto/declarative/qdeclarativeproperty/tst_qdeclarativeproperty.cpp create mode 100644 tests/auto/declarative/qdeclarativepropertymap/qdeclarativepropertymap.pro create mode 100644 tests/auto/declarative/qdeclarativepropertymap/tst_qdeclarativepropertymap.cpp create mode 100644 tests/auto/declarative/qdeclarativeqt/data/atob.qml create mode 100644 tests/auto/declarative/qdeclarativeqt/data/btoa.qml create mode 100644 tests/auto/declarative/qdeclarativeqt/data/consoleLog.qml create mode 100644 tests/auto/declarative/qdeclarativeqt/data/createComponent.qml create mode 100644 tests/auto/declarative/qdeclarativeqt/data/createComponentData.qml create mode 100644 tests/auto/declarative/qdeclarativeqt/data/createComponent_lib.js create mode 100644 tests/auto/declarative/qdeclarativeqt/data/createComponent_lib.qml create mode 100644 tests/auto/declarative/qdeclarativeqt/data/createQmlObject.qml create mode 100644 tests/auto/declarative/qdeclarativeqt/data/darker.qml create mode 100644 tests/auto/declarative/qdeclarativeqt/data/enums.qml create mode 100644 tests/auto/declarative/qdeclarativeqt/data/fontFamilies.qml create mode 100644 tests/auto/declarative/qdeclarativeqt/data/formatting.qml create mode 100644 tests/auto/declarative/qdeclarativeqt/data/hsla.qml create mode 100644 tests/auto/declarative/qdeclarativeqt/data/isQtObject.qml create mode 100644 tests/auto/declarative/qdeclarativeqt/data/lighter.qml create mode 100644 tests/auto/declarative/qdeclarativeqt/data/md5.qml create mode 100644 tests/auto/declarative/qdeclarativeqt/data/openUrlExternally.qml create mode 100644 tests/auto/declarative/qdeclarativeqt/data/openUrlExternally_lib.js create mode 100644 tests/auto/declarative/qdeclarativeqt/data/openUrlExternally_lib.qml create mode 100644 tests/auto/declarative/qdeclarativeqt/data/point.qml create mode 100644 tests/auto/declarative/qdeclarativeqt/data/quit.qml create mode 100644 tests/auto/declarative/qdeclarativeqt/data/rect.qml create mode 100644 tests/auto/declarative/qdeclarativeqt/data/rgba.qml create mode 100644 tests/auto/declarative/qdeclarativeqt/data/size.qml create mode 100644 tests/auto/declarative/qdeclarativeqt/data/tint.qml create mode 100644 tests/auto/declarative/qdeclarativeqt/data/vector.qml create mode 100644 tests/auto/declarative/qdeclarativeqt/qdeclarativeqt.pro create mode 100644 tests/auto/declarative/qdeclarativeqt/tst_qdeclarativeqt.cpp create mode 100644 tests/auto/declarative/qdeclarativerepeater/data/intmodel.qml create mode 100644 tests/auto/declarative/qdeclarativerepeater/data/itemlist.qml create mode 100644 tests/auto/declarative/qdeclarativerepeater/data/modelChanged.qml create mode 100644 tests/auto/declarative/qdeclarativerepeater/data/objlist.qml create mode 100644 tests/auto/declarative/qdeclarativerepeater/data/properties.qml create mode 100644 tests/auto/declarative/qdeclarativerepeater/data/repeater1.qml create mode 100644 tests/auto/declarative/qdeclarativerepeater/data/repeater2.qml create mode 100644 tests/auto/declarative/qdeclarativerepeater/qdeclarativerepeater.pro create mode 100644 tests/auto/declarative/qdeclarativerepeater/tst_qdeclarativerepeater.cpp create mode 100644 tests/auto/declarative/qdeclarativesmoothedanimation/data/smoothedanimation1.qml create mode 100644 tests/auto/declarative/qdeclarativesmoothedanimation/data/smoothedanimation2.qml create mode 100644 tests/auto/declarative/qdeclarativesmoothedanimation/data/smoothedanimation3.qml create mode 100644 tests/auto/declarative/qdeclarativesmoothedanimation/data/smoothedanimationBehavior.qml create mode 100644 tests/auto/declarative/qdeclarativesmoothedanimation/data/smoothedanimationValueSource.qml create mode 100644 tests/auto/declarative/qdeclarativesmoothedanimation/qdeclarativesmoothedanimation.pro create mode 100644 tests/auto/declarative/qdeclarativesmoothedanimation/tst_qdeclarativesmoothedanimation.cpp create mode 100644 tests/auto/declarative/qdeclarativespringanimation/data/springanimation1.qml create mode 100644 tests/auto/declarative/qdeclarativespringanimation/data/springanimation2.qml create mode 100644 tests/auto/declarative/qdeclarativespringanimation/data/springanimation3.qml create mode 100644 tests/auto/declarative/qdeclarativespringanimation/qdeclarativespringanimation.pro create mode 100644 tests/auto/declarative/qdeclarativespringanimation/tst_qdeclarativespringanimation.cpp create mode 100644 tests/auto/declarative/qdeclarativestates/data/ExtendedRectangle.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/Implementation/MyType.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/Implementation/images/qt-logo.png create mode 100644 tests/auto/declarative/qdeclarativestates/data/QTBUG-14830.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/anchorChanges1.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/anchorChanges2.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/anchorChanges3.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/anchorChanges4.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/anchorChanges5.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/anchorChangesCrash.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/anchorRewindBug.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/anchorRewindBug2.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/attachedPropertyChanges.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/autoStateAtStartupRestoreBug.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/basicBinding.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/basicBinding2.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/basicBinding3.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/basicBinding4.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/basicChanges.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/basicChanges2.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/basicChanges3.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/basicChanges4.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/basicExtension.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/deleting.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/deletingState.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/editProperties.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/explicit.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/extendsBug.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/fakeExtension.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/illegalObj.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/illegalTempState.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/image.png create mode 100644 tests/auto/declarative/qdeclarativestates/data/legalTempState.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/nonExistantProp.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/parentChange1.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/parentChange2.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/parentChange3.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/parentChange4.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/parentChange5.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/parentChange6.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/propertyErrors.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/reset.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/restoreEntryValues.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/returnToBase.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/script.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/signalOverride.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/signalOverride2.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/signalOverrideCrash.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/signalOverrideCrash2.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/signalOverrideCrash3.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/unnamedWhen.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/urlResolution.qml create mode 100644 tests/auto/declarative/qdeclarativestates/data/whenOrdering.qml create mode 100644 tests/auto/declarative/qdeclarativestates/qdeclarativestates.pro create mode 100644 tests/auto/declarative/qdeclarativestates/tst_qdeclarativestates.cpp create mode 100644 tests/auto/declarative/qdeclarativestyledtext/qdeclarativestyledtext.pro create mode 100644 tests/auto/declarative/qdeclarativestyledtext/tst_qdeclarativestyledtext.cpp create mode 100644 tests/auto/declarative/qdeclarativesystempalette/qdeclarativesystempalette.pro create mode 100644 tests/auto/declarative/qdeclarativesystempalette/tst_qdeclarativesystempalette.cpp create mode 100644 tests/auto/declarative/qdeclarativetext/data/alignments.qml create mode 100644 tests/auto/declarative/qdeclarativetext/data/alignments_cb.png create mode 100644 tests/auto/declarative/qdeclarativetext/data/alignments_cc.png create mode 100644 tests/auto/declarative/qdeclarativetext/data/alignments_ct.png create mode 100644 tests/auto/declarative/qdeclarativetext/data/alignments_lb.png create mode 100644 tests/auto/declarative/qdeclarativetext/data/alignments_lc.png create mode 100644 tests/auto/declarative/qdeclarativetext/data/alignments_lt.png create mode 100644 tests/auto/declarative/qdeclarativetext/data/alignments_rb.png create mode 100644 tests/auto/declarative/qdeclarativetext/data/alignments_rc.png create mode 100644 tests/auto/declarative/qdeclarativetext/data/alignments_rt.png create mode 100644 tests/auto/declarative/qdeclarativetext/data/elideimplicitwidth.qml create mode 100644 tests/auto/declarative/qdeclarativetext/data/embeddedImagesLocal.qml create mode 100644 tests/auto/declarative/qdeclarativetext/data/embeddedImagesLocalError.qml create mode 100644 tests/auto/declarative/qdeclarativetext/data/embeddedImagesRemote.qml create mode 100644 tests/auto/declarative/qdeclarativetext/data/embeddedImagesRemoteError.qml create mode 100644 tests/auto/declarative/qdeclarativetext/data/horizontalAlignment_RightToLeft.qml create mode 100644 tests/auto/declarative/qdeclarativetext/data/http/exists.png create mode 100644 tests/auto/declarative/qdeclarativetext/data/lineCount.qml create mode 100644 tests/auto/declarative/qdeclarativetext/data/lineHeight.qml create mode 100644 tests/auto/declarative/qdeclarativetext/data/qtbug_14734.qml create mode 100644 tests/auto/declarative/qdeclarativetext/data/rotated.qml create mode 100644 tests/auto/declarative/qdeclarativetext/qdeclarativetext.pro create mode 100644 tests/auto/declarative/qdeclarativetext/tst_qdeclarativetext.cpp create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/CursorRect.qml create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/alignments.qml create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/alignments_cb.png create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/alignments_cc.png create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/alignments_ct.png create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/alignments_lb.png create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/alignments_lc.png create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/alignments_lt.png create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/alignments_rb.png create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/alignments_rc.png create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/alignments_rt.png create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/cursorTest.qml create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/geometrySignals.qml create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/horizontalAlignment_RightToLeft.qml create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/http/ErrItem.qml create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/http/NormItem.qml create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/http/cursorHttpTest.qml create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/http/cursorHttpTestFail1.qml create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/http/cursorHttpTestFail2.qml create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/http/cursorHttpTestPass.qml create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/http/qmldir create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/httpfail/FailItem.qml create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/httpslow/WaitItem.qml create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/inputmethodhints.qml create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/mouseselection_default.qml create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/mouseselection_false.qml create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/mouseselection_false_readonly.qml create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/mouseselection_false_words.qml create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/mouseselection_multiline.qml create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/mouseselection_true.qml create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/mouseselection_true_readonly.qml create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/mouseselection_true_words.qml create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/mouseselectionmode_characters.qml create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/mouseselectionmode_default.qml create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/mouseselectionmode_words.qml create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/navigation.qml create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/positionAt.qml create mode 100644 tests/auto/declarative/qdeclarativetextedit/data/readOnly.qml create mode 100644 tests/auto/declarative/qdeclarativetextedit/qdeclarativetextedit.pro create mode 100644 tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp create mode 100644 tests/auto/declarative/qdeclarativetextinput/data/cursorTest.qml create mode 100644 tests/auto/declarative/qdeclarativetextinput/data/echoMode.qml create mode 100644 tests/auto/declarative/qdeclarativetextinput/data/geometrySignals.qml create mode 100644 tests/auto/declarative/qdeclarativetextinput/data/halign_center.png create mode 100644 tests/auto/declarative/qdeclarativetextinput/data/halign_left.png create mode 100644 tests/auto/declarative/qdeclarativetextinput/data/halign_right.png create mode 100644 tests/auto/declarative/qdeclarativetextinput/data/horizontalAlignment.qml create mode 100644 tests/auto/declarative/qdeclarativetextinput/data/horizontalAlignment_RightToLeft.qml create mode 100644 tests/auto/declarative/qdeclarativetextinput/data/inputmethods.qml create mode 100644 tests/auto/declarative/qdeclarativetextinput/data/masks.qml create mode 100644 tests/auto/declarative/qdeclarativetextinput/data/maxLength.qml create mode 100644 tests/auto/declarative/qdeclarativetextinput/data/mouseselection_default.qml create mode 100644 tests/auto/declarative/qdeclarativetextinput/data/mouseselection_false.qml create mode 100644 tests/auto/declarative/qdeclarativetextinput/data/mouseselection_false_readonly.qml create mode 100644 tests/auto/declarative/qdeclarativetextinput/data/mouseselection_false_words.qml create mode 100644 tests/auto/declarative/qdeclarativetextinput/data/mouseselection_true.qml create mode 100644 tests/auto/declarative/qdeclarativetextinput/data/mouseselection_true_readonly.qml create mode 100644 tests/auto/declarative/qdeclarativetextinput/data/mouseselection_true_words.qml create mode 100644 tests/auto/declarative/qdeclarativetextinput/data/mouseselectionmode_characters.qml create mode 100644 tests/auto/declarative/qdeclarativetextinput/data/mouseselectionmode_default.qml create mode 100644 tests/auto/declarative/qdeclarativetextinput/data/mouseselectionmode_words.qml create mode 100644 tests/auto/declarative/qdeclarativetextinput/data/navigation.qml create mode 100644 tests/auto/declarative/qdeclarativetextinput/data/positionAt.qml create mode 100644 tests/auto/declarative/qdeclarativetextinput/data/readOnly.qml create mode 100644 tests/auto/declarative/qdeclarativetextinput/data/validators.qml create mode 100644 tests/auto/declarative/qdeclarativetextinput/qdeclarativetextinput.pro create mode 100644 tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp create mode 100644 tests/auto/declarative/qdeclarativetimer/qdeclarativetimer.pro create mode 100644 tests/auto/declarative/qdeclarativetimer/tst_qdeclarativetimer.cpp create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/BindingsSpliceCorrectlyType.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/BindingsSpliceCorrectlyType4.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/BindingsSpliceCorrectlyType5.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/autoBindingRemoval.2.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/autoBindingRemoval.3.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/autoBindingRemoval.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/bindingAssignment.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/bindingConflict.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/bindingRead.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/bindingVariantCopy.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.1.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.2.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.3.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.4.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.5.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/conflicting.1.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/conflicting.2.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/conflicting.3.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/deletedObject.js create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/deletedObject.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/enums.1.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/enums.2.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/enums.3.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/enums.4.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/enums.5.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/font_read.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/font_write.2.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/font_write.3.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/font_write.4.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/font_write.5.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/font_write.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/matrix4x4_read.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/matrix4x4_write.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/point_read.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/point_write.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/pointf_read.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/pointf_write.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/quaternion_read.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/quaternion_write.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/rect_read.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/rect_write.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/rectf_read.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/rectf_write.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/returnValues.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/scriptAccess.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/scriptVariantCopy.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/size_read.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/size_write.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/sizef_read.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/sizef_write.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/sizereadonly_read.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/sizereadonly_writeerror.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/sizereadonly_writeerror2.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/sizereadonly_writeerror3.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/sizereadonly_writeerror4.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/staticAssignment.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/valueInterceptors.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/valueSources.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/varAssignment.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/variant_read.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/vector2d_read.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/vector2d_write.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/vector3d_read.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/vector3d_write.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/vector4d_read.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/data/vector4d_write.qml create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/qdeclarativevaluetypes.pro create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/testtypes.cpp create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/testtypes.h create mode 100644 tests/auto/declarative/qdeclarativevaluetypes/tst_qdeclarativevaluetypes.cpp create mode 100644 tests/auto/declarative/qdeclarativeview/data/error1.qml create mode 100644 tests/auto/declarative/qdeclarativeview/data/resizemodedeclarativeitem.qml create mode 100644 tests/auto/declarative/qdeclarativeview/data/resizemodegraphicswidget.qml create mode 100644 tests/auto/declarative/qdeclarativeview/qdeclarativeview.pro create mode 100644 tests/auto/declarative/qdeclarativeview/tst_qdeclarativeview.cpp create mode 100644 tests/auto/declarative/qdeclarativeviewer/data/orientation.qml create mode 100644 tests/auto/declarative/qdeclarativeviewer/qdeclarativeviewer.pro create mode 100644 tests/auto/declarative/qdeclarativeviewer/tst_qdeclarativeviewer.cpp create mode 100644 tests/auto/declarative/qdeclarativevisualdatamodel/data/datalist.qml create mode 100644 tests/auto/declarative/qdeclarativevisualdatamodel/data/modelproperties.qml create mode 100644 tests/auto/declarative/qdeclarativevisualdatamodel/data/modelproperties2.qml create mode 100644 tests/auto/declarative/qdeclarativevisualdatamodel/data/objectlist.qml create mode 100644 tests/auto/declarative/qdeclarativevisualdatamodel/data/singlerole1.qml create mode 100644 tests/auto/declarative/qdeclarativevisualdatamodel/data/singlerole2.qml create mode 100644 tests/auto/declarative/qdeclarativevisualdatamodel/data/visualdatamodel.qml create mode 100644 tests/auto/declarative/qdeclarativevisualdatamodel/qdeclarativevisualdatamodel.pro create mode 100644 tests/auto/declarative/qdeclarativevisualdatamodel/tst_qdeclarativevisualdatamodel.cpp create mode 100644 tests/auto/declarative/qdeclarativeworkerscript/data/BaseWorker.qml create mode 100644 tests/auto/declarative/qdeclarativeworkerscript/data/Global.js create mode 100644 tests/auto/declarative/qdeclarativeworkerscript/data/script.js create mode 100644 tests/auto/declarative/qdeclarativeworkerscript/data/script_error_onCall.js create mode 100644 tests/auto/declarative/qdeclarativeworkerscript/data/script_error_onLoad.js create mode 100644 tests/auto/declarative/qdeclarativeworkerscript/data/script_fixed_return.js create mode 100644 tests/auto/declarative/qdeclarativeworkerscript/data/script_include.js create mode 100644 tests/auto/declarative/qdeclarativeworkerscript/data/script_pragma.js create mode 100644 tests/auto/declarative/qdeclarativeworkerscript/data/worker.qml create mode 100644 tests/auto/declarative/qdeclarativeworkerscript/data/worker_error_onCall.qml create mode 100644 tests/auto/declarative/qdeclarativeworkerscript/data/worker_error_onLoad.qml create mode 100644 tests/auto/declarative/qdeclarativeworkerscript/data/worker_include.qml create mode 100644 tests/auto/declarative/qdeclarativeworkerscript/data/worker_pragma.qml create mode 100644 tests/auto/declarative/qdeclarativeworkerscript/qdeclarativeworkerscript.pro create mode 100644 tests/auto/declarative/qdeclarativeworkerscript/tst_qdeclarativeworkerscript.cpp create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/abort.expect create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/abort.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/abort.reply create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/abort_opened.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/abort_unsent.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/attr.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/attr.xml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/callbackException.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/cdata.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/cdata.xml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/constructor.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/defaultState.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/document.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/document.xml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/domExceptionCodes.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/element.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/element.xml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/getAllResponseHeaders.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/getAllResponseHeaders_args.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/getAllResponseHeaders_sent.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/getAllResponseHeaders_unsent.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/getResponseHeader.expect create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/getResponseHeader.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/getResponseHeader.reply create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/getResponseHeader_args.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/getResponseHeader_sent.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/getResponseHeader_unsent.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/instanceStateValues.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/invalidMethodUsage.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/open.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/open_arg_count.1.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/open_arg_count.2.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/open_invalid_method.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/open_network.expect create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/open_network.reply create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/open_network.wait create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/open_sync.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/open_user.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/open_username.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/redirectError.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/redirectRecur.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/redirects.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/redirecttarget.html create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/responseText.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/responseXML_invalid.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/seconddocument.html create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/send_alreadySent.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.1.expect create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.1.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.2.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.3.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.4.expect create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.4.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.5.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.6.expect create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.6.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.7.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.reply create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/send_ignoreData.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/send_ignoreData.reply create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/send_ignoreData_GET.expect create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/send_ignoreData_PUT.expect create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/send_unsent.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/setRequestHeader.expect create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/setRequestHeader.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/setRequestHeader.reply create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/setRequestHeader_args.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/setRequestHeader_illegalName.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/setRequestHeader_sent.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/setRequestHeader_unsent.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/staticStateValues.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/status.200.reply create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/status.404.reply create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/status.expect create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/status.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/statusText.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/testdocument.html create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/text.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/text.xml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/utf16.html create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/utf16.qml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/data/utf16.xml create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/qdeclarativexmlhttprequest.pro create mode 100644 tests/auto/declarative/qdeclarativexmlhttprequest/tst_qdeclarativexmlhttprequest.cpp create mode 100644 tests/auto/declarative/qdeclarativexmllistmodel/data/model.qml create mode 100644 tests/auto/declarative/qdeclarativexmllistmodel/data/model.xml create mode 100644 tests/auto/declarative/qdeclarativexmllistmodel/data/model2.xml create mode 100644 tests/auto/declarative/qdeclarativexmllistmodel/data/propertychanges.qml create mode 100644 tests/auto/declarative/qdeclarativexmllistmodel/data/recipes.qml create mode 100644 tests/auto/declarative/qdeclarativexmllistmodel/data/recipes.xml create mode 100644 tests/auto/declarative/qdeclarativexmllistmodel/data/roleCrash.qml create mode 100644 tests/auto/declarative/qdeclarativexmllistmodel/data/roleErrors.qml create mode 100644 tests/auto/declarative/qdeclarativexmllistmodel/data/roleKeys.qml create mode 100644 tests/auto/declarative/qdeclarativexmllistmodel/data/testtypes.qml create mode 100644 tests/auto/declarative/qdeclarativexmllistmodel/data/unique.qml create mode 100644 tests/auto/declarative/qdeclarativexmllistmodel/qdeclarativexmllistmodel.pro create mode 100644 tests/auto/declarative/qdeclarativexmllistmodel/tst_qdeclarativexmllistmodel.cpp create mode 100644 tests/auto/declarative/qmetaobjectbuilder/qmetaobjectbuilder.pro create mode 100644 tests/auto/declarative/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp create mode 100644 tests/auto/declarative/qmlshadersplugin/main.qml create mode 100644 tests/auto/declarative/qmlshadersplugin/qmlshadersplugin.pro create mode 100644 tests/auto/declarative/qmlshadersplugin/tst_qmlshadersplugin.cpp create mode 100644 tests/auto/declarative/qmlvisual/ListView/basic1.qml create mode 100644 tests/auto/declarative/qmlvisual/ListView/basic2.qml create mode 100644 tests/auto/declarative/qmlvisual/ListView/basic3.qml create mode 100644 tests/auto/declarative/qmlvisual/ListView/basic4.qml create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/basic1.0.png create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/basic1.qml create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/basic2.0.png create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/basic2.qml create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/basic3.0.png create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/basic3.qml create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/basic4.0.png create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/basic4.qml create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/enforcerange.0.png create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/enforcerange.1.png create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/enforcerange.2.png create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/enforcerange.3.png create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/enforcerange.4.png create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/enforcerange.5.png create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/enforcerange.6.png create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/enforcerange.qml create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/itemlist.0.png create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/itemlist.1.png create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/itemlist.2.png create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/itemlist.3.png create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/itemlist.4.png create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/itemlist.5.png create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/itemlist.6.png create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/itemlist.7.png create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/itemlist.qml create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/listview.0.png create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/listview.1.png create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/listview.2.png create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/listview.3.png create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/listview.4.png create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/listview.5.png create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/listview.6.png create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/listview.7.png create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/listview.8.png create mode 100644 tests/auto/declarative/qmlvisual/ListView/data/listview.qml create mode 100644 tests/auto/declarative/qmlvisual/ListView/enforcerange.qml create mode 100644 tests/auto/declarative/qmlvisual/ListView/itemlist.qml create mode 100644 tests/auto/declarative/qmlvisual/ListView/listview.qml create mode 100644 tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.0.png create mode 100644 tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.1.png create mode 100644 tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.2.png create mode 100644 tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.3.png create mode 100644 tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.4.png create mode 100644 tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.5.png create mode 100644 tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.6.png create mode 100644 tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.qml create mode 100644 tests/auto/declarative/qmlvisual/Package_Views/packageviews.qml create mode 100644 tests/auto/declarative/qmlvisual/TEST_GUIDELINES create mode 100644 tests/auto/declarative/qmlvisual/animation/bindinganimation/bindinganimation.qml create mode 100644 tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.0.png create mode 100644 tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.1.png create mode 100644 tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.2.png create mode 100644 tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.3.png create mode 100644 tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.4.png create mode 100644 tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.5.png create mode 100644 tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.qml create mode 100644 tests/auto/declarative/qmlvisual/animation/colorAnimation/colorAnimation-visual.qml create mode 100644 tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.0.png create mode 100644 tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.1.png create mode 100644 tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.2.png create mode 100644 tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.3.png create mode 100644 tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.qml create mode 100644 tests/auto/declarative/qmlvisual/animation/colorAnimation/data/colorAnimation-visual.0.png create mode 100644 tests/auto/declarative/qmlvisual/animation/colorAnimation/data/colorAnimation-visual.1.png create mode 100644 tests/auto/declarative/qmlvisual/animation/colorAnimation/data/colorAnimation-visual.2.png create mode 100644 tests/auto/declarative/qmlvisual/animation/colorAnimation/data/colorAnimation-visual.3.png create mode 100644 tests/auto/declarative/qmlvisual/animation/colorAnimation/data/colorAnimation-visual.qml create mode 100644 tests/auto/declarative/qmlvisual/animation/easing/data/easing.0.png create mode 100644 tests/auto/declarative/qmlvisual/animation/easing/data/easing.1.png create mode 100644 tests/auto/declarative/qmlvisual/animation/easing/data/easing.2.png create mode 100644 tests/auto/declarative/qmlvisual/animation/easing/data/easing.3.png create mode 100644 tests/auto/declarative/qmlvisual/animation/easing/data/easing.qml create mode 100644 tests/auto/declarative/qmlvisual/animation/easing/easing.qml create mode 100644 tests/auto/declarative/qmlvisual/animation/loop/data/loop.0.png create mode 100644 tests/auto/declarative/qmlvisual/animation/loop/data/loop.1.png create mode 100644 tests/auto/declarative/qmlvisual/animation/loop/data/loop.2.png create mode 100644 tests/auto/declarative/qmlvisual/animation/loop/data/loop.3.png create mode 100644 tests/auto/declarative/qmlvisual/animation/loop/data/loop.4.png create mode 100644 tests/auto/declarative/qmlvisual/animation/loop/data/loop.5.png create mode 100644 tests/auto/declarative/qmlvisual/animation/loop/data/loop.6.png create mode 100644 tests/auto/declarative/qmlvisual/animation/loop/data/loop.qml create mode 100644 tests/auto/declarative/qmlvisual/animation/loop/loop.qml create mode 100644 tests/auto/declarative/qmlvisual/animation/parallelAnimation/data/parallelAnimation-visual.0.png create mode 100644 tests/auto/declarative/qmlvisual/animation/parallelAnimation/data/parallelAnimation-visual.qml create mode 100644 tests/auto/declarative/qmlvisual/animation/parallelAnimation/parallelAnimation-visual.qml create mode 100644 tests/auto/declarative/qmlvisual/animation/parentAnimation/data/parentAnimation-visual.0.png create mode 100644 tests/auto/declarative/qmlvisual/animation/parentAnimation/data/parentAnimation-visual.1.png create mode 100644 tests/auto/declarative/qmlvisual/animation/parentAnimation/data/parentAnimation-visual.2.png create mode 100644 tests/auto/declarative/qmlvisual/animation/parentAnimation/data/parentAnimation-visual.3.png create mode 100644 tests/auto/declarative/qmlvisual/animation/parentAnimation/data/parentAnimation-visual.4.png create mode 100644 tests/auto/declarative/qmlvisual/animation/parentAnimation/data/parentAnimation-visual.qml create mode 100644 tests/auto/declarative/qmlvisual/animation/parentAnimation/parentAnimation-visual.qml create mode 100644 tests/auto/declarative/qmlvisual/animation/parentAnimation2/data/parentAnimation2.0.png create mode 100644 tests/auto/declarative/qmlvisual/animation/parentAnimation2/data/parentAnimation2.1.png create mode 100644 tests/auto/declarative/qmlvisual/animation/parentAnimation2/data/parentAnimation2.2.png create mode 100644 tests/auto/declarative/qmlvisual/animation/parentAnimation2/data/parentAnimation2.3.png create mode 100644 tests/auto/declarative/qmlvisual/animation/parentAnimation2/data/parentAnimation2.qml create mode 100644 tests/auto/declarative/qmlvisual/animation/parentAnimation2/parentAnimation2.qml create mode 100644 tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.0.png create mode 100644 tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.1.png create mode 100644 tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.2.png create mode 100644 tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.3.png create mode 100644 tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.4.png create mode 100644 tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.5.png create mode 100644 tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.6.png create mode 100644 tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.qml create mode 100644 tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation.0.png create mode 100644 tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation.1.png create mode 100644 tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation.2.png create mode 100644 tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation.3.png create mode 100644 tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation.4.png create mode 100644 tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation.5.png create mode 100644 tests/auto/declarative/qmlvisual/animation/pauseAnimation/pauseAnimation-visual.qml create mode 100644 tests/auto/declarative/qmlvisual/animation/pauseAnimation/pics/qtlogo.png create mode 100644 tests/auto/declarative/qmlvisual/animation/propertyAction/data/propertyAction-visual.0.png create mode 100644 tests/auto/declarative/qmlvisual/animation/propertyAction/data/propertyAction-visual.1.png create mode 100644 tests/auto/declarative/qmlvisual/animation/propertyAction/data/propertyAction-visual.2.png create mode 100644 tests/auto/declarative/qmlvisual/animation/propertyAction/data/propertyAction-visual.3.png create mode 100644 tests/auto/declarative/qmlvisual/animation/propertyAction/data/propertyAction-visual.qml create mode 100644 tests/auto/declarative/qmlvisual/animation/propertyAction/propertyAction-visual.qml create mode 100644 tests/auto/declarative/qmlvisual/animation/qtbug10586/data/qtbug10586.0.png create mode 100644 tests/auto/declarative/qmlvisual/animation/qtbug10586/data/qtbug10586.1.png create mode 100644 tests/auto/declarative/qmlvisual/animation/qtbug10586/data/qtbug10586.2.png create mode 100644 tests/auto/declarative/qmlvisual/animation/qtbug10586/data/qtbug10586.3.png create mode 100644 tests/auto/declarative/qmlvisual/animation/qtbug10586/data/qtbug10586.4.png create mode 100644 tests/auto/declarative/qmlvisual/animation/qtbug10586/data/qtbug10586.qml create mode 100644 tests/auto/declarative/qmlvisual/animation/qtbug10586/qtbug10586.qml create mode 100644 tests/auto/declarative/qmlvisual/animation/qtbug13398/data/qtbug13398.0.png create mode 100644 tests/auto/declarative/qmlvisual/animation/qtbug13398/data/qtbug13398.1.png create mode 100644 tests/auto/declarative/qmlvisual/animation/qtbug13398/data/qtbug13398.qml create mode 100644 tests/auto/declarative/qmlvisual/animation/qtbug13398/qtbug13398.qml create mode 100644 tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.0.png create mode 100644 tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.1.png create mode 100644 tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.2.png create mode 100644 tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.3.png create mode 100644 tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.4.png create mode 100644 tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.5.png create mode 100644 tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.6.png create mode 100644 tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.7.png create mode 100644 tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.8.png create mode 100644 tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.9.png create mode 100644 tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.qml create mode 100644 tests/auto/declarative/qmlvisual/animation/reanchor/reanchor.qml create mode 100644 tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.0.png create mode 100644 tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.1.png create mode 100644 tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.10.png create mode 100644 tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.11.png create mode 100644 tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.12.png create mode 100644 tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.2.png create mode 100644 tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.3.png create mode 100644 tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.4.png create mode 100644 tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.5.png create mode 100644 tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.6.png create mode 100644 tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.7.png create mode 100644 tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.8.png create mode 100644 tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.9.png create mode 100644 tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.qml create mode 100644 tests/auto/declarative/qmlvisual/animation/reanchorRTL/reanchor.qml create mode 100644 tests/auto/declarative/qmlvisual/animation/scriptAction/data/scriptAction-visual.0.png create mode 100644 tests/auto/declarative/qmlvisual/animation/scriptAction/data/scriptAction-visual.1.png create mode 100644 tests/auto/declarative/qmlvisual/animation/scriptAction/data/scriptAction-visual.2.png create mode 100644 tests/auto/declarative/qmlvisual/animation/scriptAction/data/scriptAction-visual.qml create mode 100644 tests/auto/declarative/qmlvisual/animation/scriptAction/scriptAction-visual.qml create mode 100644 tests/auto/declarative/qmlvisual/fillmode/data/fillmode.0.png create mode 100644 tests/auto/declarative/qmlvisual/fillmode/data/fillmode.qml create mode 100644 tests/auto/declarative/qmlvisual/fillmode/face.png create mode 100644 tests/auto/declarative/qmlvisual/fillmode/fillmode.qml create mode 100644 tests/auto/declarative/qmlvisual/focusscope/data/test.0.png create mode 100644 tests/auto/declarative/qmlvisual/focusscope/data/test.1.png create mode 100644 tests/auto/declarative/qmlvisual/focusscope/data/test.2.png create mode 100644 tests/auto/declarative/qmlvisual/focusscope/data/test.3.png create mode 100644 tests/auto/declarative/qmlvisual/focusscope/data/test.qml create mode 100644 tests/auto/declarative/qmlvisual/focusscope/data/test2.0.png create mode 100644 tests/auto/declarative/qmlvisual/focusscope/data/test2.1.png create mode 100644 tests/auto/declarative/qmlvisual/focusscope/data/test2.qml create mode 100644 tests/auto/declarative/qmlvisual/focusscope/data/test3.0.png create mode 100644 tests/auto/declarative/qmlvisual/focusscope/data/test3.1.png create mode 100644 tests/auto/declarative/qmlvisual/focusscope/data/test3.2.png create mode 100644 tests/auto/declarative/qmlvisual/focusscope/data/test3.3.png create mode 100644 tests/auto/declarative/qmlvisual/focusscope/data/test3.4.png create mode 100644 tests/auto/declarative/qmlvisual/focusscope/data/test3.qml create mode 100644 tests/auto/declarative/qmlvisual/focusscope/test.qml create mode 100644 tests/auto/declarative/qmlvisual/focusscope/test2.qml create mode 100644 tests/auto/declarative/qmlvisual/focusscope/test3.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeborderimage/animated-smooth.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeborderimage/animated.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeborderimage/borders.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeborderimage/content/MyBorderImage.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeborderimage/content/bw.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeborderimage/content/colors-round.sci create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeborderimage/content/colors-stretch.sci create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeborderimage/content/colors.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeborderimage/content/qmldir create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated-smooth.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated-smooth.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated-smooth.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/borders.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/borders.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.5.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.5.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.6.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.7.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.8.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/flickable-horizontal.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/flickable-nested.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflickable/flickable-vertical.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.5.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.6.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test_flipable_resize.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test_flipable_resize.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflipable/test-flipable.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeflipable/test_flipable_resize.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.10.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.5.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.6.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.7.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.8.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.9.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.10.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.5.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.6.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.7.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.8.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.9.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativegridview/gridview.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativegridview/gridview2.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.5.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.6.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.7.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.8.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.10.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.11.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.12.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.13.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.14.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.5.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.6.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.7.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.8.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.9.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.10.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.11.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.12.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.13.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.14.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.15.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.5.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.6.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.7.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.8.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.9.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.10.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.11.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.12.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.13.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.14.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.15.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.16.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.17.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.18.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.19.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.20.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.21.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.22.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.5.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.6.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.7.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.8.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.9.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.5.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.6.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.7.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.8.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.9.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/drag.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/mousearea-flickable.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/mousearea-visual.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativemousearea/nested.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeparticles/data/particles.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeparticles/data/particles.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeparticles/data/particles.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeparticles/data/particles.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeparticles/data/particles.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeparticles/particles.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativeparticles/star.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.5.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.5.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.6.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativepathview/test-pathview-2.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativepathview/test-pathview.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.5.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.6.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/usingRepeater.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/usingRepeater.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativepositioners/dynamic.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativepositioners/usingRepeater.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativesmoothedanimation/data/smoothedfollow.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativesmoothedanimation/data/smoothedfollow.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativesmoothedanimation/data/smoothedfollow.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativesmoothedanimation/data/smoothedfollow.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativesmoothedanimation/data/smoothedfollow.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativesmoothedanimation/smoothedfollow.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/clock.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/content/background.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/content/center.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/content/clock.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/content/hour.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/content/minute.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/content/second.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.5.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.6.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.7.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.5.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.6.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.7.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/clock.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/clock.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/clock.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/clock.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.5.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.6.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.7.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativespringanimation/follow.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/justify.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/justify.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/multilineAlign.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/multilineAlign.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-X11/multilineAlign.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-X11/multilineAlign.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/align/data/multilineAlign.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/align/data/multilineAlign.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/align/justify.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/align/multilineAlign.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-MAC/parentanchor.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-MAC/parentanchor.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-X11/parentanchor.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-X11/parentanchor.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data/parentanchor.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/parentanchor.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/QTBUG-14469.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-X11/QTBUG-14469.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-X11/QTBUG-14469.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data/QTBUG-14469.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data/QTBUG-14469.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/data/qtbug_14865.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/data/qtbug_14865.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.5.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/elide/elide.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/elide/elide2.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/elide/multilength.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/BorderedText.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext2.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext2.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext3.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext3.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext2.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext2.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext2.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext2.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext3.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext3.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/richtext.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/richtext.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/richtext2.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/richtext2.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext2.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext2.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext3.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext3.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/richtext.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/richtext.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/richtext2.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/richtext2.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/plaintext.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/plaintext2.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/plaintext3.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/richtext.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/font/richtext2.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines_wrap.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines_wrap.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines_wrap_elide.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines_wrap_elide.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/wrap.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/wrap.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/wrap_elide.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/wrap_elide.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines_wrap.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines_wrap.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines_wrap_elide.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines_wrap_elide.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/wrap.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/wrap.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/wrap_elide.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/wrap_elide.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/newLines.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/newLines_wrap.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/newLines_wrap_elide.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/wrap.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/wrap_elide.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetext/qtbug_14865.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/MultilineEdit.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/cursorDelegate.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.5.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.6.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.7.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.8.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.9.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/justify.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/justify.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.10.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.11.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.12.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.5.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.6.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.7.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.8.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.9.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.5.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.6.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.7.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.5.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.6.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.7.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.8.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.9.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/linkActivated.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/linkActivated.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/linkActivated.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.10.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.11.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.12.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.5.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.6.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.7.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.8.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.9.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.5.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.6.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.7.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.5.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.6.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.7.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.8.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.9.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.5.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.6.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/linkActivated.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/linkActivated.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/linkActivated.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/qt-669.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/qt-669.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/qt-669.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/qt-669.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/qt-669.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.10.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.11.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.5.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.6.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.7.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.8.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.9.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/wrap.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/wrap.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/wrap.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/wrap.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/wrap.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/wrap.5.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/wrap.6.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/wrap.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/flickableEdit.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/justify.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/linkActivated.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/qt-669.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/usingMultilineEdit.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextedit/wrap.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/LineEdit.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/cursorDelegate.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.5.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.6.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.7.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.8.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/hAlign.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/hAlign.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.10.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.11.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.5.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.6.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.7.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.8.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.9.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.5.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/hAlign.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/hAlign.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.5.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.10.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.11.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.5.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.6.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.7.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.8.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.9.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/cursorDelegate.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/echoMode.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.0.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.1.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.2.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.3.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.4.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.5.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.6.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.7.png create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/hAlign.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/echoMode.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/flickableInput.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/hAlign.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/qtbug-15818.qml create mode 100644 tests/auto/declarative/qmlvisual/qdeclarativetextinput/usingLineEdit.qml create mode 100644 tests/auto/declarative/qmlvisual/qmlvisual.pro create mode 100644 tests/auto/declarative/qmlvisual/rect/GradientRect.qml create mode 100644 tests/auto/declarative/qmlvisual/rect/MyRect.qml create mode 100644 tests/auto/declarative/qmlvisual/rect/data/GradientRect.0.png create mode 100644 tests/auto/declarative/qmlvisual/rect/data/GradientRect.qml create mode 100644 tests/auto/declarative/qmlvisual/rect/data/MyRect.0.png create mode 100644 tests/auto/declarative/qmlvisual/rect/data/MyRect.qml create mode 100644 tests/auto/declarative/qmlvisual/rect/data/rect-painting.0.png create mode 100644 tests/auto/declarative/qmlvisual/rect/data/rect-painting.qml create mode 100644 tests/auto/declarative/qmlvisual/rect/rect-painting.qml create mode 100644 tests/auto/declarative/qmlvisual/repeater/basic1.qml create mode 100644 tests/auto/declarative/qmlvisual/repeater/basic2.qml create mode 100644 tests/auto/declarative/qmlvisual/repeater/basic3.qml create mode 100644 tests/auto/declarative/qmlvisual/repeater/basic4.qml create mode 100644 tests/auto/declarative/qmlvisual/repeater/data/basic1.0.png create mode 100644 tests/auto/declarative/qmlvisual/repeater/data/basic1.qml create mode 100644 tests/auto/declarative/qmlvisual/repeater/data/basic2.0.png create mode 100644 tests/auto/declarative/qmlvisual/repeater/data/basic2.qml create mode 100644 tests/auto/declarative/qmlvisual/repeater/data/basic3.0.png create mode 100644 tests/auto/declarative/qmlvisual/repeater/data/basic3.qml create mode 100644 tests/auto/declarative/qmlvisual/repeater/data/basic4.0.png create mode 100644 tests/auto/declarative/qmlvisual/repeater/data/basic4.qml create mode 100644 tests/auto/declarative/qmlvisual/selftest_noimages/data/selftest_noimages.qml create mode 100644 tests/auto/declarative/qmlvisual/selftest_noimages/selftest_noimages.qml create mode 100644 tests/auto/declarative/qmlvisual/shared/DejaVuSansMono.ttf create mode 100644 tests/auto/declarative/qmlvisual/shared/README create mode 100644 tests/auto/declarative/qmlvisual/shared/TestText.qml create mode 100644 tests/auto/declarative/qmlvisual/shared/TestTextEdit.qml create mode 100644 tests/auto/declarative/qmlvisual/shared/TestTextInput.qml create mode 100644 tests/auto/declarative/qmlvisual/shared/qmldir create mode 100644 tests/auto/declarative/qmlvisual/tst_qmlvisual.cpp create mode 100644 tests/auto/declarative/qmlvisual/webview/autosize/autosize.qml create mode 100644 tests/auto/declarative/qmlvisual/webview/autosize/data-X11/autosize.0.png create mode 100644 tests/auto/declarative/qmlvisual/webview/autosize/data-X11/autosize.1.png create mode 100644 tests/auto/declarative/qmlvisual/webview/autosize/data-X11/autosize.2.png create mode 100644 tests/auto/declarative/qmlvisual/webview/autosize/data-X11/autosize.3.png create mode 100644 tests/auto/declarative/qmlvisual/webview/autosize/data-X11/autosize.4.png create mode 100644 tests/auto/declarative/qmlvisual/webview/autosize/data/autosize.0.png create mode 100644 tests/auto/declarative/qmlvisual/webview/autosize/data/autosize.1.png create mode 100644 tests/auto/declarative/qmlvisual/webview/autosize/data/autosize.2.png create mode 100644 tests/auto/declarative/qmlvisual/webview/autosize/data/autosize.3.png create mode 100644 tests/auto/declarative/qmlvisual/webview/autosize/data/autosize.4.png create mode 100644 tests/auto/declarative/qmlvisual/webview/autosize/data/autosize.qml create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.0.png create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.1.png create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.10.png create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.2.png create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.3.png create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.4.png create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.5.png create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.6.png create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.7.png create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.8.png create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.9.png create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.qml create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/flickweb.qml create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/qtlogo.png create mode 100644 tests/auto/declarative/qmlvisual/webview/flickable/test.html create mode 100644 tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.0.png create mode 100644 tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.1.png create mode 100644 tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.2.png create mode 100644 tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.3.png create mode 100644 tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.4.png create mode 100644 tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.5.png create mode 100644 tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.6.png create mode 100644 tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.7.png create mode 100644 tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.8.png create mode 100644 tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.qml create mode 100644 tests/auto/declarative/qmlvisual/webview/javascript/data/windowObjects.0.png create mode 100644 tests/auto/declarative/qmlvisual/webview/javascript/data/windowObjects.1.png create mode 100644 tests/auto/declarative/qmlvisual/webview/javascript/data/windowObjects.2.png create mode 100644 tests/auto/declarative/qmlvisual/webview/javascript/data/windowObjects.3.png create mode 100644 tests/auto/declarative/qmlvisual/webview/javascript/data/windowObjects.4.png create mode 100644 tests/auto/declarative/qmlvisual/webview/javascript/data/windowObjects.qml create mode 100644 tests/auto/declarative/qmlvisual/webview/javascript/evaluateJavaScript.qml create mode 100644 tests/auto/declarative/qmlvisual/webview/javascript/test-objects.html create mode 100644 tests/auto/declarative/qmlvisual/webview/javascript/windowObjects.qml create mode 100644 tests/auto/declarative/qmlvisual/webview/settings/data/fontFamily.0.png create mode 100644 tests/auto/declarative/qmlvisual/webview/settings/data/fontFamily.qml create mode 100644 tests/auto/declarative/qmlvisual/webview/settings/data/fontSize.0.png create mode 100644 tests/auto/declarative/qmlvisual/webview/settings/data/fontSize.qml create mode 100644 tests/auto/declarative/qmlvisual/webview/settings/data/noAutoLoadImages.0.png create mode 100644 tests/auto/declarative/qmlvisual/webview/settings/data/noAutoLoadImages.1.png create mode 100644 tests/auto/declarative/qmlvisual/webview/settings/data/noAutoLoadImages.qml create mode 100644 tests/auto/declarative/qmlvisual/webview/settings/data/setFontFamily.0.png create mode 100644 tests/auto/declarative/qmlvisual/webview/settings/data/setFontFamily.qml create mode 100644 tests/auto/declarative/qmlvisual/webview/settings/fontFamily.qml create mode 100644 tests/auto/declarative/qmlvisual/webview/settings/fontSize.qml create mode 100644 tests/auto/declarative/qmlvisual/webview/settings/noAutoLoadImages.qml create mode 100644 tests/auto/declarative/qmlvisual/webview/settings/qtlogo.png create mode 100644 tests/auto/declarative/qmlvisual/webview/settings/setFontFamily.qml create mode 100644 tests/auto/declarative/qmlvisual/webview/settings/tarzeau_ocr_a.ttf create mode 100644 tests/auto/declarative/qmlvisual/webview/settings/test-img.html create mode 100644 tests/auto/declarative/qmlvisual/webview/settings/test.html create mode 100644 tests/auto/declarative/qmlvisual/webview/zooming/data/pageWidth.qml create mode 100644 tests/auto/declarative/qmlvisual/webview/zooming/data/renderControl.0.png create mode 100644 tests/auto/declarative/qmlvisual/webview/zooming/data/renderControl.qml create mode 100644 tests/auto/declarative/qmlvisual/webview/zooming/data/resolution.0.png create mode 100644 tests/auto/declarative/qmlvisual/webview/zooming/data/resolution.1.png create mode 100644 tests/auto/declarative/qmlvisual/webview/zooming/data/resolution.2.png create mode 100644 tests/auto/declarative/qmlvisual/webview/zooming/data/resolution.3.png create mode 100644 tests/auto/declarative/qmlvisual/webview/zooming/data/resolution.4.png create mode 100644 tests/auto/declarative/qmlvisual/webview/zooming/data/resolution.qml create mode 100644 tests/auto/declarative/qmlvisual/webview/zooming/data/zoomTextOnly.0.png create mode 100644 tests/auto/declarative/qmlvisual/webview/zooming/data/zoomTextOnly.1.png create mode 100644 tests/auto/declarative/qmlvisual/webview/zooming/data/zoomTextOnly.qml create mode 100644 tests/auto/declarative/qmlvisual/webview/zooming/data/zooming.0.png create mode 100644 tests/auto/declarative/qmlvisual/webview/zooming/data/zooming.1.png create mode 100644 tests/auto/declarative/qmlvisual/webview/zooming/data/zooming.2.png create mode 100644 tests/auto/declarative/qmlvisual/webview/zooming/data/zooming.3.png create mode 100644 tests/auto/declarative/qmlvisual/webview/zooming/data/zooming.qml create mode 100644 tests/auto/declarative/qmlvisual/webview/zooming/pageWidth.qml create mode 100644 tests/auto/declarative/qmlvisual/webview/zooming/qtlogo.png create mode 100644 tests/auto/declarative/qmlvisual/webview/zooming/renderControl.html create mode 100644 tests/auto/declarative/qmlvisual/webview/zooming/renderControl.qml create mode 100644 tests/auto/declarative/qmlvisual/webview/zooming/resolution.html create mode 100644 tests/auto/declarative/qmlvisual/webview/zooming/resolution.qml create mode 100644 tests/auto/declarative/qmlvisual/webview/zooming/zoomTextOnly.html create mode 100644 tests/auto/declarative/qmlvisual/webview/zooming/zoomTextOnly.qml create mode 100644 tests/auto/declarative/qmlvisual/webview/zooming/zooming.html create mode 100644 tests/auto/declarative/qmlvisual/webview/zooming/zooming.qml create mode 100644 tests/auto/declarative/qpacketprotocol/qpacketprotocol.pro create mode 100644 tests/auto/declarative/qpacketprotocol/tst_qpacketprotocol.cpp create mode 100644 tests/auto/declarative/qperformancetimer/qperformancetimer.pro create mode 100644 tests/auto/declarative/qperformancetimer/tst_qperformancetimer.cpp create mode 100755 tests/auto/declarative/runall.sh create mode 100644 tests/auto/declarative/shared/debugutil.cpp create mode 100644 tests/auto/declarative/shared/debugutil_p.h create mode 100644 tests/auto/declarative/shared/testhttpserver.cpp create mode 100644 tests/auto/declarative/shared/testhttpserver.h create mode 100644 tests/auto/declarative/symbianlibs.pri (limited to 'tests/auto/declarative') diff --git a/tests/auto/declarative/declarative.pro b/tests/auto/declarative/declarative.pro new file mode 100644 index 00000000..08d59d34 --- /dev/null +++ b/tests/auto/declarative/declarative.pro @@ -0,0 +1,85 @@ +TEMPLATE = subdirs +!symbian: { +SUBDIRS += \ + qdeclarativemetatype \ + qmetaobjectbuilder +} + +SUBDIRS += \ + examples \ + parserstress \ + qdeclarativecomponent \ + qdeclarativecontext \ + qdeclarativeengine \ + qdeclarativeerror \ + qdeclarativefolderlistmodel \ + qdeclarativeinfo \ + qdeclarativelayoutitem \ + qdeclarativelistreference \ + qdeclarativemoduleplugin \ + qdeclarativeparticles \ + qdeclarativepixmapcache \ + qdeclarativeqt \ + qdeclarativeview \ + qdeclarativeviewer \ + qdeclarativexmlhttprequest \ + qmlvisual \ + moduleqt47 + +contains(QT_CONFIG, private_tests) { + SUBDIRS += \ + qdeclarativeanchors \ + qdeclarativeanimatedimage \ + qdeclarativeanimations \ + qdeclarativeapplication \ + qdeclarativebehaviors \ + qdeclarativebinding \ + qdeclarativeborderimage \ + qdeclarativeconnection \ + qdeclarativedebug \ + qdeclarativedebugclient \ + qdeclarativedebugservice \ + qdeclarativedebugjs \ + qdeclarativedom \ + qdeclarativeecmascript \ + qdeclarativeflickable \ + qdeclarativeflipable \ + qdeclarativefocusscope \ + qdeclarativefontloader \ + qdeclarativegridview \ + qdeclarativeimage \ + qdeclarativeimageprovider \ + qdeclarativeinstruction \ + qdeclarativeitem \ + qdeclarativelanguage \ + qdeclarativelistmodel \ + qdeclarativelistview \ + qdeclarativeloader \ + qdeclarativemousearea \ + qdeclarativepathview \ + qdeclarativepincharea \ + qdeclarativepositioners \ + qdeclarativeproperty \ + qdeclarativepropertymap \ + qdeclarativerepeater \ + qdeclarativesmoothedanimation \ + qdeclarativespringanimation \ + qdeclarativestyledtext \ + qdeclarativesqldatabase \ + qdeclarativestates \ + qdeclarativesystempalette \ + qdeclarativetext \ + qdeclarativetextedit \ + qdeclarativetextinput \ + qdeclarativetimer \ + qdeclarativevaluetypes \ + qdeclarativevisualdatamodel \ + qdeclarativeworkerscript \ + qdeclarativexmllistmodel \ + qpacketprotocol +} + +contains(QT_CONFIG, opengl): SUBDIRS += qmlshadersplugin + +# Tests which should run in Pulse +PULSE_TESTS = $$SUBDIRS diff --git a/tests/auto/declarative/examples/data/dummytest.qml b/tests/auto/declarative/examples/data/dummytest.qml new file mode 100644 index 00000000..b20e907f --- /dev/null +++ b/tests/auto/declarative/examples/data/dummytest.qml @@ -0,0 +1,6 @@ +import Qt.VisualTest 4.6 + +VisualTest { + Frame { msec: 0 } + Frame { msec: 10 } +} diff --git a/tests/auto/declarative/examples/data/webbrowser/webbrowser.qml b/tests/auto/declarative/examples/data/webbrowser/webbrowser.qml new file mode 100644 index 00000000..d31787b9 --- /dev/null +++ b/tests/auto/declarative/examples/data/webbrowser/webbrowser.qml @@ -0,0 +1,6 @@ +import Qt.VisualTest 4.6 + +VisualTest { + Frame { msec: 0 } + Frame { msec: 2000 } +} diff --git a/tests/auto/declarative/examples/examples.pro b/tests/auto/declarative/examples/examples.pro new file mode 100644 index 00000000..1f257693 --- /dev/null +++ b/tests/auto/declarative/examples/examples.pro @@ -0,0 +1,21 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +macx:CONFIG -= app_bundle + +SOURCES += tst_examples.cpp + +include(../../../../tools/qml/qml.pri) + +include(../symbianlibs.pri) + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + +CONFIG+=insignificant_test # QTQAINFRA-428 diff --git a/tests/auto/declarative/examples/tst_examples.cpp b/tests/auto/declarative/examples/tst_examples.cpp new file mode 100644 index 00000000..790d3d9e --- /dev/null +++ b/tests/auto/declarative/examples/tst_examples.cpp @@ -0,0 +1,230 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include "qmlruntime.h" +#include +#include + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_examples : public QObject +{ + Q_OBJECT +public: + tst_examples(); + +private slots: + void examples_data(); + void examples(); + + void namingConvention(); +private: + QString qmlruntime; + QStringList excludedDirs; + + void namingConvention(const QDir &); + QStringList findQmlFiles(const QDir &); +}; + +tst_examples::tst_examples() +{ + QString binaries = QLibraryInfo::location(QLibraryInfo::BinariesPath); + +#if defined(Q_WS_MAC) + qmlruntime = QDir(binaries).absoluteFilePath("qml.app/Contents/MacOS/qml"); +#elif defined(Q_WS_WIN) + qmlruntime = QDir(binaries).absoluteFilePath("qml.exe"); +#else + qmlruntime = QDir(binaries).absoluteFilePath("qml"); +#endif + + + // Add directories you want excluded here + excludedDirs << "doc/src/snippets/declarative/visualdatamodel_rootindex"; + excludedDirs << "doc/src/snippets/declarative/qtbinding"; + +#ifdef QT_NO_WEBKIT + excludedDirs << "examples/declarative/modelviews/webview"; + excludedDirs << "demos/declarative/webbrowser"; +#endif + +#ifdef QT_NO_XMLPATTERNS + excludedDirs << "examples/declarative/xml/xmldata"; + excludedDirs << "demos/declarative/twitter"; + excludedDirs << "demos/declarative/flickr"; + excludedDirs << "demos/declarative/photoviewer"; +#endif +} + +/* +This tests that the demos and examples follow the naming convention required +to have them tested by the examples() test. +*/ +void tst_examples::namingConvention(const QDir &d) +{ + for (int ii = 0; ii < excludedDirs.count(); ++ii) { + QString s = excludedDirs.at(ii); + if (d.absolutePath().endsWith(s)) + return; + } + + QStringList files = d.entryList(QStringList() << QLatin1String("*.qml"), + QDir::Files); + + bool seenQml = !files.isEmpty(); + bool seenLowercase = false; + + foreach (const QString &file, files) { + if (file.at(0).isLower()) + seenLowercase = true; + } + + if (!seenQml) { + QStringList dirs = d.entryList(QDir::Dirs | QDir::NoDotAndDotDot | + QDir::NoSymLinks); + foreach (const QString &dir, dirs) { + QDir sub = d; + sub.cd(dir); + namingConvention(sub); + } + } else if(!seenLowercase) { + QTest::qFail(QString("Directory " + d.absolutePath() + " violates naming convention").toLatin1().constData(), __FILE__, __LINE__); + } +} + +void tst_examples::namingConvention() +{ + QString examples = QLibraryInfo::location(QLibraryInfo::ExamplesPath); + QString demos = QLibraryInfo::location(QLibraryInfo::DemosPath); + + namingConvention(QDir(examples)); + namingConvention(QDir(demos)); +} + +QStringList tst_examples::findQmlFiles(const QDir &d) +{ + for (int ii = 0; ii < excludedDirs.count(); ++ii) { + QString s = excludedDirs.at(ii); + if (d.absolutePath().endsWith(s)) + return QStringList(); + } + + QStringList rv; + + QStringList cppfiles = d.entryList(QStringList() << QLatin1String("*.cpp"), QDir::Files); + if (cppfiles.isEmpty()) { + QStringList files = d.entryList(QStringList() << QLatin1String("*.qml"), + QDir::Files); + foreach (const QString &file, files) { + if (file.at(0).isLower()) { + rv << d.absoluteFilePath(file); + } + } + } + + QStringList dirs = d.entryList(QDir::Dirs | QDir::NoDotAndDotDot | + QDir::NoSymLinks); + foreach (const QString &dir, dirs) { + QDir sub = d; + sub.cd(dir); + rv << findQmlFiles(sub); + } + + return rv; +} + +/* +This test runs all the examples in the declarative UI source tree and ensures +that they start and exit cleanly. + +Examples are any .qml files under the examples/ or demos/ directory that start +with a lower case letter. +*/ +void tst_examples::examples_data() +{ + QTest::addColumn("file"); + + QString examples = QLatin1String(SRCDIR) + "/../../../../demos/declarative/"; + QString demos = QLatin1String(SRCDIR) + "/../../../../examples/declarative/"; + QString snippets = QLatin1String(SRCDIR) + "/../../../../doc/src/snippets/"; + + QStringList files; + files << findQmlFiles(QDir(examples)); + files << findQmlFiles(QDir(demos)); + files << findQmlFiles(QDir(snippets)); + + foreach (const QString &file, files) + QTest::newRow(qPrintable(file)) << file; +} + +static void silentErrorsMsgHandler(QtMsgType, const char *) +{ +} + +void tst_examples::examples() +{ + QFETCH(QString, file); + + QDeclarativeViewer viewer; + + QtMsgHandler old = qInstallMsgHandler(silentErrorsMsgHandler); + QVERIFY(viewer.open(file)); + qInstallMsgHandler(old); + + if (viewer.view()->status() == QDeclarativeView::Error) + qWarning() << viewer.view()->errors(); + + QCOMPARE(viewer.view()->status(), QDeclarativeView::Ready); + viewer.show(); + + QTest::qWaitForWindowShown(&viewer); +} + +QTEST_MAIN(tst_examples) + +#include "tst_examples.moc" diff --git a/tests/auto/declarative/moduleqt47/data/importqt47.qml b/tests/auto/declarative/moduleqt47/data/importqt47.qml new file mode 100644 index 00000000..0a1b533c --- /dev/null +++ b/tests/auto/declarative/moduleqt47/data/importqt47.qml @@ -0,0 +1,80 @@ +import Qt 4.7 + +Item { + QtObject {} + + Component { Item {} } + + // Util + states: [ + State { + name: "bob" + AnchorChanges {} + ParentChange {} + StateChangeScript {} + PropertyChanges {} + } + ] + transitions: [ + Transition { + AnchorAnimation {} + ColorAnimation {} + SmoothedAnimation {} + NumberAnimation {} + ParallelAnimation {} + ParentAnimation {} + PauseAnimation {} + PropertyAnimation {} + RotationAnimation {} + ScriptAction {} + SequentialAnimation {} + SpringAnimation {} + Vector3dAnimation {} + } + ] + + Behavior on x {} + Binding {} + Connections {} + FontLoader {} + ListModel { ListElement {} } + SystemPalette {} + Timer {} + + // graphic items + BorderImage {} + Column {} + MouseArea {} + Flickable {} + Flipable {} + Flow {} + FocusPanel {} + FocusScope {} + Rectangle { gradient: Gradient { GradientStop {} } } + Grid {} + GridView {} + Image {} + ListView {} + Loader {} + PathView { + path: Path { + PathLine {} + PathCubic {} + PathPercent {} + PathQuad {} + PathAttribute {} + } + } + Repeater {} + Rotation {} + Row {} + Translate {} + Scale {} + Text {} + TextEdit {} + TextInput {} + VisualItemModel {} + VisualDataModel {} + + Keys.onPressed: console.log("Press") +} diff --git a/tests/auto/declarative/moduleqt47/moduleqt47.pro b/tests/auto/declarative/moduleqt47/moduleqt47.pro new file mode 100644 index 00000000..ff773e8f --- /dev/null +++ b/tests/auto/declarative/moduleqt47/moduleqt47.pro @@ -0,0 +1,16 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative gui +macx:CONFIG -= app_bundle + +SOURCES += tst_moduleqt47.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/moduleqt47/tst_moduleqt47.cpp b/tests/auto/declarative/moduleqt47/tst_moduleqt47.cpp new file mode 100644 index 00000000..3c6cbd9a --- /dev/null +++ b/tests/auto/declarative/moduleqt47/tst_moduleqt47.cpp @@ -0,0 +1,136 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_moduleqt47 : public QObject +{ + Q_OBJECT +public: + tst_moduleqt47(); + +private slots: + void create(); + + void accidentalImport_data(); + void accidentalImport(); + +private: + QStringList findFiles(const QDir &d); + + QDeclarativeEngine engine; + QStringList excludedFiles; +}; + +tst_moduleqt47::tst_moduleqt47() +{ + excludedFiles << "tests/auto/declarative/moduleqt47/data/importqt47.qml" + << "doc/src/declarative/whatsnew.qdoc"; +} + +void tst_moduleqt47::create() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/importqt47.qml")); + QObject *obj = qobject_cast(c.create()); + + QVERIFY(obj != 0); + delete obj; +} + +QStringList tst_moduleqt47::findFiles(const QDir &d) +{ + QStringList rv; + + QStringList files = d.entryList(QStringList() << QLatin1String("*.qml") << QLatin1String("*.qdoc"), QDir::Files); + foreach (const QString &file, files) { + + QString absFile = d.absoluteFilePath(file); + + bool skip = false; + for (int ii = 0; !skip && ii < excludedFiles.count(); ++ii) + skip = (absFile.endsWith(excludedFiles.at(ii))); + + if (!skip) + rv << absFile; + } + + QStringList dirs = d.entryList(QDir::Dirs | QDir::NoDotAndDotDot | QDir::NoSymLinks); + foreach (const QString &dir, dirs) { + QDir sub = d; + sub.cd(dir); + rv << findFiles(sub); + } + + return rv; +} + +void tst_moduleqt47::accidentalImport_data() +{ + QTest::addColumn("file"); + QStringList files = findFiles(QDir(SRCDIR "/../../../../")); + + foreach(const QString &file, files) + QTest::newRow(qPrintable(file)) << file; +} + +void tst_moduleqt47::accidentalImport() +{ + QFETCH(QString, file); + + QFile f(file); + if (!f.open(QIODevice::ReadOnly)) + return; + QByteArray data = f.readAll(); + + QVERIFY(!data.contains("import Qt 4")); +} + +QTEST_MAIN(tst_moduleqt47) + +#include "tst_moduleqt47.moc" diff --git a/tests/auto/declarative/parserstress/parserstress.pro b/tests/auto/declarative/parserstress/parserstress.pro new file mode 100644 index 00000000..6ef2432b --- /dev/null +++ b/tests/auto/declarative/parserstress/parserstress.pro @@ -0,0 +1,16 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +macx:CONFIG -= app_bundle + +SOURCES += tst_parserstress.cpp + +symbian: { + importFiles.files = ..\\..\\qscriptjstestsuite\\tests + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/parserstress/tst_parserstress.cpp b/tests/auto/declarative/parserstress/tst_parserstress.cpp new file mode 100644 index 00000000..33896d52 --- /dev/null +++ b/tests/auto/declarative/parserstress/tst_parserstress.cpp @@ -0,0 +1,165 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#include +#include + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_parserstress : public QObject +{ + Q_OBJECT +public: + tst_parserstress() {} + +private slots: + void ecmascript_data(); + void ecmascript(); + +private: + static QStringList findJSFiles(const QDir &); + QDeclarativeEngine engine; +}; + +QStringList tst_parserstress::findJSFiles(const QDir &d) +{ + QStringList rv; + + QStringList files = d.entryList(QStringList() << QLatin1String("*.js"), + QDir::Files); + foreach (const QString &file, files) { + if (file == "browser.js") + continue; + rv << d.absoluteFilePath(file); + } + + QStringList dirs = d.entryList(QDir::Dirs | QDir::NoDotAndDotDot | + QDir::NoSymLinks); + foreach (const QString &dir, dirs) { + QDir sub = d; + sub.cd(dir); + rv << findJSFiles(sub); + } + + return rv; +} + +void tst_parserstress::ecmascript_data() +{ +#ifdef Q_OS_SYMBIAN + QDir dir("tests"); +#else + QDir dir(SRCDIR); + dir.cdUp(); + dir.cdUp(); + dir.cd("qscriptjstestsuite"); + dir.cd("tests"); +#endif + QStringList files = findJSFiles(dir); + + QTest::addColumn("file"); + foreach (const QString &file, files) { + QTest::newRow(qPrintable(file)) << file; + } +} + +void tst_parserstress::ecmascript() +{ + QFETCH(QString, file); + + QFile f(file); + QVERIFY(f.open(QIODevice::ReadOnly)); + + QByteArray data = f.readAll(); + + QVERIFY(!data.isEmpty()); + + QString dataStr = QString::fromUtf8(data); + + QString qml = "import QtQuick 1.0\n"; + qml+= "\n"; + qml+= "QtObject {\n"; + qml+= " property int test\n"; + qml+= " test: {\n"; + qml+= dataStr + "\n"; + qml+= " return 1;\n"; + qml+= " }\n"; + qml+= " function stress() {\n"; + qml+= dataStr; + qml+= " }\n"; + qml+= "}\n"; + + QByteArray qmlData = qml.toUtf8(); + + QDeclarativeComponent component(&engine); + + component.setData(qmlData, QUrl::fromLocalFile(SRCDIR + QString("/dummy.qml"))); + + QFileInfo info(file); + + if (info.fileName() == QLatin1String("regress-352044-02-n.js")) { + QVERIFY(component.isError()); + + QCOMPARE(component.errors().length(), 2); + + QCOMPARE(component.errors().at(0).description(), QString("Expected token `;'")); + QCOMPARE(component.errors().at(0).line(), 66); + + QCOMPARE(component.errors().at(1).description(), QString("Expected token `;'")); + QCOMPARE(component.errors().at(1).line(), 142); + + } else { + + QVERIFY(!component.isError()); + } +} + + +QTEST_MAIN(tst_parserstress) + +#include "tst_parserstress.moc" diff --git a/tests/auto/declarative/qdeclarativeanchors/data/anchors.qml b/tests/auto/declarative/qdeclarativeanchors/data/anchors.qml new file mode 100644 index 00000000..9b7c8053 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanchors/data/anchors.qml @@ -0,0 +1,162 @@ +import QtQuick 1.0 + +Rectangle { + color: "white" + width: 240 + height: 320 + Rectangle { id: masterRect; objectName: "masterRect"; x: 26; width: 96; height: 20; color: "red" } + Rectangle { + id: rect1; objectName: "rect1" + y: 20; width: 10; height: 10 + anchors.left: masterRect.left + } + Rectangle { + id: rect2; objectName: "rect2" + y: 20; width: 10; height: 10 + anchors.left: masterRect.right + } + Rectangle { + id: rect3; objectName: "rect3" + y: 20; width: 10; height: 10 + anchors.left: masterRect.horizontalCenter + } + Rectangle { + id: rect4; objectName: "rect4" + y: 30; width: 10; height: 10 + anchors.right: masterRect.left + } + Rectangle { + id: rect5; objectName: "rect5" + y: 30; width: 10; height: 10 + anchors.right: masterRect.right + } + Rectangle { + id: rect6; objectName: "rect6" + y: 30; width: 10; height: 10 + anchors.right: masterRect.horizontalCenter + } + Rectangle { + id: rect7; objectName: "rect7" + y: 50; width: 10; height: 10 + anchors.left: parent.left + } + Rectangle { + id: rect8; objectName: "rect8" + y: 50; width: 10; height: 10 + anchors.left: parent.right + } + Rectangle { + id: rect9; objectName: "rect9" + y: 50; width: 10; height: 10 + anchors.left: parent.horizontalCenter + } + Rectangle { + id: rect10; objectName: "rect10" + y: 60; width: 10; height: 10 + anchors.right: parent.left + } + Rectangle { + id: rect11; objectName: "rect11" + y: 60; width: 10; height: 10 + anchors.right: parent.right + } + Rectangle { + id: rect12; objectName: "rect12" + y: 60; width: 10; height: 10 + anchors.right: parent.horizontalCenter + } + Rectangle { + id: rect13; objectName: "rect13" + x: 200; width: 10; height: 10 + anchors.top: masterRect.bottom + } + Rectangle { + id: rect14; objectName: "rect14" + width: 10; height: 10; color: "steelblue" + anchors.verticalCenter: parent.verticalCenter + } + Rectangle { + id: rect15; objectName: "rect15" + y: 200; height: 10 + anchors.left: masterRect.left + anchors.right: masterRect.right + } + Rectangle { + id: rect16; objectName: "rect16" + y: 220; height: 10 + anchors.left: masterRect.left + anchors.horizontalCenter: masterRect.right + } + Rectangle { + id: rect17; objectName: "rect17" + y: 240; height: 10 + anchors.right: masterRect.right + anchors.horizontalCenter: masterRect.left + } + Rectangle { + id: rect18; objectName: "rect18" + x: 180; width: 10 + anchors.top: masterRect.bottom + anchors.bottom: rect12.top + } + Rectangle { + id: rect19; objectName: "rect19" + y: 70; width: 10; height: 10 + anchors.horizontalCenter: parent.horizontalCenter + } + Rectangle { + id: rect20; objectName: "rect20" + y: 70; width: 10; height: 10 + anchors.horizontalCenter: parent.right + } + Rectangle { + id: rect21; objectName: "rect21" + y: 70; width: 10; height: 10 + anchors.horizontalCenter: parent.left + } + Rectangle { + id: rect22; objectName: "rect22" + width: 10; height: 10 + anchors.centerIn: masterRect + } + Rectangle { + id: rect23; objectName: "rect23" + anchors.left: masterRect.left + anchors.leftMargin: 5 + anchors.right: masterRect.right + anchors.rightMargin: 5 + anchors.top: masterRect.top + anchors.topMargin: 5 + anchors.bottom: masterRect.bottom + anchors.bottomMargin: 5 + } + Rectangle { + id: rect24; objectName: "rect24" + width: 10; height: 10 + anchors.horizontalCenter: masterRect.left + anchors.horizontalCenterOffset: width/2 + } + Rectangle { + id: rect25; objectName: "rect25" + width: 10; height: 10 + anchors.verticalCenter: rect12.top + anchors.verticalCenterOffset: height/2 + } + Rectangle { + id: rect26; objectName: "rect26" + width: 10; height: 10 + anchors.baseline: masterRect.top + anchors.baselineOffset: height/2 + } + Text { + id: text1; objectName: "text1" + y: 200; + text: "Hello" + } + Text { + id: text2; objectName: "text2" + anchors.baseline: text1.baseline + anchors.left: text1.right + text: "World" + } +} diff --git a/tests/auto/declarative/qdeclarativeanchors/data/anchorsqgraphicswidget.qml b/tests/auto/declarative/qdeclarativeanchors/data/anchorsqgraphicswidget.qml new file mode 100644 index 00000000..82d0315a --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanchors/data/anchorsqgraphicswidget.qml @@ -0,0 +1,162 @@ +import QtQuick 1.0 + +Rectangle { + color: "white" + width: 240 + height: 320 + Rectangle { id: masterRect; objectName: "masterRect"; x: 26; width: 96; height: 20; color: "red" } + QGraphicsWidget { + id: rect1; objectName: "rect1" + y: 20; width: 10; height: 10 + anchors.left: masterRect.left + } + QGraphicsWidget { + id: rect2; objectName: "rect2" + y: 20; width: 10; height: 10 + anchors.left: masterRect.right + } + QGraphicsWidget { + id: rect3; objectName: "rect3" + y: 20; width: 10; height: 10 + anchors.left: masterRect.horizontalCenter + } + QGraphicsWidget { + id: rect4; objectName: "rect4" + y: 30; width: 10; height: 10 + anchors.right: masterRect.left + } + QGraphicsWidget { + id: rect5; objectName: "rect5" + y: 30; width: 10; height: 10 + anchors.right: masterRect.right + } + QGraphicsWidget { + id: rect6; objectName: "rect6" + y: 30; width: 10; height: 10 + anchors.right: masterRect.horizontalCenter + } + QGraphicsWidget { + id: rect7; objectName: "rect7" + y: 50; width: 10; height: 10 + anchors.left: parent.left + } + QGraphicsWidget { + id: rect8; objectName: "rect8" + y: 50; width: 10; height: 10 + anchors.left: parent.right + } + QGraphicsWidget { + id: rect9; objectName: "rect9" + y: 50; width: 10; height: 10 + anchors.left: parent.horizontalCenter + } + QGraphicsWidget { + id: rect10; objectName: "rect10" + y: 60; width: 10; height: 10 + anchors.right: parent.left + } + QGraphicsWidget { + id: rect11; objectName: "rect11" + y: 60; width: 10; height: 10 + anchors.right: parent.right + } + QGraphicsWidget { + id: rect12; objectName: "rect12" + y: 60; width: 10; height: 10 + anchors.right: parent.horizontalCenter + } + QGraphicsWidget { + id: rect13; objectName: "rect13" + x: 200; width: 10; height: 10 + anchors.top: masterRect.bottom + } + QGraphicsWidget { + id: rect14; objectName: "rect14" + width: 10; height: 10; + anchors.verticalCenter: parent.verticalCenter + } + QGraphicsWidget { + id: rect15; objectName: "rect15" + y: 200; height: 10 + anchors.left: masterRect.left + anchors.right: masterRect.right + } + QGraphicsWidget { + id: rect16; objectName: "rect16" + y: 220; height: 10 + anchors.left: masterRect.left + anchors.horizontalCenter: masterRect.right + } + QGraphicsWidget { + id: rect17; objectName: "rect17" + y: 240; height: 10 + anchors.right: masterRect.right + anchors.horizontalCenter: masterRect.left + } + QGraphicsWidget { + id: rect18; objectName: "rect18" + x: 180; width: 10 + anchors.top: masterRect.bottom + anchors.bottom: rect12.top + } + QGraphicsWidget { + id: rect19; objectName: "rect19" + y: 70; width: 10; height: 10 + anchors.horizontalCenter: parent.horizontalCenter + } + QGraphicsWidget { + id: rect20; objectName: "rect20" + y: 70; width: 10; height: 10 + anchors.horizontalCenter: parent.right + } + QGraphicsWidget { + id: rect21; objectName: "rect21" + y: 70; width: 10; height: 10 + anchors.horizontalCenter: parent.left + } + QGraphicsWidget { + id: rect22; objectName: "rect22" + width: 10; height: 10 + anchors.centerIn: masterRect + } + QGraphicsWidget { + id: rect23; objectName: "rect23" + anchors.left: masterRect.left + anchors.leftMargin: 5 + anchors.right: masterRect.right + anchors.rightMargin: 5 + anchors.top: masterRect.top + anchors.topMargin: 5 + anchors.bottom: masterRect.bottom + anchors.bottomMargin: 5 + } + QGraphicsWidget { + id: rect24; objectName: "rect24" + width: 10; height: 10 + anchors.horizontalCenter: masterRect.left + anchors.horizontalCenterOffset: width/2 + } + QGraphicsWidget { + id: rect25; objectName: "rect25" + width: 10; height: 10 + anchors.verticalCenter: rect12.top + anchors.verticalCenterOffset: height/2 + } + Rectangle { + id: rect26; objectName: "rect26" + width: 10; height: 10 + anchors.baseline: masterRect.top + anchors.baselineOffset: height/2 + } + Text { + id: text1; objectName: "text1" + y: 200; + text: "Hello" + } + Text { + id: text2; objectName: "text2" + anchors.baseline: text1.baseline + anchors.left: text1.right + text: "World" + } +} diff --git a/tests/auto/declarative/qdeclarativeanchors/data/centerin.qml b/tests/auto/declarative/qdeclarativeanchors/data/centerin.qml new file mode 100644 index 00000000..d3bc8cb2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanchors/data/centerin.qml @@ -0,0 +1,12 @@ +import QtQuick 1.0 + +Rectangle { + width: 200; height: 200 + Rectangle { + objectName: "centered" + width: 50; height: 50; color: "blue" + anchors.centerIn: parent; + anchors.verticalCenterOffset: 30 + anchors.horizontalCenterOffset: 10 + } +} diff --git a/tests/auto/declarative/qdeclarativeanchors/data/crash1.qml b/tests/auto/declarative/qdeclarativeanchors/data/crash1.qml new file mode 100644 index 00000000..de66067c --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanchors/data/crash1.qml @@ -0,0 +1,11 @@ +import QtQuick 1.0 + +Column { + Text { + text: "foo" + anchors.fill: parent + } + Text { + text: "bar" + } +} diff --git a/tests/auto/declarative/qdeclarativeanchors/data/fill.qml b/tests/auto/declarative/qdeclarativeanchors/data/fill.qml new file mode 100644 index 00000000..ff19675e --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanchors/data/fill.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 + +Rectangle { + width: 200; height: 200 + Rectangle { + objectName: "filler" + width: 50; height: 50; color: "blue" + anchors.fill: parent; + anchors.leftMargin: 10; + anchors.rightMargin: 20; + anchors.topMargin: 30; + anchors.bottomMargin: 40; + } +} diff --git a/tests/auto/declarative/qdeclarativeanchors/data/hvCenter.qml b/tests/auto/declarative/qdeclarativeanchors/data/hvCenter.qml new file mode 100644 index 00000000..11b31ffd --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanchors/data/hvCenter.qml @@ -0,0 +1,11 @@ +import QtQuick 1.0 + +Rectangle { + width: 77; height: 95 + Rectangle { + objectName: "centered" + width: 57; height: 57; color: "blue" + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + } +} diff --git a/tests/auto/declarative/qdeclarativeanchors/data/loop1.qml b/tests/auto/declarative/qdeclarativeanchors/data/loop1.qml new file mode 100644 index 00000000..def48fae --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanchors/data/loop1.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 + +Rectangle { + id: rect + width: 120; height: 200; color: "white" + Text { id: text1; anchors.right: text2.right; text: "Hello" } + Text { id: text2; anchors.right: text1.right; anchors.rightMargin: 10; text: "World" } +} diff --git a/tests/auto/declarative/qdeclarativeanchors/data/loop2.qml b/tests/auto/declarative/qdeclarativeanchors/data/loop2.qml new file mode 100644 index 00000000..21571e29 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanchors/data/loop2.qml @@ -0,0 +1,20 @@ +import QtQuick 1.0 + +Rectangle { + id: container; + width: 600; + height: 600; + + Image { + id: image1 + source: "http://labs.trolltech.com/blogs/wp-content/uploads/2009/03/3311388091_ac2a257feb.jpg" + anchors.right: image2.left + } + + Image { + id: image2 + source: "http://labs.trolltech.com/blogs/wp-content/uploads/2009/03/oslo_groupphoto.jpg" + anchors.left: image1.right + anchors.leftMargin: 20 + } +} diff --git a/tests/auto/declarative/qdeclarativeanchors/data/margins.qml b/tests/auto/declarative/qdeclarativeanchors/data/margins.qml new file mode 100644 index 00000000..685346a8 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanchors/data/margins.qml @@ -0,0 +1,13 @@ +import QtQuick 1.0 + +Rectangle { + width: 200; height: 200 + Rectangle { + objectName: "filler" + width: 50; height: 50; color: "blue" + anchors.fill: parent; + anchors.margins: 10 + anchors.leftMargin: 5 + anchors.topMargin: 6 + } +} diff --git a/tests/auto/declarative/qdeclarativeanchors/qdeclarativeanchors.pro b/tests/auto/declarative/qdeclarativeanchors/qdeclarativeanchors.pro new file mode 100644 index 00000000..f09e8d9f --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanchors/qdeclarativeanchors.pro @@ -0,0 +1,15 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +SOURCES += tst_qdeclarativeanchors.cpp +macx:CONFIG -= app_bundle + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativeanchors/tst_qdeclarativeanchors.cpp b/tests/auto/declarative/qdeclarativeanchors/tst_qdeclarativeanchors.cpp new file mode 100644 index 00000000..17e5eb03 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanchors/tst_qdeclarativeanchors.cpp @@ -0,0 +1,771 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +Q_DECLARE_METATYPE(QDeclarativeAnchors::Anchor) +Q_DECLARE_METATYPE(QDeclarativeAnchorLine::AnchorLine) + +class tst_qdeclarativeanchors : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativeanchors() {} + +private slots: + void basicAnchors(); + void basicAnchorsQGraphicsWidget(); + void basicAnchorsRTL(); + void loops(); + void illegalSets(); + void illegalSets_data(); + void reset(); + void reset_data(); + void resetConvenience(); + void nullItem(); + void nullItem_data(); + void crash1(); + void centerIn(); + void centerInRTL(); + void hvCenter(); + void hvCenterRTL(); + void fill(); + void fillRTL(); + void margins(); + void marginsRTL(); +}; + +/* + Find an item with the specified id. +*/ +template +T *findItem(QGraphicsObject *parent, const QString &objectName) +{ + const QMetaObject &mo = T::staticMetaObject; + QList children = parent->childItems(); + for (int i = 0; i < children.count(); ++i) { + QDeclarativeItem *item = qobject_cast(children.at(i)->toGraphicsObject()); + if (item) { + if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName)) { + return static_cast(item); + } + item = findItem(item, objectName); + if (item) + return static_cast(item); + } + } + + return 0; +} + +QGraphicsObject *findObject(QGraphicsObject *parent, const QString &objectName) +{ + QList children = parent->childItems(); + for (int i = 0; i < children.count(); ++i) { + QGraphicsObject *item = children.at(i)->toGraphicsObject(); + if (item) { + if (objectName.isEmpty() || item->objectName() == objectName) { + return item; + } + item = findObject(item, objectName); + if (item) + return item; + } + } + + return 0; +} + + +void tst_qdeclarativeanchors::basicAnchors() +{ + QDeclarativeView *view = new QDeclarativeView; + view->setSource(QUrl::fromLocalFile(SRCDIR "/data/anchors.qml")); + + qApp->processEvents(); + + //sibling horizontal + QCOMPARE(findItem(view->rootObject(), QLatin1String("rect1"))->x(), 26.0); + QCOMPARE(findItem(view->rootObject(), QLatin1String("rect2"))->x(), 122.0); + QCOMPARE(findItem(view->rootObject(), QLatin1String("rect3"))->x(), 74.0); + QCOMPARE(findItem(view->rootObject(), QLatin1String("rect4"))->x(), 16.0); + QCOMPARE(findItem(view->rootObject(), QLatin1String("rect5"))->x(), 112.0); + QCOMPARE(findItem(view->rootObject(), QLatin1String("rect6"))->x(), 64.0); + + //parent horizontal + QCOMPARE(findItem(view->rootObject(), QLatin1String("rect7"))->x(), 0.0); + QCOMPARE(findItem(view->rootObject(), QLatin1String("rect8"))->x(), 240.0); + QCOMPARE(findItem(view->rootObject(), QLatin1String("rect9"))->x(), 120.0); + QCOMPARE(findItem(view->rootObject(), QLatin1String("rect10"))->x(), -10.0); + QCOMPARE(findItem(view->rootObject(), QLatin1String("rect11"))->x(), 230.0); + QCOMPARE(findItem(view->rootObject(), QLatin1String("rect12"))->x(), 110.0); + + //vertical + QCOMPARE(findItem(view->rootObject(), QLatin1String("rect13"))->y(), 20.0); + QCOMPARE(findItem(view->rootObject(), QLatin1String("rect14"))->y(), 155.0); + + //stretch + QCOMPARE(findItem(view->rootObject(), QLatin1String("rect15"))->x(), 26.0); + QCOMPARE(findItem(view->rootObject(), QLatin1String("rect15"))->width(), 96.0); + QCOMPARE(findItem(view->rootObject(), QLatin1String("rect16"))->x(), 26.0); + QCOMPARE(findItem(view->rootObject(), QLatin1String("rect16"))->width(), 192.0); + QCOMPARE(findItem(view->rootObject(), QLatin1String("rect17"))->x(), -70.0); + QCOMPARE(findItem(view->rootObject(), QLatin1String("rect17"))->width(), 192.0); + + //vertical stretch + QCOMPARE(findItem(view->rootObject(), QLatin1String("rect18"))->y(), 20.0); + QCOMPARE(findItem(view->rootObject(), QLatin1String("rect18"))->height(), 40.0); + + //more parent horizontal + QCOMPARE(findItem(view->rootObject(), QLatin1String("rect19"))->x(), 115.0); + QCOMPARE(findItem(view->rootObject(), QLatin1String("rect20"))->x(), 235.0); + QCOMPARE(findItem(view->rootObject(), QLatin1String("rect21"))->x(), -5.0); + + //centerIn + QCOMPARE(findItem(view->rootObject(), QLatin1String("rect22"))->x(), 69.0); + QCOMPARE(findItem(view->rootObject(), QLatin1String("rect22"))->y(), 5.0); + + //margins + QCOMPARE(findItem(view->rootObject(), QLatin1String("rect23"))->x(), 31.0); + QCOMPARE(findItem(view->rootObject(), QLatin1String("rect23"))->y(), 5.0); + QCOMPARE(findItem(view->rootObject(), QLatin1String("rect23"))->width(), 86.0); + QCOMPARE(findItem(view->rootObject(), QLatin1String("rect23"))->height(), 10.0); + + // offsets + QCOMPARE(findItem(view->rootObject(), QLatin1String("rect24"))->x(), 26.0); + QCOMPARE(findItem(view->rootObject(), QLatin1String("rect25"))->y(), 60.0); + QCOMPARE(findItem(view->rootObject(), QLatin1String("rect26"))->y(), 5.0); + + //baseline + QDeclarativeText *text1 = findItem(view->rootObject(), QLatin1String("text1")); + QDeclarativeText *text2 = findItem(view->rootObject(), QLatin1String("text2")); + QCOMPARE(text1->y(), text2->y()); + + delete view; +} + +void tst_qdeclarativeanchors::basicAnchorsQGraphicsWidget() +{ + QDeclarativeView *view = new QDeclarativeView; + view->setSource(QUrl::fromLocalFile(SRCDIR "/data/anchorsqgraphicswidget.qml")); + + qApp->processEvents(); + + //sibling horizontal + QCOMPARE(findObject(view->rootObject(), QLatin1String("rect1"))->x(), 26.0); + QCOMPARE(findObject(view->rootObject(), QLatin1String("rect2"))->x(), 122.0); + QCOMPARE(findObject(view->rootObject(), QLatin1String("rect3"))->x(), 74.0); + QCOMPARE(findObject(view->rootObject(), QLatin1String("rect4"))->x(), 16.0); + QCOMPARE(findObject(view->rootObject(), QLatin1String("rect5"))->x(), 112.0); + QCOMPARE(findObject(view->rootObject(), QLatin1String("rect6"))->x(), 64.0); + + //parent horizontal + QCOMPARE(findObject(view->rootObject(), QLatin1String("rect7"))->x(), 0.0); + QCOMPARE(findObject(view->rootObject(), QLatin1String("rect8"))->x(), 240.0); + QCOMPARE(findObject(view->rootObject(), QLatin1String("rect9"))->x(), 120.0); + QCOMPARE(findObject(view->rootObject(), QLatin1String("rect10"))->x(), -10.0); + QCOMPARE(findObject(view->rootObject(), QLatin1String("rect11"))->x(), 230.0); + QCOMPARE(findObject(view->rootObject(), QLatin1String("rect12"))->x(), 110.0); + + //vertical + QCOMPARE(findObject(view->rootObject(), QLatin1String("rect13"))->y(), 20.0); + QCOMPARE(findObject(view->rootObject(), QLatin1String("rect14"))->y(), 155.0); + + //stretch + QCOMPARE(findObject(view->rootObject(), QLatin1String("rect15"))->x(), 26.0); + QCOMPARE(findObject(view->rootObject(), QLatin1String("rect15"))->property("width").toReal(), 96.0); + QCOMPARE(findObject(view->rootObject(), QLatin1String("rect16"))->x(), 26.0); + QCOMPARE(findObject(view->rootObject(), QLatin1String("rect16"))->property("width").toReal(), 192.0); + QCOMPARE(findObject(view->rootObject(), QLatin1String("rect17"))->x(), -70.0); + QCOMPARE(findObject(view->rootObject(), QLatin1String("rect17"))->property("width").toReal(), 192.0); + + //vertical stretch + QCOMPARE(findObject(view->rootObject(), QLatin1String("rect18"))->y(), 20.0); + QCOMPARE(findObject(view->rootObject(), QLatin1String("rect18"))->property("height").toReal(), 40.0); + + //more parent horizontal + QCOMPARE(findObject(view->rootObject(), QLatin1String("rect19"))->x(), 115.0); + QCOMPARE(findObject(view->rootObject(), QLatin1String("rect20"))->x(), 235.0); + QCOMPARE(findObject(view->rootObject(), QLatin1String("rect21"))->x(), -5.0); + + //centerIn + QCOMPARE(findObject(view->rootObject(), QLatin1String("rect22"))->x(), 69.0); + QCOMPARE(findObject(view->rootObject(), QLatin1String("rect22"))->y(), 5.0); + + //margins + QCOMPARE(findObject(view->rootObject(), QLatin1String("rect23"))->x(), 31.0); + QCOMPARE(findObject(view->rootObject(), QLatin1String("rect23"))->y(), 5.0); + QCOMPARE(findObject(view->rootObject(), QLatin1String("rect23"))->property("width").toReal(), 86.0); + QCOMPARE(findObject(view->rootObject(), QLatin1String("rect23"))->property("height").toReal(), 10.0); + + // offsets + QCOMPARE(findObject(view->rootObject(), QLatin1String("rect24"))->x(), 26.0); + QCOMPARE(findObject(view->rootObject(), QLatin1String("rect25"))->y(), 60.0); + QCOMPARE(findObject(view->rootObject(), QLatin1String("rect26"))->y(), 5.0); + + //baseline + QDeclarativeText *text1 = findItem(view->rootObject(), QLatin1String("text1")); + QDeclarativeText *text2 = findItem(view->rootObject(), QLatin1String("text2")); + QCOMPARE(text1->y(), text2->y()); + + delete view; +} + +QDeclarativeItem* childItem(QDeclarativeItem *parentItem, const char * itemString) { + return findItem(parentItem, QLatin1String(itemString)); +} + +qreal offsetMasterRTL(QDeclarativeItem *rootItem, const char * itemString) { + QDeclarativeItem* masterItem = findItem(rootItem, QLatin1String("masterRect")); + return masterItem->width()+2*masterItem->x()-findItem(rootItem, QLatin1String(itemString))->width(); +} + +qreal offsetParentRTL(QDeclarativeItem *rootItem, const char * itemString) { + return rootItem->width()+2*rootItem->x()-findItem(rootItem, QLatin1String(itemString))->width(); +} + +void mirrorAnchors(QDeclarativeItem *item) { + QDeclarativeItemPrivate *itemPrivate = QDeclarativeItemPrivate::get(item); + itemPrivate->setLayoutMirror(true); +} + +void tst_qdeclarativeanchors::basicAnchorsRTL() +{ + QDeclarativeView *view = new QDeclarativeView; + view->setSource(QUrl::fromLocalFile(SRCDIR "/data/anchors.qml")); + + qApp->processEvents(); + + QDeclarativeItem* rootItem = qobject_cast(view->rootObject()); + foreach(QObject *child, rootItem->children()) { + bool mirrored = QDeclarativeItemPrivate::get(qobject_cast(child))->anchors()->mirrored(); + QCOMPARE(mirrored, false); + } + + foreach(QObject *child, rootItem->children()) + mirrorAnchors(qobject_cast(child)); + + foreach(QObject *child, rootItem->children()) { + bool mirrored = QDeclarativeItemPrivate::get(qobject_cast(child))->anchors()->mirrored(); + QCOMPARE(mirrored, true); + } + + //sibling horizontal + QCOMPARE(childItem(rootItem, "rect1")->x(), offsetMasterRTL(rootItem, "rect1")-26.0); + QCOMPARE(childItem(rootItem, "rect2")->x(), offsetMasterRTL(rootItem, "rect2")-122.0); + QCOMPARE(childItem(rootItem, "rect3")->x(), offsetMasterRTL(rootItem, "rect3")-74.0); + QCOMPARE(childItem(rootItem, "rect4")->x(), offsetMasterRTL(rootItem, "rect4")-16.0); + QCOMPARE(childItem(rootItem, "rect5")->x(), offsetMasterRTL(rootItem, "rect5")-112.0); + QCOMPARE(childItem(rootItem, "rect6")->x(), offsetMasterRTL(rootItem, "rect6")-64.0); + + //parent horizontal + QCOMPARE(childItem(rootItem, "rect7")->x(), offsetParentRTL(rootItem, "rect7")-0.0); + QCOMPARE(childItem(rootItem, "rect8")->x(), offsetParentRTL(rootItem, "rect8")-240.0); + QCOMPARE(childItem(rootItem, "rect9")->x(), offsetParentRTL(rootItem, "rect9")-120.0); + QCOMPARE(childItem(rootItem, "rect10")->x(), offsetParentRTL(rootItem, "rect10")+10.0); + QCOMPARE(childItem(rootItem, "rect11")->x(), offsetParentRTL(rootItem, "rect11")-230.0); + QCOMPARE(childItem(rootItem, "rect12")->x(), offsetParentRTL(rootItem, "rect12")-110.0); + + //vertical + QCOMPARE(childItem(rootItem, "rect13")->y(), 20.0); + QCOMPARE(childItem(rootItem, "rect14")->y(), 155.0); + + //stretch + QCOMPARE(childItem(rootItem, "rect15")->x(), offsetMasterRTL(rootItem, "rect15")-26.0); + QCOMPARE(childItem(rootItem, "rect15")->width(), 96.0); + QCOMPARE(childItem(rootItem, "rect16")->x(), offsetMasterRTL(rootItem, "rect16")-26.0); + QCOMPARE(childItem(rootItem, "rect16")->width(), 192.0); + QCOMPARE(childItem(rootItem, "rect17")->x(), offsetMasterRTL(rootItem, "rect17")+70.0); + QCOMPARE(childItem(rootItem, "rect17")->width(), 192.0); + + //vertical stretch + QCOMPARE(childItem(rootItem, "rect18")->y(), 20.0); + QCOMPARE(childItem(rootItem, "rect18")->height(), 40.0); + + //more parent horizontal + QCOMPARE(childItem(rootItem, "rect19")->x(), offsetParentRTL(rootItem, "rect19")-115.0); + QCOMPARE(childItem(rootItem, "rect20")->x(), offsetParentRTL(rootItem, "rect20")-235.0); + QCOMPARE(childItem(rootItem, "rect21")->x(), offsetParentRTL(rootItem, "rect21")+5.0); + + //centerIn + QCOMPARE(childItem(rootItem, "rect22")->x(), offsetMasterRTL(rootItem, "rect22")-69.0); + QCOMPARE(childItem(rootItem, "rect22")->y(), 5.0); + + //margins + QCOMPARE(childItem(rootItem, "rect23")->x(), offsetMasterRTL(rootItem, "rect23")-31.0); + QCOMPARE(childItem(rootItem, "rect23")->y(), 5.0); + QCOMPARE(childItem(rootItem, "rect23")->width(), 86.0); + QCOMPARE(childItem(rootItem, "rect23")->height(), 10.0); + + // offsets + QCOMPARE(childItem(rootItem, "rect24")->x(), offsetMasterRTL(rootItem, "rect24")-26.0); + QCOMPARE(childItem(rootItem, "rect25")->y(), 60.0); + QCOMPARE(childItem(rootItem, "rect26")->y(), 5.0); + + //baseline + QDeclarativeText *text1 = findItem(rootItem, QLatin1String("text1")); + QDeclarativeText *text2 = findItem(rootItem, QLatin1String("text2")); + QCOMPARE(text1->y(), text2->y()); + + delete view; +} + +// mostly testing that we don't crash +void tst_qdeclarativeanchors::loops() +{ + { + QUrl source(QUrl::fromLocalFile(SRCDIR "/data/loop1.qml")); + + QString expect = source.toString() + ":6:5: QML Text: Possible anchor loop detected on horizontal anchor."; + QTest::ignoreMessage(QtWarningMsg, expect.toLatin1()); + QTest::ignoreMessage(QtWarningMsg, expect.toLatin1()); + QTest::ignoreMessage(QtWarningMsg, expect.toLatin1()); + + QDeclarativeView *view = new QDeclarativeView; + view->setSource(source); + qApp->processEvents(); + + delete view; + } + + { + QUrl source(QUrl::fromLocalFile(SRCDIR "/data/loop2.qml")); + + QString expect = source.toString() + ":8:3: QML Image: Possible anchor loop detected on horizontal anchor."; + QTest::ignoreMessage(QtWarningMsg, expect.toLatin1()); + + QDeclarativeView *view = new QDeclarativeView; + view->setSource(source); + qApp->processEvents(); + + delete view; + } +} + +void tst_qdeclarativeanchors::illegalSets() +{ + QFETCH(QString, qml); + QFETCH(QString, warning); + + QTest::ignoreMessage(QtWarningMsg, warning.toLatin1()); + + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine); + component.setData(QByteArray("import QtQuick 1.0\n" + qml.toUtf8()), QUrl::fromLocalFile("")); + if (!component.isReady()) + qWarning() << "Test errors:" << component.errors(); + QVERIFY(component.isReady()); + QObject *o = component.create(); + delete o; +} + +void tst_qdeclarativeanchors::illegalSets_data() +{ + QTest::addColumn("qml"); + QTest::addColumn("warning"); + + QTest::newRow("H - too many anchors") + << "Rectangle { id: rect; Rectangle { anchors.left: rect.left; anchors.right: rect.right; anchors.horizontalCenter: rect.horizontalCenter } }" + << "file::2:23: QML Rectangle: Cannot specify left, right, and hcenter anchors."; + + foreach (const QString &side, QStringList() << "left" << "right") { + QTest::newRow("H - anchor to V") + << QString("Rectangle { Rectangle { anchors.%1: parent.top } }").arg(side) + << "file::2:13: QML Rectangle: Cannot anchor a horizontal edge to a vertical edge."; + + QTest::newRow("H - anchor to non parent/sibling") + << QString("Rectangle { Item { Rectangle { id: rect } } Rectangle { anchors.%1: rect.%1 } }").arg(side) + << "file::2:45: QML Rectangle: Cannot anchor to an item that isn't a parent or sibling."; + + QTest::newRow("H - anchor to self") + << QString("Rectangle { id: rect; anchors.%1: rect.%1 }").arg(side) + << "file::2:1: QML Rectangle: Cannot anchor item to self."; + } + + + QTest::newRow("V - too many anchors") + << "Rectangle { id: rect; Rectangle { anchors.top: rect.top; anchors.bottom: rect.bottom; anchors.verticalCenter: rect.verticalCenter } }" + << "file::2:23: QML Rectangle: Cannot specify top, bottom, and vcenter anchors."; + + QTest::newRow("V - too many anchors with baseline") + << "Rectangle { Text { id: text1; text: \"Hello\" } Text { anchors.baseline: text1.baseline; anchors.top: text1.top; } }" + << "file::2:47: QML Text: Baseline anchor cannot be used in conjunction with top, bottom, or vcenter anchors."; + + foreach (const QString &side, QStringList() << "top" << "bottom" << "baseline") { + + QTest::newRow("V - anchor to H") + << QString("Rectangle { Rectangle { anchors.%1: parent.left } }").arg(side) + << "file::2:13: QML Rectangle: Cannot anchor a vertical edge to a horizontal edge."; + + QTest::newRow("V - anchor to non parent/sibling") + << QString("Rectangle { Item { Rectangle { id: rect } } Rectangle { anchors.%1: rect.%1 } }").arg(side) + << "file::2:45: QML Rectangle: Cannot anchor to an item that isn't a parent or sibling."; + + QTest::newRow("V - anchor to self") + << QString("Rectangle { id: rect; anchors.%1: rect.%1 }").arg(side) + << "file::2:1: QML Rectangle: Cannot anchor item to self."; + } + + + QTest::newRow("centerIn - anchor to non parent/sibling") + << "Rectangle { Item { Rectangle { id: rect } } Rectangle { anchors.centerIn: rect} }" + << "file::2:45: QML Rectangle: Cannot anchor to an item that isn't a parent or sibling."; + + + QTest::newRow("fill - anchor to non parent/sibling") + << "Rectangle { Item { Rectangle { id: rect } } Rectangle { anchors.fill: rect} }" + << "file::2:45: QML Rectangle: Cannot anchor to an item that isn't a parent or sibling."; +} + +void tst_qdeclarativeanchors::reset() +{ + QFETCH(QString, side); + QFETCH(QDeclarativeAnchorLine::AnchorLine, anchorLine); + QFETCH(QDeclarativeAnchors::Anchor, usedAnchor); + + QDeclarativeItem *baseItem = new QDeclarativeItem; + + QDeclarativeAnchorLine anchor; + anchor.item = baseItem; + anchor.anchorLine = anchorLine; + + QDeclarativeItem *item = new QDeclarativeItem; + QDeclarativeItemPrivate *itemPrivate = QDeclarativeItemPrivate::get(item); + + const QMetaObject *meta = itemPrivate->anchors()->metaObject(); + QMetaProperty p = meta->property(meta->indexOfProperty(side.toUtf8().constData())); + + QVERIFY(p.write(itemPrivate->anchors(), qVariantFromValue(anchor))); + QCOMPARE(itemPrivate->anchors()->usedAnchors().testFlag(usedAnchor), true); + + QVERIFY(p.reset(itemPrivate->anchors())); + QCOMPARE(itemPrivate->anchors()->usedAnchors().testFlag(usedAnchor), false); + + delete item; + delete baseItem; +} + +void tst_qdeclarativeanchors::reset_data() +{ + QTest::addColumn("side"); + QTest::addColumn("anchorLine"); + QTest::addColumn("usedAnchor"); + + QTest::newRow("left") << "left" << QDeclarativeAnchorLine::Left << QDeclarativeAnchors::LeftAnchor; + QTest::newRow("top") << "top" << QDeclarativeAnchorLine::Top << QDeclarativeAnchors::TopAnchor; + QTest::newRow("right") << "right" << QDeclarativeAnchorLine::Right << QDeclarativeAnchors::RightAnchor; + QTest::newRow("bottom") << "bottom" << QDeclarativeAnchorLine::Bottom << QDeclarativeAnchors::BottomAnchor; + + QTest::newRow("hcenter") << "horizontalCenter" << QDeclarativeAnchorLine::HCenter << QDeclarativeAnchors::HCenterAnchor; + QTest::newRow("vcenter") << "verticalCenter" << QDeclarativeAnchorLine::VCenter << QDeclarativeAnchors::VCenterAnchor; + QTest::newRow("baseline") << "baseline" << QDeclarativeAnchorLine::Baseline << QDeclarativeAnchors::BaselineAnchor; +} + +void tst_qdeclarativeanchors::resetConvenience() +{ + QDeclarativeItem *baseItem = new QDeclarativeItem; + QDeclarativeItem *item = new QDeclarativeItem; + QDeclarativeItemPrivate *itemPrivate = QDeclarativeItemPrivate::get(item); + + //fill + itemPrivate->anchors()->setFill(baseItem); + QVERIFY(itemPrivate->anchors()->fill() == baseItem); + itemPrivate->anchors()->resetFill(); + QVERIFY(itemPrivate->anchors()->fill() == 0); + + //centerIn + itemPrivate->anchors()->setCenterIn(baseItem); + QVERIFY(itemPrivate->anchors()->centerIn() == baseItem); + itemPrivate->anchors()->resetCenterIn(); + QVERIFY(itemPrivate->anchors()->centerIn() == 0); + + delete item; + delete baseItem; +} + +void tst_qdeclarativeanchors::nullItem() +{ + QFETCH(QString, side); + + QDeclarativeAnchorLine anchor; + QDeclarativeItem *item = new QDeclarativeItem; + QDeclarativeItemPrivate *itemPrivate = QDeclarativeItemPrivate::get(item); + + const QMetaObject *meta = itemPrivate->anchors()->metaObject(); + QMetaProperty p = meta->property(meta->indexOfProperty(side.toUtf8().constData())); + + QTest::ignoreMessage(QtWarningMsg, ": QML Item: Cannot anchor to a null item."); + QVERIFY(p.write(itemPrivate->anchors(), qVariantFromValue(anchor))); + + delete item; +} + +void tst_qdeclarativeanchors::nullItem_data() +{ + QTest::addColumn("side"); + + QTest::newRow("left") << "left"; + QTest::newRow("top") << "top"; + QTest::newRow("right") << "right"; + QTest::newRow("bottom") << "bottom"; + + QTest::newRow("hcenter") << "horizontalCenter"; + QTest::newRow("vcenter") << "verticalCenter"; + QTest::newRow("baseline") << "baseline"; +} + +void tst_qdeclarativeanchors::crash1() +{ + QUrl source(QUrl::fromLocalFile(SRCDIR "/data/crash1.qml")); + + QString expect = source.toString() + ":4:5: QML Text: Possible anchor loop detected on fill."; + + QTest::ignoreMessage(QtWarningMsg, expect.toLatin1()); + + // QT-3245 ... anchor loop detection needs improving. + QTest::ignoreMessage(QtWarningMsg, expect.toLatin1()); + QTest::ignoreMessage(QtWarningMsg, expect.toLatin1()); + QTest::ignoreMessage(QtWarningMsg, expect.toLatin1()); + QTest::ignoreMessage(QtWarningMsg, expect.toLatin1()); + QTest::ignoreMessage(QtWarningMsg, expect.toLatin1()); + QTest::ignoreMessage(QtWarningMsg, expect.toLatin1()); + QTest::ignoreMessage(QtWarningMsg, expect.toLatin1()); + + QDeclarativeView *view = new QDeclarativeView(source); + qApp->processEvents(); + + delete view; +} + +void tst_qdeclarativeanchors::fill() +{ + QDeclarativeView *view = new QDeclarativeView(QUrl::fromLocalFile(SRCDIR "/data/fill.qml")); + + qApp->processEvents(); + QDeclarativeRectangle* rect = findItem(view->rootObject(), QLatin1String("filler")); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + QCOMPARE(rect->x(), 0.0 + 10.0); + QCOMPARE(rect->y(), 0.0 + 30.0); + QCOMPARE(rect->width(), 200.0 - 10.0 - 20.0); + QCOMPARE(rect->height(), 200.0 - 30.0 - 40.0); + //Alter Offsets (tests QTBUG-6631) + rectPrivate->anchors()->setLeftMargin(20.0); + rectPrivate->anchors()->setRightMargin(0.0); + rectPrivate->anchors()->setBottomMargin(0.0); + rectPrivate->anchors()->setTopMargin(10.0); + QCOMPARE(rect->x(), 0.0 + 20.0); + QCOMPARE(rect->y(), 0.0 + 10.0); + QCOMPARE(rect->width(), 200.0 - 20.0); + QCOMPARE(rect->height(), 200.0 - 10.0); + + delete view; +} + +void tst_qdeclarativeanchors::fillRTL() +{ + QDeclarativeView *view = new QDeclarativeView(QUrl::fromLocalFile(SRCDIR "/data/fill.qml")); + + qApp->processEvents(); + QDeclarativeRectangle* rect = findItem(view->rootObject(), QLatin1String("filler")); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + mirrorAnchors(rect); + + QCOMPARE(rect->x(), 0.0 + 20.0); + QCOMPARE(rect->y(), 0.0 + 30.0); + QCOMPARE(rect->width(), 200.0 - 10.0 - 20.0); + QCOMPARE(rect->height(), 200.0 - 30.0 - 40.0); + //Alter Offsets (tests QTBUG-6631) + rectPrivate->anchors()->setLeftMargin(20.0); + rectPrivate->anchors()->setRightMargin(0.0); + rectPrivate->anchors()->setBottomMargin(0.0); + rectPrivate->anchors()->setTopMargin(10.0); + QCOMPARE(rect->x(), 0.0 + 0.0); + QCOMPARE(rect->y(), 0.0 + 10.0); + QCOMPARE(rect->width(), 200.0 - 20.0); + QCOMPARE(rect->height(), 200.0 - 10.0); + + delete view; +} +void tst_qdeclarativeanchors::centerIn() +{ + QDeclarativeView *view = new QDeclarativeView(QUrl::fromLocalFile(SRCDIR "/data/centerin.qml")); + + qApp->processEvents(); + QDeclarativeRectangle* rect = findItem(view->rootObject(), QLatin1String("centered")); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + + QCOMPARE(rect->x(), 75.0 + 10); + QCOMPARE(rect->y(), 75.0 + 30); + //Alter Offsets (tests QTBUG-6631) + rectPrivate->anchors()->setHorizontalCenterOffset(-20.0); + rectPrivate->anchors()->setVerticalCenterOffset(-10.0); + QCOMPARE(rect->x(), 75.0 - 20.0); + QCOMPARE(rect->y(), 75.0 - 10.0); + + delete view; +} + + +void tst_qdeclarativeanchors::centerInRTL() +{ + QDeclarativeView *view = new QDeclarativeView(QUrl::fromLocalFile(SRCDIR "/data/centerin.qml")); + + qApp->processEvents(); + QDeclarativeRectangle* rect = findItem(view->rootObject(), QLatin1String("centered")); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + mirrorAnchors(rect); + + QCOMPARE(rect->x(), 75.0 - 10); + QCOMPARE(rect->y(), 75.0 + 30); + //Alter Offsets (tests QTBUG-6631) + rectPrivate->anchors()->setHorizontalCenterOffset(-20.0); + rectPrivate->anchors()->setVerticalCenterOffset(-10.0); + QCOMPARE(rect->x(), 75.0 + 20.0); + QCOMPARE(rect->y(), 75.0 - 10.0); + + delete view; +} + +void tst_qdeclarativeanchors::hvCenter() +{ + QDeclarativeView *view = new QDeclarativeView(QUrl::fromLocalFile(SRCDIR "/data/hvCenter.qml")); + + qApp->processEvents(); + QDeclarativeRectangle* rect = findItem(view->rootObject(), QLatin1String("centered")); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + + // test QTBUG-10999 + QCOMPARE(rect->x(), 10.0); + QCOMPARE(rect->y(), 19.0); + + rectPrivate->anchors()->setHorizontalCenterOffset(-5.0); + rectPrivate->anchors()->setVerticalCenterOffset(5.0); + QCOMPARE(rect->x(), 10.0 - 5.0); + QCOMPARE(rect->y(), 19.0 + 5.0); + + delete view; +} + +void tst_qdeclarativeanchors::hvCenterRTL() +{ + QDeclarativeView *view = new QDeclarativeView(QUrl::fromLocalFile(SRCDIR "/data/hvCenter.qml")); + + qApp->processEvents(); + QDeclarativeRectangle* rect = findItem(view->rootObject(), QLatin1String("centered")); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + mirrorAnchors(rect); + + // test QTBUG-10999 + QCOMPARE(rect->x(), 10.0); + QCOMPARE(rect->y(), 19.0); + + rectPrivate->anchors()->setHorizontalCenterOffset(-5.0); + rectPrivate->anchors()->setVerticalCenterOffset(5.0); + QCOMPARE(rect->x(), 10.0 + 5.0); + QCOMPARE(rect->y(), 19.0 + 5.0); + + delete view; +} +void tst_qdeclarativeanchors::margins() +{ + QDeclarativeView *view = new QDeclarativeView(QUrl::fromLocalFile(SRCDIR "/data/margins.qml")); + + qApp->processEvents(); + QDeclarativeRectangle* rect = findItem(view->rootObject(), QLatin1String("filler")); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + QCOMPARE(rect->x(), 5.0); + QCOMPARE(rect->y(), 6.0); + QCOMPARE(rect->width(), 200.0 - 5.0 - 10.0); + QCOMPARE(rect->height(), 200.0 - 6.0 - 10.0); + + rectPrivate->anchors()->setTopMargin(0.0); + rectPrivate->anchors()->setMargins(20.0); + + QCOMPARE(rect->x(), 5.0); + QCOMPARE(rect->y(), 20.0); + QCOMPARE(rect->width(), 200.0 - 5.0 - 20.0); + QCOMPARE(rect->height(), 200.0 - 20.0 - 20.0); + + delete view; +} + +void tst_qdeclarativeanchors::marginsRTL() +{ + QDeclarativeView *view = new QDeclarativeView(QUrl::fromLocalFile(SRCDIR "/data/margins.qml")); + + QDeclarativeRectangle* rect = findItem(view->rootObject(), QLatin1String("filler")); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + mirrorAnchors(rect); + + QCOMPARE(rect->x(), 10.0); + QCOMPARE(rect->y(), 6.0); + QCOMPARE(rect->width(), 200.0 - 5.0 - 10.0); + QCOMPARE(rect->height(), 200.0 - 6.0 - 10.0); + + rectPrivate->anchors()->setTopMargin(0.0); + rectPrivate->anchors()->setMargins(20.0); + + QCOMPARE(rect->x(), 20.0); + QCOMPARE(rect->y(), 20.0); + QCOMPARE(rect->width(), 200.0 - 5.0 - 20.0); + QCOMPARE(rect->height(), 200.0 - 20.0 - 20.0); + + delete view; +} + + +QTEST_MAIN(tst_qdeclarativeanchors) + +#include "tst_qdeclarativeanchors.moc" diff --git a/tests/auto/declarative/qdeclarativeanimatedimage/data/colors.gif b/tests/auto/declarative/qdeclarativeanimatedimage/data/colors.gif new file mode 100644 index 00000000..1270bfaa Binary files /dev/null and b/tests/auto/declarative/qdeclarativeanimatedimage/data/colors.gif differ diff --git a/tests/auto/declarative/qdeclarativeanimatedimage/data/colors.qml b/tests/auto/declarative/qdeclarativeanimatedimage/data/colors.qml new file mode 100644 index 00000000..51deb56b --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimatedimage/data/colors.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +AnimatedImage { + source: "colors.gif" +} diff --git a/tests/auto/declarative/qdeclarativeanimatedimage/data/hearts.gif b/tests/auto/declarative/qdeclarativeanimatedimage/data/hearts.gif new file mode 100644 index 00000000..cfb55f27 Binary files /dev/null and b/tests/auto/declarative/qdeclarativeanimatedimage/data/hearts.gif differ diff --git a/tests/auto/declarative/qdeclarativeanimatedimage/data/hearts.qml b/tests/auto/declarative/qdeclarativeanimatedimage/data/hearts.qml new file mode 100644 index 00000000..8729dd2e --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimatedimage/data/hearts.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +AnimatedImage { + source: "hearts.gif" + playing: false +} diff --git a/tests/auto/declarative/qdeclarativeanimatedimage/data/qmldir b/tests/auto/declarative/qdeclarativeanimatedimage/data/qmldir new file mode 100644 index 00000000..ef7c1f44 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimatedimage/data/qmldir @@ -0,0 +1 @@ +# No local types diff --git a/tests/auto/declarative/qdeclarativeanimatedimage/data/qtbug-16520.qml b/tests/auto/declarative/qdeclarativeanimatedimage/data/qtbug-16520.qml new file mode 100644 index 00000000..cf5b6011 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimatedimage/data/qtbug-16520.qml @@ -0,0 +1,17 @@ +import QtQuick 1.0 + +Rectangle { + width: 500 + height: 500 + + AnimatedImage { + objectName: "anim" + anchors.centerIn: parent + asynchronous: true + opacity: status == AnimatedImage.Ready ? 1 : 0 + + Behavior on opacity { + NumberAnimation { duration: 1000 } + } + } +} diff --git a/tests/auto/declarative/qdeclarativeanimatedimage/data/stickman.gif b/tests/auto/declarative/qdeclarativeanimatedimage/data/stickman.gif new file mode 100644 index 00000000..7c4cd186 Binary files /dev/null and b/tests/auto/declarative/qdeclarativeanimatedimage/data/stickman.gif differ diff --git a/tests/auto/declarative/qdeclarativeanimatedimage/data/stickman.qml b/tests/auto/declarative/qdeclarativeanimatedimage/data/stickman.qml new file mode 100644 index 00000000..d44937f9 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimatedimage/data/stickman.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +AnimatedImage { + source: "stickman.gif" +} diff --git a/tests/auto/declarative/qdeclarativeanimatedimage/data/stickmanerror1.qml b/tests/auto/declarative/qdeclarativeanimatedimage/data/stickmanerror1.qml new file mode 100644 index 00000000..f08f74da --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimatedimage/data/stickmanerror1.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +AnimatedImage { + sourceSize: "240x180" + source: "stickman.gif" +} diff --git a/tests/auto/declarative/qdeclarativeanimatedimage/data/stickmanpause.qml b/tests/auto/declarative/qdeclarativeanimatedimage/data/stickmanpause.qml new file mode 100644 index 00000000..1d7e2590 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimatedimage/data/stickmanpause.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +AnimatedImage { + source: "stickman.gif" + paused: true + currentFrame: 2 +} diff --git a/tests/auto/declarative/qdeclarativeanimatedimage/data/stickmanscaled.qml b/tests/auto/declarative/qdeclarativeanimatedimage/data/stickmanscaled.qml new file mode 100644 index 00000000..8b24d737 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimatedimage/data/stickmanscaled.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +AnimatedImage { + width: 240 + height: 180 + source: "stickman.gif" +} diff --git a/tests/auto/declarative/qdeclarativeanimatedimage/data/stickmanstopped.qml b/tests/auto/declarative/qdeclarativeanimatedimage/data/stickmanstopped.qml new file mode 100644 index 00000000..c5b14137 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimatedimage/data/stickmanstopped.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +AnimatedImage { + source: "stickman.gif" + playing: false +} diff --git a/tests/auto/declarative/qdeclarativeanimatedimage/qdeclarativeanimatedimage.pro b/tests/auto/declarative/qdeclarativeanimatedimage/qdeclarativeanimatedimage.pro new file mode 100644 index 00000000..3d040a67 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimatedimage/qdeclarativeanimatedimage.pro @@ -0,0 +1,16 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative network +HEADERS += ../shared/testhttpserver.h +SOURCES += tst_qdeclarativeanimatedimage.cpp ../shared/testhttpserver.cpp +macx:CONFIG -= app_bundle + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativeanimatedimage/tst_qdeclarativeanimatedimage.cpp b/tests/auto/declarative/qdeclarativeanimatedimage/tst_qdeclarativeanimatedimage.cpp new file mode 100644 index 00000000..19853c4e --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimatedimage/tst_qdeclarativeanimatedimage.cpp @@ -0,0 +1,387 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../shared/testhttpserver.h" +#include "../../../shared/util.h" + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_qdeclarativeanimatedimage : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativeanimatedimage() {} + +private slots: + void play(); + void pause(); + void stopped(); + void setFrame(); + void frameCount(); + void mirror_running(); + void mirror_notRunning(); + void mirror_notRunning_data(); + void remote(); + void remote_data(); + void sourceSize(); + void sourceSizeReadOnly(); + void invalidSource(); + void qtbug_16520(); + void progressAndStatusChanges(); + +private: + QPixmap grabScene(QGraphicsScene *scene, int width, int height); +}; + +QPixmap tst_qdeclarativeanimatedimage::grabScene(QGraphicsScene *scene, int width, int height) +{ + QPixmap screenshot(width, height); + screenshot.fill(); + QPainter p_screenshot(&screenshot); + scene->render(&p_screenshot, QRect(0, 0, width, height), QRect(0, 0, width, height)); + return screenshot; +} + +void tst_qdeclarativeanimatedimage::play() +{ + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/stickman.qml")); + QDeclarativeAnimatedImage *anim = qobject_cast(component.create()); + QVERIFY(anim); + QVERIFY(anim->isPlaying()); + + delete anim; +} + +void tst_qdeclarativeanimatedimage::pause() +{ + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/stickmanpause.qml")); + QDeclarativeAnimatedImage *anim = qobject_cast(component.create()); + QVERIFY(anim); + QVERIFY(anim->isPlaying()); + QVERIFY(anim->isPaused()); + + delete anim; +} + +void tst_qdeclarativeanimatedimage::stopped() +{ + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/stickmanstopped.qml")); + QDeclarativeAnimatedImage *anim = qobject_cast(component.create()); + QVERIFY(anim); + QVERIFY(!anim->isPlaying()); + QCOMPARE(anim->currentFrame(), 0); + + delete anim; +} + +void tst_qdeclarativeanimatedimage::setFrame() +{ + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/stickmanpause.qml")); + QDeclarativeAnimatedImage *anim = qobject_cast(component.create()); + QVERIFY(anim); + QVERIFY(anim->isPlaying()); + QCOMPARE(anim->currentFrame(), 2); + + delete anim; +} + +void tst_qdeclarativeanimatedimage::frameCount() +{ + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/colors.qml")); + QDeclarativeAnimatedImage *anim = qobject_cast(component.create()); + QVERIFY(anim); + QVERIFY(anim->isPlaying()); + QCOMPARE(anim->frameCount(), 3); + + delete anim; +} + +void tst_qdeclarativeanimatedimage::mirror_running() +{ + // test where mirror is set to true after animation has started + + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/hearts.qml")); + QDeclarativeAnimatedImage *anim = qobject_cast(component.create()); + QVERIFY(anim); + + QGraphicsScene scene; + int width = anim->property("width").toInt(); + int height = anim->property("height").toInt(); + scene.addItem(qobject_cast(anim)); + + QCOMPARE(anim->currentFrame(), 0); + QPixmap frame0 = grabScene(&scene, width, height); + anim->setCurrentFrame(1); + QPixmap frame1 = grabScene(&scene, width, height); + + anim->setCurrentFrame(0); + + QSignalSpy spy(anim, SIGNAL(frameChanged())); + anim->setPlaying(true); + + QTRY_VERIFY(spy.count() == 1); spy.clear(); + anim->setProperty("mirror", true); + + QCOMPARE(anim->currentFrame(), 1); + QPixmap frame1_flipped = grabScene(&scene, width, height); + + QTRY_VERIFY(spy.count() == 1); spy.clear(); + QCOMPARE(anim->currentFrame(), 0); // animation only has 2 frames, should cycle back to first + QPixmap frame0_flipped = grabScene(&scene, width, height); + + QTransform transform; + transform.translate(width, 0).scale(-1, 1.0); + QPixmap frame0_expected = frame0.transformed(transform); + QPixmap frame1_expected = frame1.transformed(transform); + + QCOMPARE(frame0_flipped, frame0_expected); + QCOMPARE(frame1_flipped, frame1_expected); +} + +void tst_qdeclarativeanimatedimage::mirror_notRunning() +{ + QFETCH(QUrl, fileUrl); + + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine, fileUrl); + QDeclarativeAnimatedImage *anim = qobject_cast(component.create()); + QVERIFY(anim); + + QGraphicsScene scene; + int width = anim->property("width").toInt(); + int height = anim->property("height").toInt(); + scene.addItem(qobject_cast(anim)); + QPixmap screenshot = grabScene(&scene, width, height); + + QTransform transform; + transform.translate(width, 0).scale(-1, 1.0); + QPixmap expected = screenshot.transformed(transform); + + int frame = anim->currentFrame(); + bool playing = anim->isPlaying(); + bool paused = anim->isPlaying(); + + anim->setProperty("mirror", true); + screenshot = grabScene(&scene, width, height); + + QCOMPARE(screenshot, expected); + + // mirroring should not change the current frame or playing status + QCOMPARE(anim->currentFrame(), frame); + QCOMPARE(anim->isPlaying(), playing); + QCOMPARE(anim->isPaused(), paused); + + delete anim; +} + +void tst_qdeclarativeanimatedimage::mirror_notRunning_data() +{ + QTest::addColumn("fileUrl"); + + QTest::newRow("paused") << QUrl::fromLocalFile(SRCDIR "/data/stickmanpause.qml"); + QTest::newRow("stopped") << QUrl::fromLocalFile(SRCDIR "/data/stickmanstopped.qml"); +} + +void tst_qdeclarativeanimatedimage::remote() +{ + QFETCH(QString, fileName); + QFETCH(bool, paused); + + TestHTTPServer server(14449); + QVERIFY(server.isValid()); + server.serveDirectory(SRCDIR "/data"); + + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine, QUrl("http://127.0.0.1:14449/" + fileName)); + QTRY_VERIFY(component.isReady()); + + QDeclarativeAnimatedImage *anim = qobject_cast(component.create()); + QVERIFY(anim); + + QTRY_VERIFY(anim->isPlaying()); + if (paused) { + QTRY_VERIFY(anim->isPaused()); + QCOMPARE(anim->currentFrame(), 2); + } + QVERIFY(anim->status() != QDeclarativeAnimatedImage::Error); + + delete anim; +} + +void tst_qdeclarativeanimatedimage::sourceSize() +{ + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/stickmanscaled.qml")); + QDeclarativeAnimatedImage *anim = qobject_cast(component.create()); + QVERIFY(anim); + QCOMPARE(anim->width(),240.0); + QCOMPARE(anim->height(),180.0); + QCOMPARE(anim->sourceSize(),QSize(160,120)); + + delete anim; +} + +void tst_qdeclarativeanimatedimage::sourceSizeReadOnly() +{ + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/stickmanerror1.qml")); + QVERIFY(component.isError()); + QCOMPARE(component.errors().at(0).description(), QString("Invalid property assignment: \"sourceSize\" is a read-only property")); +} + +void tst_qdeclarativeanimatedimage::remote_data() +{ + QTest::addColumn("fileName"); + QTest::addColumn("paused"); + + QTest::newRow("playing") << "stickman.qml" << false; + QTest::newRow("paused") << "stickmanpause.qml" << true; +} + +void tst_qdeclarativeanimatedimage::invalidSource() +{ + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine); + component.setData("import QtQuick 1.0\n AnimatedImage { source: \"no-such-file.gif\" }", QUrl::fromLocalFile("")); + QVERIFY(component.isReady()); + + QTest::ignoreMessage(QtWarningMsg, "file::2:2: QML AnimatedImage: Error Reading Animated Image File file:no-such-file.gif"); + + QDeclarativeAnimatedImage *anim = qobject_cast(component.create()); + QVERIFY(anim); + + QVERIFY(!anim->isPlaying()); + QVERIFY(!anim->isPaused()); + QCOMPARE(anim->currentFrame(), 0); + QCOMPARE(anim->frameCount(), 0); + QTRY_VERIFY(anim->status() == 3); +} + +void tst_qdeclarativeanimatedimage::qtbug_16520() +{ + TestHTTPServer server(14449); + QVERIFY(server.isValid()); + server.serveDirectory(SRCDIR "/data"); + + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/qtbug-16520.qml")); + QTRY_VERIFY(component.isReady()); + + QDeclarativeRectangle *root = qobject_cast(component.create()); + QVERIFY(root); + QDeclarativeAnimatedImage *anim = root->findChild("anim"); + + anim->setProperty("source", "http://127.0.0.1:14449/stickman.gif"); + + QTRY_VERIFY(anim->opacity() == 0); + QTRY_VERIFY(anim->opacity() == 1); + + delete anim; +} + +void tst_qdeclarativeanimatedimage::progressAndStatusChanges() +{ + TestHTTPServer server(14449); + QVERIFY(server.isValid()); + server.serveDirectory(SRCDIR "/data"); + + QDeclarativeEngine engine; + QString componentStr = "import QtQuick 1.0\nAnimatedImage { source: srcImage }"; + QDeclarativeContext *ctxt = engine.rootContext(); + ctxt->setContextProperty("srcImage", QUrl::fromLocalFile(SRCDIR "/data/stickman.gif")); + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeImage *obj = qobject_cast(component.create()); + QVERIFY(obj != 0); + QVERIFY(obj->status() == QDeclarativeImage::Ready); + QTRY_VERIFY(obj->progress() == 1.0); + + QSignalSpy sourceSpy(obj, SIGNAL(sourceChanged(const QUrl &))); + QSignalSpy progressSpy(obj, SIGNAL(progressChanged(qreal))); + QSignalSpy statusSpy(obj, SIGNAL(statusChanged(QDeclarativeImageBase::Status))); + + // Loading local file + ctxt->setContextProperty("srcImage", QUrl::fromLocalFile(SRCDIR "/data/colors.gif")); + QTRY_VERIFY(obj->status() == QDeclarativeImage::Ready); + QTRY_VERIFY(obj->progress() == 1.0); + QTRY_COMPARE(sourceSpy.count(), 1); + QTRY_COMPARE(progressSpy.count(), 0); + QTRY_COMPARE(statusSpy.count(), 0); + + // Loading remote file + ctxt->setContextProperty("srcImage", "http://127.0.0.1:14449/stickman.gif"); + QTRY_VERIFY(obj->status() == QDeclarativeImage::Loading); + QTRY_VERIFY(obj->progress() == 0.0); + QTRY_VERIFY(obj->status() == QDeclarativeImage::Ready); + QTRY_VERIFY(obj->progress() == 1.0); + QTRY_COMPARE(sourceSpy.count(), 2); + QTRY_VERIFY(progressSpy.count() > 1); + QTRY_COMPARE(statusSpy.count(), 2); + + ctxt->setContextProperty("srcImage", ""); + QTRY_VERIFY(obj->status() == QDeclarativeImage::Null); + QTRY_VERIFY(obj->progress() == 0.0); + QTRY_COMPARE(sourceSpy.count(), 3); + QTRY_VERIFY(progressSpy.count() > 2); + QTRY_COMPARE(statusSpy.count(), 3); +} + +QTEST_MAIN(tst_qdeclarativeanimatedimage) + +#include "tst_qdeclarativeanimatedimage.moc" diff --git a/tests/auto/declarative/qdeclarativeanimations/data/Double.qml b/tests/auto/declarative/qdeclarativeanimations/data/Double.qml new file mode 100644 index 00000000..b247fcee --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/Double.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 + +Rectangle { + id: container + property bool on: false + border.color: "#ffffff" + color: "green" + width: 50 + height: 50 + NumberAnimation on x { + objectName: "animation" + running: container.on; from: 0; to: 600; loops: Animation.Infinite; duration: 2000 + } +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/attached.qml b/tests/auto/declarative/qdeclarativeanimations/data/attached.qml new file mode 100644 index 00000000..c5d5535b --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/attached.qml @@ -0,0 +1,34 @@ +import QtQuick 1.0 + +Rectangle { + width: 180; height: 200; + + Component { + id: delegate + Rectangle { + id: wrapper + width: 180; height: 200 + color: "blue" + + states: State { + name: "otherState" + PropertyChanges { target: wrapper; color: "green" } + } + + transitions: Transition { + PropertyAction { target: wrapper; property: "ListView.delayRemove"; value: true } + ScriptAction { script: console.log(wrapper.ListView.delayRemove ? "on" : "off") } + } + + Component.onCompleted: { + console.log(ListView.delayRemove ? "on" : "off"); + wrapper.state = "otherState" + } + } + } + + ListView { + model: 1 + delegate: delegate + } +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/badproperty1.qml b/tests/auto/declarative/qdeclarativeanimations/data/badproperty1.qml new file mode 100644 index 00000000..3e7ebe74 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/badproperty1.qml @@ -0,0 +1,21 @@ +import QtQuick 1.0 + +Rectangle { + id: wrapper + width: 240 + height: 320 + Rectangle { + id: myRect + color: "red" + width: 50; height: 50 + x: 100; y: 100 + } + states: State { + name: "state1" + PropertyChanges { target: myRect; border.color: "blue" } + } + transitions: Transition { + ColorAnimation { target: myRect; to: "red"; property: "border.colr"; duration: 1000 } + } + Component.onCompleted: if (wrapper.state == "state1") wrapper.state = ""; else wrapper.state = "state1"; +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/badproperty2.qml b/tests/auto/declarative/qdeclarativeanimations/data/badproperty2.qml new file mode 100644 index 00000000..40235eee --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/badproperty2.qml @@ -0,0 +1,21 @@ +import QtQuick 1.0 + +Rectangle { + id: wrapper + width: 240 + height: 320 + Rectangle { + id: myRect + color: "red" + width: 50; height: 50 + x: 100; y: 100 + } + states: State { + name: "state1" + PropertyChanges { target: myRect; border.color: "blue" } + } + transitions: Transition { + ColorAnimation { target: myRect; to: "red"; property: "border"; duration: 1000 } + } + Component.onCompleted: if (wrapper.state == "state1") wrapper.state = ""; else wrapper.state = "state1"; +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/badtype1.qml b/tests/auto/declarative/qdeclarativeanimations/data/badtype1.qml new file mode 100644 index 00000000..0a8a7ea7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/badtype1.qml @@ -0,0 +1,12 @@ +import QtQuick 1.0 + +Rectangle { + width: 240 + height: 320 + Rectangle { + color: "red" + width: 50; height: 50 + x: 100; y: 100 + PropertyAnimation on x { from: "blue"; to: "green"; } + } +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/badtype2.qml b/tests/auto/declarative/qdeclarativeanimations/data/badtype2.qml new file mode 100644 index 00000000..118bbbc8 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/badtype2.qml @@ -0,0 +1,12 @@ +import QtQuick 1.0 + +Rectangle { + width: 240 + height: 320 + Rectangle { + color: "red" + width: 50; height: 50 + x: 100; y: 100 + NumberAnimation on x { from: "blue"; to: "green"; } + } +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/badtype3.qml b/tests/auto/declarative/qdeclarativeanimations/data/badtype3.qml new file mode 100644 index 00000000..2599e70c --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/badtype3.qml @@ -0,0 +1,12 @@ +import QtQuick 1.0 + +Rectangle { + width: 240 + height: 320 + Rectangle { + color: "red" + ColorAnimation on color { from: 10; to: 15; } + width: 50; height: 50 + x: 100; y: 100 + } +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/badtype4.qml b/tests/auto/declarative/qdeclarativeanimations/data/badtype4.qml new file mode 100644 index 00000000..5dafb0e3 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/badtype4.qml @@ -0,0 +1,27 @@ +import QtQuick 1.0 + +Rectangle { + id: wrapper + width: 240 + height: 320 + Rectangle { + id: myRect + objectName: "MyRect" + color: "red" + width: 50; height: 50 + x: 100; y: 100 + MouseArea { + anchors.fill: parent + onClicked: if (wrapper.state == "state1") wrapper.state = ""; else wrapper.state = "state1"; + } + } + states: State { + name: "state1" + PropertyChanges { target: myRect; x: 200; color: "blue" } + } + transitions: Transition { + //comment out each in turn to make sure each only animates the relevant property + ColorAnimation { properties: "x,color"; duration: 1000 } //x is real, color is color + NumberAnimation { properties: "x,color"; duration: 1000 } //x is real, color is color + } +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/dontAutoStart.qml b/tests/auto/declarative/qdeclarativeanimations/data/dontAutoStart.qml new file mode 100644 index 00000000..e2ce07fb --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/dontAutoStart.qml @@ -0,0 +1,18 @@ +import QtQuick 1.0 + +Rectangle { + id: wrapper + width: 600 + height: 400 + + Rectangle { + id: redRect + width: 100; height: 100 + color: Qt.rgba(1,0,0) + Behavior on x { + NumberAnimation { id: myAnim; objectName: "MyAnim"; target: redRect; property: "y"; to: 300; loops: Animation.Infinite} + } + + } + +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/dontStart.qml b/tests/auto/declarative/qdeclarativeanimations/data/dontStart.qml new file mode 100644 index 00000000..6b803176 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/dontStart.qml @@ -0,0 +1,19 @@ +import QtQuick 1.0 + +Rectangle { + id: wrapper + width: 600 + height: 400 + + Rectangle { + id: redRect + width: 100; height: 100 + color: Qt.rgba(1,0,0) + SequentialAnimation on x { + running: false + NumberAnimation { objectName: "MyAnim"; running: true } + } + + } + +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/dontStart2.qml b/tests/auto/declarative/qdeclarativeanimations/data/dontStart2.qml new file mode 100644 index 00000000..2563c01d --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/dontStart2.qml @@ -0,0 +1,19 @@ +import QtQuick 1.0 + +Rectangle { + id: wrapper + width: 600 + height: 400 + + Rectangle { + id: redRect + width: 100; height: 100 + color: Qt.rgba(1,0,0) + + transitions: Transition { + SequentialAnimation { + NumberAnimation { id: myAnim; objectName: "MyAnim"; running: true } + } + } + } +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/dotproperty.qml b/tests/auto/declarative/qdeclarativeanimations/data/dotproperty.qml new file mode 100644 index 00000000..aff69e5c --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/dotproperty.qml @@ -0,0 +1,24 @@ +import QtQuick 1.0 + +Rectangle { + id: wrapper + width: 240 + height: 320 + Rectangle { + id: myRect + color: "red" + width: 50; height: 50 + x: 100; y: 100 + MouseArea { + anchors.fill: parent + onClicked: if (wrapper.state == "state1") wrapper.state = ""; else wrapper.state = "state1"; + } + } + states: State { + name: "state1" + PropertyChanges { target: myRect; border.color: "blue" } + } + transitions: Transition { + ColorAnimation { properties: "border.color"; duration: 1000 } + } +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/doubleRegistrationBug.qml b/tests/auto/declarative/qdeclarativeanimations/data/doubleRegistrationBug.qml new file mode 100644 index 00000000..f0fdf9cf --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/doubleRegistrationBug.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 + +Rectangle { + width: 400; height: 400 + + Double { id: dub; on: parent.width < 800 } + Component.onCompleted: dub.on = false +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/mixedtype1.qml b/tests/auto/declarative/qdeclarativeanimations/data/mixedtype1.qml new file mode 100644 index 00000000..a97b3fd5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/mixedtype1.qml @@ -0,0 +1,25 @@ +import QtQuick 1.0 + +Rectangle { + id: wrapper + width: 240 + height: 320 + Rectangle { + id: myRect + objectName: "MyRect" + color: "red" + width: 50; height: 50 + x: 100; y: 100 + MouseArea { + anchors.fill: parent + onClicked: if (wrapper.state == "state1") wrapper.state = ""; else wrapper.state = "state1"; + } + } + states: State { + name: "state1" + PropertyChanges { target: myRect; x: 200; border.width: 10 } + } + transitions: Transition { + PropertyAnimation { properties: "x,border.width"; duration: 1000 } //x is real, border.width is int + } +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/mixedtype2.qml b/tests/auto/declarative/qdeclarativeanimations/data/mixedtype2.qml new file mode 100644 index 00000000..9a774678 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/mixedtype2.qml @@ -0,0 +1,25 @@ +import QtQuick 1.0 + +Rectangle { + id: wrapper + width: 240 + height: 320 + Rectangle { + id: myRect + objectName: "MyRect" + color: "red" + width: 50; height: 50 + x: 100; y: 100 + MouseArea { + anchors.fill: parent + onClicked: if (wrapper.state == "state1") wrapper.state = ""; else wrapper.state = "state1"; + } + } + states: State { + name: "state1" + PropertyChanges { target: myRect; x: 200; color: "blue" } + } + transitions: Transition { + PropertyAnimation { properties: "x,color"; duration: 1000 } //x is real, color is color + } +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/nonTransitionBug.qml b/tests/auto/declarative/qdeclarativeanimations/data/nonTransitionBug.qml new file mode 100644 index 00000000..04741ff3 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/nonTransitionBug.qml @@ -0,0 +1,30 @@ +import QtQuick 1.0 + +Rectangle { + id: root + width: 200 + height: 200 + + Rectangle { + id: mover + objectName: "mover" + } + + states: [ + State { + name: "free" + }, + State { + name: "left" + PropertyChanges { + restoreEntryValues: false + target: mover + x: 0 + } + } + ] + + transitions: Transition { + PropertyAnimation { properties: "x"; duration: 50 } + } +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/properties.qml b/tests/auto/declarative/qdeclarativeanimations/data/properties.qml new file mode 100644 index 00000000..e6af9acc --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/properties.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 + +Rectangle { + width: 400 + height: 400 + Rectangle { + id: theRect + objectName: "TheRect" + color: "red" + width: 50; height: 50 + x: 100; y: 100 + NumberAnimation on x { to: 200 } + } +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/properties2.qml b/tests/auto/declarative/qdeclarativeanimations/data/properties2.qml new file mode 100644 index 00000000..60ec456c --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/properties2.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 + +Rectangle { + width: 400 + height: 400 + Rectangle { + id: theRect + objectName: "TheRect" + color: "red" + width: 50; height: 50 + x: 100; y: 100 + NumberAnimation on x { targets: theRect; properties: "x"; to: 200; } + } +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/properties3.qml b/tests/auto/declarative/qdeclarativeanimations/data/properties3.qml new file mode 100644 index 00000000..e86eca13 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/properties3.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 + +Rectangle { + width: 400 + height: 400 + Rectangle { + id: theRect + objectName: "TheRect" + color: "red" + width: 50; height: 50 + x: 100; y: 100 + NumberAnimation on x { target: theRect; property: "x"; to: 300; } + } +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/properties4.qml b/tests/auto/declarative/qdeclarativeanimations/data/properties4.qml new file mode 100644 index 00000000..04d41c64 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/properties4.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 + +Rectangle { + width: 400 + height: 400 + Rectangle { + id: theRect + objectName: "TheRect" + color: "red" + width: 50; height: 50 + x: 100; y: 100 + NumberAnimation on x { target: theRect; property: "y"; to: 200; } + } +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/properties5.qml b/tests/auto/declarative/qdeclarativeanimations/data/properties5.qml new file mode 100644 index 00000000..e139f8c6 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/properties5.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 + +Rectangle { + width: 400 + height: 400 + Rectangle { + id: theRect + objectName: "TheRect" + color: "red" + width: 50; height: 50 + x: 100; y: 100 + NumberAnimation on x { targets: theRect; properties: "y"; to: 200; } + } +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/propertiesTransition.qml b/tests/auto/declarative/qdeclarativeanimations/data/propertiesTransition.qml new file mode 100644 index 00000000..8e2b41db --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/propertiesTransition.qml @@ -0,0 +1,29 @@ +import QtQuick 1.0 + +Rectangle { + width: 400 + height: 400 + Rectangle { + id: theRect + objectName: "TheRect" + color: "red" + width: 50; height: 50 + x: 100; y: 100 + } + + states: State { + name: "moved" + PropertyChanges { + target: theRect + x: 200 + } + } + transitions: Transition { + NumberAnimation { targets: theRect; properties: "x" } + } + + MouseArea { + anchors.fill: parent + onClicked: parent.state = "moved" + } +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/propertiesTransition2.qml b/tests/auto/declarative/qdeclarativeanimations/data/propertiesTransition2.qml new file mode 100644 index 00000000..6b846852 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/propertiesTransition2.qml @@ -0,0 +1,29 @@ +import QtQuick 1.0 + +Rectangle { + width: 400 + height: 400 + Rectangle { + id: theRect + objectName: "TheRect" + color: "red" + width: 50; height: 50 + x: 100; y: 100 + } + + states: State { + name: "moved" + PropertyChanges { + target: theRect + x: 200 + } + } + transitions: Transition { + NumberAnimation { target: theRect; property: "y"; to: 200 } + } + + MouseArea { + anchors.fill: parent + onClicked: parent.state = "moved" + } +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/propertiesTransition3.qml b/tests/auto/declarative/qdeclarativeanimations/data/propertiesTransition3.qml new file mode 100644 index 00000000..c9d8e95b --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/propertiesTransition3.qml @@ -0,0 +1,29 @@ +import QtQuick 1.0 + +Rectangle { + width: 400 + height: 400 + Rectangle { + id: theRect + objectName: "TheRect" + color: "red" + width: 50; height: 50 + x: 100; y: 100 + } + + states: State { + name: "moved" + PropertyChanges { + target: theRect + x: 200 + } + } + transitions: Transition { + NumberAnimation { targets: theRect; properties: "y" } + } + + MouseArea { + anchors.fill: parent + onClicked: parent.state = "moved" + } +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/propertiesTransition4.qml b/tests/auto/declarative/qdeclarativeanimations/data/propertiesTransition4.qml new file mode 100644 index 00000000..61e8a967 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/propertiesTransition4.qml @@ -0,0 +1,29 @@ +import QtQuick 1.0 + +Rectangle { + width: 400 + height: 400 + Rectangle { + id: theRect + objectName: "TheRect" + color: "red" + width: 50; height: 50 + x: 100; y: 100 + } + + states: State { + name: "moved" + PropertyChanges { + target: theRect + x: 200 + } + } + transitions: Transition { + NumberAnimation { target: theRect; properties: "x" } + } + + MouseArea { + anchors.fill: parent + onClicked: parent.state = "moved" + } +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/propertiesTransition5.qml b/tests/auto/declarative/qdeclarativeanimations/data/propertiesTransition5.qml new file mode 100644 index 00000000..b0239430 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/propertiesTransition5.qml @@ -0,0 +1,29 @@ +import QtQuick 1.0 + +Rectangle { + width: 400 + height: 400 + Rectangle { + id: theRect + objectName: "TheRect" + color: "red" + width: 50; height: 50 + x: 100; y: 100 + } + + states: State { + name: "moved" + PropertyChanges { + target: theRect + x: 200 + } + } + transitions: Transition { + NumberAnimation { targets: theRect; property: "x" } + } + + MouseArea { + anchors.fill: parent + onClicked: parent.state = "moved" + } +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/propertiesTransition6.qml b/tests/auto/declarative/qdeclarativeanimations/data/propertiesTransition6.qml new file mode 100644 index 00000000..7c88a7f0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/propertiesTransition6.qml @@ -0,0 +1,29 @@ +import QtQuick 1.0 + +Rectangle { + width: 400 + height: 400 + Rectangle { + id: theRect + objectName: "TheRect" + color: "red" + width: 50; height: 50 + x: 100; y: 100 + } + + states: State { + name: "moved" + PropertyChanges { + target: theRect + x: 200 + } + } + transitions: Transition { + NumberAnimation { targets: theItem; properties: "x" } + } + + MouseArea { + anchors.fill: parent + onClicked: parent.state = "moved" + } +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/propertiesTransition7.qml b/tests/auto/declarative/qdeclarativeanimations/data/propertiesTransition7.qml new file mode 100644 index 00000000..fbef95e5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/propertiesTransition7.qml @@ -0,0 +1,29 @@ +import QtQuick 1.0 + +Rectangle { + width: 400 + height: 400 + Rectangle { + id: theRect + objectName: "TheRect" + color: "red" + width: 50; height: 50 + x: 100; y: 100 + } + + states: State { + name: "moved" + PropertyChanges { + target: theRect + x: 200 + } + } + transitions: Transition { + SpringAnimation { targets: theRect; properties: "x"; velocity: 10000 } + } + + MouseArea { + anchors.fill: parent + onClicked: parent.state = "moved" + } +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/registrationBug.qml b/tests/auto/declarative/qdeclarativeanimations/data/registrationBug.qml new file mode 100644 index 00000000..7dc29f93 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/registrationBug.qml @@ -0,0 +1,18 @@ +import QtQuick 1.0 + +Rectangle { + id: rect + width: 200 + height: 200 + + property bool animating: true + property int value: 0 + + NumberAnimation { + target: rect + property: "value" + running: rect.animating + to: 100 + duration: 50 + } +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/rotation.qml b/tests/auto/declarative/qdeclarativeanimations/data/rotation.qml new file mode 100644 index 00000000..ac158df7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/rotation.qml @@ -0,0 +1,48 @@ +import QtQuick 1.0 + +Rectangle { + width: 600; height: 200 + + Row { + spacing: 5 + Rectangle { + id: rr + objectName: "rr" + color: "red" + width: 100; height: 100 + } + Rectangle { + id: rr2 + objectName: "rr2" + color: "red" + width: 100; height: 100 + } + Rectangle { + id: rr3 + objectName: "rr3" + color: "red" + width: 100; height: 100 + } + Rectangle { + id: rr4 + objectName: "rr4" + color: "red" + width: 100; height: 100 + } + } + + states: State { + name: "state1" + PropertyChanges { target: rr; rotation: 370 } + PropertyChanges { target: rr2; rotation: 370 } + PropertyChanges { target: rr3; rotation: 370 } + PropertyChanges { target: rr4; rotation: 370 } + } + + transitions: Transition { + RotationAnimation { target: rr; direction: RotationAnimation.Numerical; duration: 1000 } + RotationAnimation { target: rr2; direction: RotationAnimation.Clockwise; duration: 1000 } + RotationAnimation { target: rr3; direction: RotationAnimation.Counterclockwise; duration: 1000 } + RotationAnimation { target: rr4; direction: RotationAnimation.Shortest; duration: 1000 } + } +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/runningTrueBug.qml b/tests/auto/declarative/qdeclarativeanimations/data/runningTrueBug.qml new file mode 100644 index 00000000..7d33ed71 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/runningTrueBug.qml @@ -0,0 +1,30 @@ +import QtQuick 1.0 +Rectangle { + color: "skyblue" + width: 500 + height: 200 + Rectangle { + objectName: "cloud" + color: "white" + y: 50 + width: 100 + height: 100 + + SequentialAnimation on x { + loops: Animation.Infinite + running: true + NumberAnimation { + id: firstAnimation + from: 0 + to: 500 + duration: 5000 + } + NumberAnimation { + id: secondAnimation + from: -100 + to: 0 + duration: 1000 + } + } + } +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/transitionAssignmentBug.qml b/tests/auto/declarative/qdeclarativeanimations/data/transitionAssignmentBug.qml new file mode 100644 index 00000000..99b9ac57 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/transitionAssignmentBug.qml @@ -0,0 +1,12 @@ +import QtQuick 1.0 + +Rectangle { + width: 400 + height: 400 + + property bool nullObject + Component.onCompleted: nullObject = transitions.length > 0 && transitions[0] === null + + property list myTransitions: [Transition {}, Transition {}] + transitions: myTransitions +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/valuesource.qml b/tests/auto/declarative/qdeclarativeanimations/data/valuesource.qml new file mode 100644 index 00000000..fa9cd400 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/valuesource.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 + +Rectangle { + width: 400 + height: 400 + Rectangle { + id: rect + objectName: "MyRect" + color: "red" + width: 50; height: 50 + x: 100; y: 100 + NumberAnimation on x { id: anim; objectName: "MyAnim"; to: 200 } + } +} diff --git a/tests/auto/declarative/qdeclarativeanimations/data/valuesource2.qml b/tests/auto/declarative/qdeclarativeanimations/data/valuesource2.qml new file mode 100644 index 00000000..f6343a1b --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/data/valuesource2.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 + +Rectangle { + width: 400 + height: 400 + Rectangle { + id: rect + objectName: "MyRect" + color: "red" + width: 50; height: 50 + x: 100; y: 100 + NumberAnimation on x { id: anim; objectName: "MyAnim"; running: false; to: 200 } + } +} diff --git a/tests/auto/declarative/qdeclarativeanimations/qdeclarativeanimations.pro b/tests/auto/declarative/qdeclarativeanimations/qdeclarativeanimations.pro new file mode 100644 index 00000000..d00d51a6 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/qdeclarativeanimations.pro @@ -0,0 +1,15 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +SOURCES += tst_qdeclarativeanimations.cpp +macx:CONFIG -= app_bundle + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativeanimations/tst_qdeclarativeanimations.cpp b/tests/auto/declarative/qdeclarativeanimations/tst_qdeclarativeanimations.cpp new file mode 100644 index 00000000..4da59108 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeanimations/tst_qdeclarativeanimations.cpp @@ -0,0 +1,862 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../../../shared/util.h" + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_qdeclarativeanimations : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativeanimations() {} + +private slots: + void initTestCase() { QDeclarativeEngine engine; } // ensure types are registered + + void simpleProperty(); + void simpleNumber(); + void simpleColor(); + void simpleRotation(); + void alwaysRunToEnd(); + void complete(); + void resume(); + void dotProperty(); + void badTypes(); + void badProperties(); + void mixedTypes(); + void properties(); + void propertiesTransition(); + void invalidDuration(); + void attached(); + void propertyValueSourceDefaultStart(); + void dontStart(); + void easingProperties(); + void rotation(); + void runningTrueBug(); + void nonTransitionBug(); + void registrationBug(); + void doubleRegistrationBug(); + void alwaysRunToEndRestartBug(); + void transitionAssignmentBug(); +}; + +#define QTIMED_COMPARE(lhs, rhs) do { \ + for (int ii = 0; ii < 5; ++ii) { \ + if (lhs == rhs) \ + break; \ + QTest::qWait(50); \ + } \ + QCOMPARE(lhs, rhs); \ +} while (false) + +void tst_qdeclarativeanimations::simpleProperty() +{ + QDeclarativeRectangle rect; + QDeclarativePropertyAnimation animation; + animation.setTarget(&rect); + animation.setProperty("pos"); + animation.setTo(QPointF(200,200)); + QVERIFY(animation.target() == &rect); + QVERIFY(animation.property() == "pos"); + QVERIFY(animation.to().toPointF() == QPointF(200,200)); + animation.start(); + QVERIFY(animation.isRunning()); + QTest::qWait(animation.duration()); + QTIMED_COMPARE(rect.pos(), QPointF(200,200)); + + rect.setPos(0,0); + animation.start(); + animation.pause(); + QVERIFY(animation.isRunning()); + QVERIFY(animation.isPaused()); + animation.setCurrentTime(125); + QVERIFY(animation.currentTime() == 125); + QCOMPARE(rect.pos(), QPointF(100,100)); +} + +void tst_qdeclarativeanimations::simpleNumber() +{ + QDeclarativeRectangle rect; + QDeclarativeNumberAnimation animation; + animation.setTarget(&rect); + animation.setProperty("x"); + animation.setTo(200); + QVERIFY(animation.target() == &rect); + QVERIFY(animation.property() == "x"); + QVERIFY(animation.to() == 200); + animation.start(); + QVERIFY(animation.isRunning()); + QTest::qWait(animation.duration()); + QTIMED_COMPARE(rect.x(), qreal(200)); + + rect.setX(0); + animation.start(); + animation.pause(); + QVERIFY(animation.isRunning()); + QVERIFY(animation.isPaused()); + animation.setCurrentTime(125); + QVERIFY(animation.currentTime() == 125); + QCOMPARE(rect.x(), qreal(100)); +} + +void tst_qdeclarativeanimations::simpleColor() +{ + QDeclarativeRectangle rect; + QDeclarativeColorAnimation animation; + animation.setTarget(&rect); + animation.setProperty("color"); + animation.setTo(QColor("red")); + QVERIFY(animation.target() == &rect); + QVERIFY(animation.property() == "color"); + QVERIFY(animation.to() == QColor("red")); + animation.start(); + QVERIFY(animation.isRunning()); + QTest::qWait(animation.duration()); + QTIMED_COMPARE(rect.color(), QColor("red")); + + rect.setColor(QColor("blue")); + animation.start(); + animation.pause(); + QVERIFY(animation.isRunning()); + QVERIFY(animation.isPaused()); + animation.setCurrentTime(125); + QVERIFY(animation.currentTime() == 125); + QCOMPARE(rect.color(), QColor::fromRgbF(0.498039, 0, 0.498039, 1)); + + rect.setColor(QColor("green")); + animation.setFrom(QColor("blue")); + QVERIFY(animation.from() == QColor("blue")); + animation.restart(); + QCOMPARE(rect.color(), QColor("blue")); + QVERIFY(animation.isRunning()); + animation.setCurrentTime(125); + QCOMPARE(rect.color(), QColor::fromRgbF(0.498039, 0, 0.498039, 1)); +} + +void tst_qdeclarativeanimations::simpleRotation() +{ + QDeclarativeRectangle rect; + QDeclarativeRotationAnimation animation; + animation.setTarget(&rect); + animation.setProperty("rotation"); + animation.setTo(270); + QVERIFY(animation.target() == &rect); + QVERIFY(animation.property() == "rotation"); + QVERIFY(animation.to() == 270); + QVERIFY(animation.direction() == QDeclarativeRotationAnimation::Numerical); + animation.start(); + QVERIFY(animation.isRunning()); + QTest::qWait(animation.duration()); + QTIMED_COMPARE(rect.rotation(), qreal(270)); + + rect.setRotation(0); + animation.start(); + animation.pause(); + QVERIFY(animation.isRunning()); + QVERIFY(animation.isPaused()); + animation.setCurrentTime(125); + QVERIFY(animation.currentTime() == 125); + QCOMPARE(rect.rotation(), qreal(135)); +} + +void tst_qdeclarativeanimations::alwaysRunToEnd() +{ + QDeclarativeRectangle rect; + QDeclarativePropertyAnimation animation; + animation.setTarget(&rect); + animation.setProperty("x"); + animation.setTo(200); + animation.setDuration(1000); + animation.setLoops(-1); + animation.setAlwaysRunToEnd(true); + QVERIFY(animation.loops() == -1); + QVERIFY(animation.alwaysRunToEnd() == true); + animation.start(); + QTest::qWait(1500); + animation.stop(); + QVERIFY(rect.x() != qreal(200)); + QTest::qWait(500); + QTIMED_COMPARE(rect.x(), qreal(200)); +} + +void tst_qdeclarativeanimations::complete() +{ + QDeclarativeRectangle rect; + QDeclarativePropertyAnimation animation; + animation.setTarget(&rect); + animation.setProperty("x"); + animation.setFrom(1); + animation.setTo(200); + animation.setDuration(500); + QVERIFY(animation.from() == 1); + animation.start(); + QTest::qWait(50); + animation.stop(); + QVERIFY(rect.x() != qreal(200)); + animation.start(); + QTest::qWait(50); + QVERIFY(animation.isRunning()); + animation.complete(); + QCOMPARE(rect.x(), qreal(200)); +} + +void tst_qdeclarativeanimations::resume() +{ + QDeclarativeRectangle rect; + QDeclarativePropertyAnimation animation; + animation.setTarget(&rect); + animation.setProperty("x"); + animation.setFrom(10); + animation.setTo(200); + animation.setDuration(1000); + QVERIFY(animation.from() == 10); + + animation.start(); + QTest::qWait(400); + animation.pause(); + qreal x = rect.x(); + QVERIFY(x != qreal(200) && x != qreal(10)); + QVERIFY(animation.isRunning()); + QVERIFY(animation.isPaused()); + + animation.resume(); + QVERIFY(animation.isRunning()); + QVERIFY(!animation.isPaused()); + QTest::qWait(400); + animation.stop(); + QVERIFY(rect.x() > x); +} + +void tst_qdeclarativeanimations::dotProperty() +{ + QDeclarativeRectangle rect; + QDeclarativeNumberAnimation animation; + animation.setTarget(&rect); + animation.setProperty("border.width"); + animation.setTo(10); + animation.start(); + QTest::qWait(animation.duration()+50); + QTIMED_COMPARE(rect.border()->width(), 10); + + rect.border()->setWidth(0); + animation.start(); + animation.pause(); + animation.setCurrentTime(125); + QVERIFY(animation.currentTime() == 125); + QCOMPARE(rect.border()->width(), 5); +} + +void tst_qdeclarativeanimations::badTypes() +{ + //don't crash + { + QDeclarativeView *view = new QDeclarativeView; + view->setSource(QUrl::fromLocalFile(SRCDIR "/data/badtype1.qml")); + + qApp->processEvents(); + + delete view; + } + + //make sure we get a compiler error + { + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/badtype2.qml")); + QTest::ignoreMessage(QtWarningMsg, "QDeclarativeComponent: Component is not ready"); + c.create(); + + QVERIFY(c.errors().count() == 1); + QCOMPARE(c.errors().at(0).description(), QLatin1String("Invalid property assignment: number expected")); + } + + //make sure we get a compiler error + { + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/badtype3.qml")); + QTest::ignoreMessage(QtWarningMsg, "QDeclarativeComponent: Component is not ready"); + c.create(); + + QVERIFY(c.errors().count() == 1); + QCOMPARE(c.errors().at(0).description(), QLatin1String("Invalid property assignment: color expected")); + } + + //don't crash + { + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/badtype4.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); + + QDeclarativeItemPrivate::get(rect)->setState("state1"); + QTest::qWait(1000 + 50); + QDeclarativeRectangle *myRect = rect->findChild("MyRect"); + QVERIFY(myRect); + QCOMPARE(myRect->x(),qreal(200)); + } +} + +void tst_qdeclarativeanimations::badProperties() +{ + //make sure we get a runtime error + { + QDeclarativeEngine engine; + + QDeclarativeComponent c1(&engine, QUrl::fromLocalFile(SRCDIR "/data/badproperty1.qml")); + QByteArray message = QUrl::fromLocalFile(SRCDIR "/data/badproperty1.qml").toString().toUtf8() + ":18:9: QML ColorAnimation: Cannot animate non-existent property \"border.colr\""; + QTest::ignoreMessage(QtWarningMsg, message); + QDeclarativeRectangle *rect = qobject_cast(c1.create()); + QVERIFY(rect); + + QDeclarativeComponent c2(&engine, QUrl::fromLocalFile(SRCDIR "/data/badproperty2.qml")); + message = QUrl::fromLocalFile(SRCDIR "/data/badproperty2.qml").toString().toUtf8() + ":18:9: QML ColorAnimation: Cannot animate read-only property \"border\""; + QTest::ignoreMessage(QtWarningMsg, message); + rect = qobject_cast(c2.create()); + QVERIFY(rect); + + //### should we warn here are well? + //rect->setState("state1"); + } +} + +//test animating mixed types with property animation in a transition +//for example, int + real; color + real; etc +void tst_qdeclarativeanimations::mixedTypes() +{ + //assumes border.width stays a real -- not real robust + { + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/mixedtype1.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); + + QDeclarativeItemPrivate::get(rect)->setState("state1"); + QTest::qWait(500); + QDeclarativeRectangle *myRect = rect->findChild("MyRect"); + QVERIFY(myRect); + + //rather inexact -- is there a better way? + QVERIFY(myRect->x() > 100 && myRect->x() < 200); + QVERIFY(myRect->border()->width() > 1 && myRect->border()->width() < 10); + } + + { + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/mixedtype2.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); + + QDeclarativeItemPrivate::get(rect)->setState("state1"); + QTest::qWait(500); + QDeclarativeRectangle *myRect = rect->findChild("MyRect"); + QVERIFY(myRect); + + //rather inexact -- is there a better way? + QVERIFY(myRect->x() > 100 && myRect->x() < 200); + QVERIFY(myRect->color() != QColor("red") && myRect->color() != QColor("blue")); + } +} + +void tst_qdeclarativeanimations::properties() +{ + const int waitDuration = 300; + { + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/properties.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); + + QDeclarativeRectangle *myRect = rect->findChild("TheRect"); + QVERIFY(myRect); + QTest::qWait(waitDuration); + QTIMED_COMPARE(myRect->x(),qreal(200)); + } + + { + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/properties2.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); + + QDeclarativeRectangle *myRect = rect->findChild("TheRect"); + QVERIFY(myRect); + QTest::qWait(waitDuration); + QTIMED_COMPARE(myRect->x(),qreal(200)); + } + + { + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/properties3.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); + + QDeclarativeRectangle *myRect = rect->findChild("TheRect"); + QVERIFY(myRect); + QTest::qWait(waitDuration); + QTIMED_COMPARE(myRect->x(),qreal(300)); + } + + { + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/properties4.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); + + QDeclarativeRectangle *myRect = rect->findChild("TheRect"); + QVERIFY(myRect); + QTest::qWait(waitDuration); + QTIMED_COMPARE(myRect->y(),qreal(200)); + QTIMED_COMPARE(myRect->x(),qreal(100)); + } + + { + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/properties5.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); + + QDeclarativeRectangle *myRect = rect->findChild("TheRect"); + QVERIFY(myRect); + QTest::qWait(waitDuration); + QTIMED_COMPARE(myRect->x(),qreal(100)); + QTIMED_COMPARE(myRect->y(),qreal(200)); + } +} + +void tst_qdeclarativeanimations::propertiesTransition() +{ + const int waitDuration = 300; + { + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/propertiesTransition.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); + + QDeclarativeItemPrivate::get(rect)->setState("moved"); + QDeclarativeRectangle *myRect = rect->findChild("TheRect"); + QVERIFY(myRect); + QTest::qWait(waitDuration); + QTIMED_COMPARE(myRect->x(),qreal(200)); + } + + { + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/propertiesTransition2.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); + + QDeclarativeRectangle *myRect = rect->findChild("TheRect"); + QVERIFY(myRect); + QDeclarativeItemPrivate::get(rect)->setState("moved"); + QCOMPARE(myRect->x(),qreal(200)); + QCOMPARE(myRect->y(),qreal(100)); + QTest::qWait(waitDuration); + QTIMED_COMPARE(myRect->y(),qreal(200)); + } + + { + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/propertiesTransition3.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); + + QDeclarativeRectangle *myRect = rect->findChild("TheRect"); + QVERIFY(myRect); + QDeclarativeItemPrivate::get(rect)->setState("moved"); + QCOMPARE(myRect->x(),qreal(200)); + QCOMPARE(myRect->y(),qreal(100)); + } + + { + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/propertiesTransition4.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); + + QDeclarativeRectangle *myRect = rect->findChild("TheRect"); + QVERIFY(myRect); + QDeclarativeItemPrivate::get(rect)->setState("moved"); + QCOMPARE(myRect->x(),qreal(100)); + QTest::qWait(waitDuration); + QTIMED_COMPARE(myRect->x(),qreal(200)); + } + + { + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/propertiesTransition5.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); + + QDeclarativeRectangle *myRect = rect->findChild("TheRect"); + QVERIFY(myRect); + QDeclarativeItemPrivate::get(rect)->setState("moved"); + QCOMPARE(myRect->x(),qreal(100)); + QTest::qWait(waitDuration); + QTIMED_COMPARE(myRect->x(),qreal(200)); + } + + /*{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/propertiesTransition6.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); + + QDeclarativeRectangle *myRect = rect->findChild("TheRect"); + QVERIFY(myRect); + QDeclarativeItemPrivate::get(rect)->setState("moved"); + QCOMPARE(myRect->x(),qreal(100)); + QTest::qWait(waitDuration); + QTIMED_COMPARE(myRect->x(),qreal(100)); + }*/ + + { + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/propertiesTransition7.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); + + QDeclarativeItemPrivate::get(rect)->setState("moved"); + QDeclarativeRectangle *myRect = rect->findChild("TheRect"); + QVERIFY(myRect); + QTest::qWait(waitDuration); + QTIMED_COMPARE(myRect->x(),qreal(200)); + } + +} + +void tst_qdeclarativeanimations::invalidDuration() +{ + QDeclarativePropertyAnimation *animation = new QDeclarativePropertyAnimation; + QTest::ignoreMessage(QtWarningMsg, ": QML PropertyAnimation: Cannot set a duration of < 0"); + animation->setDuration(-1); + QCOMPARE(animation->duration(), 250); + + QDeclarativePauseAnimation *pauseAnimation = new QDeclarativePauseAnimation; + QTest::ignoreMessage(QtWarningMsg, ": QML PauseAnimation: Cannot set a duration of < 0"); + pauseAnimation->setDuration(-1); + QCOMPARE(pauseAnimation->duration(), 250); +} + +void tst_qdeclarativeanimations::attached() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/attached.qml")); + QTest::ignoreMessage(QtDebugMsg, "off"); + QTest::ignoreMessage(QtDebugMsg, "on"); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); +} + +void tst_qdeclarativeanimations::propertyValueSourceDefaultStart() +{ + { + QDeclarativeEngine engine; + + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/valuesource.qml")); + + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); + + QDeclarativeAbstractAnimation *myAnim = rect->findChild("MyAnim"); + QVERIFY(myAnim); + QVERIFY(myAnim->isRunning()); + } + + { + QDeclarativeEngine engine; + + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/valuesource2.qml")); + + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); + + QDeclarativeAbstractAnimation *myAnim = rect->findChild("MyAnim"); + QVERIFY(myAnim); + QVERIFY(myAnim->isRunning() == false); + } + + { + QDeclarativeEngine engine; + + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/dontAutoStart.qml")); + + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); + + QDeclarativeAbstractAnimation *myAnim = rect->findChild("MyAnim"); + QVERIFY(myAnim && myAnim->qtAnimation()); + QVERIFY(myAnim->qtAnimation()->state() == QAbstractAnimation::Stopped); + } +} + + +void tst_qdeclarativeanimations::dontStart() +{ + { + QDeclarativeEngine engine; + + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/dontStart.qml")); + + QString warning = c.url().toString() + ":14:13: QML NumberAnimation: setRunning() cannot be used on non-root animation nodes."; + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning)); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); + + QDeclarativeAbstractAnimation *myAnim = rect->findChild("MyAnim"); + QVERIFY(myAnim && myAnim->qtAnimation()); + QVERIFY(myAnim->qtAnimation()->state() == QAbstractAnimation::Stopped); + } + + { + QDeclarativeEngine engine; + + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/dontStart2.qml")); + + QString warning = c.url().toString() + ":15:17: QML NumberAnimation: setRunning() cannot be used on non-root animation nodes."; + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning)); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); + + QDeclarativeAbstractAnimation *myAnim = rect->findChild("MyAnim"); + QVERIFY(myAnim && myAnim->qtAnimation()); + QVERIFY(myAnim->qtAnimation()->state() == QAbstractAnimation::Stopped); + } +} + +void tst_qdeclarativeanimations::easingProperties() +{ + { + QDeclarativeEngine engine; + QString componentStr = "import QtQuick 1.0\nNumberAnimation { easing.type: \"InOutQuad\" }"; + QDeclarativeComponent animationComponent(&engine); + animationComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativePropertyAnimation *animObject = qobject_cast(animationComponent.create()); + + QVERIFY(animObject != 0); + QCOMPARE(animObject->easing().type(), QEasingCurve::InOutQuad); + } + + { + QDeclarativeEngine engine; + QString componentStr = "import QtQuick 1.0\nPropertyAnimation { easing.type: \"OutBounce\"; easing.amplitude: 5.0 }"; + QDeclarativeComponent animationComponent(&engine); + animationComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativePropertyAnimation *animObject = qobject_cast(animationComponent.create()); + + QVERIFY(animObject != 0); + QCOMPARE(animObject->easing().type(), QEasingCurve::OutBounce); + QCOMPARE(animObject->easing().amplitude(), 5.0); + } + + { + QDeclarativeEngine engine; + QString componentStr = "import QtQuick 1.0\nPropertyAnimation { easing.type: \"OutElastic\"; easing.amplitude: 5.0; easing.period: 3.0}"; + QDeclarativeComponent animationComponent(&engine); + animationComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativePropertyAnimation *animObject = qobject_cast(animationComponent.create()); + + QVERIFY(animObject != 0); + QCOMPARE(animObject->easing().type(), QEasingCurve::OutElastic); + QCOMPARE(animObject->easing().amplitude(), 5.0); + QCOMPARE(animObject->easing().period(), 3.0); + } + + { + QDeclarativeEngine engine; + QString componentStr = "import QtQuick 1.0\nPropertyAnimation { easing.type: \"InOutBack\"; easing.overshoot: 2 }"; + QDeclarativeComponent animationComponent(&engine); + animationComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativePropertyAnimation *animObject = qobject_cast(animationComponent.create()); + + QVERIFY(animObject != 0); + QCOMPARE(animObject->easing().type(), QEasingCurve::InOutBack); + QCOMPARE(animObject->easing().overshoot(), 2.0); + } +} + +void tst_qdeclarativeanimations::rotation() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/rotation.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); + + QDeclarativeRectangle *rr = rect->findChild("rr"); + QDeclarativeRectangle *rr2 = rect->findChild("rr2"); + QDeclarativeRectangle *rr3 = rect->findChild("rr3"); + QDeclarativeRectangle *rr4 = rect->findChild("rr4"); + + QDeclarativeItemPrivate::get(rect)->setState("state1"); + QTest::qWait(800); + qreal r1 = rr->rotation(); + qreal r2 = rr2->rotation(); + qreal r3 = rr3->rotation(); + qreal r4 = rr4->rotation(); + + QVERIFY(r1 > qreal(0) && r1 < qreal(370)); + QVERIFY(r2 > qreal(0) && r2 < qreal(370)); + QVERIFY(r3 < qreal(0) && r3 > qreal(-350)); + QVERIFY(r4 > qreal(0) && r4 < qreal(10)); + QCOMPARE(r1,r2); + QVERIFY(r4 < r2); + + QTest::qWait(800); + QTIMED_COMPARE(rr->rotation() + rr2->rotation() + rr3->rotation() + rr4->rotation(), qreal(370*4)); +} + +void tst_qdeclarativeanimations::runningTrueBug() +{ + //ensure we start correctly when "running: true" is explicitly set + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/runningTrueBug.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); + + QDeclarativeRectangle *cloud = rect->findChild("cloud"); + QVERIFY(cloud); + QTest::qWait(1000); + QVERIFY(cloud->x() > qreal(0)); +} + +//QTBUG-12805 +void tst_qdeclarativeanimations::nonTransitionBug() +{ + //tests that the animation values from the previous transition are properly cleared + //in the case where an animation in the transition doesn't match anything (but previously did) + QDeclarativeEngine engine; + + QDeclarativeComponent c(&engine, SRCDIR "/data/nonTransitionBug.qml"); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect != 0); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + QDeclarativeRectangle *mover = rect->findChild("mover"); + + mover->setX(100); + QCOMPARE(mover->x(), qreal(100)); + + rectPrivate->setState("left"); + QTRY_COMPARE(mover->x(), qreal(0)); + + mover->setX(100); + QCOMPARE(mover->x(), qreal(100)); + + //make sure we don't try to animate back to 0 + rectPrivate->setState("free"); + QTest::qWait(300); + QCOMPARE(mover->x(), qreal(100)); +} + +//QTBUG-14042 +void tst_qdeclarativeanimations::registrationBug() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent c(&engine, SRCDIR "/data/registrationBug.qml"); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect != 0); + QTRY_COMPARE(rect->property("value"), QVariant(int(100))); +} + +void tst_qdeclarativeanimations::doubleRegistrationBug() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent c(&engine, SRCDIR "/data/doubleRegistrationBug.qml"); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect != 0); + + QDeclarativeAbstractAnimation *anim = rect->findChild("animation"); + QVERIFY(anim != 0); + QTRY_COMPARE(anim->qtAnimation()->state(), QAbstractAnimation::Stopped); +} + +//QTBUG-16736 +void tst_qdeclarativeanimations::alwaysRunToEndRestartBug() +{ + QDeclarativeRectangle rect; + QDeclarativePropertyAnimation animation; + animation.setTarget(&rect); + animation.setProperty("x"); + animation.setTo(200); + animation.setDuration(1000); + animation.setLoops(-1); + animation.setAlwaysRunToEnd(true); + QVERIFY(animation.loops() == -1); + QVERIFY(animation.alwaysRunToEnd() == true); + animation.start(); + animation.stop(); + animation.start(); + animation.stop(); + QTest::qWait(500); + QVERIFY(rect.x() != qreal(200)); + QTest::qWait(800); + QTIMED_COMPARE(rect.x(), qreal(200)); + QCOMPARE(static_cast(&animation)->qtAnimation()->state(), QAbstractAnimation::Stopped); +} + +//QTBUG-20227 +void tst_qdeclarativeanimations::transitionAssignmentBug() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent c(&engine, SRCDIR "/data/transitionAssignmentBug.qml"); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect != 0); + + QCOMPARE(rect->property("nullObject").toBool(), false); +} + +QTEST_MAIN(tst_qdeclarativeanimations) + +#include "tst_qdeclarativeanimations.moc" diff --git a/tests/auto/declarative/qdeclarativeapplication/qdeclarativeapplication.pro b/tests/auto/declarative/qdeclarativeapplication/qdeclarativeapplication.pro new file mode 100644 index 00000000..91e54682 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeapplication/qdeclarativeapplication.pro @@ -0,0 +1,5 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative gui +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativeapplication.cpp diff --git a/tests/auto/declarative/qdeclarativeapplication/tst_qdeclarativeapplication.cpp b/tests/auto/declarative/qdeclarativeapplication/tst_qdeclarativeapplication.cpp new file mode 100644 index 00000000..bb9967d6 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeapplication/tst_qdeclarativeapplication.cpp @@ -0,0 +1,123 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include "../../../shared/util.h" +#include +#include +#include +#include +#include + +class tst_qdeclarativeapplication : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativeapplication(); + +private slots: + void active(); + void layoutDirection(); + +private: + QDeclarativeEngine engine; +}; + +tst_qdeclarativeapplication::tst_qdeclarativeapplication() +{ +} + +void tst_qdeclarativeapplication::active() +{ + QDeclarativeComponent component(&engine); + component.setData("import QtQuick 1.0; Item { property bool active: Qt.application.active }", QUrl::fromLocalFile("")); + QDeclarativeItem *item = qobject_cast(component.create()); + QVERIFY(item); + QGraphicsScene scene; + QGraphicsView view(&scene); + scene.addItem(item); + + // not active + QVERIFY(!item->property("active").toBool()); + QCOMPARE(item->property("active").toBool(), QApplication::activeWindow() != 0); + + // active + view.show(); + QApplication::setActiveWindow(&view); + QTest::qWaitForWindowShown(&view); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(&view)); + QCOMPARE(item->property("active").toBool(), QApplication::activeWindow() != 0); + + // not active again + // on mac, setActiveWindow(0) on mac does not deactivate the current application + // (you have to switch to a different app or hide the current app to trigger this) +#if !defined(Q_WS_MAC) + QApplication::setActiveWindow(0); + QVERIFY(!item->property("active").toBool()); + QCOMPARE(item->property("active").toBool(), QApplication::activeWindow() != 0); +#endif +} + +void tst_qdeclarativeapplication::layoutDirection() +{ + QDeclarativeComponent component(&engine); + component.setData("import QtQuick 1.0; Item { property bool layoutDirection: Qt.application.layoutDirection }", QUrl::fromLocalFile("")); + QDeclarativeItem *item = qobject_cast(component.create()); + QVERIFY(item); + QGraphicsScene scene; + QGraphicsView view(&scene); + scene.addItem(item); + + // not mirrored + QCOMPARE(Qt::LayoutDirection(item->property("layoutDirection").toInt()), Qt::LeftToRight); + + // mirrored + QApplication::setLayoutDirection(Qt::RightToLeft); + QCOMPARE(Qt::LayoutDirection(item->property("layoutDirection").toInt()), Qt::RightToLeft); + + // not mirrored again + QApplication::setLayoutDirection(Qt::LeftToRight); + QCOMPARE(Qt::LayoutDirection(item->property("layoutDirection").toInt()), Qt::LeftToRight); +} + +QTEST_MAIN(tst_qdeclarativeapplication) + +#include "tst_qdeclarativeapplication.moc" diff --git a/tests/auto/declarative/qdeclarativebehaviors/data/binding.qml b/tests/auto/declarative/qdeclarativebehaviors/data/binding.qml new file mode 100644 index 00000000..a452447f --- /dev/null +++ b/tests/auto/declarative/qdeclarativebehaviors/data/binding.qml @@ -0,0 +1,26 @@ +import QtQuick 1.0 +Rectangle { + width: 400 + height: 400 + property real basex : 0 + property real movedx: 200 + Rectangle { + id: rect + objectName: "MyRect" + width: 100; height: 100; color: "green" + x: basex + Behavior on x { NumberAnimation { duration: 800; } } + } + MouseArea { + id: clicker + anchors.fill: parent + } + states: State { + name: "moved" + when: clicker.pressed + PropertyChanges { + target: rect + x: movedx + } + } +} diff --git a/tests/auto/declarative/qdeclarativebehaviors/data/color.qml b/tests/auto/declarative/qdeclarativebehaviors/data/color.qml new file mode 100644 index 00000000..c4b783a0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativebehaviors/data/color.qml @@ -0,0 +1,24 @@ +import QtQuick 1.0 +Rectangle { + width: 400 + height: 400 + Rectangle { + id: rect + objectName: "MyRect" + width: 100; height: 100; + color: "green" + Behavior on color { ColorAnimation { duration: 500; } } + } + MouseArea { + id: clicker + anchors.fill: parent + } + states: State { + name: "red" + when: clicker.pressed + PropertyChanges { + target: rect + color: "red" + } + } +} diff --git a/tests/auto/declarative/qdeclarativebehaviors/data/cpptrigger.qml b/tests/auto/declarative/qdeclarativebehaviors/data/cpptrigger.qml new file mode 100644 index 00000000..88ddfaa1 --- /dev/null +++ b/tests/auto/declarative/qdeclarativebehaviors/data/cpptrigger.qml @@ -0,0 +1,11 @@ +import QtQuick 1.0 +Rectangle { + width: 400 + height: 400 + Rectangle { + id: rect + objectName: "MyRect" + width: 100; height: 100; color: "green" + Behavior on x { NumberAnimation { duration: 500; } } + } +} diff --git a/tests/auto/declarative/qdeclarativebehaviors/data/delayedRegistration.qml b/tests/auto/declarative/qdeclarativebehaviors/data/delayedRegistration.qml new file mode 100644 index 00000000..aa384c33 --- /dev/null +++ b/tests/auto/declarative/qdeclarativebehaviors/data/delayedRegistration.qml @@ -0,0 +1,25 @@ +import QtQuick 1.0 + +Rectangle { + id: container + + width: 400; height: 400; + property Item myItem + + function doCreate() { + myItem = myComponent.createObject(container) + myItem.x = 100 + } + + Component { + id: myComponent + Rectangle { + width: 100 + height: 100 + color: "green" + Behavior on x { NumberAnimation { duration: 500 } } + } + } + + Component.onCompleted: doCreate() +} diff --git a/tests/auto/declarative/qdeclarativebehaviors/data/disabled.qml b/tests/auto/declarative/qdeclarativebehaviors/data/disabled.qml new file mode 100644 index 00000000..f6cfa5e3 --- /dev/null +++ b/tests/auto/declarative/qdeclarativebehaviors/data/disabled.qml @@ -0,0 +1,27 @@ +import QtQuick 1.0 +Rectangle { + width: 400 + height: 400 + Rectangle { + id: rect + objectName: "MyRect" + width: 100; height: 100; color: "green" + Behavior on x { + objectName: "MyBehavior"; + enabled: false + NumberAnimation { duration: 200; } + } + } + MouseArea { + id: clicker + anchors.fill: parent + } + states: State { + name: "moved" + when: clicker.pressed + PropertyChanges { + target: rect + x: 200 + } + } +} diff --git a/tests/auto/declarative/qdeclarativebehaviors/data/dontStart.qml b/tests/auto/declarative/qdeclarativebehaviors/data/dontStart.qml new file mode 100644 index 00000000..e318dd25 --- /dev/null +++ b/tests/auto/declarative/qdeclarativebehaviors/data/dontStart.qml @@ -0,0 +1,18 @@ +import QtQuick 1.0 + +Rectangle { + id: wrapper + width: 600 + height: 400 + + Rectangle { + id: redRect + width: 100; height: 100 + color: Qt.rgba(1,0,0) + Behavior on x { + NumberAnimation {id: myAnim; objectName: "MyAnim"; running: true } + } + + } + +} diff --git a/tests/auto/declarative/qdeclarativebehaviors/data/empty.qml b/tests/auto/declarative/qdeclarativebehaviors/data/empty.qml new file mode 100644 index 00000000..6c78a845 --- /dev/null +++ b/tests/auto/declarative/qdeclarativebehaviors/data/empty.qml @@ -0,0 +1,23 @@ +import QtQuick 1.0 +Rectangle { + width: 400 + height: 400 + Rectangle { + id: rect + objectName: "MyRect" + width: 100; height: 100; color: "green" + Behavior on x {} + } + MouseArea { + id: clicker + anchors.fill: parent + } + states: State { + name: "moved" + when: clicker.pressed + PropertyChanges { + target: rect + x: 200 + } + } +} diff --git a/tests/auto/declarative/qdeclarativebehaviors/data/explicit.qml b/tests/auto/declarative/qdeclarativebehaviors/data/explicit.qml new file mode 100644 index 00000000..3baa1ac2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativebehaviors/data/explicit.qml @@ -0,0 +1,26 @@ +import QtQuick 1.0 +Rectangle { + width: 400 + height: 400 + Rectangle { + id: rect + objectName: "MyRect" + width: 100; height: 100; color: "green" + Behavior on x { + objectName: "MyBehavior"; + NumberAnimation { target: rect; property: "x"; duration: 500; } + } + } + MouseArea { + id: clicker + anchors.fill: parent + } + states: State { + name: "moved" + when: clicker.pressed + PropertyChanges { + target: rect + x: 200 + } + } +} diff --git a/tests/auto/declarative/qdeclarativebehaviors/data/groupProperty.qml b/tests/auto/declarative/qdeclarativebehaviors/data/groupProperty.qml new file mode 100644 index 00000000..ddb5bbd4 --- /dev/null +++ b/tests/auto/declarative/qdeclarativebehaviors/data/groupProperty.qml @@ -0,0 +1,23 @@ +import QtQuick 1.0 +Rectangle { + width: 400 + height: 400 + Rectangle { + id: rect + objectName: "MyRect" + width: 100; height: 100; color: "green" + Behavior on pos { PropertyAnimation { duration: 500; } } + } + MouseArea { + id: clicker + anchors.fill: parent + } + states: State { + name: "moved" + when: clicker.pressed + PropertyChanges { + target: rect + pos: Qt.point(200,0); + } + } +} diff --git a/tests/auto/declarative/qdeclarativebehaviors/data/groupProperty2.qml b/tests/auto/declarative/qdeclarativebehaviors/data/groupProperty2.qml new file mode 100644 index 00000000..c0b71cdb --- /dev/null +++ b/tests/auto/declarative/qdeclarativebehaviors/data/groupProperty2.qml @@ -0,0 +1,23 @@ +import QtQuick 1.0 +Rectangle { + width: 400 + height: 400 + Rectangle { + id: rect + objectName: "MyRect" + width: 100; height: 100; color: "green" + Behavior on pos.x { NumberAnimation { duration: 500; } } + } + MouseArea { + id: clicker + anchors.fill: parent + } + states: State { + name: "moved" + when: clicker.pressed + PropertyChanges { + target: rect + pos.x: 200; + } + } +} diff --git a/tests/auto/declarative/qdeclarativebehaviors/data/groupedPropertyCrash.qml b/tests/auto/declarative/qdeclarativebehaviors/data/groupedPropertyCrash.qml new file mode 100644 index 00000000..8aa590bc --- /dev/null +++ b/tests/auto/declarative/qdeclarativebehaviors/data/groupedPropertyCrash.qml @@ -0,0 +1,10 @@ +import QtQuick 1.0 + +Rectangle { + width: 200 + height: 200 + Text { + Behavior on anchors.verticalCenterOffset { NumberAnimation { duration: 300; } } + text: "Hello World" + } +} diff --git a/tests/auto/declarative/qdeclarativebehaviors/data/loop.qml b/tests/auto/declarative/qdeclarativebehaviors/data/loop.qml new file mode 100644 index 00000000..76379c00 --- /dev/null +++ b/tests/auto/declarative/qdeclarativebehaviors/data/loop.qml @@ -0,0 +1,19 @@ +import QtQuick 1.0 +Rectangle { + width: 400 + height: 400 + Rectangle { + id: rect + objectName: "MyRect" + width: 100; height: 100; color: "green" + Behavior on x { NumberAnimation { duration: 200; } } + onXChanged: x = 100; + } + states: State { + name: "moved" + PropertyChanges { + target: rect + x: 200 + } + } +} diff --git a/tests/auto/declarative/qdeclarativebehaviors/data/nonSelecting2.qml b/tests/auto/declarative/qdeclarativebehaviors/data/nonSelecting2.qml new file mode 100644 index 00000000..c5c78d1a --- /dev/null +++ b/tests/auto/declarative/qdeclarativebehaviors/data/nonSelecting2.qml @@ -0,0 +1,26 @@ +import QtQuick 1.0 +Rectangle { + width: 400 + height: 400 + Rectangle { + id: rect + objectName: "MyRect" + width: 100; height: 100; color: "green" + Behavior on x { + objectName: "MyBehavior"; + NumberAnimation { targets: rect; properties: "y"; duration: 200; } + } + } + MouseArea { + id: clicker + anchors.fill: parent + } + states: State { + name: "moved" + when: clicker.pressed + PropertyChanges { + target: rect + x: 200 + } + } +} diff --git a/tests/auto/declarative/qdeclarativebehaviors/data/parent.qml b/tests/auto/declarative/qdeclarativebehaviors/data/parent.qml new file mode 100644 index 00000000..d19da298 --- /dev/null +++ b/tests/auto/declarative/qdeclarativebehaviors/data/parent.qml @@ -0,0 +1,28 @@ +import QtQuick 1.0 +Rectangle { + width: 400 + height: 400 + Rectangle { + id: rect + objectName: "MyRect" + width: 100; height: 100; color: "green" + Behavior on parent { + SequentialAnimation { + PauseAnimation { duration: 500 } + PropertyAction {} + } + } + } + Item { + id: newParent + objectName: "NewParent" + x: 100 + } + states: State { + name: "reparented" + PropertyChanges { + target: rect + parent: newParent + } + } +} diff --git a/tests/auto/declarative/qdeclarativebehaviors/data/qtbug12295.qml b/tests/auto/declarative/qdeclarativebehaviors/data/qtbug12295.qml new file mode 100644 index 00000000..03b54216 --- /dev/null +++ b/tests/auto/declarative/qdeclarativebehaviors/data/qtbug12295.qml @@ -0,0 +1,17 @@ +import QtQuick 1.0 + +Rectangle { + width: 200 + height: 200 + color: "blue" + + Rectangle { + id: myRect + objectName: "myRect" + width: 100 + height: 100 + Behavior on x { + NumberAnimation { duration: 500 } + } + } +} diff --git a/tests/auto/declarative/qdeclarativebehaviors/data/reassignedAnimation.qml b/tests/auto/declarative/qdeclarativebehaviors/data/reassignedAnimation.qml new file mode 100644 index 00000000..56ac216c --- /dev/null +++ b/tests/auto/declarative/qdeclarativebehaviors/data/reassignedAnimation.qml @@ -0,0 +1,32 @@ +import QtQuick 1.0 +Rectangle { + width: 400 + height: 400 + Rectangle { + id: rect + objectName: "MyRect" + width: 100; height: 100; color: "green" + Behavior on x { + id: myBehavior + objectName: "MyBehavior" + NumberAnimation {id: na1; duration: 200 } + } + } + MouseArea { + id: clicker + anchors.fill: parent + } + states: State { + name: "moved" + when: clicker.pressed + PropertyChanges { + target: rect + x: 200 + } + } + + NumberAnimation {id: na2; duration: 1000 } + Component.onCompleted: { + myBehavior.animation = na2; + } +} diff --git a/tests/auto/declarative/qdeclarativebehaviors/data/runningTrue.qml b/tests/auto/declarative/qdeclarativebehaviors/data/runningTrue.qml new file mode 100644 index 00000000..25cdf10a --- /dev/null +++ b/tests/auto/declarative/qdeclarativebehaviors/data/runningTrue.qml @@ -0,0 +1,20 @@ +import QtQuick 1.0 + +Rectangle { + id: root + width:200; height:200 + + property real myValue: 0 + + Rectangle { + anchors.centerIn: parent + width: 100 + height: 100 + color: "green" + smooth: true + rotation: myValue + Behavior on rotation { + RotationAnimation { id: rotAnim; objectName: "rotAnim"; direction: RotationAnimation.Shortest } + } + } +} diff --git a/tests/auto/declarative/qdeclarativebehaviors/data/scripttrigger.qml b/tests/auto/declarative/qdeclarativebehaviors/data/scripttrigger.qml new file mode 100644 index 00000000..c05cdaa9 --- /dev/null +++ b/tests/auto/declarative/qdeclarativebehaviors/data/scripttrigger.qml @@ -0,0 +1,16 @@ +import QtQuick 1.0 +Rectangle { + width: 400 + height: 400 + + onColorChanged: { + rect.x = 200 + } + + Rectangle { + id: rect + objectName: "MyRect" + width: 100; height: 100; color: "green" + Behavior on x { NumberAnimation { duration: 800; } } + } +} diff --git a/tests/auto/declarative/qdeclarativebehaviors/data/simple.qml b/tests/auto/declarative/qdeclarativebehaviors/data/simple.qml new file mode 100644 index 00000000..6ba01186 --- /dev/null +++ b/tests/auto/declarative/qdeclarativebehaviors/data/simple.qml @@ -0,0 +1,26 @@ +import QtQuick 1.0 +Rectangle { + width: 400 + height: 400 + Rectangle { + id: rect + objectName: "MyRect" + width: 100; height: 100; color: "green" + Behavior on x { + objectName: "MyBehavior"; + NumberAnimation {id: na; duration: 500; } + } + } + MouseArea { + id: clicker + anchors.fill: parent + } + states: State { + name: "moved" + when: clicker.pressed + PropertyChanges { + target: rect + x: 200 + } + } +} diff --git a/tests/auto/declarative/qdeclarativebehaviors/data/startup.qml b/tests/auto/declarative/qdeclarativebehaviors/data/startup.qml new file mode 100644 index 00000000..fca416c0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativebehaviors/data/startup.qml @@ -0,0 +1,17 @@ +import QtQuick 1.0 + +Rectangle { + width: 400 + height: 400 + + Rectangle { + objectName: "innerRect" + height: 100; width: 100; color: "green" + property real targetX: 100 + + x: targetX + Behavior on x { + NumberAnimation {} + } + } +} diff --git a/tests/auto/declarative/qdeclarativebehaviors/data/startup2.qml b/tests/auto/declarative/qdeclarativebehaviors/data/startup2.qml new file mode 100644 index 00000000..eb627613 --- /dev/null +++ b/tests/auto/declarative/qdeclarativebehaviors/data/startup2.qml @@ -0,0 +1,16 @@ +import QtQuick 1.0 + +Rectangle { + width: 800; + height: 480; + + Text { id:theText; text: "hello world" } + + Rectangle { + objectName: "innerRect" + color: "red" + x: theText.width + Behavior on x { NumberAnimation {} } + width: 100; height: 100 + } +} diff --git a/tests/auto/declarative/qdeclarativebehaviors/qdeclarativebehaviors.pro b/tests/auto/declarative/qdeclarativebehaviors/qdeclarativebehaviors.pro new file mode 100644 index 00000000..74168273 --- /dev/null +++ b/tests/auto/declarative/qdeclarativebehaviors/qdeclarativebehaviors.pro @@ -0,0 +1,15 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +SOURCES += tst_qdeclarativebehaviors.cpp +macx:CONFIG -= app_bundle + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativebehaviors/tst_qdeclarativebehaviors.cpp b/tests/auto/declarative/qdeclarativebehaviors/tst_qdeclarativebehaviors.cpp new file mode 100644 index 00000000..1c58ddb0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativebehaviors/tst_qdeclarativebehaviors.cpp @@ -0,0 +1,435 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../../../shared/util.h" + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_qdeclarativebehaviors : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativebehaviors() {} + +private slots: + void simpleBehavior(); + void scriptTriggered(); + void cppTriggered(); + void loop(); + void colorBehavior(); + void parentBehavior(); + void replaceBinding(); + //void transitionOverrides(); + void group(); + void emptyBehavior(); + void explicitSelection(); + void nonSelectingBehavior(); + void reassignedAnimation(); + void disabled(); + void dontStart(); + void startup(); + void groupedPropertyCrash(); + void runningTrue(); + void sameValue(); + void delayedRegistration(); +}; + +void tst_qdeclarativebehaviors::simpleBehavior() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/simple.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QTRY_VERIFY(rect); + QTRY_VERIFY(qobject_cast(rect->findChild("MyBehavior"))->animation()); + + QDeclarativeItemPrivate::get(rect)->setState("moved"); + QTRY_VERIFY(qobject_cast(rect->findChild("MyRect"))->x() > 0); + QTRY_VERIFY(qobject_cast(rect->findChild("MyRect"))->x() < 200); + //i.e. the behavior has been triggered + + delete rect; +} + +void tst_qdeclarativebehaviors::scriptTriggered() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/scripttrigger.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QTRY_VERIFY(rect); + + rect->setColor(QColor("red")); + QTRY_VERIFY(qobject_cast(rect->findChild("MyRect"))->x() > 0); + QTRY_VERIFY(qobject_cast(rect->findChild("MyRect"))->x() < 200); + //i.e. the behavior has been triggered + + delete rect; +} + +void tst_qdeclarativebehaviors::cppTriggered() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/cpptrigger.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QTRY_VERIFY(rect); + + QDeclarativeRectangle *innerRect = qobject_cast(rect->findChild("MyRect")); + QTRY_VERIFY(innerRect); + + innerRect->setProperty("x", 200); + QTRY_VERIFY(innerRect->x() > 0); + QTRY_VERIFY(innerRect->x() < 200); //i.e. the behavior has been triggered + + delete rect; +} + +void tst_qdeclarativebehaviors::loop() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/loop.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QTRY_VERIFY(rect); + + //don't crash + QDeclarativeItemPrivate::get(rect)->setState("moved"); + + delete rect; +} + +void tst_qdeclarativebehaviors::colorBehavior() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/color.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QTRY_VERIFY(rect); + + QDeclarativeItemPrivate::get(rect)->setState("red"); + QTRY_VERIFY(qobject_cast(rect->findChild("MyRect"))->color() != QColor("red")); + QTRY_VERIFY(qobject_cast(rect->findChild("MyRect"))->color() != QColor("green")); + //i.e. the behavior has been triggered + + delete rect; +} + +void tst_qdeclarativebehaviors::parentBehavior() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/parent.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QTRY_VERIFY(rect); + + QDeclarativeItemPrivate::get(rect)->setState("reparented"); + QTRY_VERIFY(rect->findChild("MyRect")->parentItem() != rect->findChild("NewParent")); + QTRY_VERIFY(rect->findChild("MyRect")->parentItem() == rect->findChild("NewParent")); + + delete rect; +} + +void tst_qdeclarativebehaviors::replaceBinding() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/binding.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QTRY_VERIFY(rect); + + QDeclarativeItemPrivate::get(rect)->setState("moved"); + QDeclarativeRectangle *innerRect = qobject_cast(rect->findChild("MyRect")); + QTRY_VERIFY(innerRect); + QTRY_VERIFY(innerRect->x() > 0); + QTRY_VERIFY(innerRect->x() < 200); + //i.e. the behavior has been triggered + QTRY_COMPARE(innerRect->x(), (qreal)200); + rect->setProperty("basex", 10); + QTRY_COMPARE(innerRect->x(), (qreal)200); + rect->setProperty("movedx", 210); + QTRY_COMPARE(innerRect->x(), (qreal)210); + + QDeclarativeItemPrivate::get(rect)->setState(""); + QTRY_VERIFY(innerRect->x() > 10); + QTRY_VERIFY(innerRect->x() < 210); //i.e. the behavior has been triggered + QTRY_COMPARE(innerRect->x(), (qreal)10); + rect->setProperty("movedx", 200); + QTRY_COMPARE(innerRect->x(), (qreal)10); + rect->setProperty("basex", 20); + QTRY_COMPARE(innerRect->x(), (qreal)20); + + delete rect; +} + +void tst_qdeclarativebehaviors::group() +{ + { + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/groupProperty.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QTRY_VERIFY(rect); + + QDeclarativeItemPrivate::get(rect)->setState("moved"); + //QTest::qWait(200); + QTRY_VERIFY(qobject_cast(rect->findChild("MyRect"))->x() > 0); + QTRY_VERIFY(qobject_cast(rect->findChild("MyRect"))->x() < 200); + //i.e. the behavior has been triggered + + delete rect; + } + + { + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/groupProperty2.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QTRY_VERIFY(rect); + + QDeclarativeItemPrivate::get(rect)->setState("moved"); + QTRY_VERIFY(qobject_cast(rect->findChild("MyRect"))->x() > 0); + QTRY_VERIFY(qobject_cast(rect->findChild("MyRect"))->x() < 200); + //i.e. the behavior has been triggered + + delete rect; + } +} + +void tst_qdeclarativebehaviors::emptyBehavior() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/empty.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); + + QDeclarativeItemPrivate::get(rect)->setState("moved"); + qreal x = qobject_cast(rect->findChild("MyRect"))->x(); + QCOMPARE(x, qreal(200)); //should change immediately + + delete rect; +} + +void tst_qdeclarativebehaviors::explicitSelection() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/explicit.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); + + QDeclarativeItemPrivate::get(rect)->setState("moved"); + QTRY_VERIFY(qobject_cast(rect->findChild("MyRect"))->x() > 0); + QTRY_VERIFY(qobject_cast(rect->findChild("MyRect"))->x() < 200); + //i.e. the behavior has been triggered + + delete rect; +} + +void tst_qdeclarativebehaviors::nonSelectingBehavior() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/nonSelecting2.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); + + QDeclarativeItemPrivate::get(rect)->setState("moved"); + qreal x = qobject_cast(rect->findChild("MyRect"))->x(); + QCOMPARE(x, qreal(200)); //should change immediately + + delete rect; +} + +void tst_qdeclarativebehaviors::reassignedAnimation() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/reassignedAnimation.qml")); + QString warning = QUrl::fromLocalFile(SRCDIR "/data/reassignedAnimation.qml").toString() + ":9:9: QML Behavior: Cannot change the animation assigned to a Behavior."; + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning)); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); + QCOMPARE(qobject_cast( + rect->findChild("MyBehavior")->animation())->duration(), 200); + + delete rect; +} + +void tst_qdeclarativebehaviors::disabled() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/disabled.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); + QCOMPARE(rect->findChild("MyBehavior")->enabled(), false); + + QDeclarativeItemPrivate::get(rect)->setState("moved"); + qreal x = qobject_cast(rect->findChild("MyRect"))->x(); + QCOMPARE(x, qreal(200)); //should change immediately + + delete rect; +} + +void tst_qdeclarativebehaviors::dontStart() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/dontStart.qml")); + + QString warning = c.url().toString() + ":13:13: QML NumberAnimation: setRunning() cannot be used on non-root animation nodes."; + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning)); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); + + QDeclarativeAbstractAnimation *myAnim = rect->findChild("MyAnim"); + QVERIFY(myAnim && myAnim->qtAnimation()); + QVERIFY(myAnim->qtAnimation()->state() == QAbstractAnimation::Stopped); + + delete rect; +} + +void tst_qdeclarativebehaviors::startup() +{ + { + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/startup.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); + + QDeclarativeRectangle *innerRect = rect->findChild("innerRect"); + QVERIFY(innerRect); + + QCOMPARE(innerRect->x(), qreal(100)); //should be set immediately + + delete rect; + } + + { + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/startup2.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); + + QDeclarativeRectangle *innerRect = rect->findChild("innerRect"); + QVERIFY(innerRect); + + QDeclarativeText *text = rect->findChild(); + QVERIFY(text); + + QCOMPARE(innerRect->x(), text->width()); //should be set immediately + + delete rect; + } +} + +//QTBUG-10799 +void tst_qdeclarativebehaviors::groupedPropertyCrash() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/groupedPropertyCrash.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); //don't crash +} + +//QTBUG-5491 +void tst_qdeclarativebehaviors::runningTrue() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/runningTrue.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); + + QDeclarativeAbstractAnimation *animation = rect->findChild("rotAnim"); + QVERIFY(animation); + + QSignalSpy runningSpy(animation, SIGNAL(runningChanged(bool))); + rect->setProperty("myValue", 180); + QTRY_VERIFY(runningSpy.count() > 0); +} + +//QTBUG-12295 +void tst_qdeclarativebehaviors::sameValue() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/qtbug12295.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); + + QDeclarativeRectangle *target = rect->findChild("myRect"); + QVERIFY(target); + + target->setX(100); + QCOMPARE(target->x(), qreal(100)); + + target->setProperty("x", 0); + QTRY_VERIFY(target->x() != qreal(0) && target->x() != qreal(100)); + QTRY_VERIFY(target->x() == qreal(0)); //make sure Behavior has finished. + + target->setX(100); + QCOMPARE(target->x(), qreal(100)); + + //this is the main point of the test -- the behavior needs to be triggered again + //even though we set 0 twice in a row. + target->setProperty("x", 0); + QTRY_VERIFY(target->x() != qreal(0) && target->x() != qreal(100)); +} + +//QTBUG-18362 +void tst_qdeclarativebehaviors::delayedRegistration() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent c(&engine, SRCDIR "/data/delayedRegistration.qml"); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect != 0); + + QDeclarativeItem *innerRect = rect->property("myItem").value(); + QVERIFY(innerRect != 0); + + QCOMPARE(innerRect->property("x").toInt(), int(0)); + + QTRY_COMPARE(innerRect->property("x").toInt(), int(100)); +} + +QTEST_MAIN(tst_qdeclarativebehaviors) + +#include "tst_qdeclarativebehaviors.moc" diff --git a/tests/auto/declarative/qdeclarativebinding/data/deletedObject.qml b/tests/auto/declarative/qdeclarativebinding/data/deletedObject.qml new file mode 100644 index 00000000..ba4c9f6f --- /dev/null +++ b/tests/auto/declarative/qdeclarativebinding/data/deletedObject.qml @@ -0,0 +1,24 @@ +import QtQuick 1.0 + +Rectangle { + id: wrapper + width: 400 + height: 400 + + property bool activateBinding: false + + Binding { + id: binding + target: Qt.createQmlObject('import QtQuick 1.0; Item { property real value: 10 }', wrapper) + property: "value" + when: activateBinding + value: x + y + } + + Component.onCompleted: binding.target.destroy(); + +// MouseArea { +// anchors.fill: parent +// onClicked: activateBinding = true; +// } +} diff --git a/tests/auto/declarative/qdeclarativebinding/data/test-binding.qml b/tests/auto/declarative/qdeclarativebinding/data/test-binding.qml new file mode 100644 index 00000000..94497368 --- /dev/null +++ b/tests/auto/declarative/qdeclarativebinding/data/test-binding.qml @@ -0,0 +1,16 @@ +import QtQuick 1.0 + +Rectangle { + id: screen + width: 320; height: 240 + property string text + property bool changeColor: false + + Text { id: s1; text: "Hello" } + Rectangle { id: r1; width: 1; height: 1; color: "yellow" } + Rectangle { id: r2; width: 1; height: 1; color: "red" } + + Binding { target: screen; property: "text"; value: s1.text; objectName: "binding1" } + Binding { target: screen; property: "color"; value: r1.color } + Binding { target: screen; property: "color"; when: screen.changeColor == true; value: r2.color; objectName: "binding3" } +} diff --git a/tests/auto/declarative/qdeclarativebinding/data/test-binding2.qml b/tests/auto/declarative/qdeclarativebinding/data/test-binding2.qml new file mode 100644 index 00000000..3e99e2b5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativebinding/data/test-binding2.qml @@ -0,0 +1,16 @@ +import QtQuick 1.0 + +Rectangle { + id: screen + width: 320; height: 240 + property string text + property bool changeColor: false + + Text { id: s1; text: "Hello" } + Rectangle { id: r1; width: 1; height: 1; color: "yellow" } + Rectangle { id: r2; width: 1; height: 1; color: "red" } + + Binding { target: screen; property: "text"; value: s1.text } + Binding { target: screen; property: "color"; value: r1.color } + Binding { target: screen; property: "color"; value: r2.color; when: screen.changeColor == true } +} diff --git a/tests/auto/declarative/qdeclarativebinding/qdeclarativebinding.pro b/tests/auto/declarative/qdeclarativebinding/qdeclarativebinding.pro new file mode 100644 index 00000000..fe126356 --- /dev/null +++ b/tests/auto/declarative/qdeclarativebinding/qdeclarativebinding.pro @@ -0,0 +1,16 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative gui +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativebinding.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativebinding/tst_qdeclarativebinding.cpp b/tests/auto/declarative/qdeclarativebinding/tst_qdeclarativebinding.cpp new file mode 100644 index 00000000..9d652556 --- /dev/null +++ b/tests/auto/declarative/qdeclarativebinding/tst_qdeclarativebinding.cpp @@ -0,0 +1,135 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include "../../../shared/util.h" + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_qdeclarativebinding : public QObject + +{ + Q_OBJECT +public: + tst_qdeclarativebinding(); + +private slots: + void binding(); + void whenAfterValue(); + void deletedObject(); + +private: + QDeclarativeEngine engine; +}; + +tst_qdeclarativebinding::tst_qdeclarativebinding() +{ +} + +void tst_qdeclarativebinding::binding() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/test-binding.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect != 0); + + QDeclarativeBind *binding3 = qobject_cast(rect->findChild("binding3")); + QVERIFY(binding3 != 0); + + QCOMPARE(rect->color(), QColor("yellow")); + QCOMPARE(rect->property("text").toString(), QString("Hello")); + QCOMPARE(binding3->when(), false); + + rect->setProperty("changeColor", true); + QCOMPARE(rect->color(), QColor("red")); + + QCOMPARE(binding3->when(), true); + + QDeclarativeBind *binding = qobject_cast(rect->findChild("binding1")); + QVERIFY(binding != 0); + QCOMPARE(binding->object(), qobject_cast(rect)); + QCOMPARE(binding->property(), QLatin1String("text")); + QCOMPARE(binding->value().toString(), QLatin1String("Hello")); + + delete rect; +} + +void tst_qdeclarativebinding::whenAfterValue() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/test-binding2.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + + QVERIFY(rect != 0); + QCOMPARE(rect->color(), QColor("yellow")); + QCOMPARE(rect->property("text").toString(), QString("Hello")); + + rect->setProperty("changeColor", true); + QCOMPARE(rect->color(), QColor("red")); + + delete rect; +} + +//QTBUG-20692 +void tst_qdeclarativebinding::deletedObject() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/deletedObject.qml")); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect != 0); + + QApplication::sendPostedEvents(0, QEvent::DeferredDelete); + + //don't crash + rect->setProperty("activateBinding", true); + + delete rect; +} + +QTEST_MAIN(tst_qdeclarativebinding) + +#include "tst_qdeclarativebinding.moc" diff --git a/tests/auto/declarative/qdeclarativeborderimage/data/colors-round-remote.sci b/tests/auto/declarative/qdeclarativeborderimage/data/colors-round-remote.sci new file mode 100644 index 00000000..c673bed5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeborderimage/data/colors-round-remote.sci @@ -0,0 +1,7 @@ +border.left:10 +border.top:20 +border.right:30 +border.bottom:40 +horizontalTileRule:Round +verticalTileRule:Repeat +source:http://127.0.0.1:14446/colors.png diff --git a/tests/auto/declarative/qdeclarativeborderimage/data/colors-round.sci b/tests/auto/declarative/qdeclarativeborderimage/data/colors-round.sci new file mode 100644 index 00000000..5d2f49f0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeborderimage/data/colors-round.sci @@ -0,0 +1,7 @@ +border.left:10 +border.top:20 +border.right:30 +border.bottom:40 +horizontalTileRule:Round +verticalTileRule:Repeat +source:colors.png diff --git a/tests/auto/declarative/qdeclarativeborderimage/data/colors.png b/tests/auto/declarative/qdeclarativeborderimage/data/colors.png new file mode 100644 index 00000000..dfb62f3d Binary files /dev/null and b/tests/auto/declarative/qdeclarativeborderimage/data/colors.png differ diff --git a/tests/auto/declarative/qdeclarativeborderimage/data/heart200.png b/tests/auto/declarative/qdeclarativeborderimage/data/heart200.png new file mode 100644 index 00000000..5a31ae8f Binary files /dev/null and b/tests/auto/declarative/qdeclarativeborderimage/data/heart200.png differ diff --git a/tests/auto/declarative/qdeclarativeborderimage/data/invalid.sci b/tests/auto/declarative/qdeclarativeborderimage/data/invalid.sci new file mode 100644 index 00000000..98c72c9b --- /dev/null +++ b/tests/auto/declarative/qdeclarativeborderimage/data/invalid.sci @@ -0,0 +1,7 @@ +border.left:10 +border.top:20 +border.down:30 +border.up:40 +horizontalTileRule:Roun +verticalTileRule:Repea +source:colors.png diff --git a/tests/auto/declarative/qdeclarativeborderimage/qdeclarativeborderimage.pro b/tests/auto/declarative/qdeclarativeborderimage/qdeclarativeborderimage.pro new file mode 100644 index 00000000..c5b1bfa1 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeborderimage/qdeclarativeborderimage.pro @@ -0,0 +1,18 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative gui network +macx:CONFIG -= app_bundle + +HEADERS += ../shared/testhttpserver.h +SOURCES += tst_qdeclarativeborderimage.cpp ../shared/testhttpserver.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + +CONFIG+=insignificant_test # QTQAINFRA-428 diff --git a/tests/auto/declarative/qdeclarativeborderimage/tst_qdeclarativeborderimage.cpp b/tests/auto/declarative/qdeclarativeborderimage/tst_qdeclarativeborderimage.cpp new file mode 100644 index 00000000..e8ebc34e --- /dev/null +++ b/tests/auto/declarative/qdeclarativeborderimage/tst_qdeclarativeborderimage.cpp @@ -0,0 +1,426 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "../shared/testhttpserver.h" +#include "../../../shared/util.h" + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +#define SERVER_PORT 14446 +#define SERVER_ADDR "http://127.0.0.1:14446" + +class tst_qdeclarativeborderimage : public QObject + +{ + Q_OBJECT +public: + tst_qdeclarativeborderimage(); + +private slots: + void noSource(); + void imageSource(); + void imageSource_data(); + void clearSource(); + void resized(); + void smooth(); + void mirror(); + void tileModes(); + void sciSource(); + void sciSource_data(); + void invalidSciFile(); + void pendingRemoteRequest(); + void pendingRemoteRequest_data(); + void testQtQuick11Attributes(); + void testQtQuick11Attributes_data(); + +private: + QDeclarativeEngine engine; +}; + +tst_qdeclarativeborderimage::tst_qdeclarativeborderimage() +{ +} + +void tst_qdeclarativeborderimage::noSource() +{ + QString componentStr = "import QtQuick 1.0\nBorderImage { source: \"\" }"; + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeBorderImage *obj = qobject_cast(component.create()); + QVERIFY(obj != 0); + QCOMPARE(obj->source(), QUrl()); + QCOMPARE(obj->width(), 0.); + QCOMPARE(obj->height(), 0.); + QCOMPARE(obj->horizontalTileMode(), QDeclarativeBorderImage::Stretch); + QCOMPARE(obj->verticalTileMode(), QDeclarativeBorderImage::Stretch); + + delete obj; +} + +void tst_qdeclarativeborderimage::imageSource_data() +{ + QTest::addColumn("source"); + QTest::addColumn("remote"); + QTest::addColumn("error"); + + QTest::newRow("local") << QUrl::fromLocalFile(SRCDIR "/data/colors.png").toString() << false << ""; + QTest::newRow("local not found") << QUrl::fromLocalFile(SRCDIR "/data/no-such-file.png").toString() << false + << "file::2:1: QML BorderImage: Cannot open: " + QUrl::fromLocalFile(SRCDIR "/data/no-such-file.png").toString(); + QTest::newRow("remote") << SERVER_ADDR "/colors.png" << true << ""; + QTest::newRow("remote not found") << SERVER_ADDR "/no-such-file.png" << true + << "file::2:1: QML BorderImage: Error downloading " SERVER_ADDR "/no-such-file.png - server replied: Not found"; +} + +void tst_qdeclarativeborderimage::imageSource() +{ + QFETCH(QString, source); + QFETCH(bool, remote); + QFETCH(QString, error); + + TestHTTPServer *server = 0; + if (remote) { + server = new TestHTTPServer(SERVER_PORT); + QVERIFY(server->isValid()); + server->serveDirectory(SRCDIR "/data"); + } + + if (!error.isEmpty()) + QTest::ignoreMessage(QtWarningMsg, error.toUtf8()); + + QString componentStr = "import QtQuick 1.0\nBorderImage { source: \"" + source + "\" }"; + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeBorderImage *obj = qobject_cast(component.create()); + QVERIFY(obj != 0); + + if (remote) + QTRY_VERIFY(obj->status() == QDeclarativeBorderImage::Loading); + + QCOMPARE(obj->source(), remote ? source : QUrl(source)); + + if (error.isEmpty()) { + QTRY_VERIFY(obj->status() == QDeclarativeBorderImage::Ready); + QCOMPARE(obj->width(), 120.); + QCOMPARE(obj->height(), 120.); + QCOMPARE(obj->sourceSize().width(), 120); + QCOMPARE(obj->sourceSize().height(), 120); + QCOMPARE(obj->horizontalTileMode(), QDeclarativeBorderImage::Stretch); + QCOMPARE(obj->verticalTileMode(), QDeclarativeBorderImage::Stretch); + } else { + QTRY_VERIFY(obj->status() == QDeclarativeBorderImage::Error); + } + + delete obj; + delete server; +} + +void tst_qdeclarativeborderimage::clearSource() +{ + QString componentStr = "import QtQuick 1.0\nBorderImage { source: srcImage }"; + QDeclarativeContext *ctxt = engine.rootContext(); + ctxt->setContextProperty("srcImage", QUrl::fromLocalFile(SRCDIR "/data/colors.png")); + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeBorderImage *obj = qobject_cast(component.create()); + QVERIFY(obj != 0); + QVERIFY(obj->status() == QDeclarativeBorderImage::Ready); + QCOMPARE(obj->width(), 120.); + QCOMPARE(obj->height(), 120.); + + ctxt->setContextProperty("srcImage", ""); + QVERIFY(obj->source().isEmpty()); + QVERIFY(obj->status() == QDeclarativeBorderImage::Null); + QCOMPARE(obj->width(), 0.); + QCOMPARE(obj->height(), 0.); +} + +void tst_qdeclarativeborderimage::resized() +{ + QString componentStr = "import QtQuick 1.0\nBorderImage { source: \"" + QUrl::fromLocalFile(SRCDIR "/data/colors.png").toString() + "\"; width: 300; height: 300 }"; + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeBorderImage *obj = qobject_cast(component.create()); + QVERIFY(obj != 0); + QCOMPARE(obj->width(), 300.); + QCOMPARE(obj->height(), 300.); + QCOMPARE(obj->sourceSize().width(), 120); + QCOMPARE(obj->sourceSize().height(), 120); + QCOMPARE(obj->horizontalTileMode(), QDeclarativeBorderImage::Stretch); + QCOMPARE(obj->verticalTileMode(), QDeclarativeBorderImage::Stretch); + + delete obj; +} + +void tst_qdeclarativeborderimage::smooth() +{ + QString componentStr = "import QtQuick 1.0\nBorderImage { source: \"" SRCDIR "/data/colors.png\"; smooth: true; width: 300; height: 300 }"; + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeBorderImage *obj = qobject_cast(component.create()); + QVERIFY(obj != 0); + QCOMPARE(obj->width(), 300.); + QCOMPARE(obj->height(), 300.); + QCOMPARE(obj->smooth(), true); + QCOMPARE(obj->horizontalTileMode(), QDeclarativeBorderImage::Stretch); + QCOMPARE(obj->verticalTileMode(), QDeclarativeBorderImage::Stretch); + + delete obj; +} + +void tst_qdeclarativeborderimage::mirror() +{ + QString componentStr = "import QtQuick 1.0\nBorderImage { source: \"" SRCDIR "/data/heart200.png\"; smooth: true; width: 300; height: 300; border { top: 50; right: 50; bottom: 50; left: 50 } }"; + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeBorderImage *obj = qobject_cast(component.create()); + QVERIFY(obj != 0); + + int width = obj->property("width").toInt(); + int height = obj->property("height").toInt(); + + QGraphicsScene scene; + scene.addItem(qobject_cast(obj)); + QPixmap screenshot(width, height); + screenshot.fill(); + QPainter p_screenshot(&screenshot); + scene.render(&p_screenshot, QRect(0, 0, width, height), QRect(0, 0, width, height)); + + QTransform transform; + transform.translate(width, 0).scale(-1, 1.0); + QPixmap expected = screenshot.transformed(transform); + + obj->setProperty("mirror", true); + p_screenshot.fillRect(QRect(0, 0, width, height), Qt::white); + scene.render(&p_screenshot, QRect(0, 0, width, height), QRect(0, 0, width, height)); + + QCOMPARE(screenshot, expected); + + delete obj; +} + +void tst_qdeclarativeborderimage::tileModes() +{ + { + QString componentStr = "import QtQuick 1.0\nBorderImage { source: \"" SRCDIR "/data/colors.png\"; width: 100; height: 300; horizontalTileMode: BorderImage.Repeat; verticalTileMode: BorderImage.Repeat }"; + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeBorderImage *obj = qobject_cast(component.create()); + QVERIFY(obj != 0); + QCOMPARE(obj->width(), 100.); + QCOMPARE(obj->height(), 300.); + QCOMPARE(obj->horizontalTileMode(), QDeclarativeBorderImage::Repeat); + QCOMPARE(obj->verticalTileMode(), QDeclarativeBorderImage::Repeat); + + delete obj; + } + { + QString componentStr = "import QtQuick 1.0\nBorderImage { source: \"" SRCDIR "/data/colors.png\"; width: 300; height: 150; horizontalTileMode: BorderImage.Round; verticalTileMode: BorderImage.Round }"; + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeBorderImage *obj = qobject_cast(component.create()); + QVERIFY(obj != 0); + QCOMPARE(obj->width(), 300.); + QCOMPARE(obj->height(), 150.); + QCOMPARE(obj->horizontalTileMode(), QDeclarativeBorderImage::Round); + QCOMPARE(obj->verticalTileMode(), QDeclarativeBorderImage::Round); + + delete obj; + } +} + +void tst_qdeclarativeborderimage::sciSource() +{ + QFETCH(QString, source); + QFETCH(bool, valid); + + bool remote = source.startsWith("http"); + TestHTTPServer *server = 0; + if (remote) { + server = new TestHTTPServer(SERVER_PORT); + QVERIFY(server->isValid()); + server->serveDirectory(SRCDIR "/data"); + } + + QString componentStr = "import QtQuick 1.0\nBorderImage { source: \"" + source + "\"; width: 300; height: 300 }"; + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeBorderImage *obj = qobject_cast(component.create()); + QVERIFY(obj != 0); + + if (remote) + QTRY_VERIFY(obj->status() == QDeclarativeBorderImage::Loading); + + QCOMPARE(obj->source(), remote ? source : QUrl(source)); + QCOMPARE(obj->width(), 300.); + QCOMPARE(obj->height(), 300.); + + if (valid) { + QTRY_VERIFY(obj->status() == QDeclarativeBorderImage::Ready); + QCOMPARE(obj->border()->left(), 10); + QCOMPARE(obj->border()->top(), 20); + QCOMPARE(obj->border()->right(), 30); + QCOMPARE(obj->border()->bottom(), 40); + QCOMPARE(obj->horizontalTileMode(), QDeclarativeBorderImage::Round); + QCOMPARE(obj->verticalTileMode(), QDeclarativeBorderImage::Repeat); + } else { + QTRY_VERIFY(obj->status() == QDeclarativeBorderImage::Error); + } + + delete obj; + delete server; +} + +void tst_qdeclarativeborderimage::sciSource_data() +{ + QTest::addColumn("source"); + QTest::addColumn("valid"); + + QTest::newRow("local") << QUrl::fromLocalFile(SRCDIR "/data/colors-round.sci").toString() << true; + QTest::newRow("local not found") << QUrl::fromLocalFile(SRCDIR "/data/no-such-file.sci").toString() << false; + QTest::newRow("remote") << SERVER_ADDR "/colors-round.sci" << true; + QTest::newRow("remote image") << SERVER_ADDR "/colors-round-remote.sci" << true; + QTest::newRow("remote not found") << SERVER_ADDR "/no-such-file.sci" << false; +} + +void tst_qdeclarativeborderimage::invalidSciFile() +{ + QTest::ignoreMessage(QtWarningMsg, "QDeclarativeGridScaledImage: Invalid tile rule specified. Using Stretch."); // for "Roun" + QTest::ignoreMessage(QtWarningMsg, "QDeclarativeGridScaledImage: Invalid tile rule specified. Using Stretch."); // for "Repea" + + QString componentStr = "import QtQuick 1.0\nBorderImage { source: \"" + QUrl::fromLocalFile(SRCDIR "/data/invalid.sci").toString() +"\"; width: 300; height: 300 }"; + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeBorderImage *obj = qobject_cast(component.create()); + QVERIFY(obj != 0); + QCOMPARE(obj->width(), 300.); + QCOMPARE(obj->height(), 300.); + QCOMPARE(obj->status(), QDeclarativeImageBase::Error); + QCOMPARE(obj->horizontalTileMode(), QDeclarativeBorderImage::Stretch); + QCOMPARE(obj->verticalTileMode(), QDeclarativeBorderImage::Stretch); + + delete obj; +} + +void tst_qdeclarativeborderimage::pendingRemoteRequest() +{ + QFETCH(QString, source); + + QString componentStr = "import QtQuick 1.0\nBorderImage { source: \"" + source + "\" }"; + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeBorderImage *obj = qobject_cast(component.create()); + QVERIFY(obj != 0); + QCOMPARE(obj->status(), QDeclarativeBorderImage::Loading); + + // verify no crash + // This will cause a delayed "QThread: Destroyed while thread is still running" warning + delete obj; + QTest::qWait(50); +} + +void tst_qdeclarativeborderimage::pendingRemoteRequest_data() +{ + QTest::addColumn("source"); + + QTest::newRow("png file") << "http://localhost/none.png"; + QTest::newRow("sci file") << "http://localhost/none.sci"; +} + +void tst_qdeclarativeborderimage::testQtQuick11Attributes() +{ + QFETCH(QString, code); + QFETCH(QString, warning); + QFETCH(QString, error); + + QDeclarativeEngine engine; + QObject *obj; + + QDeclarativeComponent valid(&engine); + valid.setData("import QtQuick 1.1; BorderImage { " + code.toUtf8() + " }", QUrl("")); + obj = valid.create(); + QVERIFY(obj); + QVERIFY(valid.errorString().isEmpty()); + delete obj; + + QDeclarativeComponent invalid(&engine); + invalid.setData("import QtQuick 1.0; BorderImage { " + code.toUtf8() + " }", QUrl("")); + QTest::ignoreMessage(QtWarningMsg, warning.toUtf8()); + obj = invalid.create(); + QCOMPARE(invalid.errorString(), error); + delete obj; +} + +void tst_qdeclarativeborderimage::testQtQuick11Attributes_data() +{ + QTest::addColumn("code"); + QTest::addColumn("warning"); + QTest::addColumn("error"); + + QTest::newRow("mirror") << "mirror: true" + << "QDeclarativeComponent: Component is not ready" + << ":1 \"BorderImage.mirror\" is not available in QtQuick 1.0.\n"; + + QTest::newRow("cache") << "cache: true" + << "QDeclarativeComponent: Component is not ready" + << ":1 \"BorderImage.cache\" is not available in QtQuick 1.0.\n"; +} + +QTEST_MAIN(tst_qdeclarativeborderimage) + +#include "tst_qdeclarativeborderimage.moc" diff --git a/tests/auto/declarative/qdeclarativecomponent/data/createObject.qml b/tests/auto/declarative/qdeclarativecomponent/data/createObject.qml new file mode 100644 index 00000000..4a067911 --- /dev/null +++ b/tests/auto/declarative/qdeclarativecomponent/data/createObject.qml @@ -0,0 +1,16 @@ +import QtQuick 1.0 + +Item{ + id: root + property QtObject qobject : null + property QtObject declarativeitem : null + property QtObject graphicswidget: null + Component{id: a; QtObject{} } + Component{id: b; Item{} } + Component{id: c; QGraphicsWidget{} } + Component.onCompleted: { + root.qobject = a.createObject(root); + root.declarativeitem = b.createObject(root); + root.graphicswidget = c.createObject(root); + } +} diff --git a/tests/auto/declarative/qdeclarativecomponent/data/createObjectWithScript.qml b/tests/auto/declarative/qdeclarativecomponent/data/createObjectWithScript.qml new file mode 100644 index 00000000..0da3bda5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativecomponent/data/createObjectWithScript.qml @@ -0,0 +1,43 @@ +import QtQuick 1.0 + +Item{ + id: root + property QtObject declarativerectangle : null + property QtObject declarativeitem : null + + property QtObject bindingTestObject : null + property QtObject bindingThisTestObject : null + + Component{ + id: a + Rectangle { + property Rectangle innerRect: Rectangle { border.width: 20 } + } + } + Component{ + id: b + Item{ + property bool testBool: false + property int testInt: null + property QtObject testObject: null + } + } + + // test passing in bindings + width: 100 + Component { + id: c + Item { + property int testValue + width: 300 + } + } + + Component.onCompleted: { + root.declarativerectangle = a.createObject(root, {"x":17,"y":17, "color":"white", "border.width":3, "innerRect.border.width": 20}); + root.declarativeitem = b.createObject(root, {"x":17,"y":17,"testBool":true,"testInt":17,"testObject":root}); + + root.bindingTestObject = c.createObject(root, {'testValue': (function(){return width * 3}) }) // use root.width + root.bindingThisTestObject = c.createObject(root, {'testValue': (function(){return this.width * 3}) }) // use width of Item within 'c' + } +} diff --git a/tests/auto/declarative/qdeclarativecomponent/qdeclarativecomponent.pro b/tests/auto/declarative/qdeclarativecomponent/qdeclarativecomponent.pro new file mode 100644 index 00000000..4124f946 --- /dev/null +++ b/tests/auto/declarative/qdeclarativecomponent/qdeclarativecomponent.pro @@ -0,0 +1,13 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +QT += script network +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativecomponent.cpp + +!symbian: { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativecomponent/tst_qdeclarativecomponent.cpp b/tests/auto/declarative/qdeclarativecomponent/tst_qdeclarativecomponent.cpp new file mode 100644 index 00000000..749640a7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativecomponent/tst_qdeclarativecomponent.cpp @@ -0,0 +1,173 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include + +#include +#include +#include +#include +#include +#include + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_qdeclarativecomponent : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativecomponent() { } + +private slots: + void null(); + void loadEmptyUrl(); + void qmlCreateObject(); + void qmlCreateObjectWithProperties(); + +private: + QDeclarativeEngine engine; +}; + +void tst_qdeclarativecomponent::null() +{ + { + QDeclarativeComponent c; + QVERIFY(c.isNull()); + } + + { + QDeclarativeComponent c(&engine); + QVERIFY(c.isNull()); + } +} + + +void tst_qdeclarativecomponent::loadEmptyUrl() +{ + QDeclarativeComponent c(&engine); + c.loadUrl(QUrl()); + + QVERIFY(c.isError()); + QCOMPARE(c.errors().count(), 1); + QDeclarativeError error = c.errors().first(); + QCOMPARE(error.url(), QUrl()); + QCOMPARE(error.line(), -1); + QCOMPARE(error.column(), -1); + QCOMPARE(error.description(), QLatin1String("Invalid empty URL")); +} + +void tst_qdeclarativecomponent::qmlCreateObject() +{ + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/createObject.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QObject *testObject1 = object->property("qobject").value(); + QVERIFY(testObject1); + QVERIFY(testObject1->parent() == object); + + QObject *testObject2 = object->property("declarativeitem").value(); + QVERIFY(testObject2); + QVERIFY(testObject2->parent() == object); + QCOMPARE(testObject2->metaObject()->className(), "QDeclarativeItem"); + + //Note that QGraphicsObjects are not exposed to QML for instantiation, and so can't be used in a component directly + //Also this is actually the extended type QDeclarativeGraphicsWidget, but it still doesn't inherit QDeclarativeItem + QGraphicsObject *testObject3 = qobject_cast(object->property("graphicswidget").value()); + QVERIFY(testObject3); + QVERIFY(testObject3->parent() == object); + QVERIFY(testObject3->parentItem() == qobject_cast(object)); + QCOMPARE(testObject3->metaObject()->className(), "QDeclarativeGraphicsWidget"); +} + +void tst_qdeclarativecomponent::qmlCreateObjectWithProperties() +{ + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/createObjectWithScript.qml")); + QVERIFY2(component.errorString().isEmpty(), component.errorString().toUtf8()); + QObject *object = component.create(); + QVERIFY(object != 0); + + QObject *testObject1 = object->property("declarativerectangle").value(); + QVERIFY(testObject1); + QVERIFY(testObject1->parent() == object); + QCOMPARE(testObject1->property("x").value(), 17); + QCOMPARE(testObject1->property("y").value(), 17); + QCOMPARE(testObject1->property("color").value(), QColor(255,255,255)); + QCOMPARE(QDeclarativeProperty::read(testObject1,"border.width").toInt(), 3); + QCOMPARE(QDeclarativeProperty::read(testObject1,"innerRect.border.width").toInt(), 20); + delete testObject1; + + QObject *testObject2 = object->property("declarativeitem").value(); + QVERIFY(testObject2); + QVERIFY(testObject2->parent() == object); + //QCOMPARE(testObject2->metaObject()->className(), "QDeclarativeItem_QML_2"); + QCOMPARE(testObject2->property("x").value(), 17); + QCOMPARE(testObject2->property("y").value(), 17); + QCOMPARE(testObject2->property("testBool").value(), true); + QCOMPARE(testObject2->property("testInt").value(), 17); + QCOMPARE(testObject2->property("testObject").value(), object); + delete testObject2; + + QObject *testBindingObj = object->property("bindingTestObject").value(); + QVERIFY(testBindingObj); + QCOMPARE(testBindingObj->parent(), object); + QCOMPARE(testBindingObj->property("testValue").value(), 300); + object->setProperty("width", 150); + QCOMPARE(testBindingObj->property("testValue").value(), 150 * 3); + delete testBindingObj; + + QObject *testBindingThisObj = object->property("bindingThisTestObject").value(); + QVERIFY(testBindingThisObj); + QCOMPARE(testBindingThisObj->parent(), object); + QCOMPARE(testBindingThisObj->property("testValue").value(), 900); + testBindingThisObj->setProperty("width", 200); + QCOMPARE(testBindingThisObj->property("testValue").value(), 200 * 3); + delete testBindingThisObj; +} + +QTEST_MAIN(tst_qdeclarativecomponent) + +#include "tst_qdeclarativecomponent.moc" diff --git a/tests/auto/declarative/qdeclarativeconnection/data/connection-targetchange.qml b/tests/auto/declarative/qdeclarativeconnection/data/connection-targetchange.qml new file mode 100644 index 00000000..dd92cb9c --- /dev/null +++ b/tests/auto/declarative/qdeclarativeconnection/data/connection-targetchange.qml @@ -0,0 +1,25 @@ +import QtQuick 1.0 + +Item { + Component { + id: item1 + Item { + objectName: "item1" + } + } + Component { + id: item2 + Item { + objectName: "item2" + } + } + Loader { + id: loader + sourceComponent: item1 + } + Connections { + objectName: "connections" + target: loader.item + onWidthChanged: loader.sourceComponent = item2 + } +} diff --git a/tests/auto/declarative/qdeclarativeconnection/data/connection-unknownsignals-ignored.qml b/tests/auto/declarative/qdeclarativeconnection/data/connection-unknownsignals-ignored.qml new file mode 100644 index 00000000..459c3461 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeconnection/data/connection-unknownsignals-ignored.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 + +Item { + id: screen + + Connections { target: screen; onNotFooBar1: {} ignoreUnknownSignals: true } + Connections { objectName: "connections"; onNotFooBar2: {} ignoreUnknownSignals: true } +} diff --git a/tests/auto/declarative/qdeclarativeconnection/data/connection-unknownsignals-notarget.qml b/tests/auto/declarative/qdeclarativeconnection/data/connection-unknownsignals-notarget.qml new file mode 100644 index 00000000..8eddf43f --- /dev/null +++ b/tests/auto/declarative/qdeclarativeconnection/data/connection-unknownsignals-notarget.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +Item { + id: screen + + Connections { objectName: "connections"; target: null; onNotFooBar: {} } +} diff --git a/tests/auto/declarative/qdeclarativeconnection/data/connection-unknownsignals-parent.qml b/tests/auto/declarative/qdeclarativeconnection/data/connection-unknownsignals-parent.qml new file mode 100644 index 00000000..953347a3 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeconnection/data/connection-unknownsignals-parent.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +Item { + id: screen + + Connections { objectName: "connections"; onFooBar: {} } +} diff --git a/tests/auto/declarative/qdeclarativeconnection/data/connection-unknownsignals.qml b/tests/auto/declarative/qdeclarativeconnection/data/connection-unknownsignals.qml new file mode 100644 index 00000000..3702bdbe --- /dev/null +++ b/tests/auto/declarative/qdeclarativeconnection/data/connection-unknownsignals.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +Item { + id: screen + + Connections { objectName: "connections"; target: screen; onFooBar: {} } +} diff --git a/tests/auto/declarative/qdeclarativeconnection/data/error-object.qml b/tests/auto/declarative/qdeclarativeconnection/data/error-object.qml new file mode 100644 index 00000000..376a2182 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeconnection/data/error-object.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +Item { + Connections { + onClicked: Item {} + } +} diff --git a/tests/auto/declarative/qdeclarativeconnection/data/error-property.qml b/tests/auto/declarative/qdeclarativeconnection/data/error-property.qml new file mode 100644 index 00000000..677af152 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeconnection/data/error-property.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +Item { + Connections { fakeProperty: {} } +} diff --git a/tests/auto/declarative/qdeclarativeconnection/data/error-property2.qml b/tests/auto/declarative/qdeclarativeconnection/data/error-property2.qml new file mode 100644 index 00000000..127e58e6 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeconnection/data/error-property2.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +Item { + Connections { onfakeProperty: {} } +} diff --git a/tests/auto/declarative/qdeclarativeconnection/data/error-syntax.qml b/tests/auto/declarative/qdeclarativeconnection/data/error-syntax.qml new file mode 100644 index 00000000..6a82528e --- /dev/null +++ b/tests/auto/declarative/qdeclarativeconnection/data/error-syntax.qml @@ -0,0 +1,9 @@ +import QtQuick 1.0 + +Item { + Connections { + onClicked { + onPressed: {} + } + } +} diff --git a/tests/auto/declarative/qdeclarativeconnection/data/test-connection.qml b/tests/auto/declarative/qdeclarativeconnection/data/test-connection.qml new file mode 100644 index 00000000..c5990830 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeconnection/data/test-connection.qml @@ -0,0 +1,10 @@ +import QtQuick 1.0 + +Item { + id: screen; width: 50 + + property bool tested: false + signal testMe + + Connections { target: screen; onWidthChanged: screen.tested = true } +} diff --git a/tests/auto/declarative/qdeclarativeconnection/data/test-connection2.qml b/tests/auto/declarative/qdeclarativeconnection/data/test-connection2.qml new file mode 100644 index 00000000..f0dbaba5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeconnection/data/test-connection2.qml @@ -0,0 +1,3 @@ +import QtQuick 1.0 + +Connections { id: connection; target: connection; onTargetChanged: 1 == 1 } diff --git a/tests/auto/declarative/qdeclarativeconnection/data/test-connection3.qml b/tests/auto/declarative/qdeclarativeconnection/data/test-connection3.qml new file mode 100644 index 00000000..94c9c7ca --- /dev/null +++ b/tests/auto/declarative/qdeclarativeconnection/data/test-connection3.qml @@ -0,0 +1,3 @@ +import QtQuick 1.0 + +Connections {} diff --git a/tests/auto/declarative/qdeclarativeconnection/data/trimming.qml b/tests/auto/declarative/qdeclarativeconnection/data/trimming.qml new file mode 100644 index 00000000..00507d91 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeconnection/data/trimming.qml @@ -0,0 +1,10 @@ +import QtQuick 1.0 + +Item { + id: screen; width: 50 + + property string tested + signal testMe(int param1, string param2) + + Connections { target: screen; onTestMe: screen.tested = param2 + param1 } +} diff --git a/tests/auto/declarative/qdeclarativeconnection/qdeclarativeconnection.pro b/tests/auto/declarative/qdeclarativeconnection/qdeclarativeconnection.pro new file mode 100644 index 00000000..6f9550d3 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeconnection/qdeclarativeconnection.pro @@ -0,0 +1,16 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative gui +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativeconnection.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativeconnection/tst_qdeclarativeconnection.cpp b/tests/auto/declarative/qdeclarativeconnection/tst_qdeclarativeconnection.cpp new file mode 100644 index 00000000..e42e906d --- /dev/null +++ b/tests/auto/declarative/qdeclarativeconnection/tst_qdeclarativeconnection.cpp @@ -0,0 +1,234 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include "../../../shared/util.h" +#include + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_qdeclarativeconnection : public QObject + +{ + Q_OBJECT +public: + tst_qdeclarativeconnection(); + +private slots: + void defaultValues(); + void properties(); + void connection(); + void trimming(); + void targetChanged(); + void unknownSignals_data(); + void unknownSignals(); + void errors_data(); + void errors(); + +private: + QDeclarativeEngine engine; +}; + +tst_qdeclarativeconnection::tst_qdeclarativeconnection() +{ +} + +void tst_qdeclarativeconnection::defaultValues() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/test-connection3.qml")); + QDeclarativeConnections *item = qobject_cast(c.create()); + + QVERIFY(item != 0); + QVERIFY(item->target() == 0); + + delete item; +} + +void tst_qdeclarativeconnection::properties() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/test-connection2.qml")); + QDeclarativeConnections *item = qobject_cast(c.create()); + + QVERIFY(item != 0); + + QVERIFY(item != 0); + QVERIFY(item->target() == item); + + delete item; +} + +void tst_qdeclarativeconnection::connection() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/test-connection.qml")); + QDeclarativeItem *item = qobject_cast(c.create()); + + QVERIFY(item != 0); + + QCOMPARE(item->property("tested").toBool(), false); + QCOMPARE(item->width(), 50.); + emit item->setWidth(100.); + QCOMPARE(item->width(), 100.); + QCOMPARE(item->property("tested").toBool(), true); + + delete item; +} + +void tst_qdeclarativeconnection::trimming() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/trimming.qml")); + QDeclarativeItem *item = qobject_cast(c.create()); + + QVERIFY(item != 0); + + QCOMPARE(item->property("tested").toString(), QString("")); + int index = item->metaObject()->indexOfSignal("testMe(int,QString)"); + QMetaMethod method = item->metaObject()->method(index); + method.invoke(item, + Qt::DirectConnection, + Q_ARG(int, 5), + Q_ARG(QString, "worked")); + QCOMPARE(item->property("tested").toString(), QString("worked5")); + + delete item; +} + +// Confirm that target can be changed by one of our signal handlers +void tst_qdeclarativeconnection::targetChanged() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/connection-targetchange.qml")); + QDeclarativeItem *item = qobject_cast(c.create()); + QVERIFY(item != 0); + + QDeclarativeConnections *connections = item->findChild("connections"); + QVERIFY(connections); + + QDeclarativeItem *item1 = item->findChild("item1"); + QVERIFY(item1); + + item1->setWidth(200); + + QDeclarativeItem *item2 = item->findChild("item2"); + QVERIFY(item2); + QVERIFY(connections->target() == item2); + + // If we don't crash then we're OK + + delete item; +} + +void tst_qdeclarativeconnection::unknownSignals_data() +{ + QTest::addColumn("file"); + QTest::addColumn("error"); + + QTest::newRow("basic") << "connection-unknownsignals.qml" << ":6:5: QML Connections: Cannot assign to non-existent property \"onFooBar\""; + QTest::newRow("parent") << "connection-unknownsignals-parent.qml" << ":6:5: QML Connections: Cannot assign to non-existent property \"onFooBar\""; + QTest::newRow("ignored") << "connection-unknownsignals-ignored.qml" << ""; // should be NO error + QTest::newRow("notarget") << "connection-unknownsignals-notarget.qml" << ""; // should be NO error +} + +void tst_qdeclarativeconnection::unknownSignals() +{ + QFETCH(QString, file); + QFETCH(QString, error); + + QUrl url = QUrl::fromLocalFile(SRCDIR "/data/" + file); + if (!error.isEmpty()) { + QTest::ignoreMessage(QtWarningMsg, (url.toString() + error).toLatin1()); + } else { + // QTest has no way to insist no message (i.e. fail) + } + + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, url); + QDeclarativeItem *item = qobject_cast(c.create()); + QVERIFY(item != 0); + + // check that connection is created (they are all runtime errors) + QDeclarativeConnections *connections = item->findChild("connections"); + QVERIFY(connections); + + if (file == "connection-unknownsignals-ignored.qml") + QVERIFY(connections->ignoreUnknownSignals()); + + delete item; +} + +void tst_qdeclarativeconnection::errors_data() +{ + QTest::addColumn("file"); + QTest::addColumn("error"); + + QTest::newRow("no \"on\"") << "error-property.qml" << "Cannot assign to non-existent property \"fakeProperty\""; + QTest::newRow("3rd letter lowercase") << "error-property2.qml" << "Cannot assign to non-existent property \"onfakeProperty\""; + QTest::newRow("child object") << "error-object.qml" << "Connections: nested objects not allowed"; + QTest::newRow("grouped object") << "error-syntax.qml" << "Connections: syntax error"; +} + +void tst_qdeclarativeconnection::errors() +{ + QFETCH(QString, file); + QFETCH(QString, error); + + QUrl url = QUrl::fromLocalFile(SRCDIR "/data/" + file); + + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, url); + QVERIFY(c.isError() == true); + QList errors = c.errors(); + QVERIFY(errors.count() == 1); + QCOMPARE(errors.at(0).description(), error); +} + +QTEST_MAIN(tst_qdeclarativeconnection) + +#include "tst_qdeclarativeconnection.moc" diff --git a/tests/auto/declarative/qdeclarativecontext/qdeclarativecontext.pro b/tests/auto/declarative/qdeclarativecontext/qdeclarativecontext.pro new file mode 100644 index 00000000..74bb78c6 --- /dev/null +++ b/tests/auto/declarative/qdeclarativecontext/qdeclarativecontext.pro @@ -0,0 +1,11 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +SOURCES += tst_qdeclarativecontext.cpp +macx:CONFIG -= app_bundle + +!symbian: { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativecontext/tst_qdeclarativecontext.cpp b/tests/auto/declarative/qdeclarativecontext/tst_qdeclarativecontext.cpp new file mode 100644 index 00000000..328a4e7e --- /dev/null +++ b/tests/auto/declarative/qdeclarativecontext/tst_qdeclarativecontext.cpp @@ -0,0 +1,468 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#include +#include + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_qdeclarativecontext : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativecontext() {} + +private slots: + void baseUrl(); + void resolvedUrl(); + void engineMethod(); + void parentContext(); + void setContextProperty(); + void setContextObject(); + void destruction(); + void idAsContextProperty(); + void readOnlyContexts(); + +private: + QDeclarativeEngine engine; +}; + +void tst_qdeclarativecontext::baseUrl() +{ + QDeclarativeContext ctxt(&engine); + + QCOMPARE(ctxt.baseUrl(), QUrl()); + + ctxt.setBaseUrl(QUrl("http://www.nokia.com/")); + + QCOMPARE(ctxt.baseUrl(), QUrl("http://www.nokia.com/")); +} + +void tst_qdeclarativecontext::resolvedUrl() +{ + // Relative to the component + { + QDeclarativeContext ctxt(&engine); + ctxt.setBaseUrl(QUrl("http://www.nokia.com/")); + + QCOMPARE(ctxt.resolvedUrl(QUrl("main.qml")), QUrl("http://www.nokia.com/main.qml")); + } + + // Relative to a parent + { + QDeclarativeContext ctxt(&engine); + ctxt.setBaseUrl(QUrl("http://www.nokia.com/")); + + QDeclarativeContext ctxt2(&ctxt); + QCOMPARE(ctxt2.resolvedUrl(QUrl("main2.qml")), QUrl("http://www.nokia.com/main2.qml")); + } + + // Relative to the engine + { + QDeclarativeContext ctxt(&engine); + QCOMPARE(ctxt.resolvedUrl(QUrl("main.qml")), engine.baseUrl().resolved(QUrl("main.qml"))); + } + + // Relative to a deleted parent + { + QDeclarativeContext *ctxt = new QDeclarativeContext(&engine); + ctxt->setBaseUrl(QUrl("http://www.nokia.com/")); + + QDeclarativeContext ctxt2(ctxt); + QCOMPARE(ctxt2.resolvedUrl(QUrl("main2.qml")), QUrl("http://www.nokia.com/main2.qml")); + + delete ctxt; ctxt = 0; + + QCOMPARE(ctxt2.resolvedUrl(QUrl("main2.qml")), QUrl()); + } + + // Absolute + { + QDeclarativeContext ctxt(&engine); + + QCOMPARE(ctxt.resolvedUrl(QUrl("http://www.nokia.com/main2.qml")), QUrl("http://www.nokia.com/main2.qml")); + QCOMPARE(ctxt.resolvedUrl(QUrl("file:///main2.qml")), QUrl("file:///main2.qml")); + } +} + +void tst_qdeclarativecontext::engineMethod() +{ + QDeclarativeEngine *engine = new QDeclarativeEngine; + + QDeclarativeContext ctxt(engine); + QDeclarativeContext ctxt2(&ctxt); + QDeclarativeContext ctxt3(&ctxt2); + QDeclarativeContext ctxt4(&ctxt2); + + QCOMPARE(ctxt.engine(), engine); + QCOMPARE(ctxt2.engine(), engine); + QCOMPARE(ctxt3.engine(), engine); + QCOMPARE(ctxt4.engine(), engine); + + delete engine; engine = 0; + + QCOMPARE(ctxt.engine(), engine); + QCOMPARE(ctxt2.engine(), engine); + QCOMPARE(ctxt3.engine(), engine); + QCOMPARE(ctxt4.engine(), engine); +} + +void tst_qdeclarativecontext::parentContext() +{ + QDeclarativeEngine *engine = new QDeclarativeEngine; + + QCOMPARE(engine->rootContext()->parentContext(), (QDeclarativeContext *)0); + + QDeclarativeContext *ctxt = new QDeclarativeContext(engine); + QDeclarativeContext *ctxt2 = new QDeclarativeContext(ctxt); + QDeclarativeContext *ctxt3 = new QDeclarativeContext(ctxt2); + QDeclarativeContext *ctxt4 = new QDeclarativeContext(ctxt2); + QDeclarativeContext *ctxt5 = new QDeclarativeContext(ctxt); + QDeclarativeContext *ctxt6 = new QDeclarativeContext(engine); + QDeclarativeContext *ctxt7 = new QDeclarativeContext(engine->rootContext()); + + QCOMPARE(ctxt->parentContext(), engine->rootContext()); + QCOMPARE(ctxt2->parentContext(), ctxt); + QCOMPARE(ctxt3->parentContext(), ctxt2); + QCOMPARE(ctxt4->parentContext(), ctxt2); + QCOMPARE(ctxt5->parentContext(), ctxt); + QCOMPARE(ctxt6->parentContext(), engine->rootContext()); + QCOMPARE(ctxt7->parentContext(), engine->rootContext()); + + delete ctxt2; ctxt2 = 0; + + QCOMPARE(ctxt->parentContext(), engine->rootContext()); + QCOMPARE(ctxt3->parentContext(), (QDeclarativeContext *)0); + QCOMPARE(ctxt4->parentContext(), (QDeclarativeContext *)0); + QCOMPARE(ctxt5->parentContext(), ctxt); + QCOMPARE(ctxt6->parentContext(), engine->rootContext()); + QCOMPARE(ctxt7->parentContext(), engine->rootContext()); + + delete engine; engine = 0; + + QCOMPARE(ctxt->parentContext(), (QDeclarativeContext *)0); + QCOMPARE(ctxt3->parentContext(), (QDeclarativeContext *)0); + QCOMPARE(ctxt4->parentContext(), (QDeclarativeContext *)0); + QCOMPARE(ctxt5->parentContext(), (QDeclarativeContext *)0); + QCOMPARE(ctxt6->parentContext(), (QDeclarativeContext *)0); + QCOMPARE(ctxt7->parentContext(), (QDeclarativeContext *)0); + + delete ctxt7; + delete ctxt6; + delete ctxt5; + delete ctxt4; + delete ctxt3; + delete ctxt; +} + +class TestObject : public QObject +{ + Q_OBJECT + Q_PROPERTY(int a READ a NOTIFY aChanged) + Q_PROPERTY(int b READ b NOTIFY bChanged) + Q_PROPERTY(int c READ c NOTIFY cChanged) + +public: + TestObject() : _a(10), _b(10), _c(10) {} + + int a() const { return _a; } + void setA(int a) { _a = a; emit aChanged(); } + + int b() const { return _b; } + void setB(int b) { _b = b; emit bChanged(); } + + int c() const { return _c; } + void setC(int c) { _c = c; emit cChanged(); } + +signals: + void aChanged(); + void bChanged(); + void cChanged(); + +private: + int _a; + int _b; + int _c; +}; + +#define TEST_CONTEXT_PROPERTY(ctxt, name, value) \ +{ \ + QDeclarativeComponent component(&engine); \ + component.setData("import QtQuick 1.0; QtObject { property variant test: " #name " }", QUrl()); \ +\ + QObject *obj = component.create(ctxt); \ +\ + QCOMPARE(obj->property("test"), value); \ +\ + delete obj; \ +} + +void tst_qdeclarativecontext::setContextProperty() +{ + QDeclarativeContext ctxt(&engine); + QDeclarativeContext ctxt2(&ctxt); + + TestObject obj1; + obj1.setA(3345); + TestObject obj2; + obj2.setA(-19); + + // Static context properties + ctxt.setContextProperty("a", QVariant(10)); + ctxt.setContextProperty("b", QVariant(9)); + ctxt2.setContextProperty("d", &obj2); + ctxt2.setContextProperty("b", QVariant(19)); + ctxt2.setContextProperty("c", QVariant(QString("Hello World!"))); + ctxt.setContextProperty("d", &obj1); + ctxt.setContextProperty("e", &obj1); + + TEST_CONTEXT_PROPERTY(&ctxt2, a, QVariant(10)); + TEST_CONTEXT_PROPERTY(&ctxt2, b, QVariant(19)); + TEST_CONTEXT_PROPERTY(&ctxt2, c, QVariant(QString("Hello World!"))); + TEST_CONTEXT_PROPERTY(&ctxt2, d.a, QVariant(-19)); + TEST_CONTEXT_PROPERTY(&ctxt2, e.a, QVariant(3345)); + + ctxt.setContextProperty("a", QVariant(13)); + ctxt.setContextProperty("b", QVariant(4)); + ctxt2.setContextProperty("b", QVariant(8)); + ctxt2.setContextProperty("c", QVariant(QString("Hi World!"))); + ctxt2.setContextProperty("d", &obj1); + obj1.setA(12); + + TEST_CONTEXT_PROPERTY(&ctxt2, a, QVariant(13)); + TEST_CONTEXT_PROPERTY(&ctxt2, b, QVariant(8)); + TEST_CONTEXT_PROPERTY(&ctxt2, c, QVariant(QString("Hi World!"))); + TEST_CONTEXT_PROPERTY(&ctxt2, d.a, QVariant(12)); + TEST_CONTEXT_PROPERTY(&ctxt2, e.a, QVariant(12)); + + // Changes in context properties + { + QDeclarativeComponent component(&engine); + component.setData("import QtQuick 1.0; QtObject { property variant test: a }", QUrl()); + + QObject *obj = component.create(&ctxt2); + + QCOMPARE(obj->property("test"), QVariant(13)); + ctxt.setContextProperty("a", QVariant(19)); + QCOMPARE(obj->property("test"), QVariant(19)); + + delete obj; + } + { + QDeclarativeComponent component(&engine); + component.setData("import QtQuick 1.0; QtObject { property variant test: b }", QUrl()); + + QObject *obj = component.create(&ctxt2); + + QCOMPARE(obj->property("test"), QVariant(8)); + ctxt.setContextProperty("b", QVariant(5)); + QCOMPARE(obj->property("test"), QVariant(8)); + ctxt2.setContextProperty("b", QVariant(1912)); + QCOMPARE(obj->property("test"), QVariant(1912)); + + delete obj; + } + { + QDeclarativeComponent component(&engine); + component.setData("import QtQuick 1.0; QtObject { property variant test: e.a }", QUrl()); + + QObject *obj = component.create(&ctxt2); + + QCOMPARE(obj->property("test"), QVariant(12)); + obj1.setA(13); + QCOMPARE(obj->property("test"), QVariant(13)); + + delete obj; + } + + // New context properties + { + QDeclarativeComponent component(&engine); + component.setData("import QtQuick 1.0; QtObject { property variant test: a }", QUrl()); + + QObject *obj = component.create(&ctxt2); + + QCOMPARE(obj->property("test"), QVariant(19)); + ctxt2.setContextProperty("a", QVariant(1945)); + QCOMPARE(obj->property("test"), QVariant(1945)); + + delete obj; + } + + // Setting an object-variant context property + { + QDeclarativeComponent component(&engine); + component.setData("import QtQuick 1.0; QtObject { id: root; property int a: 10; property int test: ctxtProp.a; property variant obj: root; }", QUrl()); + + QDeclarativeContext ctxt(engine.rootContext()); + ctxt.setContextProperty("ctxtProp", QVariant()); + + QTest::ignoreMessage(QtWarningMsg, ":1: TypeError: Result of expression 'ctxtProp' [undefined] is not an object."); + QObject *obj = component.create(&ctxt); + + QVariant v = obj->property("obj"); + + ctxt.setContextProperty("ctxtProp", v); + + QCOMPARE(obj->property("test"), QVariant(10)); + + delete obj; + } +} + +void tst_qdeclarativecontext::setContextObject() +{ + QDeclarativeContext ctxt(&engine); + + TestObject to; + + to.setA(2); + to.setB(192); + to.setC(18); + + ctxt.setContextObject(&to); + ctxt.setContextProperty("c", QVariant(9)); + + // Static context properties + TEST_CONTEXT_PROPERTY(&ctxt, a, QVariant(2)); + TEST_CONTEXT_PROPERTY(&ctxt, b, QVariant(192)); + TEST_CONTEXT_PROPERTY(&ctxt, c, QVariant(9)); + + to.setA(12); + to.setB(100); + to.setC(7); + ctxt.setContextProperty("c", QVariant(3)); + + TEST_CONTEXT_PROPERTY(&ctxt, a, QVariant(12)); + TEST_CONTEXT_PROPERTY(&ctxt, b, QVariant(100)); + TEST_CONTEXT_PROPERTY(&ctxt, c, QVariant(3)); + + // Changes in context properties + { + QDeclarativeComponent component(&engine); + component.setData("import QtQuick 1.0; QtObject { property variant test: a }", QUrl()); + + QObject *obj = component.create(&ctxt); + + QCOMPARE(obj->property("test"), QVariant(12)); + to.setA(14); + QCOMPARE(obj->property("test"), QVariant(14)); + + delete obj; + } +} + +void tst_qdeclarativecontext::destruction() +{ + QDeclarativeContext *ctxt = new QDeclarativeContext(&engine); + + QObject obj; + QDeclarativeEngine::setContextForObject(&obj, ctxt); + QDeclarativeExpression expr(ctxt, 0, "a"); + + QCOMPARE(ctxt, QDeclarativeEngine::contextForObject(&obj)); + QCOMPARE(ctxt, expr.context()); + + delete ctxt; ctxt = 0; + + QCOMPARE(ctxt, QDeclarativeEngine::contextForObject(&obj)); + QCOMPARE(ctxt, expr.context()); +} + +void tst_qdeclarativecontext::idAsContextProperty() +{ + QDeclarativeComponent component(&engine); + component.setData("import QtQuick 1.0; QtObject { property variant a; a: QtObject { id: myObject } }", QUrl()); + + QObject *obj = component.create(); + QVERIFY(obj); + + QVariant a = obj->property("a"); + QVERIFY(a.userType() == QMetaType::QObjectStar); + + QVariant ctxt = qmlContext(obj)->contextProperty("myObject"); + QVERIFY(ctxt.userType() == QMetaType::QObjectStar); + + QVERIFY(a == ctxt); + + delete obj; +} + +// Internal contexts should be read-only +void tst_qdeclarativecontext::readOnlyContexts() +{ + QDeclarativeComponent component(&engine); + component.setData("import QtQuick 1.0; QtObject { id: me }", QUrl()); + + QObject *obj = component.create(); + QVERIFY(obj); + + QDeclarativeContext *context = qmlContext(obj); + QVERIFY(context); + + QVERIFY(qvariant_cast(context->contextProperty("me")) == obj); + QVERIFY(context->contextObject() == obj); + + QTest::ignoreMessage(QtWarningMsg, "QDeclarativeContext: Cannot set property on internal context."); + context->setContextProperty("hello", 12); + QVERIFY(context->contextProperty("hello") == QVariant()); + + QTest::ignoreMessage(QtWarningMsg, "QDeclarativeContext: Cannot set property on internal context."); + context->setContextProperty("hello", obj); + QVERIFY(context->contextProperty("hello") == QVariant()); + + QTest::ignoreMessage(QtWarningMsg, "QDeclarativeContext: Cannot set context object for internal context."); + context->setContextObject(0); + QVERIFY(context->contextObject() == obj); + + delete obj; +} + +QTEST_MAIN(tst_qdeclarativecontext) + +#include "tst_qdeclarativecontext.moc" diff --git a/tests/auto/declarative/qdeclarativedebug/qdeclarativedebug.pro b/tests/auto/declarative/qdeclarativedebug/qdeclarativedebug.pro new file mode 100644 index 00000000..d488b53c --- /dev/null +++ b/tests/auto/declarative/qdeclarativedebug/qdeclarativedebug.pro @@ -0,0 +1,10 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += network declarative +macx:CONFIG -= app_bundle + +HEADERS += ../shared/debugutil_p.h +SOURCES += tst_qdeclarativedebug.cpp \ + ../shared/debugutil.cpp + +CONFIG += parallel_test declarative_debug + diff --git a/tests/auto/declarative/qdeclarativedebug/tst_qdeclarativedebug.cpp b/tests/auto/declarative/qdeclarativedebug/tst_qdeclarativedebug.cpp new file mode 100644 index 00000000..83d47fca --- /dev/null +++ b/tests/auto/declarative/qdeclarativedebug/tst_qdeclarativedebug.cpp @@ -0,0 +1,1220 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "../../../shared/util.h" +#include "../shared/debugutil_p.h" + +Q_DECLARE_METATYPE(QDeclarativeDebugWatch::State) + +class tst_QDeclarativeDebug : public QObject +{ + Q_OBJECT + +private: + QDeclarativeDebugObjectReference findRootObject(int context = 0, bool recursive = false); + QDeclarativeDebugPropertyReference findProperty(const QList &props, const QString &name) const; + void waitForQuery(QDeclarativeDebugQuery *query); + + void recursiveObjectTest(QObject *o, const QDeclarativeDebugObjectReference &oref, bool recursive) const; + + void recursiveCompareObjects(const QDeclarativeDebugObjectReference &a, const QDeclarativeDebugObjectReference &b) const; + void recursiveCompareContexts(const QDeclarativeDebugContextReference &a, const QDeclarativeDebugContextReference &b) const; + void compareProperties(const QDeclarativeDebugPropertyReference &a, const QDeclarativeDebugPropertyReference &b) const; + + QDeclarativeDebugConnection *m_conn; + QDeclarativeEngineDebug *m_dbg; + QDeclarativeEngine *m_engine; + QDeclarativeItem *m_rootItem; + + QObjectList m_components; + +private slots: + void initTestCase(); + void cleanupTestCase(); + + void watch_property(); + void watch_object(); + void watch_expression(); + void watch_expression_data(); + void watch_context(); + void watch_file(); + + void queryAvailableEngines(); + void queryRootContexts(); + void queryObject(); + void queryObject_data(); + void queryExpressionResult(); + void queryExpressionResult_data(); + + void tst_QDeclarativeDebugFileReference(); + void tst_QDeclarativeDebugEngineReference(); + void tst_QDeclarativeDebugObjectReference(); + void tst_QDeclarativeDebugContextReference(); + void tst_QDeclarativeDebugPropertyReference(); + + void setBindingForObject(); + void setMethodBody(); + void queryObjectTree(); + void setBindingInStates(); +}; + +class NonScriptProperty : public QObject { + Q_OBJECT + Q_PROPERTY(int nonScriptProp READ nonScriptProp WRITE setNonScriptProp NOTIFY nonScriptPropChanged SCRIPTABLE false) +public: + int nonScriptProp() const { return 0; } + void setNonScriptProp(int) {} +signals: + void nonScriptPropChanged(); +}; +QML_DECLARE_TYPE(NonScriptProperty) + + +QDeclarativeDebugObjectReference tst_QDeclarativeDebug::findRootObject(int context, bool recursive) +{ + QDeclarativeDebugEnginesQuery *q_engines = m_dbg->queryAvailableEngines(this); + waitForQuery(q_engines); + + if (q_engines->engines().count() == 0) + return QDeclarativeDebugObjectReference(); + QDeclarativeDebugRootContextQuery *q_context = m_dbg->queryRootContexts(q_engines->engines()[0].debugId(), this); + waitForQuery(q_context); + + if (q_context->rootContext().objects().count() == 0) + return QDeclarativeDebugObjectReference(); + QDeclarativeDebugObjectQuery *q_obj = recursive ? + m_dbg->queryObjectRecursive(q_context->rootContext().objects()[context], this) : + m_dbg->queryObject(q_context->rootContext().objects()[context], this); + waitForQuery(q_obj); + + QDeclarativeDebugObjectReference result = q_obj->object(); + + delete q_engines; + delete q_context; + delete q_obj; + + return result; +} + +QDeclarativeDebugPropertyReference tst_QDeclarativeDebug::findProperty(const QList &props, const QString &name) const +{ + foreach(const QDeclarativeDebugPropertyReference &p, props) { + if (p.name() == name) + return p; + } + return QDeclarativeDebugPropertyReference(); +} + +void tst_QDeclarativeDebug::waitForQuery(QDeclarativeDebugQuery *query) +{ + QVERIFY(query); + QCOMPARE(query->parent(), qobject_cast(this)); + QVERIFY(query->state() == QDeclarativeDebugQuery::Waiting); + if (!QDeclarativeDebugTest::waitForSignal(query, SIGNAL(stateChanged(QDeclarativeDebugQuery::State)))) + QFAIL("query timed out"); +} + +void tst_QDeclarativeDebug::recursiveObjectTest(QObject *o, const QDeclarativeDebugObjectReference &oref, bool recursive) const +{ + const QMetaObject *meta = o->metaObject(); + + QDeclarativeType *type = QDeclarativeMetaType::qmlType(meta); + QString className = type ? QString(type->qmlTypeName()) : QString(meta->className()); + className = className.mid(className.lastIndexOf(QLatin1Char('/'))+1); + + QCOMPARE(oref.debugId(), QDeclarativeDebugService::idForObject(o)); + QCOMPARE(oref.name(), o->objectName()); + QCOMPARE(oref.className(), className); + QCOMPARE(oref.contextDebugId(), QDeclarativeDebugService::idForObject(qmlContext(o))); + + const QObjectList &children = o->children(); + for (int i=0; i= 0); + + QDeclarativeDebugObjectReference cref; + foreach (const QDeclarativeDebugObjectReference &ref, oref.children()) { + if (ref.debugId() == debugId) { + cref = ref; + break; + } + } + QVERIFY(cref.debugId() >= 0); + + if (recursive) + recursiveObjectTest(child, cref, true); + } + + foreach (const QDeclarativeDebugPropertyReference &p, oref.properties()) { + QCOMPARE(p.objectDebugId(), QDeclarativeDebugService::idForObject(o)); + + // signal properties are fake - they are generated from QDeclarativeBoundSignal children + if (p.name().startsWith("on") && p.name().length() > 2 && p.name()[2].isUpper()) { + QVERIFY(p.value().toString().startsWith('{') && p.value().toString().endsWith('}')); + QVERIFY(p.valueTypeName().isEmpty()); + QVERIFY(p.binding().isEmpty()); + QVERIFY(!p.hasNotifySignal()); + continue; + } + + QMetaProperty pmeta = meta->property(meta->indexOfProperty(p.name().toUtf8().constData())); + + QCOMPARE(p.name(), QString::fromUtf8(pmeta.name())); + + if (pmeta.type() > 0 && pmeta.type() < QVariant::UserType) // TODO test complex types + QCOMPARE(p.value(), pmeta.read(o)); + + if (p.name() == "parent") + QVERIFY(p.valueTypeName() == "QGraphicsObject*" || p.valueTypeName() == "QDeclarativeItem*"); + else + QCOMPARE(p.valueTypeName(), QString::fromUtf8(pmeta.typeName())); + + QDeclarativeAbstractBinding *binding = + QDeclarativePropertyPrivate::binding(QDeclarativeProperty(o, p.name())); + if (binding) + QCOMPARE(binding->expression(), p.binding()); + + QCOMPARE(p.hasNotifySignal(), pmeta.hasNotifySignal()); + + QVERIFY(pmeta.isValid()); + } +} + +void tst_QDeclarativeDebug::recursiveCompareObjects(const QDeclarativeDebugObjectReference &a, const QDeclarativeDebugObjectReference &b) const +{ + QCOMPARE(a.debugId(), b.debugId()); + QCOMPARE(a.className(), b.className()); + QCOMPARE(a.name(), b.name()); + QCOMPARE(a.contextDebugId(), b.contextDebugId()); + + QCOMPARE(a.source().url(), b.source().url()); + QCOMPARE(a.source().lineNumber(), b.source().lineNumber()); + QCOMPARE(a.source().columnNumber(), b.source().columnNumber()); + + QCOMPARE(a.properties().count(), b.properties().count()); + QCOMPARE(a.children().count(), b.children().count()); + + QList aprops = a.properties(); + QList bprops = b.properties(); + + for (int i=0; i(); + qmlRegisterType("Test", 1, 0, "NonScriptPropertyElement"); + + QTest::ignoreMessage(QtDebugMsg, "QDeclarativeDebugServer: Waiting for connection on port 3768..."); + m_engine = new QDeclarativeEngine(this); + + QList qml; + qml << "import QtQuick 1.0\n" + "import Test 1.0\n" + "Item {" + "id: root\n" + "width: 10; height: 20; scale: blueRect.scale;" + "Rectangle { id: blueRect; width: 500; height: 600; color: \"blue\"; }" + "Text { color: blueRect.color; }" + "MouseArea {" + "onEntered: { console.log('hello') }" + "}" + "property variant varObj\n" + "property variant varObjList: []\n" + "Component.onCompleted: {\n" + "varObj = blueRect;\n" + "var list = varObjList;\n" + "list[0] = blueRect;\n" + "varObjList = list;\n" + "}\n" + "NonScriptPropertyElement {\n" + "}\n" + "}"; + + // add second component to test multiple root contexts + qml << "import QtQuick 1.0\n" + "Item {}"; + + // and a third to test methods + qml << "import QtQuick 1.0\n" + "Item {" + "function myMethodNoArgs() { return 3; }\n" + "function myMethod(a) { return a + 9; }\n" + "function myMethodIndirect() { myMethod(3); }\n" + "}"; + + // and a fourth to test states + qml << "import QtQuick 1.0\n" + "Rectangle {\n" + "id:rootRect\n" + "width:100\n" + "states: [\n" + "State {\n" + "name:\"state1\"\n" + "PropertyChanges {\n" + "target:rootRect\n" + "width:200\n" + "}\n" + "}\n" + "]\n" + "transitions: [\n" + "Transition {\n" + "from:\"*\"\n" + "to:\"state1\"\n" + "PropertyAnimation {\n" + "target:rootRect\n" + "property:\"width\"\n" + "duration:100\n" + "}\n" + "}\n" + "]\n" + "}\n" + ; + + for (int i=0; i(component.create()); + } + m_rootItem = qobject_cast(m_components.first()); + + // add an extra context to test for multiple contexts + QDeclarativeContext *context = new QDeclarativeContext(m_engine->rootContext(), this); + context->setObjectName("tst_QDeclarativeDebug_childContext"); + + m_conn = new QDeclarativeDebugConnection(this); + m_conn->connectToHost("127.0.0.1", 3768); + + QTest::ignoreMessage(QtDebugMsg, "QDeclarativeDebugServer: Connection established"); + bool ok = m_conn->waitForConnected(); + QVERIFY(ok); + QTRY_VERIFY(QDeclarativeDebugService::hasDebuggingClient()); + m_dbg = new QDeclarativeEngineDebug(m_conn, this); + QTRY_VERIFY(m_dbg->status() == QDeclarativeEngineDebug::Enabled); +} + +void tst_QDeclarativeDebug::cleanupTestCase() +{ + delete m_dbg; + delete m_conn; + qDeleteAll(m_components); + delete m_engine; +} + +void tst_QDeclarativeDebug::setMethodBody() +{ + QDeclarativeDebugObjectReference obj = findRootObject(2); + + QObject *root = m_components.at(2); + // Without args + { + QVariant rv; + QVERIFY(QMetaObject::invokeMethod(root, "myMethodNoArgs", Qt::DirectConnection, + Q_RETURN_ARG(QVariant, rv))); + QVERIFY(rv == QVariant(qreal(3))); + + + QVERIFY(m_dbg->setMethodBody(obj.debugId(), "myMethodNoArgs", "return 7")); + QTest::qWait(100); + + QVERIFY(QMetaObject::invokeMethod(root, "myMethodNoArgs", Qt::DirectConnection, + Q_RETURN_ARG(QVariant, rv))); + QVERIFY(rv == QVariant(qreal(7))); + } + + // With args + { + QVariant rv; + QVERIFY(QMetaObject::invokeMethod(root, "myMethod", Qt::DirectConnection, + Q_RETURN_ARG(QVariant, rv), Q_ARG(QVariant, QVariant(19)))); + QVERIFY(rv == QVariant(qreal(28))); + + QVERIFY(m_dbg->setMethodBody(obj.debugId(), "myMethod", "return a + 7")); + QTest::qWait(100); + + QVERIFY(QMetaObject::invokeMethod(root, "myMethod", Qt::DirectConnection, + Q_RETURN_ARG(QVariant, rv), Q_ARG(QVariant, QVariant(19)))); + QVERIFY(rv == QVariant(qreal(26))); + } +} + +void tst_QDeclarativeDebug::watch_property() +{ + QDeclarativeDebugObjectReference obj = findRootObject(); + QDeclarativeDebugPropertyReference prop = findProperty(obj.properties(), "width"); + + QDeclarativeDebugPropertyWatch *watch; + + QDeclarativeEngineDebug *unconnected = new QDeclarativeEngineDebug(0); + watch = unconnected->addWatch(prop, this); + QCOMPARE(watch->state(), QDeclarativeDebugWatch::Dead); + delete watch; + delete unconnected; + + watch = m_dbg->addWatch(QDeclarativeDebugPropertyReference(), this); + QVERIFY(QDeclarativeDebugTest::waitForSignal(watch, SIGNAL(stateChanged(QDeclarativeDebugWatch::State)))); + QCOMPARE(watch->state(), QDeclarativeDebugWatch::Inactive); + delete watch; + + watch = m_dbg->addWatch(prop, this); + QCOMPARE(watch->state(), QDeclarativeDebugWatch::Waiting); + QCOMPARE(watch->objectDebugId(), obj.debugId()); + QCOMPARE(watch->name(), prop.name()); + + QSignalSpy spy(watch, SIGNAL(valueChanged(QByteArray,QVariant))); + + int origWidth = m_rootItem->property("width").toInt(); + m_rootItem->setProperty("width", origWidth*2); + + // stateChanged() is received before valueChanged() + QVERIFY(QDeclarativeDebugTest::waitForSignal(watch, SIGNAL(stateChanged(QDeclarativeDebugWatch::State)))); + QCOMPARE(watch->state(), QDeclarativeDebugWatch::Active); + QCOMPARE(spy.count(), 1); + + m_dbg->removeWatch(watch); + delete watch; + + // restore original value and verify spy doesn't get additional signal since watch has been removed + m_rootItem->setProperty("width", origWidth); + QTest::qWait(100); + QCOMPARE(spy.count(), 1); + + QCOMPARE(spy.at(0).at(0).value(), prop.name().toUtf8()); + QCOMPARE(spy.at(0).at(1).value(), qVariantFromValue(origWidth*2)); +} + +void tst_QDeclarativeDebug::watch_object() +{ + QDeclarativeDebugEnginesQuery *q_engines = m_dbg->queryAvailableEngines(this); + waitForQuery(q_engines); + + QVERIFY(q_engines->engines().count() > 0); + QDeclarativeDebugRootContextQuery *q_context = m_dbg->queryRootContexts(q_engines->engines()[0].debugId(), this); + waitForQuery(q_context); + + QVERIFY(q_context->rootContext().objects().count() > 0); + QDeclarativeDebugObjectQuery *q_obj = m_dbg->queryObject(q_context->rootContext().objects()[0], this); + waitForQuery(q_obj); + + QDeclarativeDebugObjectReference obj = q_obj->object(); + + delete q_engines; + delete q_context; + delete q_obj; + + QDeclarativeDebugWatch *watch; + + QDeclarativeEngineDebug *unconnected = new QDeclarativeEngineDebug(0); + watch = unconnected->addWatch(obj, this); + QCOMPARE(watch->state(), QDeclarativeDebugWatch::Dead); + delete watch; + delete unconnected; + + watch = m_dbg->addWatch(QDeclarativeDebugObjectReference(), this); + QVERIFY(QDeclarativeDebugTest::waitForSignal(watch, SIGNAL(stateChanged(QDeclarativeDebugWatch::State)))); + QCOMPARE(watch->state(), QDeclarativeDebugWatch::Inactive); + delete watch; + + watch = m_dbg->addWatch(obj, this); + QCOMPARE(watch->state(), QDeclarativeDebugWatch::Waiting); + QCOMPARE(watch->objectDebugId(), obj.debugId()); + + QSignalSpy spy(watch, SIGNAL(valueChanged(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); + + // stateChanged() is received before any valueChanged() signals + QVERIFY(QDeclarativeDebugTest::waitForSignal(watch, SIGNAL(stateChanged(QDeclarativeDebugWatch::State)))); + QCOMPARE(watch->state(), QDeclarativeDebugWatch::Active); + QVERIFY(spy.count() > 0); + + int newWidth = -1; + int newHeight = -1; + for (int i=0; i() == "width") + newWidth = values[1].value().toInt(); + else if (values[0].value() == "height") + newHeight = values[1].value().toInt(); + + } + + m_dbg->removeWatch(watch); + delete watch; + + // since watch has been removed, restoring the original values should not trigger a valueChanged() + spy.clear(); + m_rootItem->setProperty("width", origWidth); + m_rootItem->setProperty("height", origHeight); + QTest::qWait(100); + QCOMPARE(spy.count(), 0); + + QCOMPARE(newWidth, origWidth * 2); + QCOMPARE(newHeight, origHeight * 2); +} + +void tst_QDeclarativeDebug::watch_expression() +{ + QFETCH(QString, expr); + QFETCH(int, increment); + QFETCH(int, incrementCount); + + int origWidth = m_rootItem->property("width").toInt(); + + QDeclarativeDebugObjectReference obj = findRootObject(); + + QDeclarativeDebugObjectExpressionWatch *watch; + + QDeclarativeEngineDebug *unconnected = new QDeclarativeEngineDebug(0); + watch = unconnected->addWatch(obj, expr, this); + QCOMPARE(watch->state(), QDeclarativeDebugWatch::Dead); + delete watch; + delete unconnected; + + watch = m_dbg->addWatch(QDeclarativeDebugObjectReference(), expr, this); + QVERIFY(QDeclarativeDebugTest::waitForSignal(watch, SIGNAL(stateChanged(QDeclarativeDebugWatch::State)))); + QCOMPARE(watch->state(), QDeclarativeDebugWatch::Inactive); + delete watch; + + watch = m_dbg->addWatch(obj, expr, this); + QCOMPARE(watch->state(), QDeclarativeDebugWatch::Waiting); + QCOMPARE(watch->objectDebugId(), obj.debugId()); + QCOMPARE(watch->expression(), expr); + + QSignalSpy spyState(watch, SIGNAL(stateChanged(QDeclarativeDebugWatch::State))); + + 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 0) { + width += increment; + m_rootItem->setProperty("width", width); + } + if (!QDeclarativeDebugTest::waitForSignal(watch, SIGNAL(valueChanged(QByteArray,QVariant)))) + QFAIL("Did not receive valueChanged() for expression"); + } + + if (spyState.count() == 0) + QVERIFY(QDeclarativeDebugTest::waitForSignal(watch, SIGNAL(stateChanged(QDeclarativeDebugWatch::State)))); + QCOMPARE(spyState.count(), 1); + QCOMPARE(watch->state(), QDeclarativeDebugWatch::Active); + + 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(100); + QCOMPARE(spy.count(), expectedSpyCount); + + width = origWidth + increment; + for (int i=0; i().toInt(), width); + width += increment; + } +} + +void tst_QDeclarativeDebug::watch_expression_data() +{ + QTest::addColumn("expr"); + QTest::addColumn("increment"); + QTest::addColumn("incrementCount"); + + QTest::newRow("width") << "width" << 0 << 0; + QTest::newRow("width+10") << "width + 10" << 10 << 5; +} + +void tst_QDeclarativeDebug::watch_context() +{ + QDeclarativeDebugContextReference c; + QTest::ignoreMessage(QtWarningMsg, "QDeclarativeEngineDebug::addWatch(): Not implemented"); + QVERIFY(!m_dbg->addWatch(c, QString(), this)); +} + +void tst_QDeclarativeDebug::watch_file() +{ + QDeclarativeDebugFileReference f; + QTest::ignoreMessage(QtWarningMsg, "QDeclarativeEngineDebug::addWatch(): Not implemented"); + QVERIFY(!m_dbg->addWatch(f, this)); +} + +void tst_QDeclarativeDebug::queryAvailableEngines() +{ + QDeclarativeDebugEnginesQuery *q_engines; + + QDeclarativeEngineDebug *unconnected = new QDeclarativeEngineDebug(0); + q_engines = unconnected->queryAvailableEngines(0); + QCOMPARE(q_engines->state(), QDeclarativeDebugQuery::Error); + delete q_engines; + delete unconnected; + + q_engines = m_dbg->queryAvailableEngines(this); + delete q_engines; + + q_engines = m_dbg->queryAvailableEngines(this); + QVERIFY(q_engines->engines().isEmpty()); + waitForQuery(q_engines); + + // TODO test multiple engines + QList engines = q_engines->engines(); + QCOMPARE(engines.count(), 1); + + foreach(const QDeclarativeDebugEngineReference &e, engines) { + QCOMPARE(e.debugId(), QDeclarativeDebugService::idForObject(m_engine)); + QCOMPARE(e.name(), m_engine->objectName()); + } + + // Make query invalid by deleting client + q_engines = m_dbg->queryAvailableEngines(this); + QCOMPARE(q_engines->state(), QDeclarativeDebugQuery::Waiting); + delete m_dbg; + QCOMPARE(q_engines->state(), QDeclarativeDebugQuery::Error); + delete q_engines; + m_dbg = new QDeclarativeEngineDebug(m_conn, this); +} + +void tst_QDeclarativeDebug::queryRootContexts() +{ + QDeclarativeDebugEnginesQuery *q_engines = m_dbg->queryAvailableEngines(this); + waitForQuery(q_engines); + int engineId = q_engines->engines()[0].debugId(); + delete q_engines; + + QDeclarativeDebugRootContextQuery *q_context; + + QDeclarativeEngineDebug *unconnected = new QDeclarativeEngineDebug(0); + q_context = unconnected->queryRootContexts(engineId, this); + QCOMPARE(q_context->state(), QDeclarativeDebugQuery::Error); + delete q_context; + delete unconnected; + + q_context = m_dbg->queryRootContexts(engineId, this); + delete q_context; + + q_context = m_dbg->queryRootContexts(engineId, this); + waitForQuery(q_context); + + QDeclarativeContext *actualContext = m_engine->rootContext(); + QDeclarativeDebugContextReference context = q_context->rootContext(); + QCOMPARE(context.debugId(), QDeclarativeDebugService::idForObject(actualContext)); + QCOMPARE(context.name(), actualContext->objectName()); + + QCOMPARE(context.objects().count(), 4); // 4 qml component objects created for context in main() + + // 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); + + QCOMPARE(context.contexts().count(), 5); + QVERIFY(context.contexts()[0].debugId() >= 0); + QCOMPARE(context.contexts()[0].name(), QString("tst_QDeclarativeDebug_childContext")); + + // Make query invalid by deleting client + q_context = m_dbg->queryRootContexts(engineId, this); + QCOMPARE(q_context->state(), QDeclarativeDebugQuery::Waiting); + delete m_dbg; + QCOMPARE(q_context->state(), QDeclarativeDebugQuery::Error); + delete q_context; + m_dbg = new QDeclarativeEngineDebug(m_conn, this); +} + +void tst_QDeclarativeDebug::queryObject() +{ + QFETCH(bool, recursive); + + QDeclarativeDebugEnginesQuery *q_engines = m_dbg->queryAvailableEngines(this); + waitForQuery(q_engines); + + QDeclarativeDebugRootContextQuery *q_context = m_dbg->queryRootContexts(q_engines->engines()[0].debugId(), this); + waitForQuery(q_context); + QDeclarativeDebugObjectReference rootObject = q_context->rootContext().objects()[0]; + + QDeclarativeDebugObjectQuery *q_obj = 0; + + QDeclarativeEngineDebug *unconnected = new QDeclarativeEngineDebug(0); + q_obj = recursive ? unconnected->queryObjectRecursive(rootObject, this) : unconnected->queryObject(rootObject, this); + QCOMPARE(q_obj->state(), QDeclarativeDebugQuery::Error); + delete q_obj; + delete unconnected; + + q_obj = recursive ? m_dbg->queryObjectRecursive(rootObject, this) : m_dbg->queryObject(rootObject, this); + delete q_obj; + + q_obj = recursive ? m_dbg->queryObjectRecursive(rootObject, this) : m_dbg->queryObject(rootObject, this); + waitForQuery(q_obj); + + QDeclarativeDebugObjectReference obj = q_obj->object(); + + delete q_engines; + delete q_context; + + // Make query invalid by deleting client + q_obj = recursive ? m_dbg->queryObjectRecursive(rootObject, this) : m_dbg->queryObject(rootObject, this); + QCOMPARE(q_obj->state(), QDeclarativeDebugQuery::Waiting); + delete m_dbg; + QCOMPARE(q_obj->state(), QDeclarativeDebugQuery::Error); + delete q_obj; + m_dbg = new QDeclarativeEngineDebug(m_conn, this); + + // check source as defined in main() + QDeclarativeDebugFileReference source = obj.source(); + QCOMPARE(source.url(), QUrl::fromLocalFile("")); + QCOMPARE(source.lineNumber(), 3); + QCOMPARE(source.columnNumber(), 1); + + // generically test all properties, children and childrens' properties + recursiveObjectTest(m_rootItem, obj, recursive); + + if (recursive) { + foreach(const QDeclarativeDebugObjectReference &child, obj.children()) + QVERIFY(child.properties().count() > 0); + + QDeclarativeDebugObjectReference rect; + QDeclarativeDebugObjectReference text; + foreach (const QDeclarativeDebugObjectReference &child, obj.children()) { + if (child.className() == "Rectangle") + rect = child; + else if (child.className() == "Text") + text = child; + } + + // test specific property values + QCOMPARE(findProperty(rect.properties(), "width").value(), qVariantFromValue(500)); + QCOMPARE(findProperty(rect.properties(), "height").value(), qVariantFromValue(600)); + QCOMPARE(findProperty(rect.properties(), "color").value(), qVariantFromValue(QColor("blue"))); + + QCOMPARE(findProperty(text.properties(), "color").value(), qVariantFromValue(QColor("blue"))); + } else { + foreach(const QDeclarativeDebugObjectReference &child, obj.children()) + QCOMPARE(child.properties().count(), 0); + } +} + +void tst_QDeclarativeDebug::queryObject_data() +{ + QTest::addColumn("recursive"); + + QTest::newRow("non-recursive") << false; + QTest::newRow("recursive") << true; +} + +void tst_QDeclarativeDebug::queryExpressionResult() +{ + QFETCH(QString, expr); + QFETCH(QVariant, result); + + QDeclarativeDebugEnginesQuery *q_engines = m_dbg->queryAvailableEngines(this); + waitForQuery(q_engines); // check immediate deletion is ok + + QDeclarativeDebugRootContextQuery *q_context = m_dbg->queryRootContexts(q_engines->engines()[0].debugId(), this); + waitForQuery(q_context); + int objectId = q_context->rootContext().objects()[0].debugId(); + + QDeclarativeDebugExpressionQuery *q_expr; + + QDeclarativeEngineDebug *unconnected = new QDeclarativeEngineDebug(0); + q_expr = unconnected->queryExpressionResult(objectId, expr, this); + QCOMPARE(q_expr->state(), QDeclarativeDebugQuery::Error); + delete q_expr; + delete unconnected; + + q_expr = m_dbg->queryExpressionResult(objectId, expr, this); + delete q_expr; + + q_expr = m_dbg->queryExpressionResult(objectId, expr, this); + QCOMPARE(q_expr->expression().toString(), expr); + waitForQuery(q_expr); + + QCOMPARE(q_expr->result(), result); + + delete q_engines; + delete q_context; + + // Make query invalid by deleting client + q_expr = m_dbg->queryExpressionResult(objectId, expr, this); + QCOMPARE(q_expr->state(), QDeclarativeDebugQuery::Waiting); + delete m_dbg; + QCOMPARE(q_expr->state(), QDeclarativeDebugQuery::Error); + delete q_expr; + m_dbg = new QDeclarativeEngineDebug(m_conn, this); +} + +void tst_QDeclarativeDebug::queryExpressionResult_data() +{ + QTest::addColumn("expr"); + QTest::addColumn("result"); + + QTest::newRow("width + 50") << "width + 50" << qVariantFromValue(60); + QTest::newRow("blueRect.width") << "blueRect.width" << qVariantFromValue(500); + QTest::newRow("bad expr") << "aeaef" << qVariantFromValue(QString("")); + QTest::newRow("QObject*") << "varObj" << qVariantFromValue(QString("")); + QTest::newRow("list of QObject*") << "varObjList" << qVariantFromValue(QString("")); +} + +void tst_QDeclarativeDebug::tst_QDeclarativeDebugFileReference() +{ + QDeclarativeDebugFileReference ref; + QVERIFY(ref.url().isEmpty()); + QCOMPARE(ref.lineNumber(), -1); + QCOMPARE(ref.columnNumber(), -1); + + ref.setUrl(QUrl("http://test")); + QCOMPARE(ref.url(), QUrl("http://test")); + ref.setLineNumber(1); + QCOMPARE(ref.lineNumber(), 1); + ref.setColumnNumber(1); + QCOMPARE(ref.columnNumber(), 1); + + QDeclarativeDebugFileReference copy(ref); + QDeclarativeDebugFileReference copyAssign; + copyAssign = ref; + foreach (const QDeclarativeDebugFileReference &r, (QList() << copy << copyAssign)) { + QCOMPARE(r.url(), ref.url()); + QCOMPARE(r.lineNumber(), ref.lineNumber()); + QCOMPARE(r.columnNumber(), ref.columnNumber()); + } +} + +void tst_QDeclarativeDebug::tst_QDeclarativeDebugEngineReference() +{ + QDeclarativeDebugEngineReference ref; + QCOMPARE(ref.debugId(), -1); + QVERIFY(ref.name().isEmpty()); + + ref = QDeclarativeDebugEngineReference(1); + QCOMPARE(ref.debugId(), 1); + QVERIFY(ref.name().isEmpty()); + + QDeclarativeDebugEnginesQuery *q_engines = m_dbg->queryAvailableEngines(this); + waitForQuery(q_engines); + ref = q_engines->engines()[0]; + delete q_engines; + + QDeclarativeDebugEngineReference copy(ref); + QDeclarativeDebugEngineReference copyAssign; + copyAssign = ref; + foreach (const QDeclarativeDebugEngineReference &r, (QList() << copy << copyAssign)) { + QCOMPARE(r.debugId(), ref.debugId()); + QCOMPARE(r.name(), ref.name()); + } +} + +void tst_QDeclarativeDebug::tst_QDeclarativeDebugObjectReference() +{ + QDeclarativeDebugObjectReference ref; + QCOMPARE(ref.debugId(), -1); + QCOMPARE(ref.className(), QString()); + QCOMPARE(ref.name(), QString()); + QCOMPARE(ref.contextDebugId(), -1); + QVERIFY(ref.properties().isEmpty()); + QVERIFY(ref.children().isEmpty()); + + QDeclarativeDebugFileReference source = ref.source(); + QVERIFY(source.url().isEmpty()); + QVERIFY(source.lineNumber() < 0); + QVERIFY(source.columnNumber() < 0); + + ref = QDeclarativeDebugObjectReference(1); + QCOMPARE(ref.debugId(), 1); + + QDeclarativeDebugObjectReference rootObject = findRootObject(); + QDeclarativeDebugObjectQuery *query = m_dbg->queryObjectRecursive(rootObject, this); + waitForQuery(query); + ref = query->object(); + delete query; + + QVERIFY(ref.debugId() >= 0); + + QDeclarativeDebugObjectReference copy(ref); + QDeclarativeDebugObjectReference copyAssign; + copyAssign = ref; + foreach (const QDeclarativeDebugObjectReference &r, (QList() << copy << copyAssign)) + recursiveCompareObjects(r, ref); +} + +void tst_QDeclarativeDebug::tst_QDeclarativeDebugContextReference() +{ + QDeclarativeDebugContextReference ref; + QCOMPARE(ref.debugId(), -1); + QVERIFY(ref.name().isEmpty()); + QVERIFY(ref.objects().isEmpty()); + QVERIFY(ref.contexts().isEmpty()); + + QDeclarativeDebugEnginesQuery *q_engines = m_dbg->queryAvailableEngines(this); + waitForQuery(q_engines); + QDeclarativeDebugRootContextQuery *q_context = m_dbg->queryRootContexts(q_engines->engines()[0].debugId(), this); + waitForQuery(q_context); + + ref = q_context->rootContext(); + delete q_engines; + delete q_context; + QVERIFY(ref.debugId() >= 0); + + QDeclarativeDebugContextReference copy(ref); + QDeclarativeDebugContextReference copyAssign; + copyAssign = ref; + foreach (const QDeclarativeDebugContextReference &r, (QList() << copy << copyAssign)) + recursiveCompareContexts(r, ref); +} + +void tst_QDeclarativeDebug::tst_QDeclarativeDebugPropertyReference() +{ + QDeclarativeDebugObjectReference rootObject = findRootObject(); + QDeclarativeDebugObjectQuery *query = m_dbg->queryObject(rootObject, this); + waitForQuery(query); + QDeclarativeDebugObjectReference obj = query->object(); + delete query; + + QDeclarativeDebugPropertyReference ref = findProperty(obj.properties(), "scale"); + QVERIFY(ref.objectDebugId() > 0); + QVERIFY(!ref.name().isEmpty()); + QVERIFY(!ref.value().isNull()); + QVERIFY(!ref.valueTypeName().isEmpty()); + QVERIFY(!ref.binding().isEmpty()); + QVERIFY(ref.hasNotifySignal()); + + QDeclarativeDebugPropertyReference copy(ref); + QDeclarativeDebugPropertyReference copyAssign; + copyAssign = ref; + foreach (const QDeclarativeDebugPropertyReference &r, (QList() << copy << copyAssign)) + compareProperties(r, ref); +} + +void tst_QDeclarativeDebug::setBindingForObject() +{ + QDeclarativeDebugObjectReference rootObject = findRootObject(); + QVERIFY(rootObject.debugId() != -1); + QDeclarativeDebugPropertyReference widthPropertyRef = findProperty(rootObject.properties(), "width"); + + QCOMPARE(widthPropertyRef.value(), QVariant(10)); + QCOMPARE(widthPropertyRef.binding(), QString()); + + // + // set literal + // + m_dbg->setBindingForObject(rootObject.debugId(), "width", "15", true); + + rootObject = findRootObject(); + widthPropertyRef = findProperty(rootObject.properties(), "width"); + + QCOMPARE(widthPropertyRef.value(), QVariant(15)); + QCOMPARE(widthPropertyRef.binding(), QString()); + + // + // set expression + // + m_dbg->setBindingForObject(rootObject.debugId(), "width", "height", false); + + rootObject = findRootObject(); + widthPropertyRef = findProperty(rootObject.properties(), "width"); + + QCOMPARE(widthPropertyRef.value(), QVariant(20)); + QCOMPARE(widthPropertyRef.binding(), QString("height")); + + // + // reset + // + m_dbg->resetBindingForObject(rootObject.debugId(), "width"); + + rootObject = findRootObject(); + widthPropertyRef = findProperty(rootObject.properties(), "width"); + + // QCOMPARE(widthPropertyRef.value(), QVariant(0)); // TODO: Shouldn't this work? + QCOMPARE(widthPropertyRef.binding(), QString()); + + // + // set handler + // + rootObject = findRootObject(); + QCOMPARE(rootObject.children().size(), 5); // Rectangle, Text, MouseArea, Component.onCompleted, NonScriptPropertyElement + QDeclarativeDebugObjectReference mouseAreaObject = rootObject.children().at(2); + QDeclarativeDebugObjectQuery *q_obj = m_dbg->queryObjectRecursive(mouseAreaObject, this); + waitForQuery(q_obj); + mouseAreaObject = q_obj->object(); + + QCOMPARE(mouseAreaObject.className(), QString("MouseArea")); + + QDeclarativeDebugPropertyReference onEnteredRef = findProperty(mouseAreaObject.properties(), "onEntered"); + + QCOMPARE(onEnteredRef.name(), QString("onEntered")); + QCOMPARE(onEnteredRef.value(), QVariant("{ console.log('hello') }")); + + m_dbg->setBindingForObject(mouseAreaObject.debugId(), "onEntered", "{console.log('hello, world') }", false) ; + + rootObject = findRootObject(); + mouseAreaObject = rootObject.children().at(2); + q_obj = m_dbg->queryObjectRecursive(mouseAreaObject, this); + waitForQuery(q_obj); + mouseAreaObject = q_obj->object(); + onEnteredRef = findProperty(mouseAreaObject.properties(), "onEntered"); + QCOMPARE(onEnteredRef.name(), QString("onEntered")); + QCOMPARE(onEnteredRef.value(), QVariant("{console.log('hello, world') }")); +} + +void tst_QDeclarativeDebug::setBindingInStates() +{ + // Check if changing bindings of propertychanges works + + const int sourceIndex = 3; + + QDeclarativeDebugObjectReference obj = findRootObject(sourceIndex); + + QVERIFY(obj.debugId() != -1); + QVERIFY(obj.children().count() >= 2); + + // We are going to switch state a couple of times, we need to get rid of the transition before + QDeclarativeDebugExpressionQuery *q_deleteTransition = m_dbg->queryExpressionResult(obj.debugId(),QString("transitions = []"),this); + waitForQuery(q_deleteTransition); + delete q_deleteTransition; + + + // check initial value of the property that is changing + QDeclarativeDebugExpressionQuery *q_setState; + q_setState = m_dbg->queryExpressionResult(obj.debugId(),QString("state=\"state1\""),this); + waitForQuery(q_setState); + delete q_setState; + + obj = findRootObject(sourceIndex); + QCOMPARE(findProperty(obj.properties(),"width").value().toInt(),200); + + + q_setState = m_dbg->queryExpressionResult(obj.debugId(),QString("state=\"\""),this); + waitForQuery(q_setState); + delete q_setState; + + + obj = findRootObject(sourceIndex, true); + QCOMPARE(findProperty(obj.properties(),"width").value().toInt(),100); + + + // change the binding + QDeclarativeDebugObjectReference state = obj.children()[0]; + QCOMPARE(state.className(), QString("State")); + QVERIFY(state.children().count() > 0); + + QDeclarativeDebugObjectReference propertyChange = state.children()[0]; + QVERIFY(propertyChange.debugId() != -1); + + QVERIFY( m_dbg->setBindingForObject(propertyChange.debugId(), "width",QVariant(300),true) ); + + // check properties changed in state + obj = findRootObject(sourceIndex); + QCOMPARE(findProperty(obj.properties(),"width").value().toInt(),100); + + + q_setState = m_dbg->queryExpressionResult(obj.debugId(),QString("state=\"state1\""),this); + waitForQuery(q_setState); + delete q_setState; + + obj = findRootObject(sourceIndex); + QCOMPARE(findProperty(obj.properties(),"width").value().toInt(),300); + + // check changing properties of base state from within a state + QVERIFY(m_dbg->setBindingForObject(obj.debugId(),"width","height*2",false)); + QVERIFY(m_dbg->setBindingForObject(obj.debugId(),"height","200",true)); + + obj = findRootObject(sourceIndex); + QCOMPARE(findProperty(obj.properties(),"width").value().toInt(),300); + + q_setState = m_dbg->queryExpressionResult(obj.debugId(),QString("state=\"\""),this); + waitForQuery(q_setState); + delete q_setState; + + obj = findRootObject(sourceIndex); + QCOMPARE(findProperty(obj.properties(),"width").value().toInt(), 400); + + // reset binding while in a state + q_setState = m_dbg->queryExpressionResult(obj.debugId(),QString("state=\"state1\""),this); + waitForQuery(q_setState); + delete q_setState; + + obj = findRootObject(sourceIndex); + QCOMPARE(findProperty(obj.properties(),"width").value().toInt(), 300); + + m_dbg->resetBindingForObject(propertyChange.debugId(), "width"); + + obj = findRootObject(sourceIndex); + QCOMPARE(findProperty(obj.properties(),"width").value().toInt(), 400); + + // re-add binding + m_dbg->setBindingForObject(propertyChange.debugId(), "width", "300", true); + + obj = findRootObject(sourceIndex); + QCOMPARE(findProperty(obj.properties(),"width").value().toInt(), 300); +} + +void tst_QDeclarativeDebug::queryObjectTree() +{ + const int sourceIndex = 3; + + // Check if states/transitions are initialized when fetching root item + QDeclarativeDebugEnginesQuery *q_engines = m_dbg->queryAvailableEngines(this); + waitForQuery(q_engines); + + QDeclarativeDebugRootContextQuery *q_context = m_dbg->queryRootContexts(q_engines->engines()[0].debugId(), this); + waitForQuery(q_context); + + QVERIFY(q_context->rootContext().objects().count() > sourceIndex); + QDeclarativeDebugObjectReference rootObject = q_context->rootContext().objects()[sourceIndex]; + + QDeclarativeDebugObjectQuery *q_obj = m_dbg->queryObjectRecursive(rootObject, this); + waitForQuery(q_obj); + + QDeclarativeDebugObjectReference obj = q_obj->object(); + + delete q_engines; + delete q_context; + delete q_obj; + + QVERIFY(obj.debugId() != -1); + QVERIFY(obj.children().count() >= 2); + + + + // check state + QDeclarativeDebugObjectReference state = obj.children()[0]; + QCOMPARE(state.className(), QString("State")); + QVERIFY(state.children().count() > 0); + + QDeclarativeDebugObjectReference propertyChange = state.children()[0]; + QVERIFY(propertyChange.debugId() != -1); + + QDeclarativeDebugPropertyReference propertyChangeTarget = findProperty(propertyChange.properties(),"target"); + QCOMPARE(propertyChangeTarget.objectDebugId(), propertyChange.debugId()); + + QDeclarativeDebugObjectReference targetReference = qvariant_cast(propertyChangeTarget.value()); + QVERIFY(targetReference.debugId() != -1); + + + + // check transition + QDeclarativeDebugObjectReference transition = obj.children()[1]; + QCOMPARE(transition.className(), QString("Transition")); + QCOMPARE(findProperty(transition.properties(),"from").value().toString(), QString("*")); + QCOMPARE(findProperty(transition.properties(),"to").value(), findProperty(state.properties(),"name").value()); + QVERIFY(transition.children().count() > 0); + + QDeclarativeDebugObjectReference animation = transition.children()[0]; + QVERIFY(animation.debugId() != -1); + + QDeclarativeDebugPropertyReference animationTarget = findProperty(animation.properties(),"target"); + QCOMPARE(animationTarget.objectDebugId(), animation.debugId()); + + targetReference = qvariant_cast(animationTarget.value()); + QVERIFY(targetReference.debugId() != -1); + + QCOMPARE(findProperty(animation.properties(),"property").value().toString(), QString("width")); + QCOMPARE(findProperty(animation.properties(),"duration").value().toInt(), 100); +} + +int main(int argc, char *argv[]) +{ + int _argc = argc + 1; + char **_argv = new char*[_argc]; + for (int i = 0; i < argc; ++i) + _argv[i] = argv[i]; + _argv[_argc - 1] = "-qmljsdebugger=port:3768"; + + QApplication app(_argc, _argv); + tst_QDeclarativeDebug tc; + return QTest::qExec(&tc, _argc, _argv); + delete _argv; +} + +#include "tst_qdeclarativedebug.moc" diff --git a/tests/auto/declarative/qdeclarativedebugclient/qdeclarativedebugclient.pro b/tests/auto/declarative/qdeclarativedebugclient/qdeclarativedebugclient.pro new file mode 100644 index 00000000..8fa87d29 --- /dev/null +++ b/tests/auto/declarative/qdeclarativedebugclient/qdeclarativedebugclient.pro @@ -0,0 +1,9 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += network declarative +macx:CONFIG -= app_bundle + +HEADERS += ../shared/debugutil_p.h +SOURCES += tst_qdeclarativedebugclient.cpp \ + ../shared/debugutil.cpp + +CONFIG += declarative_debug diff --git a/tests/auto/declarative/qdeclarativedebugclient/tst_qdeclarativedebugclient.cpp b/tests/auto/declarative/qdeclarativedebugclient/tst_qdeclarativedebugclient.cpp new file mode 100644 index 00000000..43b6b654 --- /dev/null +++ b/tests/auto/declarative/qdeclarativedebugclient/tst_qdeclarativedebugclient.cpp @@ -0,0 +1,154 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include "../../../shared/util.h" +#include "../shared/debugutil_p.h" + +class tst_QDeclarativeDebugClient : public QObject +{ + Q_OBJECT + +private: + QDeclarativeDebugConnection *m_conn; + +private slots: + void initTestCase(); + + void name(); + void status(); + void sendMessage(); +}; + +void tst_QDeclarativeDebugClient::initTestCase() +{ + QTest::ignoreMessage(QtDebugMsg, "QDeclarativeDebugServer: Waiting for connection on port 13770..."); + new QDeclarativeEngine(this); + + m_conn = new QDeclarativeDebugConnection(this); + + QDeclarativeDebugTestClient client("tst_QDeclarativeDebugClient::handshake()", m_conn); + QDeclarativeDebugTestService service("tst_QDeclarativeDebugClient::handshake()"); + + m_conn->connectToHost("127.0.0.1", 13770); + + QTest::ignoreMessage(QtDebugMsg, "QDeclarativeDebugServer: Connection established"); + bool ok = m_conn->waitForConnected(); + QVERIFY(ok); + + QTRY_VERIFY(QDeclarativeDebugService::hasDebuggingClient()); + QTRY_COMPARE(client.status(), QDeclarativeDebugClient::Enabled); +} + +void tst_QDeclarativeDebugClient::name() +{ + QString name = "tst_QDeclarativeDebugClient::name()"; + + QDeclarativeDebugClient client(name, m_conn); + QCOMPARE(client.name(), name); +} + +void tst_QDeclarativeDebugClient::status() +{ + { + QDeclarativeDebugConnection dummyConn; + QDeclarativeDebugClient client("tst_QDeclarativeDebugClient::status()", &dummyConn); + QCOMPARE(client.status(), QDeclarativeDebugClient::NotConnected); + } + + QDeclarativeDebugTestClient client("tst_QDeclarativeDebugClient::status()", m_conn); + QCOMPARE(client.status(), QDeclarativeDebugClient::Unavailable); + + { + QDeclarativeDebugTestService service("tst_QDeclarativeDebugClient::status()"); + QTRY_COMPARE(client.status(), QDeclarativeDebugClient::Enabled); + } + + QTRY_COMPARE(client.status(), QDeclarativeDebugClient::Unavailable); + + // duplicate plugin name + QTest::ignoreMessage(QtWarningMsg, "QDeclarativeDebugClient: Conflicting plugin name \"tst_QDeclarativeDebugClient::status()\" "); + QDeclarativeDebugClient client2("tst_QDeclarativeDebugClient::status()", m_conn); + QCOMPARE(client2.status(), QDeclarativeDebugClient::NotConnected); + + QDeclarativeDebugClient client3("tst_QDeclarativeDebugClient::status3()", 0); + QCOMPARE(client3.status(), QDeclarativeDebugClient::NotConnected); +} + +void tst_QDeclarativeDebugClient::sendMessage() +{ + QDeclarativeDebugTestService service("tst_QDeclarativeDebugClient::sendMessage()"); + QDeclarativeDebugTestClient client("tst_QDeclarativeDebugClient::sendMessage()", m_conn); + + QByteArray msg = "hello!"; + + QTRY_COMPARE(client.status(), QDeclarativeDebugClient::Enabled); + + client.sendMessage(msg); + QByteArray resp = client.waitForResponse(); + QCOMPARE(resp, msg); +} + +int main(int argc, char *argv[]) +{ + int _argc = argc + 1; + char **_argv = new char*[_argc]; + for (int i = 0; i < argc; ++i) + _argv[i] = argv[i]; + _argv[_argc - 1] = "-qmljsdebugger=port:13770"; + + QApplication app(_argc, _argv); + tst_QDeclarativeDebugClient tc; + return QTest::qExec(&tc, _argc, _argv); + delete _argv; +} + +#include "tst_qdeclarativedebugclient.moc" + diff --git a/tests/auto/declarative/qdeclarativedebughelper/private_headers/qdeclarativedebughelper_p.h b/tests/auto/declarative/qdeclarativedebughelper/private_headers/qdeclarativedebughelper_p.h new file mode 100644 index 00000000..9ef2df90 --- /dev/null +++ b/tests/auto/declarative/qdeclarativedebughelper/private_headers/qdeclarativedebughelper_p.h @@ -0,0 +1,71 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtDeclarative module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QDECLARATIVEDEBUGHELPER_P_H +#define QDECLARATIVEDEBUGHELPER_P_H + +#include + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +class QScriptEngine; +class QDeclarativeEngine; + +// Helper methods to access private API through a stable interface +// This is used in the qmljsdebugger library of QtCreator. +class Q_DECLARATIVE_EXPORT QDeclarativeDebugHelper +{ +public: + static QScriptEngine *getScriptEngine(QDeclarativeEngine *engine); + static void setAnimationSlowDownFactor(qreal factor); + + // Enables remote debugging functionality + // Only use this for debugging in a safe environment! + static void enableDebugging(); +}; + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif // QDECLARATIVEDEBUGHELPER_P_H diff --git a/tests/auto/declarative/qdeclarativedebughelper/qdeclarativedebughelper.pro b/tests/auto/declarative/qdeclarativedebughelper/qdeclarativedebughelper.pro new file mode 100644 index 00000000..c52c6524 --- /dev/null +++ b/tests/auto/declarative/qdeclarativedebughelper/qdeclarativedebughelper.pro @@ -0,0 +1,5 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += network declarative script +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativedebughelper.cpp diff --git a/tests/auto/declarative/qdeclarativedebughelper/tst_qdeclarativedebughelper.cpp b/tests/auto/declarative/qdeclarativedebughelper/tst_qdeclarativedebughelper.cpp new file mode 100644 index 00000000..ac4c992e --- /dev/null +++ b/tests/auto/declarative/qdeclarativedebughelper/tst_qdeclarativedebughelper.cpp @@ -0,0 +1,122 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include + +#include +#include +#include +#include + +// We have copied the header which is used in the qmljsdebugger (part of QtCreator) +// to catch BC changes. Don't update it unless you know what you are doing! +#include "private_headers/qdeclarativedebughelper_p.h" + +class tst_qdeclarativedebughelper : public QObject { + Q_OBJECT +private slots: + void getScriptEngine(); + void setAnimationSlowDownFactor(); + void enableDebugging(); +}; + +class TestAnimation : public QAbstractAnimation { +public: + int updateCalled; + + TestAnimation() : updateCalled(0) {} + + virtual void updateCurrentTime(int /*currentTime*/) { + updateCalled++; + } + virtual int duration() const { + return 100; + } +}; + +void tst_qdeclarativedebughelper::getScriptEngine() +{ + QDeclarativeEngine engine; + + QScriptEngine *scriptEngine = QDeclarativeDebugHelper::getScriptEngine(&engine); + QVERIFY(scriptEngine); + QCOMPARE(scriptEngine, QDeclarativeEnginePrivate::getScriptEngine(&engine)); +} + +void tst_qdeclarativedebughelper::setAnimationSlowDownFactor() +{ + TestAnimation animation; + + // first check whether setup works + QCOMPARE(animation.updateCalled, 0); + animation.start(); + QTest::qWait(animation.totalDuration() + 50); +#ifdef Q_OS_WIN + if (animation.state() != QAbstractAnimation::Stopped) + QEXPECT_FAIL("", "On windows, consistent timing is not working properly due to bad timer resolution", Abort); +#endif + QCOMPARE(animation.state(), QAbstractAnimation::Stopped); + QVERIFY(animation.updateCalled > 1); + + // check if we can pause all animations + animation.updateCalled = 0; + QDeclarativeDebugHelper::setAnimationSlowDownFactor(0.0); + animation.start(); + QTest::qWait(animation.totalDuration() + 50); + QVERIFY(animation.updateCalled <= 1); // updateCurrentTime seems to be called at least once + + // now run them again + animation.updateCalled = 0; + QDeclarativeDebugHelper::setAnimationSlowDownFactor(2.0); + animation.start(); + QTest::qWait(animation.totalDuration() + 50); + QVERIFY(animation.updateCalled > 1); +} + +void tst_qdeclarativedebughelper::enableDebugging() +{ + QTest::ignoreMessage(QtWarningMsg, "Qml debugging is enabled. Only use this in a safe environment!"); + QDeclarativeDebugHelper::enableDebugging(); +} + +QTEST_MAIN(tst_qdeclarativedebughelper) + +#include "tst_qdeclarativedebughelper.moc" + diff --git a/tests/auto/declarative/qdeclarativedebugjs/app/app.pro b/tests/auto/declarative/qdeclarativedebugjs/app/app.pro new file mode 100644 index 00000000..d1c0cddf --- /dev/null +++ b/tests/auto/declarative/qdeclarativedebugjs/app/app.pro @@ -0,0 +1,13 @@ +TEMPLATE = app + +QT += declarative +CONFIG += declarative_debug + +CONFIG += console +CONFIG -= app_bundle + +DESTDIR = ./ + +INSTALLS = + +SOURCES += main.cpp diff --git a/tests/auto/declarative/qdeclarativedebugjs/app/main.cpp b/tests/auto/declarative/qdeclarativedebugjs/app/main.cpp new file mode 100644 index 00000000..18a7a5f8 --- /dev/null +++ b/tests/auto/declarative/qdeclarativedebugjs/app/main.cpp @@ -0,0 +1,69 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtDeclarative module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#include +#include + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + + const QUrl path = QUrl::fromLocalFile(app.arguments().last()); + + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine, path); + + if (!component.isReady()) { + qWarning() << component.errorString(); + return -1; + } + + QObject *obj = component.create(); + +// printf("%u\n", QDeclarativeDebugService::idForObject(obj)); +// fflush(stdout); + + return app.exec(); +} diff --git a/tests/auto/declarative/qdeclarativedebugjs/data/backtrace1.js b/tests/auto/declarative/qdeclarativedebugjs/data/backtrace1.js new file mode 100644 index 00000000..f96f8e96 --- /dev/null +++ b/tests/auto/declarative/qdeclarativedebugjs/data/backtrace1.js @@ -0,0 +1,28 @@ +function function2InScript(a) +{ + logger("return function2InScript"); + root.result = a; +} + +function functionInScript(a, b) +{ + logger("enter functionInScript"); + var names = ["Clark Kent", "Peter Parker", "Bruce Wayne"]; + var aliases = ["Superman", "Spiderman", "Batman"]; + var details = { + category: "Superheroes", + names: names, + aliases: aliases + }; + function2InScript(a + b); + logger("return functionInScript"); + return details; +} + +function logger(msg) +{ + //console.log(msg); + return true; +} + +//DO NOT CHANGE CODE ABOVE THIS LINE diff --git a/tests/auto/declarative/qdeclarativedebugjs/data/backtrace1.qml b/tests/auto/declarative/qdeclarativedebugjs/data/backtrace1.qml new file mode 100644 index 00000000..f062bb96 --- /dev/null +++ b/tests/auto/declarative/qdeclarativedebugjs/data/backtrace1.qml @@ -0,0 +1,41 @@ +import QtQuick 1.0 +import "backtrace1.js" as Script + +Item { + id: root + + property int result:0 + + Component.onCompleted: + { + root.result = 10; + Script.functionInScript(4,5); + root.name = "nemo"; + Script.logger(root.simpleBinding); + } + + //DO NOT CHANGE CODE ABOVE + //ADD CODE FROM HERE + + property string name + property int simpleBinding: result + + VisualItemModel { + id: itemModel + Rectangle { height: 30; width: 80; color: "red" } + Rectangle { height: 30; width: 80; color: "green" } + Rectangle { height: 30; width: 80; color: "blue" } + } + + ListView { + anchors.fill: parent + model: itemModel + + Component.onCompleted: + { + Script.logger("List Loaded"); + } + } + +} + diff --git a/tests/auto/declarative/qdeclarativedebugjs/qdeclarativedebugjs.pro b/tests/auto/declarative/qdeclarativedebugjs/qdeclarativedebugjs.pro new file mode 100644 index 00000000..720de192 --- /dev/null +++ b/tests/auto/declarative/qdeclarativedebugjs/qdeclarativedebugjs.pro @@ -0,0 +1,4 @@ +TEMPLATE = subdirs + +SUBDIRS = tst_qdeclarativedebugjs.pro \ + app diff --git a/tests/auto/declarative/qdeclarativedebugjs/tst_qdeclarativedebugjs.cpp b/tests/auto/declarative/qdeclarativedebugjs/tst_qdeclarativedebugjs.cpp new file mode 100644 index 00000000..096f3905 --- /dev/null +++ b/tests/auto/declarative/qdeclarativedebugjs/tst_qdeclarativedebugjs.cpp @@ -0,0 +1,1443 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "../../../shared/util.h" +#include "../shared/debugutil_p.h" + +class QJSDebugClient : public QDeclarativeDebugClient +{ + Q_OBJECT +public: + QJSDebugClient(QDeclarativeDebugConnection *connection) : QDeclarativeDebugClient(QLatin1String("JSDebugger"), connection) {} + + void ping(); + void exec(const QByteArray &debuggerId, const QString &expr); + void setBreakpoints(const QSet &breakpoints); + void setWatchExpressions(const QStringList &watchExpressions); + void stepOver(); + void stepInto(); + void interrupt(); + void stepOut(); + void continueExecution(); + void expandObjectById(const QByteArray& objectName, quint64 objectId); + void setProperty(const QByteArray& id, qint64 objectId, const QString &property, const QString &value); + void activateFrame(int frameId); + void startCoverageCompleted(); + void startCoverageRun(); + + // info from last exec + JSAgentWatchData exec_data; + QByteArray exec_iname; + + QByteArray object_name; + QList object_children; + + int frame_id; + + // info from last stop + QList break_stackFrames; + QList break_watches; + QList break_locals; + bool break_becauseOfException; + QString break_error; + +signals: + void statusHasChanged(); + + void pong(); + void result(); + void stopped(); + void expanded(); + void watchTriggered(); + void coverageScriptLoaded(); + void coverageFuncEntered(); + void coverageFuncExited(); + void coveragePosChanged(); + void coverageCompleted(); + +protected: + virtual void statusChanged(Status status); + virtual void messageReceived(const QByteArray &data); + +private: + int m_ping; +}; + +class QJSDebugProcess : public QObject +{ + Q_OBJECT +public: + QJSDebugProcess(); + ~QJSDebugProcess(); + + void start(const QStringList &arguments); + bool waitForStarted(); + +private slots: + void processAppOutput(); + +private: + QProcess m_process; + QTimer m_timer; + QEventLoop m_eventLoop; + bool m_started; +}; + +class tst_QDeclarativeDebugJS : public QObject +{ + Q_OBJECT +private: + QDeclarativeDebugConnection *m_conn; + QDeclarativeEngine *m_engine; + QJSDebugClient *m_client; + +private slots: + void pingPong(); + void exec(); + void setBreakpoint(); + void stepOver(); + void stepInto(); + void interrupt(); + void stepOut(); + void continueExecution(); + void expandObject(); + void setProperty(); + void setProperty2(); + void watchExpression(); + void activateFrame(); + void setBreakpoint2(); + void stepOver2(); + void stepInto2(); + void interrupt2(); + void stepOut2(); + void continueExecution2(); + void expandObject2(); + void setProperty3(); + void setProperty4(); + void activateFrame2(); + void verifyQMLOptimizerDisabled(); + void testCoverageCompleted(); + void testCoverageRun(); + +}; + + +void QJSDebugClient::ping() +{ + m_ping++; + QByteArray reply; + QDataStream rs(&reply, QIODevice::WriteOnly); + QByteArray cmd = "PING"; + rs << cmd; + rs << m_ping; + sendMessage(reply); +} + +void QJSDebugClient::exec(const QByteArray &debuggerId, const QString &expr) +{ + QByteArray reply; + QDataStream rs(&reply, QIODevice::WriteOnly); + QByteArray cmd = "EXEC"; + rs << cmd; + rs << debuggerId; + rs << expr; + sendMessage(reply); +} + +void QJSDebugClient::setBreakpoints(const QSet &breakpoints) +{ + QByteArray reply; + QDataStream rs(&reply, QIODevice::WriteOnly); + QByteArray cmd = "BREAKPOINTS"; + rs << cmd + << breakpoints; + sendMessage(reply); +} + +void QJSDebugClient::setWatchExpressions(const QStringList &watchExpressions) +{ + QByteArray reply; + QDataStream rs(&reply, QIODevice::WriteOnly); + QByteArray cmd = "WATCH_EXPRESSIONS"; + rs << cmd + << watchExpressions; + sendMessage(reply); +} + +void QJSDebugClient::stepOver() +{ + QByteArray reply; + QDataStream rs(&reply, QIODevice::WriteOnly); + QByteArray cmd = "STEPOVER"; + rs << cmd; + sendMessage(reply); +} + +void QJSDebugClient::stepInto() +{ + QByteArray reply; + QDataStream rs(&reply, QIODevice::WriteOnly); + QByteArray cmd = "STEPINTO"; + rs << cmd; + sendMessage(reply); +} + +void QJSDebugClient::interrupt() +{ + QByteArray reply; + QDataStream rs(&reply, QIODevice::WriteOnly); + QByteArray cmd = "INTERRUPT"; + rs << cmd; + sendMessage(reply); +} + +void QJSDebugClient::stepOut() +{ + QByteArray reply; + QDataStream rs(&reply, QIODevice::WriteOnly); + QByteArray cmd = "STEPOUT"; + rs << cmd; + sendMessage(reply); +} + +void QJSDebugClient::continueExecution() +{ + QByteArray reply; + QDataStream rs(&reply, QIODevice::WriteOnly); + QByteArray cmd = "CONTINUE"; + rs << cmd; + sendMessage(reply); +} + +void QJSDebugClient::expandObjectById(const QByteArray& objectName, quint64 objectId) +{ + QByteArray reply; + QDataStream rs(&reply, QIODevice::WriteOnly); + QByteArray cmd = "EXPAND"; + rs << cmd + << objectName + << objectId; + sendMessage(reply); +} + +void QJSDebugClient::setProperty(const QByteArray& id, qint64 objectId, const QString &property, const QString &value) +{ + QByteArray reply; + QDataStream rs(&reply, QIODevice::WriteOnly); + QByteArray cmd = "SET_PROPERTY"; + rs << cmd + << id + << objectId + << property + << value; + sendMessage(reply); +} + +void QJSDebugClient::activateFrame(int frameId) +{ + QByteArray reply; + QDataStream rs(&reply, QIODevice::WriteOnly); + QByteArray cmd = "ACTIVATE_FRAME"; + rs << cmd + << frameId; + sendMessage(reply); +} + +void QJSDebugClient::startCoverageRun() +{ + QByteArray reply; + QDataStream rs(&reply, QIODevice::WriteOnly); + QByteArray cmd = "COVERAGE"; + bool enabled = true; + rs << cmd + << enabled; + sendMessage(reply); +} + +void QJSDebugClient::startCoverageCompleted() +{ + QByteArray reply; + QDataStream rs(&reply, QIODevice::WriteOnly); + QByteArray cmd = "COVERAGE"; + bool enabled = false; + rs << cmd + << enabled; + sendMessage(reply); +} + +void QJSDebugClient::statusChanged(Status /*status*/) +{ + emit statusHasChanged(); +} + +void QJSDebugClient::messageReceived(const QByteArray &data) +{ + QByteArray rwData = data; + QDataStream stream(&rwData, QIODevice::ReadOnly); + + QByteArray command; + stream >> command; + + if (command == "STOPPED") { + stream >> break_stackFrames >> break_watches >> break_locals >> break_becauseOfException >> break_error; + if (!break_becauseOfException) { + break_error.clear(); + } + emit stopped(); + } else if (command == "RESULT") { + stream >> exec_iname; + stream >> exec_data; + emit result(); + } else if (command == "EXPANDED") { + stream >> object_name >> object_children; + emit expanded(); + } else if (command == "LOCALS") { + stream >> frame_id >> break_locals; + if (!stream.atEnd()) { // compatibility with jsdebuggeragent from 2.1, 2.2 + stream >> break_watches; + } + emit watchTriggered(); + } else if (command == "PONG") { + int ping; + stream >> ping; + QCOMPARE(ping, m_ping); + emit pong(); + } else if (command == "COVERAGE") { + qint64 time; + int messageType; + qint64 scriptId; + QString program; + QString fileName; + int baseLineNumber; + int lineNumber; + int columnNumber; + QString returnValue; + + stream >> time >> messageType >> scriptId >> program >> fileName >> baseLineNumber + >> lineNumber >> columnNumber >> returnValue; + if (messageType == CoverageComplete) { + emit coverageCompleted(); + } else if (messageType == CoverageScriptLoad) { + emit coverageScriptLoaded(); + } else if (messageType == CoveragePosChange) { + emit coveragePosChanged(); + } else if (messageType == CoverageFuncEntry) { + emit coverageFuncEntered(); + } else if (messageType == CoverageFuncExit) { + emit coverageFuncExited(); + } + } else { + QFAIL("Unknown message :" + command); + } + QVERIFY(stream.atEnd()); +} + +QJSDebugProcess::QJSDebugProcess() + : m_started(false) +{ + m_process.setProcessChannelMode(QProcess::MergedChannels); + connect(&m_process, SIGNAL(readyReadStandardOutput()), this, SLOT(processAppOutput())); + connect(&m_timer, SIGNAL(timeout()), &m_eventLoop, SLOT(quit())); + m_timer.setSingleShot(true); + m_timer.setInterval(5000); + QStringList environment = QProcess::systemEnvironment(); + environment.append("QML_DISABLE_OPTIMIZER=1"); + m_process.setEnvironment(environment); +} + +QJSDebugProcess::~QJSDebugProcess() +{ + if (m_process.state() != QProcess::NotRunning) { + m_process.kill(); + m_process.waitForFinished(5000); + } +} + +void QJSDebugProcess::start(const QStringList &arguments) +{ + QString currentDir = QFileInfo(__FILE__).absoluteDir().absolutePath(); + m_process.start(currentDir + "/app/app", arguments); + m_timer.start(); +} + +bool QJSDebugProcess::waitForStarted() +{ + m_eventLoop.exec(QEventLoop::ExcludeUserInputEvents); + + return m_started; +} + +void QJSDebugProcess::processAppOutput() +{ + const QString appOutput = m_process.readAll(); + static QRegExp newline("[\n\r]{1,2}"); + QStringList lines = appOutput.split(newline); + foreach (const QString &line, lines) { + if (line.isEmpty()) + continue; + if (line.startsWith("Qml debugging is enabled")) // ignore + continue; + if (line.startsWith("QDeclarativeDebugServer:")) { + if (line.contains("Waiting for connection ")) { + m_started = true; + m_eventLoop.quit(); + continue; + } + if (line.contains("Connection established")) { + continue; + } + } + qDebug() << line; + } +} + +inline QString TEST_FILE(const QString &filename) +{ + QFileInfo fileInfo(__FILE__); + return fileInfo.absoluteDir().filePath("data/" + filename); +} + +void tst_QDeclarativeDebugJS::pingPong() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QJSDebugClient client(&connection); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + client.ping(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(pong()))); +} + +void tst_QDeclarativeDebugJS::exec() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QJSDebugClient client(&connection); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + // Evaluate script without context + client.exec("queryid", "1+1"); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(result()))); + QCOMPARE(client.exec_iname, QByteArray("queryid")); + QCOMPARE(client.exec_data.exp, QByteArray("1+1")); + QCOMPARE(client.exec_data.name, QByteArray("1+1")); + QCOMPARE(client.exec_data.hasChildren, false); + QCOMPARE(client.exec_data.type, QByteArray("Number")); + QCOMPARE(client.exec_data.value, QByteArray("2")); + + // TODO: Test access to context after breakpoint is hit +} + + +void tst_QDeclarativeDebugJS::setBreakpoint() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded(); + bp1.lineNumber = 11; + + //TEST LINE + client.setBreakpoints(QSet() << bp1); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + JSAgentStackData data = client.break_stackFrames.at(0); + QCOMPARE(data.fileUrl, bp1.fileUrl); + QCOMPARE(data.lineNumber, bp1.lineNumber); + +} + +void tst_QDeclarativeDebugJS::stepOver() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded(); + bp1.lineNumber = 11; + + client.setBreakpoints(QSet() << bp1); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + //TEST LINE + client.stepOver(); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + JSAgentStackData data = client.break_stackFrames.at(0); + QCOMPARE(data.fileUrl, bp1.fileUrl); + QCOMPARE(data.lineNumber, bp1.lineNumber +1); +} + +void tst_QDeclarativeDebugJS::stepInto() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded(); + bp1.lineNumber = 12; + + client.setBreakpoints(QSet() << bp1); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + //TEST LINE + client.stepInto(); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + QByteArray functionName("functionInScript"); + JSAgentStackData data = client.break_stackFrames.at(0); + QCOMPARE(data.functionName, functionName); + QCOMPARE(data.fileUrl, QByteArray(QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded())); +} + +void tst_QDeclarativeDebugJS::interrupt() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded(); + bp1.lineNumber = 12; + + client.setBreakpoints(QSet() << bp1); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + //TEST LINE + client.interrupt(); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + QByteArray functionName("functionInScript"); + JSAgentStackData data = client.break_stackFrames.at(0); + QCOMPARE(data.functionName, functionName); + QCOMPARE(data.fileUrl, QByteArray(QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded())); +} + +void tst_QDeclarativeDebugJS::stepOut() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1,bp2; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded(); + bp1.lineNumber = 12; + + bp2.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded(); + bp2.lineNumber = 13; + + client.setBreakpoints(QSet() << bp1 << bp2); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + client.stepInto(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + //TEST LINE + client.stepOut(); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + JSAgentStackData data = client.break_stackFrames.at(0); + + QCOMPARE(data.fileUrl, bp2.fileUrl); + QCOMPARE(data.lineNumber, bp2.lineNumber); + +} + +void tst_QDeclarativeDebugJS::continueExecution() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1, bp2; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded(); + bp1.lineNumber = 11; + + bp2.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded(); + bp2.lineNumber = 13; + + client.setBreakpoints(QSet() << bp1 << bp2); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + //TEST LINE + client.continueExecution(); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + JSAgentStackData data = client.break_stackFrames.at(0); + QCOMPARE(data.fileUrl, bp2.fileUrl); + QCOMPARE(data.lineNumber, bp2.lineNumber); +} + +void tst_QDeclarativeDebugJS::expandObject() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded(); + bp1.lineNumber = 17; + + client.setBreakpoints(QSet() << bp1); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + foreach ( JSAgentWatchData data, client.break_locals) + { + if( data.name == "details") + { + //TEST LINE + client.expandObjectById(data.name,data.objectId); + } + } + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(expanded()))); + QCOMPARE(client.object_name,QByteArray("details")); + QCOMPARE(client.object_children.at(0).name,QByteArray("category")); + QCOMPARE(client.object_children.at(0).type,QByteArray("String")); + QCOMPARE(client.object_children.at(1).name,QByteArray("names")); + QCOMPARE(client.object_children.at(1).type,QByteArray("Array")); + QCOMPARE(client.object_children.at(2).name,QByteArray("aliases")); + QCOMPARE(client.object_children.at(2).type,QByteArray("Array")); + +} + +void tst_QDeclarativeDebugJS::setProperty() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1, bp2; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded(); + bp1.lineNumber = 17; + bp2.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded(); + bp2.lineNumber = 18; + + client.setBreakpoints(QSet() << bp1 << bp2); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + quint64 objectId; + QByteArray objectName; + + foreach ( JSAgentWatchData data, client.break_locals) + { + if( data.name == "details") + { + objectId = data.objectId; + objectName = data.name; + //TEST LINE + client.setProperty(data.name, data.objectId, "total", "names.length"); + } + } + + client.continueExecution(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + client.expandObjectById(objectName,objectId); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(expanded()))); + + QCOMPARE(client.object_name,QByteArray("details")); + QCOMPARE(client.object_children.at(0).name,QByteArray("category")); + QCOMPARE(client.object_children.at(0).type,QByteArray("String")); + QCOMPARE(client.object_children.at(0).value,QByteArray("Superheroes")); + QCOMPARE(client.object_children.at(1).name,QByteArray("names")); + QCOMPARE(client.object_children.at(1).type,QByteArray("Array")); + QCOMPARE(client.object_children.at(2).name,QByteArray("aliases")); + QCOMPARE(client.object_children.at(2).type,QByteArray("Array")); + QCOMPARE(client.object_children.at(3).name,QByteArray("total")); + QCOMPARE(client.object_children.at(3).type,QByteArray("Number")); + // foreach ( JSAgentWatchData data, client.object_children) + // { + // qDebug() << data.name << data.type << data.value; + // } +} + +void tst_QDeclarativeDebugJS::setProperty2() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1, bp2; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded(); + bp1.lineNumber = 17; + bp2.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded(); + bp2.lineNumber = 18; + + client.setBreakpoints(QSet() << bp1 << bp2); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + quint64 objectId; + QByteArray objectName; + + foreach ( JSAgentWatchData data, client.break_locals) + { + if( data.name == "details") + { + objectId = data.objectId; + objectName = data.name; + //TEST LINE + client.setProperty(data.name, data.objectId, "category", data.name + ".category = 'comic characters'"); + } + } + + client.continueExecution(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + client.expandObjectById(objectName,objectId); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(expanded()))); + + QCOMPARE(client.object_name,QByteArray("details")); + QCOMPARE(client.object_children.at(0).name,QByteArray("category")); + QCOMPARE(client.object_children.at(0).type,QByteArray("String")); + QCOMPARE(client.object_children.at(0).value,QByteArray("comic characters")); + QCOMPARE(client.object_children.at(1).name,QByteArray("names")); + QCOMPARE(client.object_children.at(1).type,QByteArray("Array")); + QCOMPARE(client.object_children.at(2).name,QByteArray("aliases")); + QCOMPARE(client.object_children.at(2).type,QByteArray("Array")); + + // foreach ( JSAgentWatchData data, client.object_children) + // { + // qDebug() << data.name << data.type << data.value; + // } +} + +void tst_QDeclarativeDebugJS::watchExpression() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + QByteArray watchExpression("root.result = 20"); + QStringList watchList; + watchList.append(QString(watchExpression)); + + //TEST LINE + client.setWatchExpressions(watchList); + + JSAgentBreakpointData bp1; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded(); + bp1.lineNumber = 11; + + client.setBreakpoints(QSet() << bp1); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + JSAgentWatchData data = client.break_watches.at(0); + QCOMPARE(data.exp, watchExpression); + QCOMPARE(data.value.toInt(), 20); + QCOMPARE(data.type, QByteArray("Number")); +} + +void tst_QDeclarativeDebugJS::activateFrame() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1, bp2; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded(); + bp1.lineNumber = 3; + + client.setBreakpoints(QSet() << bp1); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + client.stepInto(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + //TEST LINE + client.activateFrame(2); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(watchTriggered()))); + + QCOMPARE(client.break_locals.at(1).name,QByteArray("names")); + QCOMPARE(client.break_locals.at(1).type,QByteArray("Array")); + QCOMPARE(client.break_locals.at(2).name,QByteArray("a")); + QCOMPARE(client.break_locals.at(2).type,QByteArray("Number")); + QCOMPARE(client.break_locals.at(2).value,QByteArray("4")); + QCOMPARE(client.break_locals.at(3).name,QByteArray("b")); + QCOMPARE(client.break_locals.at(3).type,QByteArray("Number")); + QCOMPARE(client.break_locals.at(3).value,QByteArray("5")); + + // foreach ( JSAgentWatchData data, client.break_locals) + // { + // qDebug() << data.name << data.type << data.value; + // } + +} + +void tst_QDeclarativeDebugJS::setBreakpoint2() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded(); + bp1.lineNumber = 40; + + //TEST LINE + client.setBreakpoints(QSet() << bp1); + QVERIFY(!QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); +} + +void tst_QDeclarativeDebugJS::stepOver2() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded(); + bp1.lineNumber = 11; + + client.setBreakpoints(QSet() << bp1); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + //TEST LINE + client.stepOver(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + client.stepOver(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + JSAgentStackData data = client.break_stackFrames.at(0); + QCOMPARE(data.fileUrl, bp1.fileUrl); + QCOMPARE(data.lineNumber, bp1.lineNumber +2); +} + +void tst_QDeclarativeDebugJS::stepInto2() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded(); + bp1.lineNumber = 17; + + client.setBreakpoints(QSet() << bp1); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + //TEST LINE + client.stepInto(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + client.stepInto(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + QByteArray functionName("logger"); + JSAgentStackData data = client.break_stackFrames.at(0); + QCOMPARE(data.functionName, functionName); + QCOMPARE(data.fileUrl, QByteArray(QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded())); +} + +void tst_QDeclarativeDebugJS::interrupt2() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded(); + bp1.lineNumber = 17; + + client.setBreakpoints(QSet() << bp1); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + //TEST LINE + client.interrupt(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + client.interrupt(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + QByteArray functionName("logger"); + JSAgentStackData data = client.break_stackFrames.at(0); + QCOMPARE(data.functionName, functionName); + QCOMPARE(data.fileUrl, QByteArray(QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded())); +} + +void tst_QDeclarativeDebugJS::stepOut2() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1,bp2; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded(); + bp1.lineNumber = 12; + + bp2.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded(); + bp2.lineNumber = 13; + + client.setBreakpoints(QSet() << bp1 << bp2); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + client.stepInto(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + client.stepInto(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + //TEST LINE + client.stepOut(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + client.stepOut(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + JSAgentStackData data = client.break_stackFrames.at(0); + + QCOMPARE(data.fileUrl, bp2.fileUrl); + QCOMPARE(data.lineNumber, bp2.lineNumber); + +} + +void tst_QDeclarativeDebugJS::continueExecution2() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1, bp2, bp3; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded(); + bp1.lineNumber = 11; + + bp2.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded(); + bp2.lineNumber = 12; + + bp3.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded(); + bp3.lineNumber = 13; + + client.setBreakpoints(QSet() << bp1 << bp2 << bp3); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + //TEST LINE + client.continueExecution(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + client.continueExecution(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + JSAgentStackData data = client.break_stackFrames.at(0); + QCOMPARE(data.fileUrl, bp3.fileUrl); + QCOMPARE(data.lineNumber, bp3.lineNumber); +} + +void tst_QDeclarativeDebugJS::expandObject2() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded(); + bp1.lineNumber = 17; + + client.setBreakpoints(QSet() << bp1); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + //TEST LINE + client.expandObjectById(QByteArray("details"),123); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(expanded()))); + QCOMPARE(client.object_name,QByteArray("details")); + + QEXPECT_FAIL("", "", Continue); + QCOMPARE(client.object_children.length(),0); + +} + +void tst_QDeclarativeDebugJS::setProperty3() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1, bp2; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded(); + bp1.lineNumber = 17; + bp2.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded(); + bp2.lineNumber = 18; + + client.setBreakpoints(QSet() << bp1 << bp2); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + quint64 objectId; + QByteArray objectName; + + foreach ( JSAgentWatchData data, client.break_locals) + { + if( data.name == "details") + { + objectId = data.objectId; + objectName = data.name; + //TEST LINE + client.setProperty(data.name, 123, "total", "names.length"); + } + } + + client.continueExecution(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + client.expandObjectById(objectName,objectId); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(expanded()))); + + QCOMPARE(client.object_name,QByteArray("details")); + QCOMPARE(client.object_children.length(),3); + + // foreach ( JSAgentWatchData data, client.object_children) + // { + // qDebug() << data.name << data.type << data.value; + // } +} + +void tst_QDeclarativeDebugJS::setProperty4() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1, bp2; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded(); + bp1.lineNumber = 17; + bp2.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded(); + bp2.lineNumber = 18; + + client.setBreakpoints(QSet() << bp1 << bp2); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + quint64 objectId; + QByteArray objectName; + + foreach ( JSAgentWatchData data, client.break_locals) + { + if( data.name == "details") + { + objectId = data.objectId; + objectName = data.name; + //TEST LINE + client.setProperty(data.name, 123, "category", data.name + ".category = 'comic characters'"); + } + } + + client.continueExecution(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + client.expandObjectById(objectName,objectId); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(expanded()))); + + QCOMPARE(client.object_name,QByteArray("details")); + QCOMPARE(client.object_children.at(0).name,QByteArray("category")); + QCOMPARE(client.object_children.at(0).type,QByteArray("String")); + QCOMPARE(client.object_children.at(0).value,QByteArray("Superheroes")); + QCOMPARE(client.object_children.at(1).name,QByteArray("names")); + QCOMPARE(client.object_children.at(1).type,QByteArray("Array")); + QCOMPARE(client.object_children.at(2).name,QByteArray("aliases")); + QCOMPARE(client.object_children.at(2).type,QByteArray("Array")); + + // foreach ( JSAgentWatchData data, client.object_children) + // { + // qDebug() << data.name << data.type << data.value; + // } +} + +void tst_QDeclarativeDebugJS::activateFrame2() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1, bp2; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded(); + bp1.lineNumber = 4; + + client.setBreakpoints(QSet() << bp1); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + client.stepInto(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + //TEST LINE + client.activateFrame(5); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(watchTriggered()))); + + QCOMPARE(client.break_locals.length(),0); + + // foreach ( JSAgentWatchData data, client.break_locals) + // { + // qDebug() << data.name << data.type << data.value; + // } + +} + +void tst_QDeclarativeDebugJS::verifyQMLOptimizerDisabled() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded(); + bp1.lineNumber = 21; + + client.setBreakpoints(QSet() << bp1); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + +} + +void tst_QDeclarativeDebugJS::testCoverageCompleted() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QJSDebugClient client(&connection); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + client.startCoverageCompleted(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(coverageCompleted()))); +} + +void tst_QDeclarativeDebugJS::testCoverageRun() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QJSDebugClient client(&connection); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + client.startCoverageRun(); + client.startCoverageCompleted(); + + // The app might get "COVERAGE false" before anything is actually executed + //QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(coverageScriptLoaded()))); + //QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(coveragePosChanged()))); + //QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(coverageFuncEntered()))); + //QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(coverageFuncExited()))); +} + +QTEST_MAIN(tst_QDeclarativeDebugJS) + +#include "tst_qdeclarativedebugjs.moc" diff --git a/tests/auto/declarative/qdeclarativedebugjs/tst_qdeclarativedebugjs.pro b/tests/auto/declarative/qdeclarativedebugjs/tst_qdeclarativedebugjs.pro new file mode 100644 index 00000000..c293fea7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativedebugjs/tst_qdeclarativedebugjs.pro @@ -0,0 +1,26 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative network script +macx:CONFIG -= app_bundle + +HEADERS += ../shared/debugutil_p.h + +SOURCES += tst_qdeclarativedebugjs.cpp \ + ../shared/debugutil.cpp + +INCLUDEPATH += ../shared + +# QMAKE_CXXFLAGS = -fprofile-arcs -ftest-coverage +# LIBS += -lgcov + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +OTHER_FILES = data/backtrace1.js data/backtrace1.qml + +CONFIG += parallel_test +CONFIG+=insignificant_test # QTQAINFRA-428 diff --git a/tests/auto/declarative/qdeclarativedebugservice/qdeclarativedebugservice.pro b/tests/auto/declarative/qdeclarativedebugservice/qdeclarativedebugservice.pro new file mode 100644 index 00000000..ca5a3988 --- /dev/null +++ b/tests/auto/declarative/qdeclarativedebugservice/qdeclarativedebugservice.pro @@ -0,0 +1,10 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += network declarative +macx:CONFIG -= app_bundle + +HEADERS += ../shared/debugutil_p.h +SOURCES += tst_qdeclarativedebugservice.cpp \ + ../shared/debugutil.cpp + +CONFIG += parallel_test declarative_debug + diff --git a/tests/auto/declarative/qdeclarativedebugservice/tst_qdeclarativedebugservice.cpp b/tests/auto/declarative/qdeclarativedebugservice/tst_qdeclarativedebugservice.cpp new file mode 100644 index 00000000..ff73c5c0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativedebugservice/tst_qdeclarativedebugservice.cpp @@ -0,0 +1,198 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include "../../../shared/util.h" +#include "../shared/debugutil_p.h" + + +class tst_QDeclarativeDebugService : public QObject +{ + Q_OBJECT +private: + QDeclarativeDebugConnection *m_conn; + +private slots: + void initTestCase(); + + void name(); + void status(); + void sendMessage(); + void idForObject(); + void objectForId(); + void objectToString(); +}; + +void tst_QDeclarativeDebugService::initTestCase() +{ + QTest::ignoreMessage(QtDebugMsg, "QDeclarativeDebugServer: Waiting for connection on port 13769..."); + new QDeclarativeEngine(this); + + m_conn = new QDeclarativeDebugConnection(this); + m_conn->connectToHost("127.0.0.1", 13769); + + QTest::ignoreMessage(QtDebugMsg, "QDeclarativeDebugServer: Connection established"); + bool ok = m_conn->waitForConnected(); + QVERIFY(ok); + + QTRY_VERIFY(QDeclarativeDebugService::hasDebuggingClient()); +} + +void tst_QDeclarativeDebugService::name() +{ + QString name = "tst_QDeclarativeDebugService::name()"; + + QDeclarativeDebugService service(name); + QCOMPARE(service.name(), name); +} + +void tst_QDeclarativeDebugService::status() +{ + QDeclarativeDebugTestService service("tst_QDeclarativeDebugService::status()"); + QCOMPARE(service.status(), QDeclarativeDebugService::Unavailable); + + { + QDeclarativeDebugTestClient client("tst_QDeclarativeDebugService::status()", m_conn); + QTRY_COMPARE(client.status(), QDeclarativeDebugClient::Enabled); + QTRY_COMPARE(service.status(), QDeclarativeDebugService::Enabled); + } + + + QTRY_COMPARE(service.status(), QDeclarativeDebugService::Unavailable); + + QTest::ignoreMessage(QtWarningMsg, "QDeclarativeDebugService: Conflicting plugin name \"tst_QDeclarativeDebugService::status()\" "); + + QDeclarativeDebugService duplicate("tst_QDeclarativeDebugService::status()"); + QCOMPARE(duplicate.status(), QDeclarativeDebugService::NotConnected); +} + +void tst_QDeclarativeDebugService::sendMessage() +{ + QDeclarativeDebugTestService service("tst_QDeclarativeDebugService::sendMessage()"); + QDeclarativeDebugTestClient client("tst_QDeclarativeDebugService::sendMessage()", m_conn); + + QByteArray msg = "hello!"; + + QTRY_COMPARE(client.status(), QDeclarativeDebugClient::Enabled); + QTRY_COMPARE(service.status(), QDeclarativeDebugService::Enabled); + + client.sendMessage(msg); + QByteArray resp = client.waitForResponse(); + QCOMPARE(resp, msg); + + QTest::ignoreMessage(QtWarningMsg, "QDeclarativeDebugService: Conflicting plugin name \"tst_QDeclarativeDebugService::sendMessage()\" "); + QDeclarativeDebugService duplicate("tst_QDeclarativeDebugService::sendMessage()"); + duplicate.sendMessage("msg"); +} + +void tst_QDeclarativeDebugService::idForObject() +{ + QCOMPARE(QDeclarativeDebugService::idForObject(0), -1); + + QObject *objA = new QObject; + + int idA = QDeclarativeDebugService::idForObject(objA); + QVERIFY(idA >= 0); + QCOMPARE(QDeclarativeDebugService::objectForId(idA), objA); + + int idAA = QDeclarativeDebugService::idForObject(objA); + QCOMPARE(idAA, idA); + + QObject *objB = new QObject; + int idB = QDeclarativeDebugService::idForObject(objB); + QVERIFY(idB != idA); + QCOMPARE(QDeclarativeDebugService::objectForId(idB), objB); + + delete objA; + delete objB; +} + +void tst_QDeclarativeDebugService::objectForId() +{ + QCOMPARE(QDeclarativeDebugService::objectForId(-1), static_cast(0)); + QCOMPARE(QDeclarativeDebugService::objectForId(1), static_cast(0)); + + QObject *obj = new QObject; + int id = QDeclarativeDebugService::idForObject(obj); + QCOMPARE(QDeclarativeDebugService::objectForId(id), obj); + + delete obj; + QCOMPARE(QDeclarativeDebugService::objectForId(id), static_cast(0)); +} + +void tst_QDeclarativeDebugService::objectToString() +{ + QCOMPARE(QDeclarativeDebugService::objectToString(0), QString("NULL")); + + QObject *obj = new QObject; + QCOMPARE(QDeclarativeDebugService::objectToString(obj), QString("QObject: ")); + + obj->setObjectName("Hello"); + QCOMPARE(QDeclarativeDebugService::objectToString(obj), QString("QObject: Hello")); + delete obj; +} + + +int main(int argc, char *argv[]) +{ + int _argc = argc + 1; + char **_argv = new char*[_argc]; + for (int i = 0; i < argc; ++i) + _argv[i] = argv[i]; + _argv[_argc - 1] = "-qmljsdebugger=port:13769"; + + QApplication app(_argc, _argv); + tst_QDeclarativeDebugService tc; + return QTest::qExec(&tc, _argc, _argv); + delete _argv; +} + +#include "tst_qdeclarativedebugservice.moc" diff --git a/tests/auto/declarative/qdeclarativedom/data/MyComponent.qml b/tests/auto/declarative/qdeclarativedom/data/MyComponent.qml new file mode 100644 index 00000000..f6760b6a --- /dev/null +++ b/tests/auto/declarative/qdeclarativedom/data/MyComponent.qml @@ -0,0 +1,4 @@ +import QtQuick 1.0 + +Item { +} diff --git a/tests/auto/declarative/qdeclarativedom/data/MyItem.qml b/tests/auto/declarative/qdeclarativedom/data/MyItem.qml new file mode 100644 index 00000000..f6760b6a --- /dev/null +++ b/tests/auto/declarative/qdeclarativedom/data/MyItem.qml @@ -0,0 +1,4 @@ +import QtQuick 1.0 + +Item { +} diff --git a/tests/auto/declarative/qdeclarativedom/data/import/Bar.qml b/tests/auto/declarative/qdeclarativedom/data/import/Bar.qml new file mode 100644 index 00000000..86a71768 --- /dev/null +++ b/tests/auto/declarative/qdeclarativedom/data/import/Bar.qml @@ -0,0 +1,2 @@ +import QtQuick 1.0 + diff --git a/tests/auto/declarative/qdeclarativedom/data/importlib/sublib/Foo.qml b/tests/auto/declarative/qdeclarativedom/data/importlib/sublib/Foo.qml new file mode 100644 index 00000000..86a71768 --- /dev/null +++ b/tests/auto/declarative/qdeclarativedom/data/importlib/sublib/Foo.qml @@ -0,0 +1,2 @@ +import QtQuick 1.0 + diff --git a/tests/auto/declarative/qdeclarativedom/data/importlib/sublib/qmldir b/tests/auto/declarative/qdeclarativedom/data/importlib/sublib/qmldir new file mode 100644 index 00000000..98d6b743 --- /dev/null +++ b/tests/auto/declarative/qdeclarativedom/data/importlib/sublib/qmldir @@ -0,0 +1,2 @@ +Foo 1.1 Foo.qml +Foo 1.0 Foo.qml diff --git a/tests/auto/declarative/qdeclarativedom/data/top.qml b/tests/auto/declarative/qdeclarativedom/data/top.qml new file mode 100644 index 00000000..56ea9dfa --- /dev/null +++ b/tests/auto/declarative/qdeclarativedom/data/top.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +MyComponent { + width: 100 + height: 100 +} diff --git a/tests/auto/declarative/qdeclarativedom/qdeclarativedom.pro b/tests/auto/declarative/qdeclarativedom/qdeclarativedom.pro new file mode 100644 index 00000000..8ac69aac --- /dev/null +++ b/tests/auto/declarative/qdeclarativedom/qdeclarativedom.pro @@ -0,0 +1,16 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativedom.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativedom/tst_qdeclarativedom.cpp b/tests/auto/declarative/qdeclarativedom/tst_qdeclarativedom.cpp new file mode 100644 index 00000000..14f1fb50 --- /dev/null +++ b/tests/auto/declarative/qdeclarativedom/tst_qdeclarativedom.cpp @@ -0,0 +1,1326 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include + +#include +#include + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_qdeclarativedom : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativedom() {} + +private slots: + void loadSimple(); + void loadProperties(); + void loadGroupedProperties(); + void loadChildObject(); + void loadComposite(); + void loadImports(); + void loadErrors(); + void loadSyntaxErrors(); + void loadRemoteErrors(); + void loadDynamicProperty(); + void loadComponent(); + + void testValueSource(); + void testValueInterceptor(); + + void object_dynamicProperty(); + void object_property(); + void object_url(); + + void copy(); + void position(); +private: + QDeclarativeEngine engine; +}; + + +void tst_qdeclarativedom::loadSimple() +{ + QByteArray qml = "import QtQuick 1.0\n" + "Item {}"; + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml)); + QVERIFY(document.errors().isEmpty()); + + QDeclarativeDomObject rootObject = document.rootObject(); + QVERIFY(rootObject.isValid()); + QVERIFY(!rootObject.isComponent()); + QVERIFY(!rootObject.isCustomType()); + QVERIFY(rootObject.objectType() == "QtQuick/Item"); + QVERIFY(rootObject.objectTypeMajorVersion() == 1); + QVERIFY(rootObject.objectTypeMinorVersion() == 0); +} + +// Test regular properties +void tst_qdeclarativedom::loadProperties() +{ + QByteArray qml = "import QtQuick 1.0\n" + "Item { id : item; x : 300; visible : true }"; + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml)); + + QDeclarativeDomObject rootObject = document.rootObject(); + QVERIFY(rootObject.isValid()); + QVERIFY(rootObject.objectId() == "item"); + QCOMPARE(rootObject.properties().size(), 3); + + QDeclarativeDomProperty xProperty = rootObject.property("x"); + QVERIFY(xProperty.propertyName() == "x"); + QCOMPARE(xProperty.propertyNameParts().count(), 1); + QVERIFY(xProperty.propertyNameParts().at(0) == "x"); + QCOMPARE(xProperty.position(), 37); + QCOMPARE(xProperty.length(), 1); + QVERIFY(xProperty.value().isLiteral()); + QVERIFY(xProperty.value().toLiteral().literal() == "300"); + + QDeclarativeDomProperty visibleProperty = rootObject.property("visible"); + QVERIFY(visibleProperty.propertyName() == "visible"); + QCOMPARE(visibleProperty.propertyNameParts().count(), 1); + QVERIFY(visibleProperty.propertyNameParts().at(0) == "visible"); + QCOMPARE(visibleProperty.position(), 46); + QCOMPARE(visibleProperty.length(), 7); + QVERIFY(visibleProperty.value().isLiteral()); + QVERIFY(visibleProperty.value().toLiteral().literal() == "true"); +} + +// Test grouped properties +void tst_qdeclarativedom::loadGroupedProperties() +{ + { + QByteArray qml = "import QtQuick 1.0\n" + "Item { anchors.left: parent.left; anchors.right: parent.right }"; + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml)); + + QDeclarativeDomObject rootItem = document.rootObject(); + QVERIFY(rootItem.isValid()); + QVERIFY(rootItem.properties().size() == 2); + + // Order is not deterministic + QDeclarativeDomProperty p0 = rootItem.properties().at(0); + QDeclarativeDomProperty p1 = rootItem.properties().at(1); + QDeclarativeDomProperty leftProperty; + QDeclarativeDomProperty rightProperty; + if (p0.propertyName() == "anchors.left") { + leftProperty = p0; + rightProperty = p1; + } else { + leftProperty = p1; + rightProperty = p0; + } + + QVERIFY(leftProperty.propertyName() == "anchors.left"); + QCOMPARE(leftProperty.propertyNameParts().count(), 2); + QVERIFY(leftProperty.propertyNameParts().at(0) == "anchors"); + QVERIFY(leftProperty.propertyNameParts().at(1) == "left"); + QCOMPARE(leftProperty.position(), 26); + QCOMPARE(leftProperty.length(), 12); + QVERIFY(leftProperty.value().isBinding()); + QVERIFY(leftProperty.value().toBinding().binding() == "parent.left"); + + QVERIFY(rightProperty.propertyName() == "anchors.right"); + QCOMPARE(rightProperty.propertyNameParts().count(), 2); + QVERIFY(rightProperty.propertyNameParts().at(0) == "anchors"); + QVERIFY(rightProperty.propertyNameParts().at(1) == "right"); + QCOMPARE(rightProperty.position(), 53); + QCOMPARE(rightProperty.length(), 13); + QVERIFY(rightProperty.value().isBinding()); + QVERIFY(rightProperty.value().toBinding().binding() == "parent.right"); + } + + { + QByteArray qml = "import QtQuick 1.0\n" + "Item { \n" + " anchors {\n" + " left: parent.left\n" + " right: parent.right\n" + " }\n" + "}"; + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml)); + + QDeclarativeDomObject rootItem = document.rootObject(); + QVERIFY(rootItem.isValid()); + QVERIFY(rootItem.properties().size() == 2); + + // Order is not deterministic + QDeclarativeDomProperty p0 = rootItem.properties().at(0); + QDeclarativeDomProperty p1 = rootItem.properties().at(1); + QDeclarativeDomProperty leftProperty; + QDeclarativeDomProperty rightProperty; + if (p0.propertyName() == "anchors.left") { + leftProperty = p0; + rightProperty = p1; + } else { + leftProperty = p1; + rightProperty = p0; + } + + QVERIFY(leftProperty.propertyName() == "anchors.left"); + QCOMPARE(leftProperty.propertyNameParts().count(), 2); + QVERIFY(leftProperty.propertyNameParts().at(0) == "anchors"); + QVERIFY(leftProperty.propertyNameParts().at(1) == "left"); + QCOMPARE(leftProperty.position(), 49); + QCOMPARE(leftProperty.length(), 4); + QVERIFY(leftProperty.value().isBinding()); + QVERIFY(leftProperty.value().toBinding().binding() == "parent.left"); + + QVERIFY(rightProperty.propertyName() == "anchors.right"); + QCOMPARE(rightProperty.propertyNameParts().count(), 2); + QVERIFY(rightProperty.propertyNameParts().at(0) == "anchors"); + QVERIFY(rightProperty.propertyNameParts().at(1) == "right"); + QCOMPARE(rightProperty.position(), 75); + QCOMPARE(rightProperty.length(), 5); + QVERIFY(rightProperty.value().isBinding()); + QVERIFY(rightProperty.value().toBinding().binding() == "parent.right"); + } + +} + +void tst_qdeclarativedom::loadChildObject() +{ + QByteArray qml = "import QtQuick 1.0\n" + "Item { Item {} }"; + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml)); + + QDeclarativeDomObject rootItem = document.rootObject(); + QVERIFY(rootItem.isValid()); + QVERIFY(rootItem.properties().size() == 1); + + QDeclarativeDomProperty listProperty = rootItem.properties().at(0); + QVERIFY(listProperty.isDefaultProperty()); + QVERIFY(listProperty.value().isList()); + + QDeclarativeDomList list = listProperty.value().toList(); + QVERIFY(list.values().size() == 1); + + QDeclarativeDomObject childItem = list.values().first().toObject(); + QVERIFY(childItem.isValid()); + QVERIFY(childItem.objectType() == "QtQuick/Item"); +} + +void tst_qdeclarativedom::loadComposite() +{ + QFile file(SRCDIR "/data/top.qml"); + QVERIFY(file.open(QIODevice::ReadOnly | QIODevice::Text)); + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, file.readAll(), QUrl::fromLocalFile(file.fileName()))); + QVERIFY(document.errors().isEmpty()); + + QDeclarativeDomObject rootItem = document.rootObject(); + QVERIFY(rootItem.isValid()); + QCOMPARE(rootItem.objectType(), QByteArray("MyComponent")); + QCOMPARE(rootItem.properties().size(), 2); + + QDeclarativeDomProperty widthProperty = rootItem.property("width"); + QVERIFY(widthProperty.value().isLiteral()); + + QDeclarativeDomProperty heightProperty = rootItem.property("height"); + QVERIFY(heightProperty.value().isLiteral()); +} + +void tst_qdeclarativedom::testValueSource() +{ + QByteArray qml = "import QtQuick 1.0\n" + "Rectangle { SpringAnimation on height { spring: 1.4; damping: .15; to: Math.min(Math.max(-130, value*2.2 - 130), 133); }}"; + + QDeclarativeEngine freshEngine; + QDeclarativeDomDocument document; + QVERIFY(document.load(&freshEngine, qml)); + + QDeclarativeDomObject rootItem = document.rootObject(); + QVERIFY(rootItem.isValid()); + QDeclarativeDomProperty heightProperty = rootItem.properties().at(0); + QVERIFY(heightProperty.propertyName() == "height"); + QVERIFY(heightProperty.value().isValueSource()); + + const QDeclarativeDomValueValueSource valueSource = heightProperty.value().toValueSource(); + QDeclarativeDomObject valueSourceObject = valueSource.object(); + QVERIFY(valueSourceObject.isValid()); + + QVERIFY(valueSourceObject.objectType() == "QtQuick/SpringAnimation"); + + const QDeclarativeDomValue springValue = valueSourceObject.property("spring").value(); + QVERIFY(!springValue.isInvalid()); + QVERIFY(springValue.isLiteral()); + QVERIFY(springValue.toLiteral().literal() == "1.4"); + + const QDeclarativeDomValue sourceValue = valueSourceObject.property("to").value(); + QVERIFY(!sourceValue.isInvalid()); + QVERIFY(sourceValue.isBinding()); + QVERIFY(sourceValue.toBinding().binding() == "Math.min(Math.max(-130, value*2.2 - 130), 133)"); +} + +void tst_qdeclarativedom::testValueInterceptor() +{ + QByteArray qml = "import QtQuick 1.0\n" + "Rectangle { Behavior on height { NumberAnimation { duration: 100 } } }"; + + QDeclarativeEngine freshEngine; + QDeclarativeDomDocument document; + QVERIFY(document.load(&freshEngine, qml)); + + QDeclarativeDomObject rootItem = document.rootObject(); + QVERIFY(rootItem.isValid()); + QDeclarativeDomProperty heightProperty = rootItem.properties().at(0); + QVERIFY(heightProperty.propertyName() == "height"); + QVERIFY(heightProperty.value().isValueInterceptor()); + + const QDeclarativeDomValueValueInterceptor valueInterceptor = heightProperty.value().toValueInterceptor(); + QDeclarativeDomObject valueInterceptorObject = valueInterceptor.object(); + QVERIFY(valueInterceptorObject.isValid()); + + QVERIFY(valueInterceptorObject.objectType() == "QtQuick/Behavior"); + + const QDeclarativeDomValue animationValue = valueInterceptorObject.property("animation").value(); + QVERIFY(!animationValue.isInvalid()); + QVERIFY(animationValue.isObject()); +} + +// Test QDeclarativeDomDocument::imports() +void tst_qdeclarativedom::loadImports() +{ + QByteArray qml = "import QtQuick 1.0\n" + "import importlib.sublib 1.1\n" + "import importlib.sublib 1.0 as NewFoo\n" + "import 'import'\n" + "import 'import' as X\n" + "Item {}"; + + QDeclarativeEngine engine; + engine.addImportPath(SRCDIR "/data"); + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml, QUrl::fromLocalFile(SRCDIR "/data/dummy.qml"))); + + QCOMPARE(document.imports().size(), 5); + + QDeclarativeDomImport import = document.imports().at(0); + QCOMPARE(import.type(), QDeclarativeDomImport::Library); + QCOMPARE(import.uri(), QLatin1String("QtQuick")); + QCOMPARE(import.qualifier(), QString()); + QCOMPARE(import.version(), QLatin1String("1.0")); + + import = document.imports().at(1); + QCOMPARE(import.type(), QDeclarativeDomImport::Library); + QCOMPARE(import.uri(), QLatin1String("importlib.sublib")); + QCOMPARE(import.qualifier(), QString()); + QCOMPARE(import.version(), QLatin1String("1.1")); + + import = document.imports().at(2); + QCOMPARE(import.type(), QDeclarativeDomImport::Library); + QCOMPARE(import.uri(), QLatin1String("importlib.sublib")); + QCOMPARE(import.qualifier(), QLatin1String("NewFoo")); + QCOMPARE(import.version(), QLatin1String("1.0")); + + import = document.imports().at(3); + QCOMPARE(import.type(), QDeclarativeDomImport::File); + QCOMPARE(import.uri(), QLatin1String("import")); + QCOMPARE(import.qualifier(), QLatin1String("")); + QCOMPARE(import.version(), QLatin1String("")); + + import = document.imports().at(4); + QCOMPARE(import.type(), QDeclarativeDomImport::File); + QCOMPARE(import.uri(), QLatin1String("import")); + QCOMPARE(import.qualifier(), QLatin1String("X")); + QCOMPARE(import.version(), QLatin1String("")); +} + +// Test loading a file with errors +void tst_qdeclarativedom::loadErrors() +{ + QByteArray qml = "import QtQuick 1.0\n" + "Item {\n" + " foo: 12\n" + "}"; + + QDeclarativeDomDocument document; + QVERIFY(false == document.load(&engine, qml)); + + QCOMPARE(document.errors().count(), 1); + QDeclarativeError error = document.errors().first(); + + QCOMPARE(error.url(), QUrl()); + QCOMPARE(error.line(), 3); + QCOMPARE(error.column(), 3); + QCOMPARE(error.description(), QString("Cannot assign to non-existent property \"foo\"")); +} + +// Test loading a file with syntax errors +void tst_qdeclarativedom::loadSyntaxErrors() +{ + QByteArray qml = "import QtQuick 1.0\n" + "asdf"; + + QDeclarativeDomDocument document; + QVERIFY(false == document.load(&engine, qml)); + + QCOMPARE(document.errors().count(), 1); + QDeclarativeError error = document.errors().first(); + + QCOMPARE(error.url(), QUrl()); + QCOMPARE(error.line(), 2); + QCOMPARE(error.column(), 1); + QCOMPARE(error.description(), QString("Syntax error")); +} + +// Test attempting to load a file with remote references +void tst_qdeclarativedom::loadRemoteErrors() +{ + QByteArray qml = "import QtQuick 1.0\n" + "import \"http://localhost/exampleQmlScript.js\" as Script\n" + "Item {\n" + "}"; + QDeclarativeDomDocument document; + QVERIFY(false == document.load(&engine, qml)); + + QCOMPARE(document.errors().count(), 1); + QDeclarativeError error = document.errors().first(); + + QCOMPARE(error.url(), QUrl()); + QCOMPARE(error.line(), -1); + QCOMPARE(error.column(), -1); + QCOMPARE(error.description(), QString("QDeclarativeDomDocument supports local types only")); +} + +// Test dynamic property declarations +void tst_qdeclarativedom::loadDynamicProperty() +{ + { + QByteArray qml = "import QtQuick 1.0\n" + "Item {\n" + " property int a\n" + " property bool b\n" + " property double c\n" + " property real d\n" + " property string e\n" + " property url f\n" + " property color g\n" + " property date h\n" + " property variant i\n" + " property QtObject j\n" + "}"; + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml)); + + QDeclarativeDomObject rootObject = document.rootObject(); + QVERIFY(rootObject.isValid()); + + QCOMPARE(rootObject.dynamicProperties().count(), 10); + +#define DP_TEST(index, name, type, test_position, test_length, propTypeName) \ + { \ + QDeclarativeDomDynamicProperty d = rootObject.dynamicProperties().at(index); \ + QVERIFY(d.isValid()); \ + QVERIFY(d.propertyName() == # name ); \ + QVERIFY(d.propertyType() == type); \ + QVERIFY(d.propertyTypeName() == propTypeName); \ + QVERIFY(d.isDefaultProperty() == false); \ + QVERIFY(d.defaultValue().isValid() == false); \ + QCOMPARE(d.position(), test_position); \ + QCOMPARE(d.length(), test_length); \ + } \ + + DP_TEST(0, a, QVariant::Int, 30, 14, "int"); + DP_TEST(1, b, QVariant::Bool, 49, 15, "bool"); + DP_TEST(2, c, QMetaType::QReal, 69, 17, "double"); + DP_TEST(3, d, QMetaType::QReal, 91, 15, "real"); + DP_TEST(4, e, QVariant::String, 111, 17, "string"); + DP_TEST(5, f, QVariant::Url, 133, 14, "url"); + DP_TEST(6, g, QVariant::Color, 152, 16, "color"); + DP_TEST(7, h, QVariant::DateTime, 173, 15, "date"); + DP_TEST(8, i, qMetaTypeId(), 193, 18, "variant"); + DP_TEST(9, j, -1, 216, 19, "QtObject"); + } + + { + QByteArray qml = "import QtQuick 1.0\n" + "Item {\n" + " id: item\n" + " property int a: 12\n" + " property int b: a + 6\n" + " default property QtObject c\n" + " property alias d: item.a\n" + "}\n"; + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml)); + + QDeclarativeDomObject rootObject = document.rootObject(); + QVERIFY(rootObject.isValid()); + + QCOMPARE(rootObject.dynamicProperties().count(), 4); + + { + QDeclarativeDomDynamicProperty d = rootObject.dynamicProperties().at(0); + QVERIFY(d.isDefaultProperty() == false); + QVERIFY(d.isAlias() == false); + QVERIFY(d.defaultValue().isValid()); + QVERIFY(d.defaultValue().propertyName() == "a"); + QVERIFY(d.defaultValue().value().isLiteral()); + } + + { + QDeclarativeDomDynamicProperty d = rootObject.dynamicProperties().at(1); + QVERIFY(d.isDefaultProperty() == false); + QVERIFY(d.isAlias() == false); + QVERIFY(d.defaultValue().isValid()); + QVERIFY(d.defaultValue().propertyName() == "b"); + QVERIFY(d.defaultValue().value().isBinding()); + } + + { + QDeclarativeDomDynamicProperty d = rootObject.dynamicProperties().at(2); + QVERIFY(d.isDefaultProperty() == true); + QVERIFY(d.isAlias() == false); + QVERIFY(d.defaultValue().isValid() == false); + } + + { + QDeclarativeDomDynamicProperty d = rootObject.dynamicProperties().at(3); + QVERIFY(d.isDefaultProperty() == false); + QVERIFY(d.isAlias() == true); + } + } +} + +// Test inline components +void tst_qdeclarativedom::loadComponent() +{ + // Explicit component + { + QByteArray qml = "import QtQuick 1.0\n" + "Item {\n" + " Component {\n" + " id: myComponent\n" + " Item {}\n" + " }\n" + "}"; + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml)); + + QDeclarativeDomObject rootItem = document.rootObject(); + QVERIFY(rootItem.isValid()); + QVERIFY(rootItem.properties().size() == 1); + + QDeclarativeDomProperty listProperty = rootItem.properties().at(0); + QVERIFY(listProperty.isDefaultProperty()); + QVERIFY(listProperty.value().isList()); + + QDeclarativeDomList list = listProperty.value().toList(); + QVERIFY(list.values().size() == 1); + + QDeclarativeDomObject componentObject = list.values().first().toObject(); + QVERIFY(componentObject.isValid()); + QVERIFY(componentObject.objectClassName() == "Component"); + QVERIFY(componentObject.isComponent()); + + QDeclarativeDomComponent component = componentObject.toComponent(); + QVERIFY(component.isValid()); + QVERIFY(component.objectType() == "QtQuick/Component"); + QVERIFY(component.objectTypeMajorVersion() == 1); + QVERIFY(component.objectTypeMinorVersion() == 0); + QVERIFY(component.objectClassName() == "Component"); + QVERIFY(component.objectId() == "myComponent"); + QVERIFY(component.properties().isEmpty()); + QVERIFY(component.dynamicProperties().isEmpty()); + QVERIFY(component.isCustomType() == false); + QVERIFY(component.customTypeData() == ""); + QVERIFY(component.isComponent()); + QCOMPARE(component.position(), 30); + QCOMPARE(component.length(), 57); + + QVERIFY(component.componentRoot().isValid()); + QVERIFY(component.componentRoot().objectClassName() == "Item"); + } + + // Implicit component + { + QByteArray qml = "import QtQuick 1.0\n" + "ListView {\n" + " delegate: Item {}\n" + "}"; + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml)); + + QDeclarativeDomObject rootItem = document.rootObject(); + QVERIFY(rootItem.isValid()); + QVERIFY(rootItem.properties().size() == 1); + + QDeclarativeDomProperty delegate = rootItem.property("delegate"); + + QDeclarativeDomObject componentObject = delegate.value().toObject(); + QVERIFY(componentObject.isValid()); + QVERIFY(componentObject.objectClassName() == "Component"); + QVERIFY(componentObject.isComponent()); + + QDeclarativeDomComponent component = componentObject.toComponent(); + QVERIFY(component.isValid()); + QVERIFY(component.objectType() == "QtQuick/Component"); + QVERIFY(component.objectClassName() == "Component"); + QVERIFY(component.objectId() == ""); + QVERIFY(component.properties().isEmpty()); + QVERIFY(component.dynamicProperties().isEmpty()); + QVERIFY(component.isCustomType() == false); + QVERIFY(component.customTypeData() == ""); + QVERIFY(component.isComponent()); + QCOMPARE(component.position(), 44); + QCOMPARE(component.length(), 7); + + QVERIFY(component.componentRoot().isValid()); + QVERIFY(component.componentRoot().objectClassName() == "Item"); + } +} + +// Test QDeclarativeDomObject::dynamicProperty() method +void tst_qdeclarativedom::object_dynamicProperty() +{ + // Invalid object + { + QDeclarativeDomObject object; + QVERIFY(object.dynamicProperty("").isValid() == false); + QVERIFY(object.dynamicProperty("foo").isValid() == false); + } + + + // Valid object, no dynamic properties + { + QByteArray qml = "import QtQuick 1.0\n" + "Item {}"; + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml)); + + QDeclarativeDomObject rootObject = document.rootObject(); + QVERIFY(rootObject.isValid()); + + QVERIFY(rootObject.dynamicProperty("").isValid() == false); + QVERIFY(rootObject.dynamicProperty("foo").isValid() == false); + } + + // Valid object, dynamic properties + { + QByteArray qml = "import QtQuick 1.0\n" + "Item {\n" + " property int a\n" + "}"; + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml)); + + QDeclarativeDomObject rootObject = document.rootObject(); + QVERIFY(rootObject.isValid()); + + QVERIFY(rootObject.dynamicProperty("").isValid() == false); + QVERIFY(rootObject.dynamicProperty("foo").isValid() == false); + + QDeclarativeDomDynamicProperty p = rootObject.dynamicProperty("a"); + QVERIFY(p.isValid()); + QVERIFY(p.propertyName() == "a"); + QVERIFY(p.propertyType() == QVariant::Int); + QVERIFY(p.propertyTypeName() == "int"); + QVERIFY(p.isDefaultProperty() == false); + QCOMPARE(p.position(), 30); + QCOMPARE(p.length(), 14); + } + +} + +// Test QDeclarativeObject::property() method +void tst_qdeclarativedom::object_property() +{ + // Invalid object + { + QDeclarativeDomObject object; + QVERIFY(object.property("").isValid() == false); + QVERIFY(object.property("foo").isValid() == false); + } + + // Valid object - no default + { + QByteArray qml = "import QtQuick 1.0\n" + "Item {\n" + " x: 10\n" + " y: 12\n" + "}\n"; + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml)); + + QDeclarativeDomObject rootObject = document.rootObject(); + QVERIFY(rootObject.isValid()); + + QVERIFY(rootObject.property("").isValid() == false); + QVERIFY(rootObject.property("foo").isValid() == false); + + QDeclarativeDomProperty x = rootObject.property("x"); + QVERIFY(x.isValid()); + QVERIFY(x.propertyName() == "x"); + QVERIFY(x.propertyNameParts().count() == 1); + QVERIFY(x.propertyNameParts().at(0) == "x"); + QVERIFY(x.isDefaultProperty() == false); + QVERIFY(x.value().isLiteral()); + QVERIFY(x.value().toLiteral().literal() == "10"); + QCOMPARE(x.position(), 30); + QCOMPARE(x.length(), 1); + + QDeclarativeDomProperty y = rootObject.property("y"); + QVERIFY(y.isValid()); + QVERIFY(y.propertyName() == "y"); + QVERIFY(y.propertyNameParts().count() == 1); + QVERIFY(y.propertyNameParts().at(0) == "y"); + QVERIFY(y.isDefaultProperty() == false); + QVERIFY(y.value().isLiteral()); + QVERIFY(y.value().toLiteral().literal() == "12"); + QCOMPARE(y.position(), 40); + QCOMPARE(y.length(), 1); + } + + // Valid object - with default + { + QByteArray qml = "import QtQuick 1.0\n" + "Item {\n" + " x: 10\n" + " y: 12\n" + " Item {}\n" + "}\n"; + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml)); + + QDeclarativeDomObject rootObject = document.rootObject(); + QVERIFY(rootObject.isValid()); + + QVERIFY(rootObject.property("").isValid() == false); + QVERIFY(rootObject.property("foo").isValid() == false); + + QDeclarativeDomProperty x = rootObject.property("x"); + QVERIFY(x.isValid()); + QVERIFY(x.propertyName() == "x"); + QVERIFY(x.propertyNameParts().count() == 1); + QVERIFY(x.propertyNameParts().at(0) == "x"); + QVERIFY(x.isDefaultProperty() == false); + QVERIFY(x.value().isLiteral()); + QVERIFY(x.value().toLiteral().literal() == "10"); + QCOMPARE(x.position(), 30); + QCOMPARE(x.length(), 1); + + QDeclarativeDomProperty y = rootObject.property("y"); + QVERIFY(y.isValid()); + QVERIFY(y.propertyName() == "y"); + QVERIFY(y.propertyNameParts().count() == 1); + QVERIFY(y.propertyNameParts().at(0) == "y"); + QVERIFY(y.isDefaultProperty() == false); + QVERIFY(y.value().isLiteral()); + QVERIFY(y.value().toLiteral().literal() == "12"); + QCOMPARE(y.position(), 40); + QCOMPARE(y.length(), 1); + + QDeclarativeDomProperty data = rootObject.property("data"); + QVERIFY(data.isValid()); + QVERIFY(data.propertyName() == "data"); + QVERIFY(data.propertyNameParts().count() == 1); + QVERIFY(data.propertyNameParts().at(0) == "data"); + QVERIFY(data.isDefaultProperty() == true); + QVERIFY(data.value().isList()); + QCOMPARE(data.position(), 50); + QCOMPARE(data.length(), 0); + } +} + +// Tests the QDeclarativeDomObject::url() method +void tst_qdeclarativedom::object_url() +{ + // Invalid object + { + QDeclarativeDomObject object; + QCOMPARE(object.url(), QUrl()); + } + + // Valid builtin object + { + QByteArray qml = "import QtQuick 1.0\n" + "Item {}"; + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml)); + + QDeclarativeDomObject rootObject = document.rootObject(); + QVERIFY(rootObject.isValid()); + QCOMPARE(rootObject.url(), QUrl()); + } + + // Valid composite object + { + QByteArray qml = "import QtQuick 1.0\n" + "MyItem {}"; + + QUrl myUrl = QUrl::fromLocalFile(SRCDIR "/data/main.qml"); + QUrl subUrl = QUrl::fromLocalFile(SRCDIR "/data/MyItem.qml"); + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml, myUrl)); + + QDeclarativeDomObject rootObject = document.rootObject(); + QVERIFY(rootObject.isValid()); + QCOMPARE(rootObject.url(), subUrl); + } +} + +// Test copy constructors and operators +void tst_qdeclarativedom::copy() +{ + QByteArray qml = "import QtQuick 1.0\n" + "MyItem {\n" + " id: myItem\n" + " property int a: 10\n" + " x: 10\n" + " y: x + 10\n" + " NumberAnimation on z {}\n" + " Behavior on opacity {}\n" + " Component {\n" + " Item{}\n" + " }\n" + " children: [ Item{}, Item{} ]\n" + "}\n"; + + QUrl myUrl = QUrl::fromLocalFile(SRCDIR "/data/main.qml"); + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml, myUrl)); + + // QDeclarativeDomDocument + { + QDeclarativeDomDocument document2(document); + QDeclarativeDomDocument document3; + document3 = document; + + QCOMPARE(document.imports().count(), document2.imports().count()); + QCOMPARE(document.errors().count(), document2.errors().count()); + QCOMPARE(document.rootObject().objectClassName(), document2.rootObject().objectClassName()); + + QCOMPARE(document.imports().count(), document3.imports().count()); + QCOMPARE(document.errors().count(), document3.errors().count()); + QCOMPARE(document.rootObject().objectClassName(), document3.rootObject().objectClassName()); + } + + // QDeclarativeDomImport + { + QCOMPARE(document.imports().count(), 1); + QDeclarativeDomImport import = document.imports().at(0); + + QDeclarativeDomImport import2(import); + QDeclarativeDomImport import3; + import3 = import2; + + QCOMPARE(import.type(), import2.type()); + QCOMPARE(import.uri(), import2.uri()); + QCOMPARE(import.version(), import2.version()); + QCOMPARE(import.qualifier(), import2.qualifier()); + + QCOMPARE(import.type(), import3.type()); + QCOMPARE(import.uri(), import3.uri()); + QCOMPARE(import.version(), import3.version()); + QCOMPARE(import.qualifier(), import3.qualifier()); + } + + // QDeclarativeDomObject + { + QDeclarativeDomObject object = document.rootObject(); + QVERIFY(object.isValid()); + + QDeclarativeDomObject object2(object); + QDeclarativeDomObject object3; + object3 = object; + + QCOMPARE(object.isValid(), object2.isValid()); + QCOMPARE(object.objectType(), object2.objectType()); + QCOMPARE(object.objectClassName(), object2.objectClassName()); + QCOMPARE(object.objectTypeMajorVersion(), object2.objectTypeMajorVersion()); + QCOMPARE(object.objectTypeMinorVersion(), object2.objectTypeMinorVersion()); + QCOMPARE(object.objectId(), object2.objectId()); + QCOMPARE(object.properties().count(), object2.properties().count()); + QCOMPARE(object.dynamicProperties().count(), object2.dynamicProperties().count()); + QCOMPARE(object.isCustomType(), object2.isCustomType()); + QCOMPARE(object.customTypeData(), object2.customTypeData()); + QCOMPARE(object.isComponent(), object2.isComponent()); + QCOMPARE(object.position(), object2.position()); + QCOMPARE(object.length(), object2.length()); + QCOMPARE(object.url(), object2.url()); + + QCOMPARE(object.isValid(), object3.isValid()); + QCOMPARE(object.objectType(), object3.objectType()); + QCOMPARE(object.objectClassName(), object3.objectClassName()); + QCOMPARE(object.objectTypeMajorVersion(), object3.objectTypeMajorVersion()); + QCOMPARE(object.objectTypeMinorVersion(), object3.objectTypeMinorVersion()); + QCOMPARE(object.objectId(), object3.objectId()); + QCOMPARE(object.properties().count(), object3.properties().count()); + QCOMPARE(object.dynamicProperties().count(), object3.dynamicProperties().count()); + QCOMPARE(object.isCustomType(), object3.isCustomType()); + QCOMPARE(object.customTypeData(), object3.customTypeData()); + QCOMPARE(object.isComponent(), object3.isComponent()); + QCOMPARE(object.position(), object3.position()); + QCOMPARE(object.length(), object3.length()); + QCOMPARE(object.url(), object3.url()); + } + + // QDeclarativeDomDynamicProperty + { + QDeclarativeDomObject object = document.rootObject(); + QDeclarativeDomDynamicProperty property = object.dynamicProperty("a"); + + QDeclarativeDomDynamicProperty property2(property); + QDeclarativeDomDynamicProperty property3; + property3 = property; + + QCOMPARE(property.isValid(), property2.isValid()); + QCOMPARE(property.propertyName(), property2.propertyName()); + QCOMPARE(property.propertyType(), property2.propertyType()); + QCOMPARE(property.propertyTypeName(), property2.propertyTypeName()); + QCOMPARE(property.isDefaultProperty(), property2.isDefaultProperty()); + QCOMPARE(property.defaultValue().propertyName(), property2.defaultValue().propertyName()); + QCOMPARE(property.position(), property2.position()); + QCOMPARE(property.length(), property2.length()); + + QCOMPARE(property.isValid(), property3.isValid()); + QCOMPARE(property.propertyName(), property3.propertyName()); + QCOMPARE(property.propertyType(), property3.propertyType()); + QCOMPARE(property.propertyTypeName(), property3.propertyTypeName()); + QCOMPARE(property.isDefaultProperty(), property3.isDefaultProperty()); + QCOMPARE(property.defaultValue().propertyName(), property3.defaultValue().propertyName()); + QCOMPARE(property.position(), property3.position()); + QCOMPARE(property.length(), property3.length()); + } + + // QDeclarativeDomProperty + { + QDeclarativeDomObject object = document.rootObject(); + QDeclarativeDomProperty property = object.property("opacity"); + + QDeclarativeDomProperty property2(property); + QDeclarativeDomProperty property3; + property3 = property; + + QCOMPARE(property.isValid(), property2.isValid()); + QCOMPARE(property.propertyName(), property2.propertyName()); + QCOMPARE(property.propertyNameParts(), property2.propertyNameParts()); + QCOMPARE(property.isDefaultProperty(), property2.isDefaultProperty()); + QCOMPARE(property.value().type(), property2.value().type()); + QCOMPARE(property.position(), property2.position()); + QCOMPARE(property.length(), property2.length()); + + QCOMPARE(property.isValid(), property3.isValid()); + QCOMPARE(property.propertyName(), property3.propertyName()); + QCOMPARE(property.propertyNameParts(), property3.propertyNameParts()); + QCOMPARE(property.isDefaultProperty(), property3.isDefaultProperty()); + QCOMPARE(property.value().type(), property3.value().type()); + QCOMPARE(property.position(), property3.position()); + QCOMPARE(property.length(), property3.length()); + } + + // QDeclarativeDomValueLiteral + { + QDeclarativeDomObject object = document.rootObject(); + QDeclarativeDomProperty property = object.property("x"); + QDeclarativeDomValueLiteral literal = property.value().toLiteral(); + QCOMPARE(literal.literal(), QString("10")); + + QDeclarativeDomValueLiteral literal2(literal); + QDeclarativeDomValueLiteral literal3; + literal3 = literal2; + + QCOMPARE(literal2.literal(), QString("10")); + QCOMPARE(literal3.literal(), QString("10")); + } + + + // QDeclarativeDomValueBinding + { + QDeclarativeDomObject object = document.rootObject(); + QDeclarativeDomProperty property = object.property("y"); + QDeclarativeDomValueBinding binding = property.value().toBinding(); + QCOMPARE(binding.binding(), QString("x + 10")); + + QDeclarativeDomValueBinding binding2(binding); + QDeclarativeDomValueBinding binding3; + binding3 = binding2; + + QCOMPARE(binding2.binding(), QString("x + 10")); + QCOMPARE(binding3.binding(), QString("x + 10")); + } + + // QDeclarativeDomValueValueSource + { + QDeclarativeDomObject object = document.rootObject(); + QDeclarativeDomProperty property = object.property("z"); + QDeclarativeDomValueValueSource source = property.value().toValueSource(); + QCOMPARE(source.object().objectClassName(), QByteArray("NumberAnimation")); + + QDeclarativeDomValueValueSource source2(source); + QDeclarativeDomValueValueSource source3; + source3 = source; + + QCOMPARE(source2.object().objectClassName(), QByteArray("NumberAnimation")); + QCOMPARE(source3.object().objectClassName(), QByteArray("NumberAnimation")); + } + + // QDeclarativeDomValueValueInterceptor + { + QDeclarativeDomObject object = document.rootObject(); + QDeclarativeDomProperty property = object.property("opacity"); + QDeclarativeDomValueValueInterceptor interceptor = property.value().toValueInterceptor(); + QCOMPARE(interceptor.object().objectClassName(), QByteArray("Behavior")); + + QDeclarativeDomValueValueInterceptor interceptor2(interceptor); + QDeclarativeDomValueValueInterceptor interceptor3; + interceptor3 = interceptor; + + QCOMPARE(interceptor2.object().objectClassName(), QByteArray("Behavior")); + QCOMPARE(interceptor3.object().objectClassName(), QByteArray("Behavior")); + } + + // QDeclarativeDomComponent + { + QDeclarativeDomObject object = document.rootObject(); + QDeclarativeDomProperty property = object.property("data"); + QCOMPARE(property.value().toList().values().count(), 1); + QDeclarativeDomComponent component = + property.value().toList().values().at(0).toObject().toComponent(); + QCOMPARE(component.componentRoot().objectClassName(), QByteArray("Item")); + + QDeclarativeDomComponent component2(component); + QDeclarativeDomComponent component3; + component3 = component; + + QCOMPARE(component.componentRoot().objectClassName(), component2.componentRoot().objectClassName()); + QCOMPARE(component.isValid(), component2.isValid()); + QCOMPARE(component.objectType(), component2.objectType()); + QCOMPARE(component.objectClassName(), component2.objectClassName()); + QCOMPARE(component.objectTypeMajorVersion(), component2.objectTypeMajorVersion()); + QCOMPARE(component.objectTypeMinorVersion(), component2.objectTypeMinorVersion()); + QCOMPARE(component.objectId(), component2.objectId()); + QCOMPARE(component.properties().count(), component2.properties().count()); + QCOMPARE(component.dynamicProperties().count(), component2.dynamicProperties().count()); + QCOMPARE(component.isCustomType(), component2.isCustomType()); + QCOMPARE(component.customTypeData(), component2.customTypeData()); + QCOMPARE(component.isComponent(), component2.isComponent()); + QCOMPARE(component.position(), component2.position()); + QCOMPARE(component.length(), component2.length()); + QCOMPARE(component.url(), component2.url()); + + QCOMPARE(component.componentRoot().objectClassName(), component3.componentRoot().objectClassName()); + QCOMPARE(component.isValid(), component3.isValid()); + QCOMPARE(component.objectType(), component3.objectType()); + QCOMPARE(component.objectClassName(), component3.objectClassName()); + QCOMPARE(component.objectTypeMajorVersion(), component3.objectTypeMajorVersion()); + QCOMPARE(component.objectTypeMinorVersion(), component3.objectTypeMinorVersion()); + QCOMPARE(component.objectId(), component3.objectId()); + QCOMPARE(component.properties().count(), component3.properties().count()); + QCOMPARE(component.dynamicProperties().count(), component3.dynamicProperties().count()); + QCOMPARE(component.isCustomType(), component3.isCustomType()); + QCOMPARE(component.customTypeData(), component3.customTypeData()); + QCOMPARE(component.isComponent(), component3.isComponent()); + QCOMPARE(component.position(), component3.position()); + QCOMPARE(component.length(), component3.length()); + QCOMPARE(component.url(), component3.url()); + } + + // QDeclarativeDomValue + { + QDeclarativeDomObject object = document.rootObject(); + QDeclarativeDomProperty property = object.property("data"); + QDeclarativeDomValue value = property.value(); + + QDeclarativeDomValue value2(value); + QDeclarativeDomValue value3; + value3 = value; + + QCOMPARE(value.type(), value2.type()); + QCOMPARE(value.isInvalid(), value2.isInvalid()); + QCOMPARE(value.isLiteral(), value2.isLiteral()); + QCOMPARE(value.isBinding(), value2.isBinding()); + QCOMPARE(value.isValueSource(), value2.isValueSource()); + QCOMPARE(value.isValueInterceptor(), value2.isValueInterceptor()); + QCOMPARE(value.isObject(), value2.isObject()); + QCOMPARE(value.isList(), value2.isList()); + QCOMPARE(value.position(), value2.position()); + QCOMPARE(value.length(), value2.length()); + + QCOMPARE(value.type(), value3.type()); + QCOMPARE(value.isInvalid(), value3.isInvalid()); + QCOMPARE(value.isLiteral(), value3.isLiteral()); + QCOMPARE(value.isBinding(), value3.isBinding()); + QCOMPARE(value.isValueSource(), value3.isValueSource()); + QCOMPARE(value.isValueInterceptor(), value3.isValueInterceptor()); + QCOMPARE(value.isObject(), value3.isObject()); + QCOMPARE(value.isList(), value3.isList()); + QCOMPARE(value.position(), value3.position()); + QCOMPARE(value.length(), value3.length()); + } + { + QDeclarativeDomObject object = document.rootObject(); + QDeclarativeDomProperty property = object.property("x"); + QDeclarativeDomValue value = property.value(); + + QDeclarativeDomValue value2(value); + QDeclarativeDomValue value3; + value3 = value; + + QCOMPARE(value.type(), value2.type()); + QCOMPARE(value.isInvalid(), value2.isInvalid()); + QCOMPARE(value.isLiteral(), value2.isLiteral()); + QCOMPARE(value.isBinding(), value2.isBinding()); + QCOMPARE(value.isValueSource(), value2.isValueSource()); + QCOMPARE(value.isValueInterceptor(), value2.isValueInterceptor()); + QCOMPARE(value.isObject(), value2.isObject()); + QCOMPARE(value.isList(), value2.isList()); + QCOMPARE(value.position(), value2.position()); + QCOMPARE(value.length(), value2.length()); + + QCOMPARE(value.type(), value3.type()); + QCOMPARE(value.isInvalid(), value3.isInvalid()); + QCOMPARE(value.isLiteral(), value3.isLiteral()); + QCOMPARE(value.isBinding(), value3.isBinding()); + QCOMPARE(value.isValueSource(), value3.isValueSource()); + QCOMPARE(value.isValueInterceptor(), value3.isValueInterceptor()); + QCOMPARE(value.isObject(), value3.isObject()); + QCOMPARE(value.isList(), value3.isList()); + QCOMPARE(value.position(), value3.position()); + QCOMPARE(value.length(), value3.length()); + } + { + QDeclarativeDomValue value; + + QDeclarativeDomValue value2(value); + QDeclarativeDomValue value3; + value3 = value; + + QCOMPARE(value.type(), value2.type()); + QCOMPARE(value.isInvalid(), value2.isInvalid()); + QCOMPARE(value.isLiteral(), value2.isLiteral()); + QCOMPARE(value.isBinding(), value2.isBinding()); + QCOMPARE(value.isValueSource(), value2.isValueSource()); + QCOMPARE(value.isValueInterceptor(), value2.isValueInterceptor()); + QCOMPARE(value.isObject(), value2.isObject()); + QCOMPARE(value.isList(), value2.isList()); + QCOMPARE(value.position(), value2.position()); + QCOMPARE(value.length(), value2.length()); + + QCOMPARE(value.type(), value3.type()); + QCOMPARE(value.isInvalid(), value3.isInvalid()); + QCOMPARE(value.isLiteral(), value3.isLiteral()); + QCOMPARE(value.isBinding(), value3.isBinding()); + QCOMPARE(value.isValueSource(), value3.isValueSource()); + QCOMPARE(value.isValueInterceptor(), value3.isValueInterceptor()); + QCOMPARE(value.isObject(), value3.isObject()); + QCOMPARE(value.isList(), value3.isList()); + QCOMPARE(value.position(), value3.position()); + QCOMPARE(value.length(), value3.length()); + } + + // QDeclarativeDomList + { + QDeclarativeDomObject object = document.rootObject(); + QDeclarativeDomProperty property = object.property("children"); + QDeclarativeDomList list = property.value().toList(); + QCOMPARE(list.values().count(), 2); + + QDeclarativeDomList list2(list); + QDeclarativeDomList list3; + list3 = list2; + + QCOMPARE(list.values().count(), list2.values().count()); + QCOMPARE(list.position(), list2.position()); + QCOMPARE(list.length(), list2.length()); + QCOMPARE(list.commaPositions(), list2.commaPositions()); + + QCOMPARE(list.values().count(), list3.values().count()); + QCOMPARE(list.position(), list3.position()); + QCOMPARE(list.length(), list3.length()); + QCOMPARE(list.commaPositions(), list3.commaPositions()); + + } +} + +// Tests the position/length of various elements +void tst_qdeclarativedom::position() +{ + QByteArray qml = "import QtQuick 1.0\n" + "Item {\n" + " id: myItem\n" + " property int a: 10\n" + " x: 10\n" + " y: x + 10\n" + " NumberAnimation on z {}\n" + " Behavior on opacity {}\n" + " Component {\n" + " Item{}\n" + " }\n" + " children: [ Item{}, Item{} ]\n" + "}\n"; + + + QDeclarativeDomDocument document; + QVERIFY(document.load(&engine, qml)); + + QDeclarativeDomObject root = document.rootObject(); + + // All QDeclarativeDomDynamicProperty + QDeclarativeDomDynamicProperty dynProp = root.dynamicProperty("a"); + QCOMPARE(dynProp.position(), 45); + QCOMPARE(dynProp.length(), 18); + + // All QDeclarativeDomProperty + QDeclarativeDomProperty x = root.property("x"); + QCOMPARE(x.position(), 68); + QCOMPARE(x.length(), 1); + + QDeclarativeDomProperty y = root.property("y"); + QCOMPARE(y.position(), 78); + QCOMPARE(y.length(), 1); + + QDeclarativeDomProperty z = root.property("z"); + QCOMPARE(z.position(), 111); + QCOMPARE(z.length(), 1); + + QDeclarativeDomProperty opacity = root.property("opacity"); + QCOMPARE(opacity.position(), 132); + QCOMPARE(opacity.length(), 7); + + QDeclarativeDomProperty data = root.property("data"); + QCOMPARE(data.position(), 147); + QCOMPARE(data.length(), 0); + + QDeclarativeDomProperty children = root.property("children"); + QCOMPARE(children.position(), 184); + QCOMPARE(children.length(), 8); + + QDeclarativeDomList dataList = data.value().toList(); + QCOMPARE(dataList.values().count(), 1); + QDeclarativeDomList childrenList = children.value().toList(); + QCOMPARE(childrenList.values().count(), 2); + + // All QDeclarativeDomObject + QCOMPARE(root.position(), 19); + QCOMPARE(root.length(), 195); + + QDeclarativeDomObject numberAnimation = z.value().toValueSource().object(); + QCOMPARE(numberAnimation.position(), 92); + QCOMPARE(numberAnimation.length(), 23); + + QDeclarativeDomObject behavior = opacity.value().toValueInterceptor().object(); + QCOMPARE(behavior.position(), 120); + QCOMPARE(behavior.length(), 22); + + QDeclarativeDomObject component = dataList.values().at(0).toObject(); + QCOMPARE(component.position(), 147); + QCOMPARE(component.length(), 32); + + QDeclarativeDomObject componentRoot = component.toComponent().componentRoot(); + QCOMPARE(componentRoot.position(), 167); + QCOMPARE(componentRoot.length(), 6); + + QDeclarativeDomObject child1 = childrenList.values().at(0).toObject(); + QCOMPARE(child1.position(), 196); + QCOMPARE(child1.length(), 6); + + QDeclarativeDomObject child2 = childrenList.values().at(1).toObject(); + QCOMPARE(child2.position(), 204); + QCOMPARE(child2.length(), 6); + + // All QDeclarativeDomValue + QDeclarativeDomValue xValue = x.value(); + QCOMPARE(xValue.position(), 71); + QCOMPARE(xValue.length(), 2); + + QDeclarativeDomValue yValue = y.value(); + QCOMPARE(yValue.position(), 81); + QCOMPARE(yValue.length(), 6); + + QDeclarativeDomValue zValue = z.value(); + QCOMPARE(zValue.position(), 92); + QCOMPARE(zValue.length(), 23); + + QDeclarativeDomValue opacityValue = opacity.value(); + QCOMPARE(opacityValue.position(), 120); + QCOMPARE(opacityValue.length(), 22); + + QDeclarativeDomValue dataValue = data.value(); + QCOMPARE(dataValue.position(), 147); + QCOMPARE(dataValue.length(), 32); + + QDeclarativeDomValue child1Value = childrenList.values().at(0); + QCOMPARE(child1Value.position(), 196); + QCOMPARE(child1Value.length(), 6); + + QDeclarativeDomValue child2Value = childrenList.values().at(1); + QCOMPARE(child2Value.position(), 204); + QCOMPARE(child2Value.length(), 6); + + // All QDeclarativeDomList + QCOMPARE(childrenList.position(), 194); + QCOMPARE(childrenList.length(), 18); +} + +QTEST_MAIN(tst_qdeclarativedom) + +#include "tst_qdeclarativedom.moc" diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/AliasBindingsAssignCorrectlyType.qml b/tests/auto/declarative/qdeclarativeecmascript/data/AliasBindingsAssignCorrectlyType.qml new file mode 100644 index 00000000..0eda67d5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/AliasBindingsAssignCorrectlyType.qml @@ -0,0 +1,9 @@ +import QtQuick 1.0 + +QtObject { + id: root + + property real realProperty + property alias aliasProperty: root.realProperty +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/AliasBindingsOverrideTargetType.qml b/tests/auto/declarative/qdeclarativeecmascript/data/AliasBindingsOverrideTargetType.qml new file mode 100644 index 00000000..f539fb62 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/AliasBindingsOverrideTargetType.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 +import Qt.test 1.0 + +MyTypeObject { + id: root + + property int data: 7 + + property int targetProperty: root.data * 43 - root.data + property alias aliasProperty: root.targetProperty + + pointProperty: Qt.point(data, data); + property alias pointAliasProperty: root.pointProperty +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/AliasBindingsOverrideTargetType3.qml b/tests/auto/declarative/qdeclarativeecmascript/data/AliasBindingsOverrideTargetType3.qml new file mode 100644 index 00000000..a4b05274 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/AliasBindingsOverrideTargetType3.qml @@ -0,0 +1,9 @@ +import QtQuick 1.0 + +QtObject { + id: root + + property int testProperty + property alias aliasProperty: root.testProperty +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/ConstantsOverrideBindings.qml b/tests/auto/declarative/qdeclarativeecmascript/data/ConstantsOverrideBindings.qml new file mode 100644 index 00000000..07bb16b0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/ConstantsOverrideBindings.qml @@ -0,0 +1,12 @@ +import Qt.test 1.0 + +MyQmlObject { + property int c1: 0 + property int c2: c1 + property alias c3: inner.ic1 + + objectProperty: MyQmlObject { + id: inner + property int ic1: c1 + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/CustomObject.qml b/tests/auto/declarative/qdeclarativeecmascript/data/CustomObject.qml new file mode 100644 index 00000000..4a425185 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/CustomObject.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +QtObject { + property string greeting: "hello world" +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/MethodsObject.qml b/tests/auto/declarative/qdeclarativeecmascript/data/MethodsObject.qml new file mode 100644 index 00000000..829d405c --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/MethodsObject.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +QtObject { + function testFunction() { return 19; } + function testFunction2() { return 18; } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/NestedTypeTransientErrors.qml b/tests/auto/declarative/qdeclarativeecmascript/data/NestedTypeTransientErrors.qml new file mode 100644 index 00000000..f542c64a --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/NestedTypeTransientErrors.qml @@ -0,0 +1,11 @@ +import QtQuick 1.0 + +QtObject { + property int b: obj.prop.a + + property variant prop; + prop: QtObject { + property int a: 10 + } +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/ScopeObject.qml b/tests/auto/declarative/qdeclarativeecmascript/data/ScopeObject.qml new file mode 100644 index 00000000..df494af5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/ScopeObject.qml @@ -0,0 +1,12 @@ +import QtQuick 1.0 + +Item { + property int a: 3 + property int binding: myFunction(); + property int binding2: myCompFunction(); + + function myCompFunction() { + return a; + } +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/SpuriousWarning.qml b/tests/auto/declarative/qdeclarativeecmascript/data/SpuriousWarning.qml new file mode 100644 index 00000000..3427a3b2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/SpuriousWarning.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +Item { + property int children: root.children.length +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/TypeForDynamicCreation.qml b/tests/auto/declarative/qdeclarativeecmascript/data/TypeForDynamicCreation.qml new file mode 100644 index 00000000..56e06252 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/TypeForDynamicCreation.qml @@ -0,0 +1,2 @@ +import Qt.test 1.0 +MyQmlObject{objectName:"objectThree"} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/aliasBindingsAssignCorrectly.qml b/tests/auto/declarative/qdeclarativeecmascript/data/aliasBindingsAssignCorrectly.qml new file mode 100644 index 00000000..f0808c4c --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/aliasBindingsAssignCorrectly.qml @@ -0,0 +1,59 @@ +import QtQuick 1.0 + +Item { + id: root + + property bool test: false + + property real testData: 9 + property real testData2: 9 + + states: State { + name: "change" + PropertyChanges { + target: myType + realProperty: if (testData2 > 3) 9; else 11; + } + } + + AliasBindingsAssignCorrectlyType { + id: myType + + aliasProperty: if (testData > 3) 14; else 12; + } + + Component.onCompleted: { + // Check original binding works + if (myType.aliasProperty != 14) return; + + testData = 2; + if (myType.aliasProperty != 12) return; + + // Change binding indirectly by modifying the "realProperty" + root.state = "change"; + if (myType.aliasProperty != 9) return; + + // Check the new binding works + testData2 = 1; + if (myType.aliasProperty != 11) return; + + // Try and trigger the old binding (that should have been removed) + testData = 6; + if (myType.aliasProperty != 11) return; + + // Restore the original binding + root.state = ""; + if (myType.aliasProperty != 14) return; + + // Test the restored binding works + testData = 0; + if (myType.aliasProperty != 12) return; + + // Test the old binding isn't somehow hanging around and still in effect + testData2 = 13; + if (myType.aliasProperty != 12) return; + + test = true; + } +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/aliasBindingsOverrideTarget.2.qml b/tests/auto/declarative/qdeclarativeecmascript/data/aliasBindingsOverrideTarget.2.qml new file mode 100644 index 00000000..4f07cbf6 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/aliasBindingsOverrideTarget.2.qml @@ -0,0 +1,29 @@ +import QtQuick 1.0 + +Item { + id: me + property bool test: false + + property int value: 9 + + AliasBindingsOverrideTargetType { + id: aliasType + pointAliasProperty.x: me.value + } + + Component.onCompleted: { + if (aliasType.pointAliasProperty.x != 9) return; + + me.value = 11; + if (aliasType.pointAliasProperty.x != 11) return; + + aliasType.data = 8; + if (aliasType.pointAliasProperty.x != 11) return; + + me.value = 4; + if (aliasType.pointAliasProperty.x != 4) return; + + test = true; + } +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/aliasBindingsOverrideTarget.3.qml b/tests/auto/declarative/qdeclarativeecmascript/data/aliasBindingsOverrideTarget.3.qml new file mode 100644 index 00000000..937ae91c --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/aliasBindingsOverrideTarget.3.qml @@ -0,0 +1,24 @@ +import QtQuick 1.0 + +Item { + id: root + property bool test: false; + + property int value1: 10 + property int value2: 11 + + AliasBindingsOverrideTargetType3 { + id: obj + + testProperty: root.value1 * 9 + aliasProperty: root.value2 * 10 + } + + Component.onCompleted: { + if (obj.testProperty != 110) return; + if (obj.aliasProperty != 110) return; + + test = true; + } +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/aliasBindingsOverrideTarget.qml b/tests/auto/declarative/qdeclarativeecmascript/data/aliasBindingsOverrideTarget.qml new file mode 100644 index 00000000..a01dc5b0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/aliasBindingsOverrideTarget.qml @@ -0,0 +1,28 @@ +import QtQuick 1.0 + +Item { + id: me + property bool test: false + + property int value: 9 + + AliasBindingsOverrideTargetType { + id: aliasType + aliasProperty: me.value + } + + Component.onCompleted: { + if (aliasType.aliasProperty != 9) return; + + me.value = 11; + if (aliasType.aliasProperty != 11) return; + + aliasType.data = 8; + if (aliasType.aliasProperty != 11) return; + + me.value = 4; + if (aliasType.aliasProperty != 4) return; + + test = true; + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/aliasPropertyAndBinding.qml b/tests/auto/declarative/qdeclarativeecmascript/data/aliasPropertyAndBinding.qml new file mode 100644 index 00000000..da6c795b --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/aliasPropertyAndBinding.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 +import Qt.test 1.0 + +MyQmlObject { + property alias c1: myObject.c1 + property int c2: 3 + property int c3: c2 + objectProperty: QtObject { + id: myObject + property int c1 + } +} + + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/aliasWritesOverrideBindings.2.qml b/tests/auto/declarative/qdeclarativeecmascript/data/aliasWritesOverrideBindings.2.qml new file mode 100644 index 00000000..5bf9f6a2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/aliasWritesOverrideBindings.2.qml @@ -0,0 +1,29 @@ +import QtQuick 1.0 + +Item { + id: me + property bool test: false + + property int value: 9 + + AliasBindingsOverrideTargetType { + id: aliasType + } + + Component.onCompleted: { + if (aliasType.aliasProperty != 294) return; + + aliasType.data = 8; + if (aliasType.aliasProperty != 336) return; + + aliasType.aliasProperty = 4; + if (aliasType.aliasProperty != 4) return; + + aliasType.data = 7; + if (aliasType.aliasProperty != 4) return; + + test = true; + } +} + + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/aliasWritesOverrideBindings.3.qml b/tests/auto/declarative/qdeclarativeecmascript/data/aliasWritesOverrideBindings.3.qml new file mode 100644 index 00000000..a23ad4a0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/aliasWritesOverrideBindings.3.qml @@ -0,0 +1,23 @@ +import QtQuick 1.0 + +Item { + id: me + property bool test: false + + property int value: 9 + + AliasBindingsOverrideTargetType { + id: aliasType + pointAliasProperty.x: 9 + } + + Component.onCompleted: { + if (aliasType.pointAliasProperty.x != 9) return; + + aliasType.data = 8; + if (aliasType.pointAliasProperty.x != 9) return; + + test = true; + } +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/aliasWritesOverrideBindings.qml b/tests/auto/declarative/qdeclarativeecmascript/data/aliasWritesOverrideBindings.qml new file mode 100644 index 00000000..ac203714 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/aliasWritesOverrideBindings.qml @@ -0,0 +1,23 @@ +import QtQuick 1.0 + +Item { + id: me + property bool test: false + + property int value: 9 + + AliasBindingsOverrideTargetType { + id: aliasType + aliasProperty: 11 + } + + Component.onCompleted: { + if (aliasType.aliasProperty != 11) return; + + aliasType.data = 8; + if (aliasType.aliasProperty != 11) return; + + test = true; + } +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/assignBasicTypes.2.qml b/tests/auto/declarative/qdeclarativeecmascript/data/assignBasicTypes.2.qml new file mode 100644 index 00000000..2c797296 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/assignBasicTypes.2.qml @@ -0,0 +1,26 @@ +import Qt.test 1.0 + +MyTypeObject { + flagProperty: if(1) "FlagVal1 | FlagVal3" + enumProperty: if(1) "EnumVal2" + stringProperty: if(1) "Hello World!" + uintProperty: if(1) 10 + intProperty: if(1) -19 + realProperty: if(1) 23.2 + doubleProperty: if(1) -19.75 + floatProperty: if(1) 8.5 + colorProperty: if(1) "red" + dateProperty: if(1) "1982-11-25" + timeProperty: if(1) "11:11:32" + dateTimeProperty: if(1) "2009-05-12T13:22:01" + pointProperty: if(1) "99,13" + pointFProperty: if(1) "-10.1,12.3" + sizeProperty: if(1) "99x13" + sizeFProperty: if(1) "0.1x0.2" + rectProperty: if(1) "9,7,100x200" + rectFProperty: if(1) "1000.1,-10.9,400x90.99" + boolProperty: if(1) true + variantProperty: if(1) "Hello World!" + vectorProperty: if(1) "10,1,2.2" + urlProperty: if(1) "main.qml" +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/assignBasicTypes.qml b/tests/auto/declarative/qdeclarativeecmascript/data/assignBasicTypes.qml new file mode 100644 index 00000000..9443c01d --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/assignBasicTypes.qml @@ -0,0 +1,29 @@ +import Qt.test 1.0 +import QtQuick 1.0 + +MyTypeObject { + Component.onCompleted: { + flagProperty = "FlagVal1 | FlagVal3" + enumProperty = "EnumVal2" + stringProperty = "Hello World!" + uintProperty = 10 + intProperty = -19 + realProperty = 23.2 + doubleProperty = -19.75 + floatProperty = 8.5 + colorProperty = "red" + dateProperty = "1982-11-25" + timeProperty = "11:11:32" + dateTimeProperty = "2009-05-12T13:22:01" + pointProperty = "99,13" + pointFProperty = "-10.1,12.3" + sizeProperty = "99x13" + sizeFProperty = "0.1x0.2" + rectProperty = "9,7,100x200" + rectFProperty = "1000.1,-10.9,400x90.99" + boolProperty = true + variantProperty = "Hello World!" + vectorProperty = "10,1,2.2" + urlProperty = "main.qml" + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/attachedProperty.2.qml b/tests/auto/declarative/qdeclarativeecmascript/data/attachedProperty.2.qml new file mode 100644 index 00000000..a7184c92 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/attachedProperty.2.qml @@ -0,0 +1,22 @@ +import Qt.test 1.0 +import Qt.test 1.0 as Namespace + +MyQmlObject { + property alias a: me.a + property alias b: me.a + property alias c: me.a + property alias d: me.a + + property MyQmlObject obj + obj: MyQmlObject { + MyQmlObject.value2: 13 + + id: me + property int a: MyQmlObject.value2 * 2 + property int b: Namespace.MyQmlObject.value2 * 2 + property int c: me.Namespace.MyQmlObject.value * 2 + property int d: me.Namespace.MyQmlObject.value * 2 + } +} + + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/attachedProperty.qml b/tests/auto/declarative/qdeclarativeecmascript/data/attachedProperty.qml new file mode 100644 index 00000000..061eda0e --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/attachedProperty.qml @@ -0,0 +1,11 @@ +import Qt.test 1.0 +import Qt.test 1.0 as Namespace + +MyQmlObject { + id: me + property int a: MyQmlObject.value + property int b: Namespace.MyQmlObject.value + property int c: me.Namespace.MyQmlObject.value + property int d: me.Namespace.MyQmlObject.value +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/attachedPropertyScope.qml b/tests/auto/declarative/qdeclarativeecmascript/data/attachedPropertyScope.qml new file mode 100644 index 00000000..c66ef693 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/attachedPropertyScope.qml @@ -0,0 +1,9 @@ +import QtQuick 1.0 +import Qt.test 1.0 + +QtObject { + property int value: 9 + property int value2 + + MyQmlObject.onMySignal: value2 = value +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/bindingLoop.qml b/tests/auto/declarative/qdeclarativeecmascript/data/bindingLoop.qml new file mode 100644 index 00000000..80545cf7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/bindingLoop.qml @@ -0,0 +1,14 @@ +import Qt.test 1.0 + +MyQmlContainer { + children : [ + MyQmlObject { + id: object1 + stringProperty: "hello" + object2.stringProperty + }, + MyQmlObject { + id: object2 + stringProperty: "hello" + object1.stringProperty + } + ] +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/blank.js b/tests/auto/declarative/qdeclarativeecmascript/data/blank.js new file mode 100644 index 00000000..e69de29b diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/boolPropertiesEvaluateAsBool.1.qml b/tests/auto/declarative/qdeclarativeecmascript/data/boolPropertiesEvaluateAsBool.1.qml new file mode 100644 index 00000000..3147f639 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/boolPropertiesEvaluateAsBool.1.qml @@ -0,0 +1,5 @@ +import Qt.test 1.0 + +MyQmlObject { + stringProperty: trueProperty?'pass':'fail' +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/boolPropertiesEvaluateAsBool.2.qml b/tests/auto/declarative/qdeclarativeecmascript/data/boolPropertiesEvaluateAsBool.2.qml new file mode 100644 index 00000000..c89bb49b --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/boolPropertiesEvaluateAsBool.2.qml @@ -0,0 +1,5 @@ +import Qt.test 1.0 + +MyQmlObject { + stringProperty: falseProperty?'fail':'pass' +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/bug.1.qml b/tests/auto/declarative/qdeclarativeecmascript/data/bug.1.qml new file mode 100644 index 00000000..68dbcfad --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/bug.1.qml @@ -0,0 +1,10 @@ +import QtQuick 1.0 + +QtObject { + property int a: 10 + property bool b: false + + property int test + + test: ((a == 10)?(a + 1):0) + ((b == true)?9:3) +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/canAssignNullToQObject.1.qml b/tests/auto/declarative/qdeclarativeecmascript/data/canAssignNullToQObject.1.qml new file mode 100644 index 00000000..3fd9131b --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/canAssignNullToQObject.1.qml @@ -0,0 +1,9 @@ +import Qt.test 1.0 + +MyQmlObject { + property bool runTest: false + + property variant a: MyQmlObject {} + + objectProperty: (runTest == false)?a:null +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/canAssignNullToQObject.2.qml b/tests/auto/declarative/qdeclarativeecmascript/data/canAssignNullToQObject.2.qml new file mode 100644 index 00000000..0f232975 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/canAssignNullToQObject.2.qml @@ -0,0 +1,11 @@ +import Qt.test 1.0 +import QtQuick 1.0 + +MyQmlObject { + objectProperty: MyQmlObject {} + + Component.onCompleted: { + objectProperty = null; + } +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/compiled.qml b/tests/auto/declarative/qdeclarativeecmascript/data/compiled.qml new file mode 100644 index 00000000..58b7adb8 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/compiled.qml @@ -0,0 +1,48 @@ +import QtQuick 1.0 + +QtObject { + //real + property real test1: a + b + property real test2: a - b + property bool test3: (a < b) + property bool test4: (a > b) + property bool test5: (a == b) + property bool test6: (a != b) + + //int + property int test7: c + d + property int test8: d - c + property bool test9: (c < d) + property bool test10: (c > d) + property bool test11: (c == d) + property bool test12: (c != d) + + //string + property string test13: e + f + property string test14: e + " " + f + property bool test15: (e == f) + property bool test16: (e != f) + + //type conversion + property int test17: a + property real test18: d + property int test19: g + property real test20: g + property string test21: g + property string test22: h + property bool test23: i + property color test24: j + property color test25: k + + property real a: 4.5 + property real b: 11.2 + property int c: 9 + property int d: 176 + property string e: "Hello" + property string f: "World" + property variant g: 6.7 + property variant h: "!" + property variant i: true + property string j: "#112233" + property string k: "#aa112233" +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/compositePropertyType.qml b/tests/auto/declarative/qdeclarativeecmascript/data/compositePropertyType.qml new file mode 100644 index 00000000..1af77d5a --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/compositePropertyType.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 + +QtObject { + property CustomObject myObject + myObject: CustomObject { } + + Component.onCompleted: console.log(myObject.greeting) +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/constantsOverrideBindings.1.qml b/tests/auto/declarative/qdeclarativeecmascript/data/constantsOverrideBindings.1.qml new file mode 100644 index 00000000..13c5ae5f --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/constantsOverrideBindings.1.qml @@ -0,0 +1,8 @@ +import Qt.test 1.0 + +MyQmlObject { + property int c1: 0 + property int c2: c1 + + onBasicSignal: c2 = 13 +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/constantsOverrideBindings.2.qml b/tests/auto/declarative/qdeclarativeecmascript/data/constantsOverrideBindings.2.qml new file mode 100644 index 00000000..207a06b7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/constantsOverrideBindings.2.qml @@ -0,0 +1,11 @@ +import Qt.test 1.0 + +MyQmlObject { + property alias c1: myConstants.c1 + property alias c2: myConstants.c2 + + objectProperty: ConstantsOverrideBindings { + id: myConstants + c2: 10 + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/constantsOverrideBindings.3.qml b/tests/auto/declarative/qdeclarativeecmascript/data/constantsOverrideBindings.3.qml new file mode 100644 index 00000000..ca9d1d8a --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/constantsOverrideBindings.3.qml @@ -0,0 +1,7 @@ +import Qt.test 1.0 + +MyQmlObject { + property int c1: 0 + property int c2: c1 +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/constantsOverrideBindings.4.qml b/tests/auto/declarative/qdeclarativeecmascript/data/constantsOverrideBindings.4.qml new file mode 100644 index 00000000..5a2091f7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/constantsOverrideBindings.4.qml @@ -0,0 +1,11 @@ +import Qt.test 1.0 + +MyQmlObject { + property alias c1: myConstants.c1 + property alias c3: myConstants.c3 + + objectProperty: ConstantsOverrideBindings { + id: myConstants + c3: 10 + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/declarativeToString.qml b/tests/auto/declarative/qdeclarativeecmascript/data/declarativeToString.qml new file mode 100644 index 00000000..ac296ce2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/declarativeToString.qml @@ -0,0 +1,11 @@ +import Qt.test 1.0 + +MyQmlObject{ + id: obj + objectName: "objName" + function testToString() + { + obj.stringProperty = obj.toString(); + } + +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/deferredProperties.qml b/tests/auto/declarative/qdeclarativeecmascript/data/deferredProperties.qml new file mode 100644 index 00000000..e01f708a --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/deferredProperties.qml @@ -0,0 +1,10 @@ +import Qt.test 1.0 + +MyDeferredObject { + id: root + value: 10 + objectProperty: MyQmlObject { + value: root.value + } + objectProperty2: MyQmlObject { id: blah } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/deferredPropertiesErrors.qml b/tests/auto/declarative/qdeclarativeecmascript/data/deferredPropertiesErrors.qml new file mode 100644 index 00000000..18a57ba6 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/deferredPropertiesErrors.qml @@ -0,0 +1,10 @@ +import Qt.test 1.0 +import QtQuick 1.0 + +MyDeferredObject { + value: undefined // error is resolved before complete + objectProperty: undefined // immediate error + objectProperty2: QtObject { + Component.onCompleted: value = 10 + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/deleteLater.qml b/tests/auto/declarative/qdeclarativeecmascript/data/deleteLater.qml new file mode 100644 index 00000000..131fa6f2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/deleteLater.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 + +QtObject { + id: root + property bool test: false + + Component.onCompleted: { + try { + root.deleteLater() + } catch(e) { + test = true; + } + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/deletedEngine.qml b/tests/auto/declarative/qdeclarativeecmascript/data/deletedEngine.qml new file mode 100644 index 00000000..4de405dc --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/deletedEngine.qml @@ -0,0 +1,11 @@ +import QtQuick 1.0 + +QtObject { + function calculate() { + return b * 13; + } + + property int a: calculate() + property int b: 3 +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/deletedObject.qml b/tests/auto/declarative/qdeclarativeecmascript/data/deletedObject.qml new file mode 100644 index 00000000..7ba51ef0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/deletedObject.qml @@ -0,0 +1,25 @@ +import QtQuick 1.0 +import Qt.test 1.0 + +QtObject { + property variant obj + obj: MyQmlObject { + id: myObject + value: 92 + } + + property bool test1: false + property bool test2: false + property bool test3: false + property bool test4: false + + Component.onCompleted: { + test1 = myObject.value == 92; + test2 = obj.value == 92; + + myObject.deleteOnSet = 1; + + test3 = myObject == null + test4 = obj == null + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/dynamicCreation.helper.qml b/tests/auto/declarative/qdeclarativeecmascript/data/dynamicCreation.helper.qml new file mode 100644 index 00000000..d790d634 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/dynamicCreation.helper.qml @@ -0,0 +1,6 @@ +import Qt.test 1.0 + +MyQmlObject{ + objectName: "objectTwo" +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/dynamicCreation.qml b/tests/auto/declarative/qdeclarativeecmascript/data/dynamicCreation.qml new file mode 100644 index 00000000..7b132e1e --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/dynamicCreation.qml @@ -0,0 +1,27 @@ +import Qt.test 1.0 + +MyQmlObject{ + id: obj + objectName: "obj" + function createOne() + { + obj.objectProperty = Qt.createQmlObject('import Qt.test 1.0; MyQmlObject{objectName:"objectOne"}', obj); + } + + function createTwo() + { + var component = Qt.createComponent('dynamicCreation.helper.qml'); + obj.objectProperty = component.createObject(obj); + } + + function createThree() + { + obj.objectProperty = Qt.createQmlObject('TypeForDynamicCreation{}', obj); + } + + function dontCrash() + { + var component = Qt.createComponent('file-doesnt-exist.qml'); + obj.objectProperty = component.createObject(obj); + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/dynamicDeletion.qml b/tests/auto/declarative/qdeclarativeecmascript/data/dynamicDeletion.qml new file mode 100644 index 00000000..f41e5262 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/dynamicDeletion.qml @@ -0,0 +1,20 @@ +import Qt.test 1.0 + +MyQmlObject{ + id: obj + objectName: "obj" + function create() + { + obj.objectProperty = Qt.createQmlObject('import Qt.test 1.0; MyQmlObject{objectName:"emptyObject"}', obj); + } + + function killOther() + { + obj.objectProperty.destroy(500); + } + + function killMe() + { + obj.destroy();//Must not segfault + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/enums.1.qml b/tests/auto/declarative/qdeclarativeecmascript/data/enums.1.qml new file mode 100644 index 00000000..63518232 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/enums.1.qml @@ -0,0 +1,20 @@ +import Qt.test 1.0 +import Qt.test 1.0 as Namespace + +MyQmlObject { + // Enums from non-namespaced type + property int a: MyQmlObject.EnumValue1 + property int b: MyQmlObject.EnumValue2 + property int c: MyQmlObject.EnumValue3 + property int d: MyQmlObject.EnumValue4 + + // Enums from namespaced type + property int e: Namespace.MyQmlObject.EnumValue1 + property int f: Namespace.MyQmlObject.EnumValue2 + property int g: Namespace.MyQmlObject.EnumValue3 + property int h: Namespace.MyQmlObject.EnumValue4 + + // Test that enums don't mask attached properties + property int i: MyQmlObject.value + property int j: Namespace.MyQmlObject.value +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/enums.2.qml b/tests/auto/declarative/qdeclarativeecmascript/data/enums.2.qml new file mode 100644 index 00000000..bdc672fa --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/enums.2.qml @@ -0,0 +1,8 @@ +import Qt.test 1.0 +import Qt.test 1.0 as Namespace + +MyQmlObject { + property int a: MyQmlObject.EnumValue10 + property int b: Namespace.MyQmlObject.EnumValue10 +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/eval.qml b/tests/auto/declarative/qdeclarativeecmascript/data/eval.qml new file mode 100644 index 00000000..661cd5c4 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/eval.qml @@ -0,0 +1,27 @@ +import QtQuick 1.0 + +QtObject { + property bool test1: false; + property bool test2: false; + property bool test3: false; + property bool test4: false; + property bool test5: false; + + + property int a: 7 + property int b: 8 + + Component.onCompleted: { + var b = 9; + + test1 = (eval("a") == 7); + test2 = (eval("b") == 9); + try { + eval("c"); + } catch(e) { + test3 = true; + } + test4 = (eval("console") == console); + test5 = (eval("Qt") == Qt); + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/exception.js b/tests/auto/declarative/qdeclarativeecmascript/data/exception.js new file mode 100644 index 00000000..160bbfa5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/exception.js @@ -0,0 +1 @@ +throw("Whoops!"); diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/exceptionClearsOnReeval.qml b/tests/auto/declarative/qdeclarativeecmascript/data/exceptionClearsOnReeval.qml new file mode 100644 index 00000000..a2f0d1a8 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/exceptionClearsOnReeval.qml @@ -0,0 +1,6 @@ +import Qt.test 1.0 + +MyQmlObject { + property bool test: objectProperty.objectProperty.trueProperty +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/exceptionProducesWarning.qml b/tests/auto/declarative/qdeclarativeecmascript/data/exceptionProducesWarning.qml new file mode 100644 index 00000000..2102821a --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/exceptionProducesWarning.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 +import Qt.test 1.0 + +MyQmlObject { + Component.onCompleted: + { throw(new Error("JS exception")) } +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/exceptionProducesWarning2.qml b/tests/auto/declarative/qdeclarativeecmascript/data/exceptionProducesWarning2.qml new file mode 100644 index 00000000..c197ef83 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/exceptionProducesWarning2.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 +import Qt.test 1.0 + +MyQmlObject { + value: { throw(new Error("JS exception")) } +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/extendedObjectPropertyLookup.qml b/tests/auto/declarative/qdeclarativeecmascript/data/extendedObjectPropertyLookup.qml new file mode 100644 index 00000000..9738d2cf --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/extendedObjectPropertyLookup.qml @@ -0,0 +1,8 @@ +import Qt.test 1.0 +import QtQuick 1.0 + +QtObject { + property MyExtendedObject a; + a: MyExtendedObject { id: root } + property int b: Math.max(root.extendedProperty, 0) +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/extensionObjects.qml b/tests/auto/declarative/qdeclarativeecmascript/data/extensionObjects.qml new file mode 100644 index 00000000..b0e897ef --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/extensionObjects.qml @@ -0,0 +1,19 @@ +import Qt.test 1.0 +import QtQuick 1.0 + +MyExtendedObject +{ + baseProperty: baseExtendedProperty + baseExtendedProperty: 13 + + coreProperty: extendedProperty + extendedProperty: 9 + + property QtObject nested: MyExtendedObject { + baseProperty: baseExtendedProperty + baseExtendedProperty: 13 + + coreProperty: extendedProperty + extendedProperty: 9 + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/extensionObjectsPropertyOverride.qml b/tests/auto/declarative/qdeclarativeecmascript/data/extensionObjectsPropertyOverride.qml new file mode 100644 index 00000000..3c443cb9 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/extensionObjectsPropertyOverride.qml @@ -0,0 +1,7 @@ +import Qt.test 1.0 + +OverrideDefaultPropertyObject +{ + MyBaseExtendedObject { + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/function.qml b/tests/auto/declarative/qdeclarativeecmascript/data/function.qml new file mode 100644 index 00000000..6cd8751c --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/function.qml @@ -0,0 +1,23 @@ +import QtQuick 1.0 + +QtObject { + property bool test1: false; + property bool test2: false; + property bool test3: false; + + Component.onCompleted: { + var a = 10; + + var func1 = new Function("a", "return a + 7"); + var func2 = new Function("a", "return Qt.atob(a)"); + var func3 = new Function("return a"); + + test1 = (func1(4) == 11); + test2 = (func2("Hello World!") == Qt.atob("Hello World!")); + try { + func3(); + } catch(e) { + test3 = true; + } + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/functionAssignment.1.qml b/tests/auto/declarative/qdeclarativeecmascript/data/functionAssignment.1.qml new file mode 100644 index 00000000..09540f1f --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/functionAssignment.1.qml @@ -0,0 +1,5 @@ +import Qt.test 1.0 + +MyQmlObject { + property variant a: function myFunction() { return 2; } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/functionAssignment.2.qml b/tests/auto/declarative/qdeclarativeecmascript/data/functionAssignment.2.qml new file mode 100644 index 00000000..c8c926ae --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/functionAssignment.2.qml @@ -0,0 +1,73 @@ +import Qt.test 1.0 +import QtQuick 1.0 + +import "functionAssignment.js" as Script + +MyQmlObject { + property variant a + property int aNumber: 10 + + property bool assignToProperty: false + property bool assignToPropertyFromJsFile: false + + property bool assignWithThis: false + property bool assignWithThisFromJsFile: false + + property bool assignToValueType: false + + property bool assignFuncWithoutReturn: false + property bool assignWrongType: false + property bool assignWrongTypeToValueType: false + + + onAssignToPropertyChanged: { + function myFunction() { + return aNumber * 10; + } + a = myFunction; + } + + property QtObject obj: QtObject { + property int aNumber: 4212 + function myFunction() { + return this.aNumber * 10; // should use the aNumber from root, not this object + } + } + onAssignWithThisChanged: { + a = obj.myFunction; + } + + onAssignToPropertyFromJsFileChanged: { + Script.bindPropertyWithThis() + } + + onAssignWithThisFromJsFileChanged: { + Script.bindProperty() + } + + property Text text: Text { } + onAssignToValueTypeChanged: { + text.font.pixelSize = (function() { return aNumber * 10; }) + a = (function() { return text.font.pixelSize; }) + } + + + // detecting errors: + + onAssignFuncWithoutReturnChanged: { + function myFunction() { + } + a = myFunction; + } + + onAssignWrongTypeChanged: { + function myFunction() { + return 'a string'; + } + aNumber = myFunction; + } + + onAssignWrongTypeToValueTypeChanged: { + text.font.pixelSize = (function() { return 'a string'; }) + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/functionAssignment.js b/tests/auto/declarative/qdeclarativeecmascript/data/functionAssignment.js new file mode 100644 index 00000000..14daa762 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/functionAssignment.js @@ -0,0 +1,17 @@ +function bindProperty() +{ + a = (function(){ return aNumber * 10 }) +} + + +function TestObject() { } +TestObject.prototype.aNumber = 928349 +TestObject.prototype.bindFunction = function() { + return this.aNumber * 10 // this should not use the TestObject's aNumber +} +var testObj = new TestObject() + +function bindPropertyWithThis() +{ + a = testObj.bindFunction +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/functionErrors.qml b/tests/auto/declarative/qdeclarativeecmascript/data/functionErrors.qml new file mode 100644 index 00000000..2ba02d1d --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/functionErrors.qml @@ -0,0 +1,10 @@ +import QtQuick 1.0 + +QtObject { + function myFunction() { + a = 10; + } + + Component.onCompleted: myFunction(); +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/idShortcutInvalidates.1.qml b/tests/auto/declarative/qdeclarativeecmascript/data/idShortcutInvalidates.1.qml new file mode 100644 index 00000000..6dcdefcb --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/idShortcutInvalidates.1.qml @@ -0,0 +1,13 @@ +import Qt.test 1.0 +import QtQuick 1.0 + +MyQmlObject { + objectProperty: if(1) otherObject + + property variant obj + + obj: QtObject { + id: otherObject + } +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/idShortcutInvalidates.qml b/tests/auto/declarative/qdeclarativeecmascript/data/idShortcutInvalidates.qml new file mode 100644 index 00000000..32b86110 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/idShortcutInvalidates.qml @@ -0,0 +1,12 @@ +import Qt.test 1.0 +import QtQuick 1.0 + +MyQmlObject { + objectProperty: otherObject + + property variant obj + + obj: QtObject { + id: otherObject + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/in.qml b/tests/auto/declarative/qdeclarativeecmascript/data/in.qml new file mode 100644 index 00000000..f9cccb5a --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/in.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +Item { + id: root + property bool test1: "x" in root + property bool test2: !("foo" in root) +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/include.js b/tests/auto/declarative/qdeclarativeecmascript/data/include.js new file mode 100644 index 00000000..232fd808 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/include.js @@ -0,0 +1,8 @@ +var test1 = true +var test2 = false +var test3 = false + +function go() { + Qt.include("js/include2.js"); +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/include.qml b/tests/auto/declarative/qdeclarativeecmascript/data/include.qml new file mode 100644 index 00000000..61b04618 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/include.qml @@ -0,0 +1,23 @@ +import QtQuick 1.0 +import "include.js" as IncludeTest + +QtObject { + property int test0: 0 + property bool test1: false + property bool test2: false + property bool test2_1: false + property bool test3: false + property bool test3_1: false + + property int testValue: 99 + + Component.onCompleted: { + IncludeTest.go(); + test0 = IncludeTest.value + test1 = IncludeTest.test1 + test2 = IncludeTest.test2 + test2_1 = IncludeTest.test2_1 + test3 = IncludeTest.test3 + test3_1 = IncludeTest.test3_1 + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/include_callback.js b/tests/auto/declarative/qdeclarativeecmascript/data/include_callback.js new file mode 100644 index 00000000..ea19eba3 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/include_callback.js @@ -0,0 +1,11 @@ +function go() { + var a = Qt.include("missing.js", function(o) { test2 = o.status == o.NETWORK_ERROR }); + test1 = a.status == a.NETWORK_ERROR + + var b = Qt.include("blank.js", function(o) { test4 = o.status == o.OK }); + test3 = b.status == b.OK + + var c = Qt.include("exception.js", function(o) { test6 = o.status == o.EXCEPTION }); + test5 = c.status == c.EXCEPTION +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/include_callback.qml b/tests/auto/declarative/qdeclarativeecmascript/data/include_callback.qml new file mode 100644 index 00000000..1633ebaa --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/include_callback.qml @@ -0,0 +1,15 @@ +import QtQuick 1.0 +import "include_callback.js" as IncludeTest + +QtObject { + property bool test1: false + property bool test2: false + property bool test3: false + property bool test4: false + property bool test5: false + property bool test6: false + + Component.onCompleted: { + IncludeTest.go(); + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/include_pragma.qml b/tests/auto/declarative/qdeclarativeecmascript/data/include_pragma.qml new file mode 100644 index 00000000..a6489694 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/include_pragma.qml @@ -0,0 +1,11 @@ +import QtQuick 1.0 +import "include_pragma_outer.js" as Script + +Item { + property int test1 + + Component.onCompleted: { + test1 = Script.callFunction() + } +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/include_pragma_inner.js b/tests/auto/declarative/qdeclarativeecmascript/data/include_pragma_inner.js new file mode 100644 index 00000000..a0380a25 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/include_pragma_inner.js @@ -0,0 +1,5 @@ +.pragma library + +function getValue() { + return 100; +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/include_pragma_outer.js b/tests/auto/declarative/qdeclarativeecmascript/data/include_pragma_outer.js new file mode 100644 index 00000000..d87bafc8 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/include_pragma_outer.js @@ -0,0 +1,6 @@ +Qt.include("include_pragma_inner.js") + +function callFunction() { + return getValue(); +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/include_remote.js b/tests/auto/declarative/qdeclarativeecmascript/data/include_remote.js new file mode 100644 index 00000000..e6a46768 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/include_remote.js @@ -0,0 +1,26 @@ +var myvar = 10; + +function go() +{ + var a = Qt.include("http://127.0.0.1:8111/remote_file.js", + function(o) { + test2 = o.status == o.OK + test3 = a.status == a.OK + test4 = myvar == 13 + + done = true; + }); + test1 = a.status == a.LOADING + + + var b = Qt.include("http://127.0.0.1:8111/exception.js", + function(o) { + test7 = o.status == o.EXCEPTION + test8 = b.status == a.EXCEPTION + test9 = b.exception.toString() == "Whoops!"; + test10 = o.exception.toString() == "Whoops!"; + + done2 = true; + }); + test6 = b.status == b.LOADING +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/include_remote.qml b/tests/auto/declarative/qdeclarativeecmascript/data/include_remote.qml new file mode 100644 index 00000000..0dfc74ff --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/include_remote.qml @@ -0,0 +1,21 @@ +import QtQuick 1.0 +import "include_remote.js" as IncludeTest + +QtObject { + property bool done: false + property bool done2: false + + property bool test1: false + property bool test2: false + property bool test3: false + property bool test4: false + property bool test5: false + + property bool test6: false + property bool test7: false + property bool test8: false + property bool test9: false + property bool test10: false + + Component.onCompleted: IncludeTest.go(); +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/include_remote_missing.js b/tests/auto/declarative/qdeclarativeecmascript/data/include_remote_missing.js new file mode 100644 index 00000000..cc90860c --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/include_remote_missing.js @@ -0,0 +1,13 @@ +function go() +{ + var a = Qt.include("http://127.0.0.1:8111/missing.js", + function(o) { + test2 = o.status == o.NETWORK_ERROR + test3 = a.status == a.NETWORK_ERROR + + done = true; + }); + + test1 = a.status == a.LOADING +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/include_remote_missing.qml b/tests/auto/declarative/qdeclarativeecmascript/data/include_remote_missing.qml new file mode 100644 index 00000000..05a73996 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/include_remote_missing.qml @@ -0,0 +1,12 @@ +import QtQuick 1.0 +import "include_remote_missing.js" as IncludeTest + +QtObject { + property bool done: false + + property bool test1: false + property bool test2: false + property bool test3: false + + Component.onCompleted: IncludeTest.go(); +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/include_shared.js b/tests/auto/declarative/qdeclarativeecmascript/data/include_shared.js new file mode 100644 index 00000000..a49c07bb --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/include_shared.js @@ -0,0 +1,12 @@ +.pragma library + +var test1 = true +var test2 = false +var test3 = false + +var testValue = 99; + +function go() { + Qt.include("js/include2.js"); +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/include_shared.qml b/tests/auto/declarative/qdeclarativeecmascript/data/include_shared.qml new file mode 100644 index 00000000..e9f1c89b --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/include_shared.qml @@ -0,0 +1,22 @@ +import QtQuick 1.0 +import "include_shared.js" as IncludeTest + +QtObject { + property int test0: 0 + property bool test1: false + property bool test2: false + property bool test2_1: false + property bool test3: false + property bool test3_1: false + + Component.onCompleted: { + IncludeTest.go(); + test0 = IncludeTest.value + test1 = IncludeTest.test1 + test2 = IncludeTest.test2 + test2_1 = IncludeTest.test2_1 + test3 = IncludeTest.test3 + test3_1 = IncludeTest.test3_1 + } +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/invokableObjectArg.qml b/tests/auto/declarative/qdeclarativeecmascript/data/invokableObjectArg.qml new file mode 100644 index 00000000..6ab25f27 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/invokableObjectArg.qml @@ -0,0 +1,9 @@ +import Qt.test 1.0 +import QtQuick 1.0 + +MyQmlObject { + id: root + Component.onCompleted: { + root.myinvokable(root); + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/invokableObjectRet.qml b/tests/auto/declarative/qdeclarativeecmascript/data/invokableObjectRet.qml new file mode 100644 index 00000000..87b2d7e4 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/invokableObjectRet.qml @@ -0,0 +1,11 @@ +import Qt.test 1.0 +import QtQuick 1.0 + +MyQmlObject { + id: root + property bool test: false + Component.onCompleted: { + test = (root.returnme() == root) + } +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/js/include2.js b/tests/auto/declarative/qdeclarativeecmascript/data/js/include2.js new file mode 100644 index 00000000..2a0c039d --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/js/include2.js @@ -0,0 +1,4 @@ +test2 = true +var test2_1 = true + +Qt.include("include3.js"); diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/js/include3.js b/tests/auto/declarative/qdeclarativeecmascript/data/js/include3.js new file mode 100644 index 00000000..84b2770b --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/js/include3.js @@ -0,0 +1,3 @@ +test3 = true +var test3_1 = true +var value = testValue diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/jsObject.qml b/tests/auto/declarative/qdeclarativeecmascript/data/jsObject.qml new file mode 100644 index 00000000..e93007ab --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/jsObject.qml @@ -0,0 +1,12 @@ +import QtQuick 1.0 + +QtObject { + property int test + + Component.onCompleted: { + var o = new Object; + o.test = 92; + test = o.test; + } +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/libraryScriptAssert.js b/tests/auto/declarative/qdeclarativeecmascript/data/libraryScriptAssert.js new file mode 100644 index 00000000..3ffdb339 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/libraryScriptAssert.js @@ -0,0 +1,6 @@ +.pragma library + +function test(target) +{ + var a = target.a; +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/libraryScriptAssert.qml b/tests/auto/declarative/qdeclarativeecmascript/data/libraryScriptAssert.qml new file mode 100644 index 00000000..c0789424 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/libraryScriptAssert.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 +import "libraryScriptAssert.js" as Test + +QtObject { + id: root + Component.onCompleted: Test.test(root); +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/listProperties.qml b/tests/auto/declarative/qdeclarativeecmascript/data/listProperties.qml new file mode 100644 index 00000000..7b940758 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/listProperties.qml @@ -0,0 +1,24 @@ +import Qt.test 1.0 +import QtQuick 1.0 + +MyQmlObject { + id: root + + objectListProperty: [ + QtObject { property int a: 10 }, + QtObject { property int a: 11 } + ] + + function calcTest1() { + var rv = 0; + for (var ii = 0; ii < root.objectListProperty.length; ++ii) { + rv += root.objectListProperty[ii].a; + } + return rv; + } + + property int test1: calcTest1(); + property int test2: root.objectListProperty.length + property bool test3: root.objectListProperty[1] != undefined + property bool test4: root.objectListProperty[100] == undefined +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/listToVariant.qml b/tests/auto/declarative/qdeclarativeecmascript/data/listToVariant.qml new file mode 100644 index 00000000..7940ab8c --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/listToVariant.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +QtObject { + property variant test: children +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevision.qml b/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevision.qml new file mode 100644 index 00000000..77accd80 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevision.qml @@ -0,0 +1,7 @@ +import Qt.test 1.1 + +MyRevisionedClass +{ + prop1: prop2 + onSignal1: method2() +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevision2.qml b/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevision2.qml new file mode 100644 index 00000000..36057cb9 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevision2.qml @@ -0,0 +1,9 @@ +import Qt.test 1.1 + +MyRevisionedSubclass +{ + prop1: prop3 + onSignal1: method2() + prop3: prop4 + onSignal3: method4() +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevision3.qml b/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevision3.qml new file mode 100644 index 00000000..81769e98 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevision3.qml @@ -0,0 +1,8 @@ +import Qt.test 1.0 + +MyRevisionedSubclass +{ + prop1: prop3 + onSignal1: method1() + onSignal3: method3() +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevision4.qml b/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevision4.qml new file mode 100644 index 00000000..81ea5366 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevision4.qml @@ -0,0 +1,14 @@ +import Qt.test 1.1 +import QtQuick 1.0 + +QtObject { + property variant a + property real test + + a: MyRevisionedClass { + prop2: 11 + + Component.onCompleted: test = prop2 + } +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevisionErrors.qml b/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevisionErrors.qml new file mode 100644 index 00000000..44d421e8 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevisionErrors.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 +import Qt.test 1.0 + +MyRevisionedClass +{ + // Will not hit optimizer + property real p1: prop1 % 3 + property real p2: prop2 % 3 + + // Should hit optimizer + property real p3: prop2 + + Component.onCompleted: method2() +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevisionErrors2.qml b/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevisionErrors2.qml new file mode 100644 index 00000000..121642e0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevisionErrors2.qml @@ -0,0 +1,24 @@ +import QtQuick 1.0 +import Qt.test 1.0 + +MyRevisionedSubclass +{ + // Will not hit optimizer + property real p1: prop1 % 3 + property real p2: prop2 % 3 + property real p3: prop3 % 3 + property real p4: prop4 % 3 + + // Should hit optimizer + property real p5: prop1 + property real p6: prop2 + property real p7: prop3 + property real p8: prop4 + + Component.onCompleted: { + method1() + method2() + method3() + method4() + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevisionErrors3.qml b/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevisionErrors3.qml new file mode 100644 index 00000000..123650e4 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/metaobjectRevisionErrors3.qml @@ -0,0 +1,36 @@ +import QtQuick 1.0 +import Qt.test 1.1 + +MyRevisionedSubclass +{ + // Will not hit optimizer + property real pA: propA % 3 + property real pB: propB % 3 + property real pC: propC % 3 + property real pD: propD % 3 + property real p1: prop1 % 3 + property real p2: prop2 % 3 + property real p3: prop3 % 3 + property real p4: prop4 % 3 + + // Should hit optimizer + property real pE: propA + property real pF: propB + property real pG: propC + property real pH: propD + property real p5: prop1 + property real p6: prop2 + property real p7: prop3 + property real p8: prop4 + + Component.onCompleted: { + methodA() + methodB() + methodC() + methodD() + method1() + method2() + method3() + method4() + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/methods.1.qml b/tests/auto/declarative/qdeclarativeecmascript/data/methods.1.qml new file mode 100644 index 00000000..0bbee16d --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/methods.1.qml @@ -0,0 +1,6 @@ +import Qt.test 1.0 + +MyQmlObject { + id: myObject + onBasicSignal: myObject.methodNoArgs() +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/methods.2.qml b/tests/auto/declarative/qdeclarativeecmascript/data/methods.2.qml new file mode 100644 index 00000000..9f0c6b15 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/methods.2.qml @@ -0,0 +1,6 @@ +import Qt.test 1.0 + +MyQmlObject { + id: myObject + onBasicSignal: myObject.method(163) +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/methods.3.qml b/tests/auto/declarative/qdeclarativeecmascript/data/methods.3.qml new file mode 100644 index 00000000..1090b48f --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/methods.3.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +QtObject { + function testFunction() { return 19; } + + property int test: testFunction() +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/methods.4.qml b/tests/auto/declarative/qdeclarativeecmascript/data/methods.4.qml new file mode 100644 index 00000000..34c50d66 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/methods.4.qml @@ -0,0 +1,11 @@ +import QtQuick 1.0 + +MethodsObject { + function testFunction2() { return 17; } + function testFunction3() { return 16; } + + property int test: testFunction() + property int test2: testFunction2() + property int test3: testFunction3() +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/methods.5.qml b/tests/auto/declarative/qdeclarativeecmascript/data/methods.5.qml new file mode 100644 index 00000000..bebdf3d8 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/methods.5.qml @@ -0,0 +1,9 @@ +import QtQuick 1.0 + +Item { + property alias blah: item.x + Item { id: item } + + function testFunction() { return 9; } + property int test: testFunction(); +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/multiEngineObject.qml b/tests/auto/declarative/qdeclarativeecmascript/data/multiEngineObject.qml new file mode 100644 index 00000000..d9c63e67 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/multiEngineObject.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +QtObject { + property string test: thing.stringProperty +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/noSpuriousWarningsAtShutdown.2.qml b/tests/auto/declarative/qdeclarativeecmascript/data/noSpuriousWarningsAtShutdown.2.qml new file mode 100644 index 00000000..9e0bcf09 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/noSpuriousWarningsAtShutdown.2.qml @@ -0,0 +1,10 @@ +import QtQuick 1.0 + +Item { + id: root + + Item {} + + SpuriousWarning {} +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/noSpuriousWarningsAtShutdown.qml b/tests/auto/declarative/qdeclarativeecmascript/data/noSpuriousWarningsAtShutdown.qml new file mode 100644 index 00000000..7e7da8d7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/noSpuriousWarningsAtShutdown.qml @@ -0,0 +1,9 @@ +import QtQuick 1.0 + +Item { + id: root + + property int childrenCount: root.children.length + + Item {} +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/nonExistentAttachedObject.qml b/tests/auto/declarative/qdeclarativeecmascript/data/nonExistentAttachedObject.qml new file mode 100644 index 00000000..f9585db0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/nonExistentAttachedObject.qml @@ -0,0 +1,5 @@ +import Qt.test 1.0 + +MyQmlObject { + stringProperty: MyQmlContainer.prop +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/nonscriptable.qml b/tests/auto/declarative/qdeclarativeecmascript/data/nonscriptable.qml new file mode 100644 index 00000000..e86cc961 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/nonscriptable.qml @@ -0,0 +1,19 @@ +import Qt.test 1.0 +import QtQuick 1.0 + +MyQmlObject { + id: root + + property bool readOk: false; + property bool writeOk: false + + Component.onCompleted: { + readOk = (root.nonscriptable == undefined); + + try { + root.nonscriptable = 10 + } catch (e) { + writeOk = true; + } + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/nullObjectBinding.qml b/tests/auto/declarative/qdeclarativeecmascript/data/nullObjectBinding.qml new file mode 100644 index 00000000..cbd2d3e7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/nullObjectBinding.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 + +QtObject { + property QtObject test + test: if (1) model + property ListModel model +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/numberAssignment.qml b/tests/auto/declarative/qdeclarativeecmascript/data/numberAssignment.qml new file mode 100644 index 00000000..30a77e8a --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/numberAssignment.qml @@ -0,0 +1,18 @@ +import Qt.test 1.0 + +NumberAssignment { + test1: if (1) 6.7 + test2: if (1) "6.7" + test3: if (1) 6 + test4: if (1) "6" + + test5: if (1) 6.7 + test6: if (1) "6.7" + test7: if (1) 6 + test8: if (1) "6" + + test9: if (1) 6.7 + test10: if (1) "6.7" + test11: if (1) 6 + test12: if (1) "6" +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/objectName.qml b/tests/auto/declarative/qdeclarativeecmascript/data/objectName.qml new file mode 100644 index 00000000..ca8c90d8 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/objectName.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 + +QtObject { + objectName: "hello" + + property string test1: objectName + property string test2: objectName.substr(1, 3) +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/objectsCompareAsEqual.qml b/tests/auto/declarative/qdeclarativeecmascript/data/objectsCompareAsEqual.qml new file mode 100644 index 00000000..ef0e304a --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/objectsCompareAsEqual.qml @@ -0,0 +1,15 @@ +import QtQuick 1.0 + +Item { + id: root + + property variant item: child + Item { id: child } + + property bool test1: child == child + property bool test2: child.parent == root + property bool test3: root != child + property bool test4: item == child + property bool test5: item != root +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/outerBindingOverridesInnerBinding.qml b/tests/auto/declarative/qdeclarativeecmascript/data/outerBindingOverridesInnerBinding.qml new file mode 100644 index 00000000..090c948f --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/outerBindingOverridesInnerBinding.qml @@ -0,0 +1,15 @@ +import Qt.test 1.0 + +MyQmlObject { + id: obj + property alias c1: myConstants.c1 + property alias c2: myConstants.c2 + property int c3: 0 + + objectProperty: ConstantsOverrideBindings { + id: myConstants + c2: obj.c3 + } + +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/ownership.qml b/tests/auto/declarative/qdeclarativeecmascript/data/ownership.qml new file mode 100644 index 00000000..53427b76 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/ownership.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +QtObject { + Component.onCompleted: { var a = getObject(); a = null; } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/propertyAssignmentErrors.qml b/tests/auto/declarative/qdeclarativeecmascript/data/propertyAssignmentErrors.qml new file mode 100644 index 00000000..a778dcc8 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/propertyAssignmentErrors.qml @@ -0,0 +1,22 @@ +import QtQuick 1.0 + +QtObject { + id: root + + property int a + property variant b + + Component.onCompleted: { + try { + root.a = undefined; + } catch(e) { + console.log (e.fileName + ":" + e.lineNumber + ":" + e); + } + + try { + root.a = "Hello"; + } catch(e) { + console.log (e.fileName + ":" + e.lineNumber + ":" + e); + } + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/propertySplicing.qml b/tests/auto/declarative/qdeclarativeecmascript/data/propertySplicing.qml new file mode 100644 index 00000000..7deb84a1 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/propertySplicing.qml @@ -0,0 +1,10 @@ +import Qt.test 1.0 +import QtQuick 1.0 + +MyDerivedObject { + property bool test: false + + Component.onCompleted: { + test = intProperty() + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/qlistqobjectMethods.qml b/tests/auto/declarative/qdeclarativeecmascript/data/qlistqobjectMethods.qml new file mode 100644 index 00000000..2e9e1736 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/qlistqobjectMethods.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +QtObject { + property int test: getObjects().length + property bool test2: getObjects()[0].trueProperty +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/qtbug_10696.qml b/tests/auto/declarative/qdeclarativeecmascript/data/qtbug_10696.qml new file mode 100644 index 00000000..02357d45 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/qtbug_10696.qml @@ -0,0 +1,26 @@ +import QtQuick 1.0 + +QtObject { + property string test: "aaaa" + + "bbbb" + + "cccc" + + "cccc" + + "cccc" + + "cccc" + + "cccc" + + "cccc" + + "cccc" + + "cccc" + + "cccc" + + "cccc" + + "cccc" + + "cccc" + + "cccc" + + "cccc" + + "cccc" + + "cccc" + + "cccc" + + "cccc" + + "cccc" + + "cccc"; +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/qtbug_11600.js b/tests/auto/declarative/qdeclarativeecmascript/data/qtbug_11600.js new file mode 100644 index 00000000..092bc2b0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/qtbug_11600.js @@ -0,0 +1 @@ +; diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/qtbug_11600.qml b/tests/auto/declarative/qdeclarativeecmascript/data/qtbug_11600.qml new file mode 100644 index 00000000..b7bb3666 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/qtbug_11600.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 +import "qtbug_11600.js" as Test + +QtObject { + id: goo + + property bool test: undefined == goo.Test.foo +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/qtbug_11606.qml b/tests/auto/declarative/qdeclarativeecmascript/data/qtbug_11606.qml new file mode 100644 index 00000000..05c482ca --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/qtbug_11606.qml @@ -0,0 +1,12 @@ +import QtQuick 1.0 + +QtObject { + property bool test: false + Component.onCompleted: { + try { + console.log(sorryNoSuchProperty); + } catch (e) { + test = true; + } + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/qtbug_20648.qml b/tests/auto/declarative/qdeclarativeecmascript/data/qtbug_20648.qml new file mode 100644 index 00000000..40f21ef7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/qtbug_20648.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +QtObject { + property bool hd: true + + property real test: ((hd ? 100 : 20) + 0) +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/qtbug_9792.qml b/tests/auto/declarative/qdeclarativeecmascript/data/qtbug_9792.qml new file mode 100644 index 00000000..9ac44308 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/qtbug_9792.qml @@ -0,0 +1,5 @@ +import Qt.test 1.0 + +MyQmlObject { + onBasicSignal: print("Hello world!"); +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/qtcreatorbug_1289.qml b/tests/auto/declarative/qdeclarativeecmascript/data/qtcreatorbug_1289.qml new file mode 100644 index 00000000..e531efcd --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/qtcreatorbug_1289.qml @@ -0,0 +1,13 @@ +import QtQuick 1.0 + +QtObject { + id: root + property QtObject object: QtObject { + id: nested + property QtObject nestedObject + } + + Component.onCompleted: { + nested.nestedObject = root; + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/realToInt.qml b/tests/auto/declarative/qdeclarativeecmascript/data/realToInt.qml new file mode 100644 index 00000000..cbbbbf92 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/realToInt.qml @@ -0,0 +1,11 @@ +import QtQuick 1.0 +import Qt.test 1.0 + +MyQmlObject { + function test1() { + value = 4.2 + } + function test2() { + value = 7.9 + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/regExp.qml b/tests/auto/declarative/qdeclarativeecmascript/data/regExp.qml new file mode 100644 index 00000000..0dc404b5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/regExp.qml @@ -0,0 +1,7 @@ +import Qt.test 1.0 + +MyQmlObject{ + id: obj + objectName: "obj" + regExp: /[a-zA-z]/ +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/remote_file.js b/tests/auto/declarative/qdeclarativeecmascript/data/remote_file.js new file mode 100644 index 00000000..1b123aee --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/remote_file.js @@ -0,0 +1,2 @@ +myvar = 13; +test5 = true; diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scope.2.qml b/tests/auto/declarative/qdeclarativeecmascript/data/scope.2.qml new file mode 100644 index 00000000..9555b7f9 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/scope.2.qml @@ -0,0 +1,40 @@ +import QtQuick 1.0 + +Item { + property int a: 0 + property int b: 14 + + function b() { return 11; } + function c() { return 33; } + + QtObject { + id: a + property int value: 19 + } + + QtObject { + id: c + property int value: 24 + } + + QtObject { + id: nested + property int a: 1 + property int test: a.value + property int test2: b + property int test3: c.value + } + + + // id takes precedence over local, and root properties + property int test1: a.value + property alias test2: nested.test + + // properties takes precedence over local, and root methods + property int test3: b + property alias test4: nested.test2 + + // id takes precedence over methods + property int test5: c.value + property alias test6: nested.test3 +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scope.3.qml b/tests/auto/declarative/qdeclarativeecmascript/data/scope.3.qml new file mode 100644 index 00000000..0b0770e6 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/scope.3.qml @@ -0,0 +1,13 @@ +import QtQuick 1.0 +import Qt.test 1.0 + +MyQmlObject { + id: root + + property int foo: 12 + + property bool test1: foo == 12 + property bool test2: console != 11 + property bool test3: root.console == 11 +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scope.4.qml b/tests/auto/declarative/qdeclarativeecmascript/data/scope.4.qml new file mode 100644 index 00000000..d65b6e7c --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/scope.4.qml @@ -0,0 +1,12 @@ +import Qt.test 1.0 + +MyQmlObject { + id: a + property int b: 9 + + property int test + property string test2 + + // Should resolve to signal arguments, not to other elements in the file + onArgumentSignal: { test = a; test2 = b; } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scope.qml b/tests/auto/declarative/qdeclarativeecmascript/data/scope.qml new file mode 100644 index 00000000..63dba2fc --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/scope.qml @@ -0,0 +1,44 @@ +import QtQuick 1.0 + +Item { + id: root + + property int a: 1 + property int binding: a + property string binding2: a + "Test" + property int binding3: myFunction() + property int binding4: nestedObject.myNestedFunction() + + function myFunction() { + return a; + } + + Item { + id: nestedObject + + function myNestedFunction() { + return a; + } + + property int a: 2 + property int binding: a + property string binding2: a + "Test" + property int binding3: myFunction() + property int binding4: myNestedFunction() + } + + ScopeObject { + id: compObject + } + + property alias test1: root.binding + property alias test2: nestedObject.binding + property alias test3: root.binding2 + property alias test4: nestedObject.binding2 + property alias test5: root.binding3 + property alias test6: nestedObject.binding3 + property alias test7: root.binding4 + property alias test8: nestedObject.binding4 + property alias test9: compObject.binding + property alias test10: compObject.binding2 +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.1.js b/tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.1.js new file mode 100644 index 00000000..54284fea --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.1.js @@ -0,0 +1,4 @@ +function testFunction() { + test = true; +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.1.qml b/tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.1.qml new file mode 100644 index 00000000..65697d93 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.1.qml @@ -0,0 +1,10 @@ +import Qt.test 1.0 +import QtQuick 1.0 +import "scriptConnect.1.js" as Script +MyQmlObject { + property bool test: false + + id: root + + Component.onCompleted: root.argumentSignal.connect(Script.testFunction); +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.2.js b/tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.2.js new file mode 100644 index 00000000..595c778a --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.2.js @@ -0,0 +1,5 @@ +function testFunction() { + if (this.b == 12) + test = true; +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.2.qml b/tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.2.qml new file mode 100644 index 00000000..86ff7987 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.2.qml @@ -0,0 +1,16 @@ +import Qt.test 1.0 +import QtQuick 1.0 +import "scriptConnect.2.js" as Script + +MyQmlObject { + property bool test: false + + id: root + + Component.onCompleted: { + var a = new Object; + a.b = 12; + root.argumentSignal.connect(a, Script.testFunction); + } +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.3.qml b/tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.3.qml new file mode 100644 index 00000000..db2f0057 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.3.qml @@ -0,0 +1,15 @@ +import Qt.test 1.0 +import QtQuick 1.0 + +MyQmlObject { + property bool test: false + + id: root + + function testFunction() { + test = true; + } + + Component.onCompleted: root.argumentSignal.connect(testFunction); +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.4.qml b/tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.4.qml new file mode 100644 index 00000000..a2d90ff8 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.4.qml @@ -0,0 +1,12 @@ +import Qt.test 1.0 +import QtQuick 1.0 + +MyQmlObject { + property bool test: false + + id: root + + Component.onCompleted: root.argumentSignal.connect(methodNoArgs); +} + + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.5.qml b/tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.5.qml new file mode 100644 index 00000000..21fac15d --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.5.qml @@ -0,0 +1,11 @@ +import Qt.test 1.0 +import QtQuick 1.0 + +MyQmlObject { + property bool test: false + + id: root + + Component.onCompleted: root.argumentSignal.connect(root, methodNoArgs); +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.6.js b/tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.6.js new file mode 100644 index 00000000..71bdd088 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.6.js @@ -0,0 +1,3 @@ +function testFunction() { + test++; +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.6.qml b/tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.6.qml new file mode 100644 index 00000000..40530919 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/scriptConnect.6.qml @@ -0,0 +1,15 @@ +import Qt.test 1.0 +import QtQuick 1.0 +import "scriptConnect.6.js" as Script + +MyQmlObject { + property int test: 0 + + id: root + + Component.onCompleted: { + root.argumentSignal.connect(Script.testFunction); + root.argumentSignal.connect(Script.testFunction); + } +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scriptDisconnect.1.js b/tests/auto/declarative/qdeclarativeecmascript/data/scriptDisconnect.1.js new file mode 100644 index 00000000..407426fc --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/scriptDisconnect.1.js @@ -0,0 +1,6 @@ +function testFunction() { + test++; +} + +function otherFunction() { +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scriptDisconnect.1.qml b/tests/auto/declarative/qdeclarativeecmascript/data/scriptDisconnect.1.qml new file mode 100644 index 00000000..bbe70249 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/scriptDisconnect.1.qml @@ -0,0 +1,13 @@ +import Qt.test 1.0 +import QtQuick 1.0 +import "scriptDisconnect.1.js" as Script + +MyQmlObject { + property int test: 0 + + id: root + + Component.onCompleted: root.argumentSignal.connect(Script.testFunction); + + onBasicSignal: root.argumentSignal.disconnect(Script.testFunction); +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scriptDisconnect.2.qml b/tests/auto/declarative/qdeclarativeecmascript/data/scriptDisconnect.2.qml new file mode 100644 index 00000000..8a166f41 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/scriptDisconnect.2.qml @@ -0,0 +1,14 @@ +import Qt.test 1.0 +import QtQuick 1.0 +import "scriptDisconnect.1.js" as Script + +MyQmlObject { + property int test: 0 + + id: root + + Component.onCompleted: root.argumentSignal.connect(root, Script.testFunction); + + onBasicSignal: root.argumentSignal.disconnect(root, Script.testFunction); +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scriptDisconnect.3.qml b/tests/auto/declarative/qdeclarativeecmascript/data/scriptDisconnect.3.qml new file mode 100644 index 00000000..548f2a12 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/scriptDisconnect.3.qml @@ -0,0 +1,14 @@ +import Qt.test 1.0 +import QtQuick 1.0 +import "scriptDisconnect.1.js" as Script + +MyQmlObject { + property int test: 0 + + id: root + + Component.onCompleted: root.argumentSignal.connect(root, Script.testFunction); + + onBasicSignal: root.argumentSignal.disconnect(Script.testFunction); +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scriptDisconnect.4.qml b/tests/auto/declarative/qdeclarativeecmascript/data/scriptDisconnect.4.qml new file mode 100644 index 00000000..11b22d72 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/scriptDisconnect.4.qml @@ -0,0 +1,13 @@ +import Qt.test 1.0 +import QtQuick 1.0 +import "scriptDisconnect.1.js" as Script + +MyQmlObject { + property int test: 0 + + id: root + + Component.onCompleted: root.argumentSignal.connect(Script.testFunction); + + onBasicSignal: root.argumentSignal.disconnect(Script.otherFunction); +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scriptErrors.js b/tests/auto/declarative/qdeclarativeecmascript/data/scriptErrors.js new file mode 100644 index 00000000..d22f623e --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/scriptErrors.js @@ -0,0 +1,4 @@ +// Comment +a = 10 + +function getValue() { a = 10; return 0; } diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/scriptErrors.qml b/tests/auto/declarative/qdeclarativeecmascript/data/scriptErrors.qml new file mode 100644 index 00000000..f601f497 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/scriptErrors.qml @@ -0,0 +1,15 @@ +import Qt.test 1.0 +import "scriptErrors.js" as Script + +MyQmlObject { + property int t: a.value + property int w: Script.getValue(); + property int x: undefined + property int y: (a.value, undefinedObject) + + onBasicSignal: { console.log(a.value); } + id: myObj + onAnotherBasicSignal: myObj.trueProperty = false; + onThirdBasicSignal: myObj.fakeProperty = ""; +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/selfDeletingBinding.2.qml b/tests/auto/declarative/qdeclarativeecmascript/data/selfDeletingBinding.2.qml new file mode 100644 index 00000000..58cf8051 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/selfDeletingBinding.2.qml @@ -0,0 +1,17 @@ +import Qt.test 1.0 + +MyQmlContainer { + property bool triggerDelete: false + + children: [ + MyQmlObject { + // Will trigger deletion on binding assignment + deleteOnSet: Math.max(0, 1) + }, + + MyQmlObject { + // Will trigger deletion on binding assignment, but after component creation + deleteOnSet: if (triggerDelete) 1; else 0; + } + ] +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/selfDeletingBinding.qml b/tests/auto/declarative/qdeclarativeecmascript/data/selfDeletingBinding.qml new file mode 100644 index 00000000..074851a6 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/selfDeletingBinding.qml @@ -0,0 +1,18 @@ +import Qt.test 1.0 + +MyQmlContainer { + property bool triggerDelete: false + + children: [ + MyQmlObject { + // Will trigger deletion during binding evaluation + stringProperty: {deleteMe(), "Hello"} + }, + + MyQmlObject { + // Will trigger deletion during binding evaluation, but after component creation + stringProperty: if (triggerDelete) { deleteMe(), "Hello" } else { "World" } + } + + ] +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/sharedAttachedObject.qml b/tests/auto/declarative/qdeclarativeecmascript/data/sharedAttachedObject.qml new file mode 100644 index 00000000..2d090b8f --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/sharedAttachedObject.qml @@ -0,0 +1,16 @@ +import Qt.test 1.0 +import QtQuick 1.0 + +MyQmlObject { + id: root + property bool test1: false + property bool test2: false + + MyQmlObject.value2: 7 + + Component.onCompleted: { + test1 = root.MyQmlObject.value2 == 7; + test2 = root.MyQmlObjectAlias.value2 == 7; + } +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/shutdownErrors.qml b/tests/auto/declarative/qdeclarativeecmascript/data/shutdownErrors.qml new file mode 100644 index 00000000..7a6aba74 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/shutdownErrors.qml @@ -0,0 +1,13 @@ +import QtQuick 1.0 + +Item { + property int test: myObject.object.a + + Item { + id: myObject + property QtObject object; + object: QtObject { + property int a: 10 + } + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/signalAssignment.1.qml b/tests/auto/declarative/qdeclarativeecmascript/data/signalAssignment.1.qml new file mode 100644 index 00000000..fbd09142 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/signalAssignment.1.qml @@ -0,0 +1,5 @@ +import Qt.test 1.0 + +MyQmlObject { + onBasicSignal: setString('pass') +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/signalAssignment.2.qml b/tests/auto/declarative/qdeclarativeecmascript/data/signalAssignment.2.qml new file mode 100644 index 00000000..6467c42b --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/signalAssignment.2.qml @@ -0,0 +1,5 @@ +import Qt.test 1.0 + +MyQmlObject { + onArgumentSignal: setString('pass ' + a + ' ' + b + ' ' + c + ' ' + d + ' ' + e) +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/signalParameterTypes.qml b/tests/auto/declarative/qdeclarativeecmascript/data/signalParameterTypes.qml new file mode 100644 index 00000000..4fc2dab9 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/signalParameterTypes.qml @@ -0,0 +1,18 @@ +import Qt.test 1.0 + +MyQmlObject +{ + id: root + property int intProperty + property real realProperty + property color colorProperty + property variant variantProperty + property int enumProperty + property int qtEnumProperty + + signal mySignal(int a, real b, color c, variant d, int e, int f) + + onMySignal: { intProperty = a; realProperty = b; colorProperty = c; variantProperty = d; enumProperty = e; qtEnumProperty = f; } + + onBasicSignal: root.mySignal(10, 19.2, Qt.rgba(1, 1, 0, 1), Qt.rgba(1, 0, 1, 1), MyQmlObject.EnumValue3, Qt.LeftButton) +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/signalTriggeredBindings.qml b/tests/auto/declarative/qdeclarativeecmascript/data/signalTriggeredBindings.qml new file mode 100644 index 00000000..8410d333 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/signalTriggeredBindings.qml @@ -0,0 +1,20 @@ +import Qt.test 1.0 +import QtQuick 1.0 + +MyQmlObject { + property real base: 50 + property alias test1: myObject.test1 + property alias test2: myObject.test2 + + objectProperty: QtObject { + id: myObject + property real test1: base + property real test2: Math.max(0, base) + } + + // Signal with no args + onBasicSignal: base = 200 + // Signal with args + onArgumentSignal: base = 400 +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/signalWithUnknownTypes.qml b/tests/auto/declarative/qdeclarativeecmascript/data/signalWithUnknownTypes.qml new file mode 100644 index 00000000..49293edf --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/signalWithUnknownTypes.qml @@ -0,0 +1,5 @@ +import Qt.test 1.0 + +MyQmlObject { + onSignalWithUnknownType: variantMethod(arg); +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/strictlyEquals.qml b/tests/auto/declarative/qdeclarativeecmascript/data/strictlyEquals.qml new file mode 100644 index 00000000..2932c778 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/strictlyEquals.qml @@ -0,0 +1,17 @@ +import QtQuick 1.0 + +QtObject { + property bool test1: (a === true) + property bool test2: !(a === false) + property bool test3: (b === 11.2) + property bool test4: !(b === 9) + property bool test5: (c === 9) + property bool test6: !(c === 13) + property bool test7: (d === "Hello world") + property bool test8: !(d === "Hi") + + property bool a: true + property real b: 11.2 + property int c: 9 + property string d: "Hello world" +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/transientErrors.2.qml b/tests/auto/declarative/qdeclarativeecmascript/data/transientErrors.2.qml new file mode 100644 index 00000000..1e5afdf5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/transientErrors.2.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 + +QtObject { + id: root + + property variant a: 10 + property int x: 10 + property int test: a.x + + Component.onCompleted: { + a = 11; + a = root; + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/transientErrors.qml b/tests/auto/declarative/qdeclarativeecmascript/data/transientErrors.qml new file mode 100644 index 00000000..60d39fa1 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/transientErrors.qml @@ -0,0 +1,10 @@ +import QtQuick 1.0 + +QtObject { + property variant obj: nested + + property variant obj2 + obj2: NestedTypeTransientErrors { + id: nested + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/undefinedResetsProperty.2.qml b/tests/auto/declarative/qdeclarativeecmascript/data/undefinedResetsProperty.2.qml new file mode 100644 index 00000000..e73d38e2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/undefinedResetsProperty.2.qml @@ -0,0 +1,10 @@ +import Qt.test 1.0 + +MyQmlObject { + resettableProperty: 19 + + function doReset() { + resettableProperty = undefined; + } +} + diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/undefinedResetsProperty.qml b/tests/auto/declarative/qdeclarativeecmascript/data/undefinedResetsProperty.qml new file mode 100644 index 00000000..eceff60a --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/undefinedResetsProperty.qml @@ -0,0 +1,7 @@ +import Qt.test 1.0 + +MyQmlObject { + property bool setUndefined: false + + resettableProperty: setUndefined?undefined:92 +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/valueTypeFunctions.qml b/tests/auto/declarative/qdeclarativeecmascript/data/valueTypeFunctions.qml new file mode 100644 index 00000000..33b4a68c --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/valueTypeFunctions.qml @@ -0,0 +1,6 @@ +import Qt.test 1.0 + +MyTypeObject { + rectProperty: Qt.rect(0,0,100,100) + rectFProperty: Qt.rect(0,0.5,100,99.5) +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/variantsAssignedUndefined.qml b/tests/auto/declarative/qdeclarativeecmascript/data/variantsAssignedUndefined.qml new file mode 100644 index 00000000..849dfadd --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/variantsAssignedUndefined.qml @@ -0,0 +1,9 @@ +import QtQuick 1.0 + +QtObject { + property bool runTest: false + onRunTestChanged: test1 = undefined + + property variant test1: 10 + property variant test2: (runTest == false)?11:undefined +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/writeAttachedProperty.qml b/tests/auto/declarative/qdeclarativeecmascript/data/writeAttachedProperty.qml new file mode 100644 index 00000000..31bf69d3 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/writeAttachedProperty.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 +import Qt.test 1.0 + +QtObject { + function writeValue2() { MyQmlObject.value2 = 9 } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/writeRemovesBinding.qml b/tests/auto/declarative/qdeclarativeecmascript/data/writeRemovesBinding.qml new file mode 100644 index 00000000..035f0374 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/writeRemovesBinding.qml @@ -0,0 +1,46 @@ +import QtQuick 1.0 + +QtObject { + id: root + + property bool test: false + + property real data: 9 + property real binding: data + + property alias aliasProperty: root.aliasBinding + property real aliasBinding: data + + Component.onCompleted: { + // Non-aliased properties + if (binding != 9) return; + + data = 11; + if (binding != 11) return; + + binding = 6; + if (binding != 6) return; + + data = 3; + if (binding != 6) return; + + + // Writing through an aliased property + if (aliasProperty != 3) return; + if (aliasBinding != 3) return; + + data = 4; + if (aliasProperty != 4) return; + if (aliasBinding != 4) return; + + aliasProperty = 19; + if (aliasProperty != 19) return; + if (aliasBinding != 19) return; + + data = 5; + if (aliasProperty != 19) return; + if (aliasBinding != 19) return; + + test = true; + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/qdeclarativeecmascript.pro b/tests/auto/declarative/qdeclarativeecmascript/qdeclarativeecmascript.pro new file mode 100644 index 00000000..69d25a42 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/qdeclarativeecmascript.pro @@ -0,0 +1,24 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative script network +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativeecmascript.cpp \ + testtypes.cpp \ + ../shared/testhttpserver.cpp +HEADERS += testtypes.h \ + ../shared/testhttpserver.h +INCLUDEPATH += ../shared + +# QMAKE_CXXFLAGS = -fprofile-arcs -ftest-coverage +# LIBS += -lgcov + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativeecmascript/testtypes.cpp b/tests/auto/declarative/qdeclarativeecmascript/testtypes.cpp new file mode 100644 index 00000000..903fafa9 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/testtypes.cpp @@ -0,0 +1,134 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "testtypes.h" +#include +#include + +class BaseExtensionObject : public QObject +{ + Q_OBJECT + Q_PROPERTY(int baseExtendedProperty READ extendedProperty WRITE setExtendedProperty NOTIFY extendedPropertyChanged) +public: + BaseExtensionObject(QObject *parent) : QObject(parent), m_value(0) {} + + int extendedProperty() const { return m_value; } + void setExtendedProperty(int v) { m_value = v; emit extendedPropertyChanged(); } + +signals: + void extendedPropertyChanged(); +private: + int m_value; +}; + +class ExtensionObject : public QObject +{ + Q_OBJECT + Q_PROPERTY(int extendedProperty READ extendedProperty WRITE setExtendedProperty NOTIFY extendedPropertyChanged) +public: + ExtensionObject(QObject *parent) : QObject(parent), m_value(0) {} + + int extendedProperty() const { return m_value; } + void setExtendedProperty(int v) { m_value = v; emit extendedPropertyChanged(); } + +signals: + void extendedPropertyChanged(); +private: + int m_value; +}; + +class DefaultPropertyExtensionObject : public QObject +{ + Q_OBJECT + Q_CLASSINFO("DefaultProperty", "firstProperty") +public: + DefaultPropertyExtensionObject(QObject *parent) : QObject(parent) {} +}; + +class QWidgetDeclarativeUI : public QObject +{ + Q_OBJECT + + Q_PROPERTY(int width READ width WRITE setWidth NOTIFY widthChanged) + +signals: + void widthChanged(); + +public: + QWidgetDeclarativeUI(QObject *other) : QObject(other) { } + +public: + int width() const { return 0; } + void setWidth(int) { } +}; + + +void registerTypes() +{ + qmlRegisterType("Qt.test", 1,0, "MyQmlObjectAlias"); + qmlRegisterType("Qt.test", 1,0, "MyQmlObject"); + qmlRegisterType("Qt.test", 1,0, "MyDeferredObject"); + qmlRegisterType("Qt.test", 1,0, "MyQmlContainer"); + qmlRegisterExtendedType("Qt.test", 1,0, "MyBaseExtendedObject"); + qmlRegisterExtendedType("Qt.test", 1,0, "MyExtendedObject"); + qmlRegisterType("Qt.test", 1,0, "MyTypeObject"); + qmlRegisterType("Qt.test", 1,0, "MyDerivedObject"); + qmlRegisterType("Qt.test", 1,0, "NumberAssignment"); + qmlRegisterExtendedType("Qt.test", 1,0, "DefaultPropertyExtendedObject"); + qmlRegisterType("Qt.test", 1,0, "OverrideDefaultPropertyObject"); + qmlRegisterType("Qt.test",1,0,"MyRevisionedClass"); + qmlRegisterType("Qt.test",1,1,"MyRevisionedClass"); + + // Register the uncreatable base class + qmlRegisterRevision("Qt.test",1,1); + // MyRevisionedSubclass 1.0 uses MyRevisionedClass revision 0 + qmlRegisterType("Qt.test",1,0,"MyRevisionedSubclass"); + // MyRevisionedSubclass 1.1 uses MyRevisionedClass revision 1 + qmlRegisterType("Qt.test",1,1,"MyRevisionedSubclass"); + + qmlRegisterExtendedType("Qt.test",1,0,"QWidget"); + qmlRegisterType("Qt.test",1,0,"QPlainTextEdit"); + + qRegisterMetaType("MyQmlObject::MyType"); + qRegisterMetaType("MyEnum2"); + qRegisterMetaType("Qt::MouseButtons"); +} + +#include "testtypes.moc" diff --git a/tests/auto/declarative/qdeclarativeecmascript/testtypes.h b/tests/auto/declarative/qdeclarativeecmascript/testtypes.h new file mode 100644 index 00000000..8c7326f6 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/testtypes.h @@ -0,0 +1,915 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef TESTTYPES_H +#define TESTTYPES_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class MyQmlAttachedObject : public QObject +{ + Q_OBJECT + Q_PROPERTY(int value READ value CONSTANT) + Q_PROPERTY(int value2 READ value2 WRITE setValue2 NOTIFY value2Changed) +public: + MyQmlAttachedObject(QObject *parent) : QObject(parent), m_value2(0) {} + + int value() const { return 19; } + int value2() const { return m_value2; } + void setValue2(int v) { if (m_value2 == v) return; m_value2 = v; emit value2Changed(); } + + void emitMySignal() { emit mySignal(); } + +signals: + void value2Changed(); + void mySignal(); + +private: + int m_value2; +}; + +class MyQmlObject : public QObject +{ + Q_OBJECT + Q_ENUMS(MyEnum) + Q_ENUMS(MyEnum2) + Q_PROPERTY(int deleteOnSet READ deleteOnSet WRITE setDeleteOnSet) + Q_PROPERTY(bool trueProperty READ trueProperty CONSTANT) + Q_PROPERTY(bool falseProperty READ falseProperty CONSTANT) + Q_PROPERTY(int value READ value WRITE setValue) + Q_PROPERTY(int console READ console CONSTANT) + Q_PROPERTY(QString stringProperty READ stringProperty WRITE setStringProperty NOTIFY stringChanged) + Q_PROPERTY(QObject *objectProperty READ objectProperty WRITE setObjectProperty NOTIFY objectChanged) + Q_PROPERTY(QDeclarativeListProperty objectListProperty READ objectListProperty CONSTANT) + Q_PROPERTY(int resettableProperty READ resettableProperty WRITE setResettableProperty RESET resetProperty) + Q_PROPERTY(QRegExp regExp READ regExp WRITE setRegExp) + Q_PROPERTY(int nonscriptable READ nonscriptable WRITE setNonscriptable SCRIPTABLE false) + +public: + MyQmlObject(): myinvokableObject(0), m_methodCalled(false), m_methodIntCalled(false), m_object(0), m_value(0), m_resetProperty(13) {} + + enum MyEnum { EnumValue1 = 0, EnumValue2 = 1 }; + enum MyEnum2 { EnumValue3 = 2, EnumValue4 = 3 }; + + bool trueProperty() const { return true; } + bool falseProperty() const { return false; } + + QString stringProperty() const { return m_string; } + void setStringProperty(const QString &s) + { + if (s == m_string) + return; + m_string = s; + emit stringChanged(); + } + + QObject *objectProperty() const { return m_object; } + void setObjectProperty(QObject *obj) { + if (obj == m_object) + return; + m_object = obj; + emit objectChanged(); + } + + QDeclarativeListProperty objectListProperty() { return QDeclarativeListProperty(this, m_objectQList); } + + bool methodCalled() const { return m_methodCalled; } + bool methodIntCalled() const { return m_methodIntCalled; } + + QString string() const { return m_string; } + + static MyQmlAttachedObject *qmlAttachedProperties(QObject *o) { + return new MyQmlAttachedObject(o); + } + + int deleteOnSet() const { return 1; } + void setDeleteOnSet(int v) { if(v) delete this; } + + int value() const { return m_value; } + void setValue(int v) { m_value = v; } + + int resettableProperty() const { return m_resetProperty; } + void setResettableProperty(int v) { m_resetProperty = v; } + void resetProperty() { m_resetProperty = 13; } + + QRegExp regExp() { return m_regExp; } + void setRegExp(const QRegExp ®Exp) { m_regExp = regExp; } + + int console() const { return 11; } + + int nonscriptable() const { return 0; } + void setNonscriptable(int) {} + + MyQmlObject *myinvokableObject; + Q_INVOKABLE MyQmlObject *returnme() { return this; } + + struct MyType { + int value; + }; + QVariant variant() const { return m_variant; } + +signals: + void basicSignal(); + void argumentSignal(int a, QString b, qreal c, MyEnum2 d, Qt::MouseButtons e); + void stringChanged(); + void objectChanged(); + void anotherBasicSignal(); + void thirdBasicSignal(); + void signalWithUnknownType(const MyQmlObject::MyType &arg); + +public slots: + void deleteMe() { delete this; } + void methodNoArgs() { m_methodCalled = true; } + void method(int a) { if(a == 163) m_methodIntCalled = true; } + void setString(const QString &s) { m_string = s; } + void myinvokable(MyQmlObject *o) { myinvokableObject = o; } + void variantMethod(const QVariant &v) { m_variant = v; } + +private: + friend class tst_qdeclarativeecmascript; + bool m_methodCalled; + bool m_methodIntCalled; + + QObject *m_object; + QString m_string; + QList m_objectQList; + int m_value; + int m_resetProperty; + QRegExp m_regExp; + QVariant m_variant; +}; + +QML_DECLARE_TYPEINFO(MyQmlObject, QML_HAS_ATTACHED_PROPERTIES) + +class MyQmlContainer : public QObject +{ + Q_OBJECT + Q_PROPERTY(QDeclarativeListProperty children READ children CONSTANT) +public: + MyQmlContainer() {} + + QDeclarativeListProperty children() { return QDeclarativeListProperty(this, m_children); } + +private: + QList m_children; +}; + + +class MyExpression : public QDeclarativeExpression +{ + Q_OBJECT +public: + MyExpression(QDeclarativeContext *ctxt, const QString &expr) + : QDeclarativeExpression(ctxt, 0, expr), changed(false) + { + QObject::connect(this, SIGNAL(valueChanged()), this, SLOT(expressionValueChanged())); + setNotifyOnValueChanged(true); + } + + bool changed; + +public slots: + void expressionValueChanged() { + changed = true; + } +}; + + +class MyDefaultObject1 : public QObject +{ + Q_OBJECT + Q_PROPERTY(int horseLegs READ horseLegs CONSTANT) + Q_PROPERTY(int antLegs READ antLegs CONSTANT) + Q_PROPERTY(int emuLegs READ emuLegs CONSTANT) +public: + int horseLegs() const { return 4; } + int antLegs() const { return 6; } + int emuLegs() const { return 2; } +}; + +class MyDefaultObject3 : public QObject +{ + Q_OBJECT + Q_PROPERTY(int antLegs READ antLegs CONSTANT) + Q_PROPERTY(int humanLegs READ humanLegs CONSTANT) +public: + int antLegs() const { return 7; } // Mutant + int humanLegs() const { return 2; } + int millipedeLegs() const { return 1000; } +}; + +class MyDeferredObject : public QObject +{ + Q_OBJECT + Q_PROPERTY(int value READ value WRITE setValue NOTIFY valueChanged) + Q_PROPERTY(QObject *objectProperty READ objectProperty WRITE setObjectProperty) + Q_PROPERTY(QObject *objectProperty2 READ objectProperty2 WRITE setObjectProperty2) + Q_CLASSINFO("DeferredPropertyNames", "value,objectProperty,objectProperty2") + +public: + MyDeferredObject() : m_value(0), m_object(0), m_object2(0) {} + + int value() const { return m_value; } + void setValue(int v) { m_value = v; emit valueChanged(); } + + QObject *objectProperty() const { return m_object; } + void setObjectProperty(QObject *obj) { m_object = obj; } + + QObject *objectProperty2() const { return m_object2; } + void setObjectProperty2(QObject *obj) { m_object2 = obj; } + +signals: + void valueChanged(); + +private: + int m_value; + QObject *m_object; + QObject *m_object2; +}; + +class MyBaseExtendedObject : public QObject +{ +Q_OBJECT +Q_PROPERTY(int baseProperty READ baseProperty WRITE setBaseProperty) +public: + MyBaseExtendedObject() : m_value(0) {} + + int baseProperty() const { return m_value; } + void setBaseProperty(int v) { m_value = v; } + +private: + int m_value; +}; + +class MyExtendedObject : public MyBaseExtendedObject +{ +Q_OBJECT +Q_PROPERTY(int coreProperty READ coreProperty WRITE setCoreProperty) +public: + MyExtendedObject() : m_value(0) {} + + int coreProperty() const { return m_value; } + void setCoreProperty(int v) { m_value = v; } + +private: + int m_value; +}; + +class MyTypeObject : public QObject +{ + Q_OBJECT + Q_ENUMS(MyEnum) + Q_FLAGS(MyFlags) + + Q_PROPERTY(QString id READ id WRITE setId) + Q_PROPERTY(QObject *objectProperty READ objectProperty WRITE setObjectProperty) + Q_PROPERTY(QDeclarativeComponent *componentProperty READ componentProperty WRITE setComponentProperty) + Q_PROPERTY(MyFlags flagProperty READ flagProperty WRITE setFlagProperty) + Q_PROPERTY(MyEnum enumProperty READ enumProperty WRITE setEnumProperty) + Q_PROPERTY(QString stringProperty READ stringProperty WRITE setStringProperty) + Q_PROPERTY(uint uintProperty READ uintProperty WRITE setUintProperty) + Q_PROPERTY(int intProperty READ intProperty WRITE setIntProperty) + Q_PROPERTY(qreal realProperty READ realProperty WRITE setRealProperty) + Q_PROPERTY(double doubleProperty READ doubleProperty WRITE setDoubleProperty) + Q_PROPERTY(float floatProperty READ floatProperty WRITE setFloatProperty) + Q_PROPERTY(QColor colorProperty READ colorProperty WRITE setColorProperty) + Q_PROPERTY(QDate dateProperty READ dateProperty WRITE setDateProperty) + Q_PROPERTY(QTime timeProperty READ timeProperty WRITE setTimeProperty) + Q_PROPERTY(QDateTime dateTimeProperty READ dateTimeProperty WRITE setDateTimeProperty) + Q_PROPERTY(QPoint pointProperty READ pointProperty WRITE setPointProperty) + Q_PROPERTY(QPointF pointFProperty READ pointFProperty WRITE setPointFProperty) + Q_PROPERTY(QSize sizeProperty READ sizeProperty WRITE setSizeProperty) + Q_PROPERTY(QSizeF sizeFProperty READ sizeFProperty WRITE setSizeFProperty) + Q_PROPERTY(QRect rectProperty READ rectProperty WRITE setRectProperty NOTIFY rectPropertyChanged) + Q_PROPERTY(QRect rectProperty2 READ rectProperty2 WRITE setRectProperty2) + Q_PROPERTY(QRectF rectFProperty READ rectFProperty WRITE setRectFProperty) + Q_PROPERTY(bool boolProperty READ boolProperty WRITE setBoolProperty) + Q_PROPERTY(QVariant variantProperty READ variantProperty WRITE setVariantProperty) + Q_PROPERTY(QVector3D vectorProperty READ vectorProperty WRITE setVectorProperty) + Q_PROPERTY(QUrl urlProperty READ urlProperty WRITE setUrlProperty) + + Q_PROPERTY(QDeclarativeScriptString scriptProperty READ scriptProperty WRITE setScriptProperty) + +public: + MyTypeObject() + : objectPropertyValue(0), componentPropertyValue(0) {} + + QString idValue; + QString id() const { + return idValue; + } + void setId(const QString &v) { + idValue = v; + } + + QObject *objectPropertyValue; + QObject *objectProperty() const { + return objectPropertyValue; + } + void setObjectProperty(QObject *v) { + objectPropertyValue = v; + } + + QDeclarativeComponent *componentPropertyValue; + QDeclarativeComponent *componentProperty() const { + return componentPropertyValue; + } + void setComponentProperty(QDeclarativeComponent *v) { + componentPropertyValue = v; + } + + enum MyFlag { FlagVal1 = 0x01, FlagVal2 = 0x02, FlagVal3 = 0x04 }; + Q_DECLARE_FLAGS(MyFlags, MyFlag) + MyFlags flagPropertyValue; + MyFlags flagProperty() const { + return flagPropertyValue; + } + void setFlagProperty(MyFlags v) { + flagPropertyValue = v; + } + + enum MyEnum { EnumVal1, EnumVal2 }; + MyEnum enumPropertyValue; + MyEnum enumProperty() const { + return enumPropertyValue; + } + void setEnumProperty(MyEnum v) { + enumPropertyValue = v; + } + + QString stringPropertyValue; + QString stringProperty() const { + return stringPropertyValue; + } + void setStringProperty(const QString &v) { + stringPropertyValue = v; + } + + uint uintPropertyValue; + uint uintProperty() const { + return uintPropertyValue; + } + void setUintProperty(const uint &v) { + uintPropertyValue = v; + } + + int intPropertyValue; + int intProperty() const { + return intPropertyValue; + } + void setIntProperty(const int &v) { + intPropertyValue = v; + } + + qreal realPropertyValue; + qreal realProperty() const { + return realPropertyValue; + } + void setRealProperty(const qreal &v) { + realPropertyValue = v; + } + + double doublePropertyValue; + double doubleProperty() const { + return doublePropertyValue; + } + void setDoubleProperty(const double &v) { + doublePropertyValue = v; + } + + float floatPropertyValue; + float floatProperty() const { + return floatPropertyValue; + } + void setFloatProperty(const float &v) { + floatPropertyValue = v; + } + + QColor colorPropertyValue; + QColor colorProperty() const { + return colorPropertyValue; + } + void setColorProperty(const QColor &v) { + colorPropertyValue = v; + } + + QDate datePropertyValue; + QDate dateProperty() const { + return datePropertyValue; + } + void setDateProperty(const QDate &v) { + datePropertyValue = v; + } + + QTime timePropertyValue; + QTime timeProperty() const { + return timePropertyValue; + } + void setTimeProperty(const QTime &v) { + timePropertyValue = v; + } + + QDateTime dateTimePropertyValue; + QDateTime dateTimeProperty() const { + return dateTimePropertyValue; + } + void setDateTimeProperty(const QDateTime &v) { + dateTimePropertyValue = v; + } + + QPoint pointPropertyValue; + QPoint pointProperty() const { + return pointPropertyValue; + } + void setPointProperty(const QPoint &v) { + pointPropertyValue = v; + } + + QPointF pointFPropertyValue; + QPointF pointFProperty() const { + return pointFPropertyValue; + } + void setPointFProperty(const QPointF &v) { + pointFPropertyValue = v; + } + + QSize sizePropertyValue; + QSize sizeProperty() const { + return sizePropertyValue; + } + void setSizeProperty(const QSize &v) { + sizePropertyValue = v; + } + + QSizeF sizeFPropertyValue; + QSizeF sizeFProperty() const { + return sizeFPropertyValue; + } + void setSizeFProperty(const QSizeF &v) { + sizeFPropertyValue = v; + } + + QRect rectPropertyValue; + QRect rectProperty() const { + return rectPropertyValue; + } + void setRectProperty(const QRect &v) { + rectPropertyValue = v; + emit rectPropertyChanged(); + } + + QRect rectPropertyValue2; + QRect rectProperty2() const { + return rectPropertyValue2; + } + void setRectProperty2(const QRect &v) { + rectPropertyValue2 = v; + } + + QRectF rectFPropertyValue; + QRectF rectFProperty() const { + return rectFPropertyValue; + } + void setRectFProperty(const QRectF &v) { + rectFPropertyValue = v; + } + + bool boolPropertyValue; + bool boolProperty() const { + return boolPropertyValue; + } + void setBoolProperty(const bool &v) { + boolPropertyValue = v; + } + + QVariant variantPropertyValue; + QVariant variantProperty() const { + return variantPropertyValue; + } + void setVariantProperty(const QVariant &v) { + variantPropertyValue = v; + } + + QVector3D vectorPropertyValue; + QVector3D vectorProperty() const { + return vectorPropertyValue; + } + void setVectorProperty(const QVector3D &v) { + vectorPropertyValue = v; + } + + QUrl urlPropertyValue; + QUrl urlProperty() const { + return urlPropertyValue; + } + void setUrlProperty(const QUrl &v) { + urlPropertyValue = v; + } + + QDeclarativeScriptString scriptPropertyValue; + QDeclarativeScriptString scriptProperty() const { + return scriptPropertyValue; + } + void setScriptProperty(const QDeclarativeScriptString &v) { + scriptPropertyValue = v; + } + + void doAction() { emit action(); } +signals: + void action(); + void rectPropertyChanged(); +}; +Q_DECLARE_OPERATORS_FOR_FLAGS(MyTypeObject::MyFlags) + +class MyDerivedObject : public MyTypeObject +{ + Q_OBJECT +public: + Q_INVOKABLE bool intProperty() const { + return true; + } +}; + +Q_DECLARE_METATYPE(QScriptValue); +class MyInvokableBaseObject : public QObject +{ + Q_OBJECT +public: + inline ~MyInvokableBaseObject() = 0; + + Q_INVOKABLE inline void method_inherited(int a); + Q_INVOKABLE inline void method_overload(); +}; + +class MyInvokableObject : public MyInvokableBaseObject +{ + Q_OBJECT + Q_ENUMS(TestEnum) +public: + enum TestEnum { EnumValue1, EnumValue2 }; + MyInvokableObject() { reset(); } + + int invoked() const { return m_invoked; } + bool error() const { return m_invokedError; } + const QVariantList &actuals() const { return m_actuals; } + void reset() { m_invoked = -1; m_invokedError = false; m_actuals.clear(); } + + Q_INVOKABLE QPointF method_get_QPointF() { return QPointF(99.3, -10.2); } + Q_INVOKABLE QPoint method_get_QPoint() { return QPoint(9, 12); } + + Q_INVOKABLE void method_NoArgs() { invoke(0); } + Q_INVOKABLE int method_NoArgs_int() { invoke(1); return 6; } + Q_INVOKABLE qreal method_NoArgs_real() { invoke(2); return 19.75; } + Q_INVOKABLE QPointF method_NoArgs_QPointF() { invoke(3); return QPointF(123, 4.5); } + Q_INVOKABLE QObject *method_NoArgs_QObject() { invoke(4); return this; } + Q_INVOKABLE MyInvokableObject *method_NoArgs_unknown() { invoke(5); return this; } + Q_INVOKABLE QScriptValue method_NoArgs_QScriptValue() { invoke(6); return QScriptValue("Hello world"); } + Q_INVOKABLE QVariant method_NoArgs_QVariant() { invoke(7); return QVariant("QML rocks"); } + + Q_INVOKABLE void method_int(int a) { invoke(8); m_actuals << a; } + Q_INVOKABLE void method_intint(int a, int b) { invoke(9); m_actuals << a << b; } + Q_INVOKABLE void method_real(qreal a) { invoke(10); m_actuals << a; } + Q_INVOKABLE void method_QString(QString a) { invoke(11); m_actuals << a; } + Q_INVOKABLE void method_QPointF(QPointF a) { invoke(12); m_actuals << a; } + Q_INVOKABLE void method_QObject(QObject *a) { invoke(13); m_actuals << qVariantFromValue(a); } + Q_INVOKABLE void method_QScriptValue(QScriptValue a) { invoke(14); m_actuals << qVariantFromValue(a); } + Q_INVOKABLE void method_intQScriptValue(int a, QScriptValue b) { invoke(15); m_actuals << a << qVariantFromValue(b); } + + Q_INVOKABLE void method_overload(int a) { invoke(16); m_actuals << a; } + Q_INVOKABLE void method_overload(int a, int b) { invoke(17); m_actuals << a << b; } + Q_INVOKABLE void method_overload(QString a) { invoke(18); m_actuals << a; } + + Q_INVOKABLE void method_with_enum(TestEnum e) { invoke(19); m_actuals << (int)e; } + + Q_INVOKABLE int method_default(int a, int b = 19) { invoke(20); m_actuals << a << b; return b; } + + Q_INVOKABLE void method_QVariant(QVariant a, QVariant b = QVariant()) { invoke(21); m_actuals << a << b; } + +private: + friend class MyInvokableBaseObject; + void invoke(int idx) { if (m_invoked != -1) m_invokedError = true; m_invoked = idx;} + int m_invoked; + bool m_invokedError; + QVariantList m_actuals; +}; + +MyInvokableBaseObject::~MyInvokableBaseObject() {} + +void MyInvokableBaseObject::method_inherited(int a) +{ + static_cast(this)->invoke(-3); + static_cast(this)->m_actuals << a; +} + +// This is a hidden overload of the MyInvokableObject::method_overload() method +void MyInvokableBaseObject::method_overload() +{ + static_cast(this)->invoke(-2); +} + +class NumberAssignment : public QObject +{ + Q_OBJECT +public: + Q_PROPERTY(qreal test1 READ test1 WRITE setTest1) + qreal _test1; + qreal test1() const { return _test1; } + void setTest1(qreal v) { _test1 = v; } + + Q_PROPERTY(qreal test2 READ test2 WRITE setTest2) + qreal _test2; + qreal test2() const { return _test2; } + void setTest2(qreal v) { _test2 = v; } + + Q_PROPERTY(qreal test3 READ test3 WRITE setTest3) + qreal _test3; + qreal test3() const { return _test3; } + void setTest3(qreal v) { _test3 = v; } + + Q_PROPERTY(qreal test4 READ test4 WRITE setTest4) + qreal _test4; + qreal test4() const { return _test4; } + void setTest4(qreal v) { _test4 = v; } + + Q_PROPERTY(int test5 READ test5 WRITE setTest5) + int _test5; + int test5() const { return _test5; } + void setTest5(int v) { _test5 = v; } + + Q_PROPERTY(int test6 READ test6 WRITE setTest6) + int _test6; + int test6() const { return _test6; } + void setTest6(int v) { _test6 = v; } + + Q_PROPERTY(int test7 READ test7 WRITE setTest7) + int _test7; + int test7() const { return _test7; } + void setTest7(int v) { _test7 = v; } + + Q_PROPERTY(int test8 READ test8 WRITE setTest8) + int _test8; + int test8() const { return _test8; } + void setTest8(int v) { _test8 = v; } + + Q_PROPERTY(unsigned int test9 READ test9 WRITE setTest9) + unsigned int _test9; + unsigned int test9() const { return _test9; } + void setTest9(unsigned int v) { _test9 = v; } + + Q_PROPERTY(unsigned int test10 READ test10 WRITE setTest10) + unsigned int _test10; + unsigned int test10() const { return _test10; } + void setTest10(unsigned int v) { _test10 = v; } + + Q_PROPERTY(unsigned int test11 READ test11 WRITE setTest11) + unsigned int _test11; + unsigned int test11() const { return _test11; } + void setTest11(unsigned int v) { _test11 = v; } + + Q_PROPERTY(unsigned int test12 READ test12 WRITE setTest12) + unsigned int _test12; + unsigned int test12() const { return _test12; } + void setTest12(unsigned int v) { _test12 = v; } +}; + +class DefaultPropertyExtendedObject : public QObject +{ + Q_OBJECT + Q_PROPERTY(QObject *firstProperty READ firstProperty WRITE setFirstProperty) + Q_PROPERTY(QObject *secondProperty READ secondProperty WRITE setSecondProperty) +public: + DefaultPropertyExtendedObject(QObject *parent = 0) : QObject(parent), m_firstProperty(0), m_secondProperty(0) {} + + QObject *firstProperty() const { return m_firstProperty; } + QObject *secondProperty() const { return m_secondProperty; } + void setFirstProperty(QObject *property) { m_firstProperty = property; } + void setSecondProperty(QObject *property) { m_secondProperty = property; } +private: + QObject* m_firstProperty; + QObject* m_secondProperty; +}; + +class OverrideDefaultPropertyObject : public DefaultPropertyExtendedObject +{ + Q_OBJECT + Q_CLASSINFO("DefaultProperty", "secondProperty") +public: + OverrideDefaultPropertyObject() {} +}; + +class MyRevisionedBaseClassRegistered : public QObject +{ +Q_OBJECT + Q_PROPERTY(qreal propA READ propA WRITE setPropA NOTIFY propAChanged) + Q_PROPERTY(qreal propB READ propB WRITE setPropB NOTIFY propBChanged REVISION 1) + +public: + MyRevisionedBaseClassRegistered() : m_pa(1), m_pb(2) {} + + qreal propA() const { return m_pa; } + void setPropA(qreal p) { + if (p != m_pa) { + m_pa = p; + emit propAChanged(); + } + } + qreal propB() const { return m_pb; } + void setPropB(qreal p) { + if (p != m_pb) { + m_pb = p; + emit propBChanged(); + } + } + + Q_INVOKABLE void methodA() { } + Q_INVOKABLE Q_REVISION(1) void methodB() { } + +signals: + void propAChanged(); + void propBChanged(); + + void signalA(); + Q_REVISION(1) void signalB(); + +protected: + qreal m_pa; + qreal m_pb; +}; + +class MyRevisionedBaseClassUnregistered : public MyRevisionedBaseClassRegistered +{ +Q_OBJECT + Q_PROPERTY(qreal propC READ propC WRITE setPropC NOTIFY propCChanged) + Q_PROPERTY(qreal propD READ propD WRITE setPropD NOTIFY propDChanged REVISION 1) + +public: + MyRevisionedBaseClassUnregistered() : m_pc(1), m_pd(2) {} + + qreal propC() const { return m_pc; } + void setPropC(qreal p) { + if (p != m_pc) { + m_pc = p; + emit propCChanged(); + } + } + qreal propD() const { return m_pd; } + void setPropD(qreal p) { + if (p != m_pd) { + m_pd = p; + emit propDChanged(); + } + } + + Q_INVOKABLE void methodC() { } + Q_INVOKABLE Q_REVISION(1) void methodD() { } + +signals: + void propCChanged(); + void propDChanged(); + + void signalC(); + Q_REVISION(1) void signalD(); + +protected: + qreal m_pc; + qreal m_pd; +}; + +class MyRevisionedClass : public MyRevisionedBaseClassUnregistered +{ + Q_OBJECT + Q_PROPERTY(qreal prop1 READ prop1 WRITE setProp1 NOTIFY prop1Changed) + Q_PROPERTY(qreal prop2 READ prop2 WRITE setProp2 NOTIFY prop2Changed REVISION 1) + +public: + MyRevisionedClass() {} + + qreal prop1() const { return m_p1; } + void setProp1(qreal p) { + if (p != m_p1) { + m_p1 = p; + emit prop1Changed(); + } + } + qreal prop2() const { return m_p2; } + void setProp2(qreal p) { + if (p != m_p2) { + m_p2 = p; + emit prop2Changed(); + } + } + + Q_INVOKABLE void method1() { } + Q_INVOKABLE Q_REVISION(1) void method2() { } + +signals: + void prop1Changed(); + void prop2Changed(); + + void signal1(); + Q_REVISION(1) void signal2(); + +protected: + qreal m_p1; + qreal m_p2; +}; + +class MyRevisionedSubclass : public MyRevisionedClass +{ + Q_OBJECT + Q_PROPERTY(qreal prop3 READ prop3 WRITE setProp3 NOTIFY prop3Changed) + Q_PROPERTY(qreal prop4 READ prop4 WRITE setProp4 NOTIFY prop4Changed REVISION 1) + +public: + MyRevisionedSubclass() : m_p3(3), m_p4(4) {} + + qreal prop3() const { return m_p3; } + void setProp3(qreal p) { + if (p != m_p3) { + m_p3 = p; + emit prop3Changed(); + } + } + qreal prop4() const { return m_p4; } + void setProp4(qreal p) { + if (p != m_p4) { + m_p4 = p; + emit prop4Changed(); + } + } + + Q_INVOKABLE void method3() { } + Q_INVOKABLE Q_REVISION(1) void method4() { } + +signals: + void prop3Changed(); + void prop4Changed(); + + void signal3(); + Q_REVISION(1) void signal4(); + +protected: + qreal m_p3; + qreal m_p4; +}; + +QML_DECLARE_TYPE(MyRevisionedBaseClassRegistered) +QML_DECLARE_TYPE(MyRevisionedBaseClassUnregistered) +QML_DECLARE_TYPE(MyRevisionedClass) +QML_DECLARE_TYPE(MyRevisionedSubclass) +Q_DECLARE_METATYPE(MyQmlObject::MyType) + +void registerTypes(); + +#endif // TESTTYPES_H + diff --git a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp new file mode 100644 index 00000000..f5b2061d --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp @@ -0,0 +1,3105 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "testtypes.h" +#include "testhttpserver.h" +#include "../../../shared/util.h" + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +/* +This test covers evaluation of ECMAScript expressions and bindings from within +QML. This does not include static QML language issues. + +Static QML language issues are covered in qmllanguage +*/ +inline QUrl TEST_FILE(const QString &filename) +{ + QFileInfo fileInfo(__FILE__); + return QUrl::fromLocalFile(fileInfo.absoluteDir().filePath("data/" + filename)); +} + +inline QUrl TEST_FILE(const char *filename) +{ + return TEST_FILE(QLatin1String(filename)); +} + +class tst_qdeclarativeecmascript : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativeecmascript() {} + +private slots: + void initTestCase(); + void assignBasicTypes(); + void idShortcutInvalidates(); + void boolPropertiesEvaluateAsBool(); + void methods(); + void signalAssignment(); + void bindingLoop(); + void basicExpressions(); + void basicExpressions_data(); + void arrayExpressions(); + void contextPropertiesTriggerReeval(); + void objectPropertiesTriggerReeval(); + void deferredProperties(); + void deferredPropertiesErrors(); + void extensionObjects(); + void overrideExtensionProperties(); + void attachedProperties(); + void enums(); + void valueTypeFunctions(); + void constantsOverrideBindings(); + void outerBindingOverridesInnerBinding(); + void aliasPropertyAndBinding(); + void nonExistentAttachedObject(); + void scope(); + void signalParameterTypes(); + void objectsCompareAsEqual(); + void dynamicCreation_data(); + void dynamicCreation(); + void dynamicDestruction(); + void objectToString(); + void selfDeletingBinding(); + void extendedObjectPropertyLookup(); + void scriptErrors(); + void functionErrors(); + void propertyAssignmentErrors(); + void signalTriggeredBindings(); + void listProperties(); + void exceptionClearsOnReeval(); + void exceptionSlotProducesWarning(); + void exceptionBindingProducesWarning(); + void transientErrors(); + void shutdownErrors(); + void compositePropertyType(); + void jsObject(); + void undefinedResetsProperty(); + void listToVariant(); + void multiEngineObject(); + void deletedObject(); + void attachedPropertyScope(); + void scriptConnect(); + void scriptDisconnect(); + void ownership(); + void cppOwnershipReturnValue(); + void ownershipCustomReturnValue(); + void qlistqobjectMethods(); + void strictlyEquals(); + void compiled(); + void numberAssignment(); + void propertySplicing(); + void signalWithUnknownTypes(); + + void bug1(); + void bug2(); + void dynamicCreationCrash(); + void regExpBug(); + void nullObjectBinding(); + void deletedEngine(); + void libraryScriptAssert(); + void variantsAssignedUndefined(); + void qtbug_9792(); + void qtcreatorbug_1289(); + void noSpuriousWarningsAtShutdown(); + void canAssignNullToQObject(); + void functionAssignment_fromBinding(); + void functionAssignment_fromJS(); + void functionAssignment_fromJS_data(); + void functionAssignmentfromJS_invalid(); + void eval(); + void function(); + void qtbug_10696(); + void qtbug_11606(); + void qtbug_11600(); + void nonscriptable(); + void deleteLater(); + void in(); + void sharedAttachedObject(); + void objectName(); + void writeRemovesBinding(); + void aliasBindingsAssignCorrectly(); + void aliasBindingsOverrideTarget(); + void aliasWritesOverrideBindings(); + void pushCleanContext(); + void realToInt(); + void qtbug_20648(); + + void include(); + + void callQtInvokables(); + void invokableObjectArg(); + void invokableObjectRet(); + + void revisionErrors(); + void revision(); +private: + QDeclarativeEngine engine; +}; + +void tst_qdeclarativeecmascript::initTestCase() { registerTypes(); } + +void tst_qdeclarativeecmascript::assignBasicTypes() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("assignBasicTypes.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QCOMPARE(object->flagProperty(), MyTypeObject::FlagVal1 | MyTypeObject::FlagVal3); + QCOMPARE(object->enumProperty(), MyTypeObject::EnumVal2); + QCOMPARE(object->stringProperty(), QString("Hello World!")); + QCOMPARE(object->uintProperty(), uint(10)); + QCOMPARE(object->intProperty(), -19); + QCOMPARE((float)object->realProperty(), float(23.2)); + QCOMPARE((float)object->doubleProperty(), float(-19.75)); + QCOMPARE((float)object->floatProperty(), float(8.5)); + QCOMPARE(object->colorProperty(), QColor("red")); + QCOMPARE(object->dateProperty(), QDate(1982, 11, 25)); + QCOMPARE(object->timeProperty(), QTime(11, 11, 32)); + QCOMPARE(object->dateTimeProperty(), QDateTime(QDate(2009, 5, 12), QTime(13, 22, 1))); + QCOMPARE(object->pointProperty(), QPoint(99,13)); + QCOMPARE(object->pointFProperty(), QPointF(-10.1, 12.3)); + QCOMPARE(object->sizeProperty(), QSize(99, 13)); + QCOMPARE(object->sizeFProperty(), QSizeF(0.1, 0.2)); + QCOMPARE(object->rectProperty(), QRect(9, 7, 100, 200)); + QCOMPARE(object->rectFProperty(), QRectF(1000.1, -10.9, 400, 90.99)); + QCOMPARE(object->boolProperty(), true); + QCOMPARE(object->variantProperty(), QVariant("Hello World!")); + QCOMPARE(object->vectorProperty(), QVector3D(10, 1, 2.2)); + QCOMPARE(object->urlProperty(), component.url().resolved(QUrl("main.qml"))); + delete object; + } + { + QDeclarativeComponent component(&engine, TEST_FILE("assignBasicTypes.2.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QCOMPARE(object->flagProperty(), MyTypeObject::FlagVal1 | MyTypeObject::FlagVal3); + QCOMPARE(object->enumProperty(), MyTypeObject::EnumVal2); + QCOMPARE(object->stringProperty(), QString("Hello World!")); + QCOMPARE(object->uintProperty(), uint(10)); + QCOMPARE(object->intProperty(), -19); + QCOMPARE((float)object->realProperty(), float(23.2)); + QCOMPARE((float)object->doubleProperty(), float(-19.75)); + QCOMPARE((float)object->floatProperty(), float(8.5)); + QCOMPARE(object->colorProperty(), QColor("red")); + QCOMPARE(object->dateProperty(), QDate(1982, 11, 25)); + QCOMPARE(object->timeProperty(), QTime(11, 11, 32)); + QCOMPARE(object->dateTimeProperty(), QDateTime(QDate(2009, 5, 12), QTime(13, 22, 1))); + QCOMPARE(object->pointProperty(), QPoint(99,13)); + QCOMPARE(object->pointFProperty(), QPointF(-10.1, 12.3)); + QCOMPARE(object->sizeProperty(), QSize(99, 13)); + QCOMPARE(object->sizeFProperty(), QSizeF(0.1, 0.2)); + QCOMPARE(object->rectProperty(), QRect(9, 7, 100, 200)); + QCOMPARE(object->rectFProperty(), QRectF(1000.1, -10.9, 400, 90.99)); + QCOMPARE(object->boolProperty(), true); + QCOMPARE(object->variantProperty(), QVariant("Hello World!")); + QCOMPARE(object->vectorProperty(), QVector3D(10, 1, 2.2)); + QCOMPARE(object->urlProperty(), component.url().resolved(QUrl("main.qml"))); + delete object; + } +} + +void tst_qdeclarativeecmascript::idShortcutInvalidates() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("idShortcutInvalidates.qml")); + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QVERIFY(object->objectProperty() != 0); + delete object->objectProperty(); + QVERIFY(object->objectProperty() == 0); + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("idShortcutInvalidates.1.qml")); + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QVERIFY(object->objectProperty() != 0); + delete object->objectProperty(); + QVERIFY(object->objectProperty() == 0); + } +} + +void tst_qdeclarativeecmascript::boolPropertiesEvaluateAsBool() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("boolPropertiesEvaluateAsBool.1.qml")); + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QCOMPARE(object->stringProperty(), QLatin1String("pass")); + } + { + QDeclarativeComponent component(&engine, TEST_FILE("boolPropertiesEvaluateAsBool.2.qml")); + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QCOMPARE(object->stringProperty(), QLatin1String("pass")); + } +} + +void tst_qdeclarativeecmascript::signalAssignment() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("signalAssignment.1.qml")); + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QCOMPARE(object->string(), QString()); + emit object->basicSignal(); + QCOMPARE(object->string(), QString("pass")); + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("signalAssignment.2.qml")); + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QCOMPARE(object->string(), QString()); + emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton); + QCOMPARE(object->string(), QString("pass 19 Hello world! 10.25 3 2")); + } +} + +void tst_qdeclarativeecmascript::methods() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("methods.1.qml")); + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QCOMPARE(object->methodCalled(), false); + QCOMPARE(object->methodIntCalled(), false); + emit object->basicSignal(); + QCOMPARE(object->methodCalled(), true); + QCOMPARE(object->methodIntCalled(), false); + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("methods.2.qml")); + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QCOMPARE(object->methodCalled(), false); + QCOMPARE(object->methodIntCalled(), false); + emit object->basicSignal(); + QCOMPARE(object->methodCalled(), false); + QCOMPARE(object->methodIntCalled(), true); + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("methods.3.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + QCOMPARE(object->property("test").toInt(), 19); + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("methods.4.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + QCOMPARE(object->property("test").toInt(), 19); + QCOMPARE(object->property("test2").toInt(), 17); + QCOMPARE(object->property("test3").toInt(), 16); + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("methods.5.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + QCOMPARE(object->property("test").toInt(), 9); + } +} + +void tst_qdeclarativeecmascript::bindingLoop() +{ + QDeclarativeComponent component(&engine, TEST_FILE("bindingLoop.qml")); + QString warning = component.url().toString() + ":9:9: QML MyQmlObject: Binding loop detected for property \"stringProperty\""; + QTest::ignoreMessage(QtWarningMsg, warning.toLatin1().constData()); + QObject *object = component.create(); + QVERIFY(object != 0); +} + +void tst_qdeclarativeecmascript::basicExpressions_data() +{ + QTest::addColumn("expression"); + QTest::addColumn("result"); + QTest::addColumn("nest"); + + QTest::newRow("Syntax error (self test)") << "{console.log({'a':1'}.a)}" << QVariant() << false; + QTest::newRow("Context property") << "a" << QVariant(1944) << false; + QTest::newRow("Context property") << "a" << QVariant(1944) << true; + QTest::newRow("Context property expression") << "a * 2" << QVariant(3888) << false; + QTest::newRow("Context property expression") << "a * 2" << QVariant(3888) << true; + QTest::newRow("Overridden context property") << "b" << QVariant("Milk") << false; + QTest::newRow("Overridden context property") << "b" << QVariant("Cow") << true; + QTest::newRow("Object property") << "object.stringProperty" << QVariant("Object1") << false; + QTest::newRow("Object property") << "object.stringProperty" << QVariant("Object1") << true; + QTest::newRow("Overridden object property") << "objectOverride.stringProperty" << QVariant("Object2") << false; + QTest::newRow("Overridden object property") << "objectOverride.stringProperty" << QVariant("Object3") << true; + QTest::newRow("Default object property") << "horseLegs" << QVariant(4) << false; + QTest::newRow("Default object property") << "antLegs" << QVariant(6) << false; + QTest::newRow("Default object property") << "emuLegs" << QVariant(2) << false; + QTest::newRow("Nested default object property") << "horseLegs" << QVariant(4) << true; + QTest::newRow("Nested default object property") << "antLegs" << QVariant(7) << true; + QTest::newRow("Nested default object property") << "emuLegs" << QVariant(2) << true; + QTest::newRow("Nested default object property") << "humanLegs" << QVariant(2) << true; + QTest::newRow("Context property override default object property") << "millipedeLegs" << QVariant(100) << true; +} + +void tst_qdeclarativeecmascript::basicExpressions() +{ + QFETCH(QString, expression); + QFETCH(QVariant, result); + QFETCH(bool, nest); + + MyQmlObject object1; + MyQmlObject object2; + MyQmlObject object3; + MyDefaultObject1 default1; + MyDefaultObject3 default3; + object1.setStringProperty("Object1"); + object2.setStringProperty("Object2"); + object3.setStringProperty("Object3"); + + QDeclarativeContext context(engine.rootContext()); + QDeclarativeContext nestedContext(&context); + + context.setContextObject(&default1); + context.setContextProperty("a", QVariant(1944)); + context.setContextProperty("b", QVariant("Milk")); + context.setContextProperty("object", &object1); + context.setContextProperty("objectOverride", &object2); + nestedContext.setContextObject(&default3); + nestedContext.setContextProperty("b", QVariant("Cow")); + nestedContext.setContextProperty("objectOverride", &object3); + nestedContext.setContextProperty("millipedeLegs", QVariant(100)); + + MyExpression expr(nest?&nestedContext:&context, expression); + QCOMPARE(expr.evaluate(), result); +} + +void tst_qdeclarativeecmascript::arrayExpressions() +{ + QObject obj1; + QObject obj2; + QObject obj3; + + QDeclarativeContext context(engine.rootContext()); + context.setContextProperty("a", &obj1); + context.setContextProperty("b", &obj2); + context.setContextProperty("c", &obj3); + + MyExpression expr(&context, "[a, b, c, 10]"); + QVariant result = expr.evaluate(); + QCOMPARE(result.userType(), qMetaTypeId >()); + QList list = qvariant_cast >(result); + QCOMPARE(list.count(), 4); + QCOMPARE(list.at(0), &obj1); + QCOMPARE(list.at(1), &obj2); + QCOMPARE(list.at(2), &obj3); + QCOMPARE(list.at(3), (QObject *)0); +} + +// Tests that modifying a context property will reevaluate expressions +void tst_qdeclarativeecmascript::contextPropertiesTriggerReeval() +{ + QDeclarativeContext context(engine.rootContext()); + MyQmlObject object1; + MyQmlObject object2; + MyQmlObject *object3 = new MyQmlObject; + + object1.setStringProperty("Hello"); + object2.setStringProperty("World"); + + context.setContextProperty("testProp", QVariant(1)); + context.setContextProperty("testObj", &object1); + context.setContextProperty("testObj2", object3); + + { + MyExpression expr(&context, "testProp + 1"); + QCOMPARE(expr.changed, false); + QCOMPARE(expr.evaluate(), QVariant(2)); + + context.setContextProperty("testProp", QVariant(2)); + QCOMPARE(expr.changed, true); + QCOMPARE(expr.evaluate(), QVariant(3)); + } + + { + MyExpression expr(&context, "testProp + testProp + testProp"); + QCOMPARE(expr.changed, false); + QCOMPARE(expr.evaluate(), QVariant(6)); + + context.setContextProperty("testProp", QVariant(4)); + QCOMPARE(expr.changed, true); + QCOMPARE(expr.evaluate(), QVariant(12)); + } + + { + MyExpression expr(&context, "testObj.stringProperty"); + QCOMPARE(expr.changed, false); + QCOMPARE(expr.evaluate(), QVariant("Hello")); + + context.setContextProperty("testObj", &object2); + QCOMPARE(expr.changed, true); + QCOMPARE(expr.evaluate(), QVariant("World")); + } + + { + MyExpression expr(&context, "testObj.stringProperty /**/"); + QCOMPARE(expr.changed, false); + QCOMPARE(expr.evaluate(), QVariant("World")); + + context.setContextProperty("testObj", &object1); + QCOMPARE(expr.changed, true); + QCOMPARE(expr.evaluate(), QVariant("Hello")); + } + + { + MyExpression expr(&context, "testObj2"); + QCOMPARE(expr.changed, false); + QCOMPARE(expr.evaluate(), QVariant::fromValue((QObject *)object3)); + } + +} + +void tst_qdeclarativeecmascript::objectPropertiesTriggerReeval() +{ + QDeclarativeContext context(engine.rootContext()); + MyQmlObject object1; + MyQmlObject object2; + MyQmlObject object3; + context.setContextProperty("testObj", &object1); + + object1.setStringProperty(QLatin1String("Hello")); + object2.setStringProperty(QLatin1String("Dog")); + object3.setStringProperty(QLatin1String("Cat")); + + { + MyExpression expr(&context, "testObj.stringProperty"); + QCOMPARE(expr.changed, false); + QCOMPARE(expr.evaluate(), QVariant("Hello")); + + object1.setStringProperty(QLatin1String("World")); + QCOMPARE(expr.changed, true); + QCOMPARE(expr.evaluate(), QVariant("World")); + } + + { + MyExpression expr(&context, "testObj.objectProperty.stringProperty"); + QCOMPARE(expr.changed, false); + QCOMPARE(expr.evaluate(), QVariant()); + + object1.setObjectProperty(&object2); + QCOMPARE(expr.changed, true); + expr.changed = false; + QCOMPARE(expr.evaluate(), QVariant("Dog")); + + object1.setObjectProperty(&object3); + QCOMPARE(expr.changed, true); + expr.changed = false; + QCOMPARE(expr.evaluate(), QVariant("Cat")); + + object1.setObjectProperty(0); + QCOMPARE(expr.changed, true); + expr.changed = false; + QCOMPARE(expr.evaluate(), QVariant()); + + object1.setObjectProperty(&object3); + QCOMPARE(expr.changed, true); + expr.changed = false; + QCOMPARE(expr.evaluate(), QVariant("Cat")); + + object3.setStringProperty("Donkey"); + QCOMPARE(expr.changed, true); + expr.changed = false; + QCOMPARE(expr.evaluate(), QVariant("Donkey")); + } +} + +void tst_qdeclarativeecmascript::deferredProperties() +{ + QDeclarativeComponent component(&engine, TEST_FILE("deferredProperties.qml")); + MyDeferredObject *object = + qobject_cast(component.create()); + QVERIFY(object != 0); + QCOMPARE(object->value(), 0); + QVERIFY(object->objectProperty() == 0); + QVERIFY(object->objectProperty2() != 0); + qmlExecuteDeferred(object); + QCOMPARE(object->value(), 10); + QVERIFY(object->objectProperty() != 0); + MyQmlObject *qmlObject = + qobject_cast(object->objectProperty()); + QVERIFY(qmlObject != 0); + QCOMPARE(qmlObject->value(), 10); + object->setValue(19); + QCOMPARE(qmlObject->value(), 19); +} + +// Check errors on deferred properties are correctly emitted +void tst_qdeclarativeecmascript::deferredPropertiesErrors() +{ + QDeclarativeComponent component(&engine, TEST_FILE("deferredPropertiesErrors.qml")); + MyDeferredObject *object = + qobject_cast(component.create()); + QVERIFY(object != 0); + QCOMPARE(object->value(), 0); + QVERIFY(object->objectProperty() == 0); + QVERIFY(object->objectProperty2() == 0); + + QString warning = component.url().toString() + ":6: Unable to assign [undefined] to QObject* objectProperty"; + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning)); + + qmlExecuteDeferred(object); + + delete object; +} + +void tst_qdeclarativeecmascript::extensionObjects() +{ + QDeclarativeComponent component(&engine, TEST_FILE("extensionObjects.qml")); + MyExtendedObject *object = + qobject_cast(component.create()); + QVERIFY(object != 0); + QCOMPARE(object->baseProperty(), 13); + QCOMPARE(object->coreProperty(), 9); + object->setProperty("extendedProperty", QVariant(11)); + object->setProperty("baseExtendedProperty", QVariant(92)); + QCOMPARE(object->coreProperty(), 11); + QCOMPARE(object->baseProperty(), 92); + + MyExtendedObject *nested = qobject_cast(qvariant_cast(object->property("nested"))); + QVERIFY(nested); + QCOMPARE(nested->baseProperty(), 13); + QCOMPARE(nested->coreProperty(), 9); + nested->setProperty("extendedProperty", QVariant(11)); + nested->setProperty("baseExtendedProperty", QVariant(92)); + QCOMPARE(nested->coreProperty(), 11); + QCOMPARE(nested->baseProperty(), 92); + +} + +void tst_qdeclarativeecmascript::overrideExtensionProperties() +{ + QDeclarativeComponent component(&engine, TEST_FILE("extensionObjectsPropertyOverride.qml")); + OverrideDefaultPropertyObject *object = + qobject_cast(component.create()); + QVERIFY(object != 0); + QVERIFY(object->secondProperty() != 0); + QVERIFY(object->firstProperty() == 0); +} + +void tst_qdeclarativeecmascript::attachedProperties() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("attachedProperty.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + QCOMPARE(object->property("a").toInt(), 19); + QCOMPARE(object->property("b").toInt(), 19); + QCOMPARE(object->property("c").toInt(), 19); + QCOMPARE(object->property("d").toInt(), 19); + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("attachedProperty.2.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + QCOMPARE(object->property("a").toInt(), 26); + QCOMPARE(object->property("b").toInt(), 26); + QCOMPARE(object->property("c").toInt(), 26); + QCOMPARE(object->property("d").toInt(), 26); + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("writeAttachedProperty.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QMetaObject::invokeMethod(object, "writeValue2"); + + MyQmlAttachedObject *attached = + qobject_cast(qmlAttachedPropertiesObject(object)); + QVERIFY(attached != 0); + + QCOMPARE(attached->value2(), 9); + } +} + +void tst_qdeclarativeecmascript::enums() +{ + // Existent enums + { + QDeclarativeComponent component(&engine, TEST_FILE("enums.1.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("a").toInt(), 0); + QCOMPARE(object->property("b").toInt(), 1); + QCOMPARE(object->property("c").toInt(), 2); + QCOMPARE(object->property("d").toInt(), 3); + QCOMPARE(object->property("e").toInt(), 0); + QCOMPARE(object->property("f").toInt(), 1); + QCOMPARE(object->property("g").toInt(), 2); + QCOMPARE(object->property("h").toInt(), 3); + QCOMPARE(object->property("i").toInt(), 19); + QCOMPARE(object->property("j").toInt(), 19); + } + // Non-existent enums + { + QDeclarativeComponent component(&engine, TEST_FILE("enums.2.qml")); + + QString warning1 = component.url().toString() + ":5: Unable to assign [undefined] to int a"; + QString warning2 = component.url().toString() + ":6: Unable to assign [undefined] to int b"; + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1)); + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2)); + + QObject *object = component.create(); + QVERIFY(object != 0); + QCOMPARE(object->property("a").toInt(), 0); + QCOMPARE(object->property("b").toInt(), 0); + } +} + +void tst_qdeclarativeecmascript::valueTypeFunctions() +{ + QDeclarativeComponent component(&engine, TEST_FILE("valueTypeFunctions.qml")); + MyTypeObject *obj = qobject_cast(component.create()); + QVERIFY(obj != 0); + QCOMPARE(obj->rectProperty(), QRect(0,0,100,100)); + QCOMPARE(obj->rectFProperty(), QRectF(0,0.5,100,99.5)); +} + +/* +Tests that writing a constant to a property with a binding on it disables the +binding. +*/ +void tst_qdeclarativeecmascript::constantsOverrideBindings() +{ + // From ECMAScript + { + QDeclarativeComponent component(&engine, TEST_FILE("constantsOverrideBindings.1.qml")); + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->property("c2").toInt(), 0); + object->setProperty("c1", QVariant(9)); + QCOMPARE(object->property("c2").toInt(), 9); + + emit object->basicSignal(); + + QCOMPARE(object->property("c2").toInt(), 13); + object->setProperty("c1", QVariant(8)); + QCOMPARE(object->property("c2").toInt(), 13); + } + + // During construction + { + QDeclarativeComponent component(&engine, TEST_FILE("constantsOverrideBindings.2.qml")); + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->property("c1").toInt(), 0); + QCOMPARE(object->property("c2").toInt(), 10); + object->setProperty("c1", QVariant(9)); + QCOMPARE(object->property("c1").toInt(), 9); + QCOMPARE(object->property("c2").toInt(), 10); + } + +#if 0 + // From C++ + { + QDeclarativeComponent component(&engine, TEST_FILE("constantsOverrideBindings.3.qml")); + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->property("c2").toInt(), 0); + object->setProperty("c1", QVariant(9)); + QCOMPARE(object->property("c2").toInt(), 9); + + object->setProperty("c2", QVariant(13)); + QCOMPARE(object->property("c2").toInt(), 13); + object->setProperty("c1", QVariant(7)); + QCOMPARE(object->property("c1").toInt(), 7); + QCOMPARE(object->property("c2").toInt(), 13); + } +#endif + + // Using an alias + { + QDeclarativeComponent component(&engine, TEST_FILE("constantsOverrideBindings.4.qml")); + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->property("c1").toInt(), 0); + QCOMPARE(object->property("c3").toInt(), 10); + object->setProperty("c1", QVariant(9)); + QCOMPARE(object->property("c1").toInt(), 9); + QCOMPARE(object->property("c3").toInt(), 10); + } +} + +/* +Tests that assigning a binding to a property that already has a binding causes +the original binding to be disabled. +*/ +void tst_qdeclarativeecmascript::outerBindingOverridesInnerBinding() +{ + QDeclarativeComponent component(&engine, + TEST_FILE("outerBindingOverridesInnerBinding.qml")); + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->property("c1").toInt(), 0); + QCOMPARE(object->property("c2").toInt(), 0); + QCOMPARE(object->property("c3").toInt(), 0); + + object->setProperty("c1", QVariant(9)); + QCOMPARE(object->property("c1").toInt(), 9); + QCOMPARE(object->property("c2").toInt(), 0); + QCOMPARE(object->property("c3").toInt(), 0); + + object->setProperty("c3", QVariant(8)); + QCOMPARE(object->property("c1").toInt(), 9); + QCOMPARE(object->property("c2").toInt(), 8); + QCOMPARE(object->property("c3").toInt(), 8); +} + +/* +Access a non-existent attached object. + +Tests for a regression where this used to crash. +*/ +void tst_qdeclarativeecmascript::nonExistentAttachedObject() +{ + QDeclarativeComponent component(&engine, TEST_FILE("nonExistentAttachedObject.qml")); + + QString warning = component.url().toString() + ":4: Unable to assign [undefined] to QString stringProperty"; + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning)); + + QObject *object = component.create(); + QVERIFY(object != 0); +} + +void tst_qdeclarativeecmascript::scope() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("scope.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("test1").toInt(), 1); + QCOMPARE(object->property("test2").toInt(), 2); + QCOMPARE(object->property("test3").toString(), QString("1Test")); + QCOMPARE(object->property("test4").toString(), QString("2Test")); + QCOMPARE(object->property("test5").toInt(), 1); + QCOMPARE(object->property("test6").toInt(), 1); + QCOMPARE(object->property("test7").toInt(), 2); + QCOMPARE(object->property("test8").toInt(), 2); + QCOMPARE(object->property("test9").toInt(), 1); + QCOMPARE(object->property("test10").toInt(), 3); + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("scope.2.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("test1").toInt(), 19); + QCOMPARE(object->property("test2").toInt(), 19); + QCOMPARE(object->property("test3").toInt(), 14); + QCOMPARE(object->property("test4").toInt(), 14); + QCOMPARE(object->property("test5").toInt(), 24); + QCOMPARE(object->property("test6").toInt(), 24); + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("scope.3.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("test1").toBool(), true); + QCOMPARE(object->property("test2").toBool(), true); + QCOMPARE(object->property("test3").toBool(), true); + } + + // Signal argument scope + { + QDeclarativeComponent component(&engine, TEST_FILE("scope.4.qml")); + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->property("test").toInt(), 0); + QCOMPARE(object->property("test2").toString(), QString()); + + emit object->argumentSignal(13, "Argument Scope", 9, MyQmlObject::EnumValue4, Qt::RightButton); + + QCOMPARE(object->property("test").toInt(), 13); + QCOMPARE(object->property("test2").toString(), QString("Argument Scope")); + + delete object; + } +} + +/* +Tests that "any" type passes through a synthesized signal parameter. This +is essentially a test of QDeclarativeMetaType::copy() +*/ +void tst_qdeclarativeecmascript::signalParameterTypes() +{ + QDeclarativeComponent component(&engine, TEST_FILE("signalParameterTypes.qml")); + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + emit object->basicSignal(); + + QCOMPARE(object->property("intProperty").toInt(), 10); + QCOMPARE(object->property("realProperty").toReal(), 19.2); + QVERIFY(object->property("colorProperty").value() == QColor(255, 255, 0, 255)); + QVERIFY(object->property("variantProperty") == QVariant::fromValue(QColor(255, 0, 255, 255))); + QVERIFY(object->property("enumProperty") == MyQmlObject::EnumValue3); + QVERIFY(object->property("qtEnumProperty") == Qt::LeftButton); +} + +/* +Test that two JS objects for the same QObject compare as equal. +*/ +void tst_qdeclarativeecmascript::objectsCompareAsEqual() +{ + QDeclarativeComponent component(&engine, TEST_FILE("objectsCompareAsEqual.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("test1").toBool(), true); + QCOMPARE(object->property("test2").toBool(), true); + QCOMPARE(object->property("test3").toBool(), true); + QCOMPARE(object->property("test4").toBool(), true); + QCOMPARE(object->property("test5").toBool(), true); +} + +/* +Confirm bindings and alias properties can coexist. + +Tests for a regression where the binding would not reevaluate. +*/ +void tst_qdeclarativeecmascript::aliasPropertyAndBinding() +{ + QDeclarativeComponent component(&engine, TEST_FILE("aliasPropertyAndBinding.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("c2").toInt(), 3); + QCOMPARE(object->property("c3").toInt(), 3); + + object->setProperty("c2", QVariant(19)); + + QCOMPARE(object->property("c2").toInt(), 19); + QCOMPARE(object->property("c3").toInt(), 19); +} + +void tst_qdeclarativeecmascript::dynamicCreation_data() +{ + QTest::addColumn("method"); + QTest::addColumn("createdName"); + + QTest::newRow("One") << "createOne" << "objectOne"; + QTest::newRow("Two") << "createTwo" << "objectTwo"; + QTest::newRow("Three") << "createThree" << "objectThree"; +} + +/* +Test using createQmlObject to dynamically generate an item +Also using createComponent is tested. +*/ +void tst_qdeclarativeecmascript::dynamicCreation() +{ + QFETCH(QString, method); + QFETCH(QString, createdName); + + QDeclarativeComponent component(&engine, TEST_FILE("dynamicCreation.qml")); + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QMetaObject::invokeMethod(object, method.toUtf8()); + QObject *created = object->objectProperty(); + QVERIFY(created); + QCOMPARE(created->objectName(), createdName); +} + +/* + Tests the destroy function +*/ +void tst_qdeclarativeecmascript::dynamicDestruction() +{ + QDeclarativeComponent component(&engine, TEST_FILE("dynamicDeletion.qml")); + QDeclarativeGuard object = qobject_cast(component.create()); + QVERIFY(object != 0); + QDeclarativeGuard createdQmlObject = 0; + + QMetaObject::invokeMethod(object, "create"); + createdQmlObject = object->objectProperty(); + QVERIFY(createdQmlObject); + QCOMPARE(createdQmlObject->objectName(), QString("emptyObject")); + + QMetaObject::invokeMethod(object, "killOther"); + QVERIFY(createdQmlObject); + QCoreApplication::instance()->processEvents(QEventLoop::DeferredDeletion); + QVERIFY(createdQmlObject); + for (int ii = 0; createdQmlObject && ii < 50; ++ii) { // After 5 seconds we should give up + if (createdQmlObject) { + QTest::qWait(100); + QCoreApplication::instance()->processEvents(QEventLoop::DeferredDeletion); + } + } + QVERIFY(!createdQmlObject); + + QDeclarativeEngine::setObjectOwnership(object, QDeclarativeEngine::JavaScriptOwnership); + QMetaObject::invokeMethod(object, "killMe"); + QVERIFY(object); + QTest::qWait(0); + QCoreApplication::instance()->processEvents(QEventLoop::DeferredDeletion); + QVERIFY(!object); +} + +/* + tests that id.toString() works +*/ +void tst_qdeclarativeecmascript::objectToString() +{ + QDeclarativeComponent component(&engine, TEST_FILE("declarativeToString.qml")); + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QMetaObject::invokeMethod(object, "testToString"); + QVERIFY(object->stringProperty().startsWith("MyQmlObject_QML_")); + QVERIFY(object->stringProperty().endsWith(", \"objName\")")); +} + +/* +Tests bindings that indirectly cause their own deletion work. + +This test is best run under valgrind to ensure no invalid memory access occur. +*/ +void tst_qdeclarativeecmascript::selfDeletingBinding() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("selfDeletingBinding.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + object->setProperty("triggerDelete", true); + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("selfDeletingBinding.2.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + object->setProperty("triggerDelete", true); + } +} + +/* +Test that extended object properties can be accessed. + +This test a regression where this used to crash. The issue was specificially +for extended objects that did not include a synthesized meta object (so non-root +and no synthesiszed properties). +*/ +void tst_qdeclarativeecmascript::extendedObjectPropertyLookup() +{ + QDeclarativeComponent component(&engine, TEST_FILE("extendedObjectPropertyLookup.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); +} + +/* +Test file/lineNumbers for binding/Script errors. +*/ +void tst_qdeclarativeecmascript::scriptErrors() +{ + QDeclarativeComponent component(&engine, TEST_FILE("scriptErrors.qml")); + QString url = component.url().toString(); + + QString warning1 = url.left(url.length() - 3) + "js:2: Error: Invalid write to global property \"a\""; + QString warning2 = url + ":5: ReferenceError: Can't find variable: a"; + QString warning3 = url.left(url.length() - 3) + "js:4: Error: Invalid write to global property \"a\""; + QString warning4 = url + ":10: ReferenceError: Can't find variable: a"; + QString warning5 = url + ":8: ReferenceError: Can't find variable: a"; + QString warning6 = url + ":7: Unable to assign [undefined] to int x"; + QString warning7 = url + ":12: Error: Cannot assign to read-only property \"trueProperty\""; + QString warning8 = url + ":13: Error: Cannot assign to non-existent property \"fakeProperty\""; + + QTest::ignoreMessage(QtWarningMsg, warning1.toLatin1().constData()); + QTest::ignoreMessage(QtWarningMsg, warning2.toLatin1().constData()); + QTest::ignoreMessage(QtWarningMsg, warning3.toLatin1().constData()); + QTest::ignoreMessage(QtWarningMsg, warning5.toLatin1().constData()); + QTest::ignoreMessage(QtWarningMsg, warning6.toLatin1().constData()); + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QTest::ignoreMessage(QtWarningMsg, warning4.toLatin1().constData()); + emit object->basicSignal(); + + QTest::ignoreMessage(QtWarningMsg, warning7.toLatin1().constData()); + emit object->anotherBasicSignal(); + + QTest::ignoreMessage(QtWarningMsg, warning8.toLatin1().constData()); + emit object->thirdBasicSignal(); +} + +/* +Test file/lineNumbers for inline functions. +*/ +void tst_qdeclarativeecmascript::functionErrors() +{ + QDeclarativeComponent component(&engine, TEST_FILE("functionErrors.qml")); + QString url = component.url().toString(); + + QString warning = url + ":5: Error: Invalid write to global property \"a\""; + + QTest::ignoreMessage(QtWarningMsg, warning.toLatin1().constData()); + + QObject *object = component.create(); + QVERIFY(object != 0); + delete object; +} + +/* +Test various errors that can occur when assigning a property from script +*/ +void tst_qdeclarativeecmascript::propertyAssignmentErrors() +{ + QDeclarativeComponent component(&engine, TEST_FILE("propertyAssignmentErrors.qml")); + + QString url = component.url().toString(); + + QString warning1 = url + ":11:Error: Cannot assign [undefined] to int"; + QString warning2 = url + ":17:Error: Cannot assign QString to int"; + + QTest::ignoreMessage(QtDebugMsg, warning1.toLatin1().constData()); + QTest::ignoreMessage(QtDebugMsg, warning2.toLatin1().constData()); + + QObject *object = component.create(); + QVERIFY(object != 0); + + delete object; +} + +/* +Test bindings still work when the reeval is triggered from within +a signal script. +*/ +void tst_qdeclarativeecmascript::signalTriggeredBindings() +{ + QDeclarativeComponent component(&engine, TEST_FILE("signalTriggeredBindings.qml")); + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->property("base").toReal(), 50.); + QCOMPARE(object->property("test1").toReal(), 50.); + QCOMPARE(object->property("test2").toReal(), 50.); + + object->basicSignal(); + + QCOMPARE(object->property("base").toReal(), 200.); + QCOMPARE(object->property("test1").toReal(), 200.); + QCOMPARE(object->property("test2").toReal(), 200.); + + object->argumentSignal(10, QString(), 10, MyQmlObject::EnumValue4, Qt::RightButton); + + QCOMPARE(object->property("base").toReal(), 400.); + QCOMPARE(object->property("test1").toReal(), 400.); + QCOMPARE(object->property("test2").toReal(), 400.); +} + +/* +Test that list properties can be iterated from ECMAScript +*/ +void tst_qdeclarativeecmascript::listProperties() +{ + QDeclarativeComponent component(&engine, TEST_FILE("listProperties.qml")); + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->property("test1").toInt(), 21); + QCOMPARE(object->property("test2").toInt(), 2); + QCOMPARE(object->property("test3").toBool(), true); + QCOMPARE(object->property("test4").toBool(), true); +} + +void tst_qdeclarativeecmascript::exceptionClearsOnReeval() +{ + QDeclarativeComponent component(&engine, TEST_FILE("exceptionClearsOnReeval.qml")); + QString url = component.url().toString(); + + QString warning = url + ":4: TypeError: Result of expression 'objectProperty' [null] is not an object."; + + QTest::ignoreMessage(QtWarningMsg, warning.toLatin1().constData()); + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->property("test").toBool(), false); + + MyQmlObject object2; + MyQmlObject object3; + object2.setObjectProperty(&object3); + object->setObjectProperty(&object2); + + QCOMPARE(object->property("test").toBool(), true); +} + +void tst_qdeclarativeecmascript::exceptionSlotProducesWarning() +{ + QDeclarativeComponent component(&engine, TEST_FILE("exceptionProducesWarning.qml")); + QString url = component.url().toString(); + + QString warning = component.url().toString() + ":6: Error: JS exception"; + + QTest::ignoreMessage(QtWarningMsg, warning.toLatin1().constData()); + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); +} + +void tst_qdeclarativeecmascript::exceptionBindingProducesWarning() +{ + QDeclarativeComponent component(&engine, TEST_FILE("exceptionProducesWarning2.qml")); + QString url = component.url().toString(); + + QString warning = component.url().toString() + ":5: Error: JS exception"; + + QTest::ignoreMessage(QtWarningMsg, warning.toLatin1().constData()); + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); +} + +static int transientErrorsMsgCount = 0; +static void transientErrorsMsgHandler(QtMsgType, const char *) +{ + ++transientErrorsMsgCount; +} + +// Check that transient binding errors are not displayed +void tst_qdeclarativeecmascript::transientErrors() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("transientErrors.qml")); + + transientErrorsMsgCount = 0; + QtMsgHandler old = qInstallMsgHandler(transientErrorsMsgHandler); + + QObject *object = component.create(); + QVERIFY(object != 0); + + qInstallMsgHandler(old); + + QCOMPARE(transientErrorsMsgCount, 0); + } + + // One binding erroring multiple times, but then resolving + { + QDeclarativeComponent component(&engine, TEST_FILE("transientErrors.2.qml")); + + transientErrorsMsgCount = 0; + QtMsgHandler old = qInstallMsgHandler(transientErrorsMsgHandler); + + QObject *object = component.create(); + QVERIFY(object != 0); + + qInstallMsgHandler(old); + + QCOMPARE(transientErrorsMsgCount, 0); + } +} + +// Check that errors during shutdown are minimized +void tst_qdeclarativeecmascript::shutdownErrors() +{ + QDeclarativeComponent component(&engine, TEST_FILE("shutdownErrors.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + transientErrorsMsgCount = 0; + QtMsgHandler old = qInstallMsgHandler(transientErrorsMsgHandler); + + delete object; + + qInstallMsgHandler(old); + QCOMPARE(transientErrorsMsgCount, 0); +} + +void tst_qdeclarativeecmascript::compositePropertyType() +{ + QDeclarativeComponent component(&engine, TEST_FILE("compositePropertyType.qml")); + QTest::ignoreMessage(QtDebugMsg, "hello world"); + QObject *object = qobject_cast(component.create()); + delete object; +} + +// QTBUG-5759 +void tst_qdeclarativeecmascript::jsObject() +{ + QDeclarativeComponent component(&engine, TEST_FILE("jsObject.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("test").toInt(), 92); + + delete object; +} + +void tst_qdeclarativeecmascript::undefinedResetsProperty() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("undefinedResetsProperty.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("resettableProperty").toInt(), 92); + + object->setProperty("setUndefined", true); + + QCOMPARE(object->property("resettableProperty").toInt(), 13); + + object->setProperty("setUndefined", false); + + QCOMPARE(object->property("resettableProperty").toInt(), 92); + + delete object; + } + { + QDeclarativeComponent component(&engine, TEST_FILE("undefinedResetsProperty.2.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("resettableProperty").toInt(), 19); + + QMetaObject::invokeMethod(object, "doReset"); + + QCOMPARE(object->property("resettableProperty").toInt(), 13); + + delete object; + } +} + +// QTBUG-6781 +void tst_qdeclarativeecmascript::bug1() +{ + QDeclarativeComponent component(&engine, TEST_FILE("bug.1.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("test").toInt(), 14); + + object->setProperty("a", 11); + + QCOMPARE(object->property("test").toInt(), 3); + + object->setProperty("b", true); + + QCOMPARE(object->property("test").toInt(), 9); + + delete object; +} + +void tst_qdeclarativeecmascript::bug2() +{ + QDeclarativeComponent component(&engine); + component.setData("import Qt.test 1.0;\nQPlainTextEdit { width: 100 }", QUrl()); + + QObject *object = component.create(); + QVERIFY(object != 0); + + delete object; +} + +// Don't crash in createObject when the component has errors. +void tst_qdeclarativeecmascript::dynamicCreationCrash() +{ + QDeclarativeComponent component(&engine, TEST_FILE("dynamicCreation.qml")); + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QTest::ignoreMessage(QtWarningMsg, "QDeclarativeComponent: Component is not ready"); + QMetaObject::invokeMethod(object, "dontCrash"); + QObject *created = object->objectProperty(); + QVERIFY(created == 0); +} + +//QTBUG-9367 +void tst_qdeclarativeecmascript::regExpBug() +{ + QDeclarativeComponent component(&engine, TEST_FILE("regExp.qml")); + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QCOMPARE(object->regExp().pattern(), QLatin1String("[a-zA-z]")); +} + +void tst_qdeclarativeecmascript::callQtInvokables() +{ + MyInvokableObject o; + + QDeclarativeEngine qmlengine; + QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(&qmlengine); + QScriptEngine *engine = &ep->scriptEngine; + + QStringList names; QList values; + names << QLatin1String("object"); values << ep->objectClass->newQObject(&o); + names << QLatin1String("undefined"); values << engine->undefinedValue(); + + ep->globalClass->explicitSetProperty(names, values); + + // Non-existent methods + o.reset(); + QCOMPARE(engine->evaluate("object.method_nonexistent()").isError(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), -1); + QCOMPARE(o.actuals().count(), 0); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_nonexistent(10, 11)").isError(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), -1); + QCOMPARE(o.actuals().count(), 0); + + // Insufficient arguments + o.reset(); + QCOMPARE(engine->evaluate("object.method_int()").isError(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), -1); + QCOMPARE(o.actuals().count(), 0); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_intint(10)").isError(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), -1); + QCOMPARE(o.actuals().count(), 0); + + // Excessive arguments + o.reset(); + QCOMPARE(engine->evaluate("object.method_int(10, 11)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 8); + QCOMPARE(o.actuals().count(), 1); + QCOMPARE(o.actuals().at(0), QVariant(10)); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_intint(10, 11, 12)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 9); + QCOMPARE(o.actuals().count(), 2); + QCOMPARE(o.actuals().at(0), QVariant(10)); + QCOMPARE(o.actuals().at(1), QVariant(11)); + + // Test return types + o.reset(); + QCOMPARE(engine->evaluate("object.method_NoArgs()").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 0); + QCOMPARE(o.actuals().count(), 0); + + o.reset(); + QVERIFY(engine->evaluate("object.method_NoArgs_int()").strictlyEquals(QScriptValue(engine, 6))); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 1); + QCOMPARE(o.actuals().count(), 0); + + o.reset(); + QVERIFY(engine->evaluate("object.method_NoArgs_real()").strictlyEquals(QScriptValue(engine, 19.75))); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 2); + QCOMPARE(o.actuals().count(), 0); + + o.reset(); + { + QScriptValue ret = engine->evaluate("object.method_NoArgs_QPointF()"); + QCOMPARE(ret.toVariant(), QVariant(QPointF(123, 4.5))); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 3); + QCOMPARE(o.actuals().count(), 0); + } + + o.reset(); + { + QScriptValue ret = engine->evaluate("object.method_NoArgs_QObject()"); + QVERIFY(ret.isQObject()); + QCOMPARE(ret.toQObject(), (QObject *)&o); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 4); + QCOMPARE(o.actuals().count(), 0); + } + + o.reset(); + QCOMPARE(engine->evaluate("object.method_NoArgs_unknown()").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 5); + QCOMPARE(o.actuals().count(), 0); + + o.reset(); + { + QScriptValue ret = engine->evaluate("object.method_NoArgs_QScriptValue()"); + QVERIFY(ret.isString()); + QCOMPARE(ret.toString(), QString("Hello world")); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 6); + QCOMPARE(o.actuals().count(), 0); + } + + o.reset(); + QVERIFY(engine->evaluate("object.method_NoArgs_QVariant()").strictlyEquals(QScriptValue(engine, "QML rocks"))); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 7); + QCOMPARE(o.actuals().count(), 0); + + // Test arg types + o.reset(); + QCOMPARE(engine->evaluate("object.method_int(94)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 8); + QCOMPARE(o.actuals().count(), 1); + QCOMPARE(o.actuals().at(0), QVariant(94)); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_int(\"94\")").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 8); + QCOMPARE(o.actuals().count(), 1); + QCOMPARE(o.actuals().at(0), QVariant(94)); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_int(\"not a number\")").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 8); + QCOMPARE(o.actuals().count(), 1); + QCOMPARE(o.actuals().at(0), QVariant(0)); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_int(null)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 8); + QCOMPARE(o.actuals().count(), 1); + QCOMPARE(o.actuals().at(0), QVariant(0)); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_int(undefined)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 8); + QCOMPARE(o.actuals().count(), 1); + QCOMPARE(o.actuals().at(0), QVariant(0)); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_int(object)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 8); + QCOMPARE(o.actuals().count(), 1); + QCOMPARE(o.actuals().at(0), QVariant(0)); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_intint(122, 9)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 9); + QCOMPARE(o.actuals().count(), 2); + QCOMPARE(o.actuals().at(0), QVariant(122)); + QCOMPARE(o.actuals().at(1), QVariant(9)); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_real(94.3)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 10); + QCOMPARE(o.actuals().count(), 1); + QCOMPARE(o.actuals().at(0), QVariant(94.3)); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_real(\"94.3\")").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 10); + QCOMPARE(o.actuals().count(), 1); + QCOMPARE(o.actuals().at(0), QVariant(94.3)); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_real(\"not a number\")").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 10); + QCOMPARE(o.actuals().count(), 1); + QVERIFY(qIsNaN(o.actuals().at(0).toDouble())); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_real(null)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 10); + QCOMPARE(o.actuals().count(), 1); + QCOMPARE(o.actuals().at(0), QVariant(0)); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_real(undefined)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 10); + QCOMPARE(o.actuals().count(), 1); + QVERIFY(qIsNaN(o.actuals().at(0).toDouble())); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_real(object)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 10); + QCOMPARE(o.actuals().count(), 1); + QVERIFY(qIsNaN(o.actuals().at(0).toDouble())); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_QString(\"Hello world\")").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 11); + QCOMPARE(o.actuals().count(), 1); + QCOMPARE(o.actuals().at(0), QVariant("Hello world")); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_QString(19)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 11); + QCOMPARE(o.actuals().count(), 1); + QCOMPARE(o.actuals().at(0), QVariant("19")); + + o.reset(); + { + QString expected = "MyInvokableObject(0x" + QString::number((quintptr)&o, 16) + ")"; + QCOMPARE(engine->evaluate("object.method_QString(object)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 11); + QCOMPARE(o.actuals().count(), 1); + QCOMPARE(o.actuals().at(0), QVariant(expected)); + } + + o.reset(); + QCOMPARE(engine->evaluate("object.method_QString(null)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 11); + QCOMPARE(o.actuals().count(), 1); + QCOMPARE(o.actuals().at(0), QVariant(QString())); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_QString(undefined)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 11); + QCOMPARE(o.actuals().count(), 1); + QCOMPARE(o.actuals().at(0), QVariant(QString())); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_QPointF(0)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 12); + QCOMPARE(o.actuals().count(), 1); + QCOMPARE(o.actuals().at(0), QVariant(QPointF())); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_QPointF(null)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 12); + QCOMPARE(o.actuals().count(), 1); + QCOMPARE(o.actuals().at(0), QVariant(QPointF())); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_QPointF(undefined)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 12); + QCOMPARE(o.actuals().count(), 1); + QCOMPARE(o.actuals().at(0), QVariant(QPointF())); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_QPointF(object)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 12); + QCOMPARE(o.actuals().count(), 1); + QCOMPARE(o.actuals().at(0), QVariant(QPointF())); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_QPointF(object.method_get_QPointF())").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 12); + QCOMPARE(o.actuals().count(), 1); + QCOMPARE(o.actuals().at(0), QVariant(QPointF(99.3, -10.2))); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_QPointF(object.method_get_QPoint())").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 12); + QCOMPARE(o.actuals().count(), 1); + QCOMPARE(o.actuals().at(0), QVariant(QPointF(9, 12))); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_QObject(0)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 13); + QCOMPARE(o.actuals().count(), 1); + QCOMPARE(o.actuals().at(0), qVariantFromValue((QObject *)0)); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_QObject(\"Hello world\")").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 13); + QCOMPARE(o.actuals().count(), 1); + QCOMPARE(o.actuals().at(0), qVariantFromValue((QObject *)0)); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_QObject(null)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 13); + QCOMPARE(o.actuals().count(), 1); + QCOMPARE(o.actuals().at(0), qVariantFromValue((QObject *)0)); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_QObject(undefined)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 13); + QCOMPARE(o.actuals().count(), 1); + QCOMPARE(o.actuals().at(0), qVariantFromValue((QObject *)0)); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_QObject(object)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 13); + QCOMPARE(o.actuals().count(), 1); + QCOMPARE(o.actuals().at(0), qVariantFromValue((QObject *)&o)); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_QScriptValue(null)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 14); + QCOMPARE(o.actuals().count(), 1); + QVERIFY(qvariant_cast(o.actuals().at(0)).isNull()); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_QScriptValue(undefined)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 14); + QCOMPARE(o.actuals().count(), 1); + QVERIFY(qvariant_cast(o.actuals().at(0)).isUndefined()); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_QScriptValue(19)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 14); + QCOMPARE(o.actuals().count(), 1); + QVERIFY(qvariant_cast(o.actuals().at(0)).strictlyEquals(QScriptValue(engine, 19))); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_QScriptValue([19, 20])").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 14); + QCOMPARE(o.actuals().count(), 1); + QVERIFY(qvariant_cast(o.actuals().at(0)).isArray()); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_intQScriptValue(4, null)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 15); + QCOMPARE(o.actuals().count(), 2); + QCOMPARE(o.actuals().at(0), QVariant(4)); + QVERIFY(qvariant_cast(o.actuals().at(1)).isNull()); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_intQScriptValue(8, undefined)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 15); + QCOMPARE(o.actuals().count(), 2); + QCOMPARE(o.actuals().at(0), QVariant(8)); + QVERIFY(qvariant_cast(o.actuals().at(1)).isUndefined()); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_intQScriptValue(3, 19)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 15); + QCOMPARE(o.actuals().count(), 2); + QCOMPARE(o.actuals().at(0), QVariant(3)); + QVERIFY(qvariant_cast(o.actuals().at(1)).strictlyEquals(QScriptValue(engine, 19))); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_intQScriptValue(44, [19, 20])").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 15); + QCOMPARE(o.actuals().count(), 2); + QCOMPARE(o.actuals().at(0), QVariant(44)); + QVERIFY(qvariant_cast(o.actuals().at(1)).isArray()); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_overload()").isError(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), -1); + QCOMPARE(o.actuals().count(), 0); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_overload(10)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 16); + QCOMPARE(o.actuals().count(), 1); + QCOMPARE(o.actuals().at(0), QVariant(10)); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_overload(10, 11)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 17); + QCOMPARE(o.actuals().count(), 2); + QCOMPARE(o.actuals().at(0), QVariant(10)); + QCOMPARE(o.actuals().at(1), QVariant(11)); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_overload(\"Hello\")").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 18); + QCOMPARE(o.actuals().count(), 1); + QCOMPARE(o.actuals().at(0), QVariant(QString("Hello"))); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_with_enum(9)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 19); + QCOMPARE(o.actuals().count(), 1); + QCOMPARE(o.actuals().at(0), QVariant(9)); + + o.reset(); + QVERIFY(engine->evaluate("object.method_default(10)").strictlyEquals(QScriptValue(19))); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 20); + QCOMPARE(o.actuals().count(), 2); + QCOMPARE(o.actuals().at(0), QVariant(10)); + QCOMPARE(o.actuals().at(1), QVariant(19)); + + o.reset(); + QVERIFY(engine->evaluate("object.method_default(10, 13)").strictlyEquals(QScriptValue(13))); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 20); + QCOMPARE(o.actuals().count(), 2); + QCOMPARE(o.actuals().at(0), QVariant(10)); + QCOMPARE(o.actuals().at(1), QVariant(13)); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_inherited(9)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), -3); + QCOMPARE(o.actuals().count(), 1); + QCOMPARE(o.actuals().at(0), QVariant(9)); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_QVariant(9)").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 21); + QCOMPARE(o.actuals().count(), 2); + QCOMPARE(o.actuals().at(0), QVariant(9)); + QCOMPARE(o.actuals().at(1), QVariant()); + + o.reset(); + QCOMPARE(engine->evaluate("object.method_QVariant(\"Hello\", \"World\")").isUndefined(), true); + QCOMPARE(o.error(), false); + QCOMPARE(o.invoked(), 21); + QCOMPARE(o.actuals().count(), 2); + QCOMPARE(o.actuals().at(0), QVariant(QString("Hello"))); + QCOMPARE(o.actuals().at(1), QVariant(QString("World"))); +} + +// QTBUG-13047 (check that you can pass registered object types as args) +void tst_qdeclarativeecmascript::invokableObjectArg() +{ + QDeclarativeComponent component(&engine, TEST_FILE("invokableObjectArg.qml")); + + QObject *o = component.create(); + QVERIFY(o); + MyQmlObject *qmlobject = qobject_cast(o); + QVERIFY(qmlobject); + QCOMPARE(qmlobject->myinvokableObject, qmlobject); + + delete o; +} + +// QTBUG-13047 (check that you can return registered object types from methods) +void tst_qdeclarativeecmascript::invokableObjectRet() +{ + QDeclarativeComponent component(&engine, TEST_FILE("invokableObjectRet.qml")); + + QObject *o = component.create(); + QVERIFY(o); + QCOMPARE(o->property("test").toBool(), true); + delete o; +} + +// QTBUG-5675 +void tst_qdeclarativeecmascript::listToVariant() +{ + QDeclarativeComponent component(&engine, TEST_FILE("listToVariant.qml")); + + MyQmlContainer container; + + QDeclarativeContext context(engine.rootContext()); + context.setContextObject(&container); + + QObject *object = component.create(&context); + QVERIFY(object != 0); + + QVariant v = object->property("test"); + QCOMPARE(v.userType(), qMetaTypeId()); + QVERIFY(qvariant_cast(v).object() == &container); + + delete object; +} + +// QTBUG-7957 +void tst_qdeclarativeecmascript::multiEngineObject() +{ + MyQmlObject obj; + obj.setStringProperty("Howdy planet"); + + QDeclarativeEngine e1; + e1.rootContext()->setContextProperty("thing", &obj); + QDeclarativeComponent c1(&e1, TEST_FILE("multiEngineObject.qml")); + + QDeclarativeEngine e2; + e2.rootContext()->setContextProperty("thing", &obj); + QDeclarativeComponent c2(&e2, TEST_FILE("multiEngineObject.qml")); + + QObject *o1 = c1.create(); + QObject *o2 = c2.create(); + + QCOMPARE(o1->property("test").toString(), QString("Howdy planet")); + QCOMPARE(o2->property("test").toString(), QString("Howdy planet")); + + delete o2; + delete o1; +} + +// Test that references to QObjects are cleanup when the object is destroyed +void tst_qdeclarativeecmascript::deletedObject() +{ + QDeclarativeComponent component(&engine, TEST_FILE("deletedObject.qml")); + + QObject *object = component.create(); + + QCOMPARE(object->property("test1").toBool(), true); + QCOMPARE(object->property("test2").toBool(), true); + QCOMPARE(object->property("test3").toBool(), true); + QCOMPARE(object->property("test4").toBool(), true); + + delete object; +} + +void tst_qdeclarativeecmascript::attachedPropertyScope() +{ + QDeclarativeComponent component(&engine, TEST_FILE("attachedPropertyScope.qml")); + + QObject *object = component.create(); + QVERIFY(object != 0); + + MyQmlAttachedObject *attached = + qobject_cast(qmlAttachedPropertiesObject(object)); + QVERIFY(attached != 0); + + QCOMPARE(object->property("value2").toInt(), 0); + + attached->emitMySignal(); + + QCOMPARE(object->property("value2").toInt(), 9); + + delete object; +} + +void tst_qdeclarativeecmascript::scriptConnect() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("scriptConnect.1.qml")); + + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->property("test").toBool(), false); + emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton); + QCOMPARE(object->property("test").toBool(), true); + + delete object; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("scriptConnect.2.qml")); + + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->property("test").toBool(), false); + emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton); + QCOMPARE(object->property("test").toBool(), true); + + delete object; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("scriptConnect.3.qml")); + + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->property("test").toBool(), false); + emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton); + QCOMPARE(object->property("test").toBool(), true); + + delete object; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("scriptConnect.4.qml")); + + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->methodCalled(), false); + emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton); + QCOMPARE(object->methodCalled(), true); + + delete object; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("scriptConnect.5.qml")); + + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->methodCalled(), false); + emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton); + QCOMPARE(object->methodCalled(), true); + + delete object; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("scriptConnect.6.qml")); + + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->property("test").toInt(), 0); + emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton); + QCOMPARE(object->property("test").toInt(), 2); + + delete object; + } +} + +void tst_qdeclarativeecmascript::scriptDisconnect() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("scriptDisconnect.1.qml")); + + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->property("test").toInt(), 0); + emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton); + QCOMPARE(object->property("test").toInt(), 1); + emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton); + QCOMPARE(object->property("test").toInt(), 2); + emit object->basicSignal(); + QCOMPARE(object->property("test").toInt(), 2); + emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton); + QCOMPARE(object->property("test").toInt(), 2); + + delete object; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("scriptDisconnect.2.qml")); + + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->property("test").toInt(), 0); + emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton); + QCOMPARE(object->property("test").toInt(), 1); + emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton); + QCOMPARE(object->property("test").toInt(), 2); + emit object->basicSignal(); + QCOMPARE(object->property("test").toInt(), 2); + emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton); + QCOMPARE(object->property("test").toInt(), 2); + + delete object; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("scriptDisconnect.3.qml")); + + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->property("test").toInt(), 0); + emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton); + QCOMPARE(object->property("test").toInt(), 1); + emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton); + QCOMPARE(object->property("test").toInt(), 2); + emit object->basicSignal(); + QCOMPARE(object->property("test").toInt(), 2); + emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton); + QCOMPARE(object->property("test").toInt(), 3); + + delete object; + } + { + QDeclarativeComponent component(&engine, TEST_FILE("scriptDisconnect.4.qml")); + + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->property("test").toInt(), 0); + emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton); + QCOMPARE(object->property("test").toInt(), 1); + emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton); + QCOMPARE(object->property("test").toInt(), 2); + emit object->basicSignal(); + QCOMPARE(object->property("test").toInt(), 2); + emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton); + QCOMPARE(object->property("test").toInt(), 3); + + delete object; + } +} + +class OwnershipObject : public QObject +{ + Q_OBJECT +public: + OwnershipObject() { object = new QObject; } + + QPointer object; + +public slots: + QObject *getObject() { return object; } +}; + +void tst_qdeclarativeecmascript::ownership() +{ + OwnershipObject own; + QDeclarativeContext *context = new QDeclarativeContext(engine.rootContext()); + context->setContextObject(&own); + + { + QDeclarativeComponent component(&engine, TEST_FILE("ownership.qml")); + + QVERIFY(own.object != 0); + + QObject *object = component.create(context); + QDeclarativeEnginePrivate::getScriptEngine(&engine)->collectGarbage(); + + QCoreApplication::processEvents(QEventLoop::DeferredDeletion); + + QVERIFY(own.object == 0); + + delete object; + } + + own.object = new QObject(&own); + + { + QDeclarativeComponent component(&engine, TEST_FILE("ownership.qml")); + + QVERIFY(own.object != 0); + + QObject *object = component.create(context); + QDeclarativeEnginePrivate::getScriptEngine(&engine)->collectGarbage(); + + QCoreApplication::processEvents(QEventLoop::DeferredDeletion); + + QVERIFY(own.object != 0); + + delete object; + } +} + +class CppOwnershipReturnValue : public QObject +{ + Q_OBJECT +public: + CppOwnershipReturnValue() : value(0) {} + ~CppOwnershipReturnValue() { delete value; } + + Q_INVOKABLE QObject *create() { + value = new QObject; + QDeclarativeEngine::setObjectOwnership(value, QDeclarativeEngine::CppOwnership); + return value; + } + + Q_INVOKABLE MyQmlObject *createQmlObject() { + MyQmlObject *rv = new MyQmlObject; + value = rv; + return rv; + } + + QPointer value; +}; + +// QTBUG-15695. +// Test setObjectOwnership(CppOwnership) works even when there is no QDeclarativeData +void tst_qdeclarativeecmascript::cppOwnershipReturnValue() +{ + CppOwnershipReturnValue source; + + { + QDeclarativeEngine engine; + engine.rootContext()->setContextProperty("source", &source); + + QVERIFY(source.value == 0); + + QDeclarativeComponent component(&engine); + component.setData("import QtQuick 1.0\nQtObject {\nComponent.onCompleted: { var a = source.create(); }\n}\n", QUrl()); + + QObject *object = component.create(); + + QVERIFY(object != 0); + QVERIFY(source.value != 0); + + delete object; + } + + QCoreApplication::instance()->processEvents(QEventLoop::DeferredDeletion); + + QVERIFY(source.value != 0); +} + +// QTBUG-15697 +void tst_qdeclarativeecmascript::ownershipCustomReturnValue() +{ + CppOwnershipReturnValue source; + + { + QDeclarativeEngine engine; + engine.rootContext()->setContextProperty("source", &source); + + QVERIFY(source.value == 0); + + QDeclarativeComponent component(&engine); + component.setData("import QtQuick 1.0\nQtObject {\nComponent.onCompleted: { var a = source.createQmlObject(); }\n}\n", QUrl()); + + QObject *object = component.create(); + + QVERIFY(object != 0); + QVERIFY(source.value != 0); + + delete object; + } + + QCoreApplication::instance()->processEvents(QEventLoop::DeferredDeletion); + + QVERIFY(source.value == 0); +} + +class QListQObjectMethodsObject : public QObject +{ + Q_OBJECT +public: + QListQObjectMethodsObject() { + m_objects.append(new MyQmlObject()); + m_objects.append(new MyQmlObject()); + } + + ~QListQObjectMethodsObject() { + qDeleteAll(m_objects); + } + +public slots: + QList getObjects() { return m_objects; } + +private: + QList m_objects; +}; + +// Tests that returning a QList from a method works +void tst_qdeclarativeecmascript::qlistqobjectMethods() +{ + QListQObjectMethodsObject obj; + QDeclarativeContext *context = new QDeclarativeContext(engine.rootContext()); + context->setContextObject(&obj); + + QDeclarativeComponent component(&engine, TEST_FILE("qlistqobjectMethods.qml")); + + QObject *object = component.create(context); + + QCOMPARE(object->property("test").toInt(), 2); + QCOMPARE(object->property("test2").toBool(), true); + + delete object; +} + +// QTBUG-9205 +void tst_qdeclarativeecmascript::strictlyEquals() +{ + QDeclarativeComponent component(&engine, TEST_FILE("strictlyEquals.qml")); + + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("test1").toBool(), true); + QCOMPARE(object->property("test2").toBool(), true); + QCOMPARE(object->property("test3").toBool(), true); + QCOMPARE(object->property("test4").toBool(), true); + QCOMPARE(object->property("test5").toBool(), true); + QCOMPARE(object->property("test6").toBool(), true); + QCOMPARE(object->property("test7").toBool(), true); + QCOMPARE(object->property("test8").toBool(), true); + + delete object; +} + +void tst_qdeclarativeecmascript::compiled() +{ + QDeclarativeComponent component(&engine, TEST_FILE("compiled.qml")); + + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("test1").toReal(), qreal(15.7)); + QCOMPARE(object->property("test2").toReal(), qreal(-6.7)); + QCOMPARE(object->property("test3").toBool(), true); + QCOMPARE(object->property("test4").toBool(), false); + QCOMPARE(object->property("test5").toBool(), false); + QCOMPARE(object->property("test6").toBool(), true); + + QCOMPARE(object->property("test7").toInt(), 185); + QCOMPARE(object->property("test8").toInt(), 167); + QCOMPARE(object->property("test9").toBool(), true); + QCOMPARE(object->property("test10").toBool(), false); + QCOMPARE(object->property("test11").toBool(), false); + QCOMPARE(object->property("test12").toBool(), true); + + QCOMPARE(object->property("test13").toString(), QLatin1String("HelloWorld")); + QCOMPARE(object->property("test14").toString(), QLatin1String("Hello World")); + QCOMPARE(object->property("test15").toBool(), false); + QCOMPARE(object->property("test16").toBool(), true); + + QCOMPARE(object->property("test17").toInt(), 5); + QCOMPARE(object->property("test18").toReal(), qreal(176)); + QCOMPARE(object->property("test19").toInt(), 7); + QCOMPARE(object->property("test20").toReal(), qreal(6.7)); + QCOMPARE(object->property("test21").toString(), QLatin1String("6.7")); + QCOMPARE(object->property("test22").toString(), QLatin1String("!")); + QCOMPARE(object->property("test23").toBool(), true); + QCOMPARE(qvariant_cast(object->property("test24")), QColor(0x11,0x22,0x33)); + QCOMPARE(qvariant_cast(object->property("test25")), QColor(0x11,0x22,0x33,0xAA)); + + delete object; +} + +// Test that numbers assigned in bindings as strings work consistently +void tst_qdeclarativeecmascript::numberAssignment() +{ + QDeclarativeComponent component(&engine, TEST_FILE("numberAssignment.qml")); + + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("test1"), QVariant((qreal)6.7)); + QCOMPARE(object->property("test2"), QVariant((qreal)6.7)); + QCOMPARE(object->property("test2"), QVariant((qreal)6.7)); + QCOMPARE(object->property("test3"), QVariant((qreal)6)); + QCOMPARE(object->property("test4"), QVariant((qreal)6)); + + QCOMPARE(object->property("test5"), QVariant((int)7)); + QCOMPARE(object->property("test6"), QVariant((int)7)); + QCOMPARE(object->property("test7"), QVariant((int)6)); + QCOMPARE(object->property("test8"), QVariant((int)6)); + + QCOMPARE(object->property("test9"), QVariant((unsigned int)7)); + QCOMPARE(object->property("test10"), QVariant((unsigned int)7)); + QCOMPARE(object->property("test11"), QVariant((unsigned int)6)); + QCOMPARE(object->property("test12"), QVariant((unsigned int)6)); + + delete object; +} + +void tst_qdeclarativeecmascript::propertySplicing() +{ + QDeclarativeComponent component(&engine, TEST_FILE("propertySplicing.qml")); + + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("test").toBool(), true); + + delete object; +} + +// QTBUG-16683 +void tst_qdeclarativeecmascript::signalWithUnknownTypes() +{ + QDeclarativeComponent component(&engine, TEST_FILE("signalWithUnknownTypes.qml")); + + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + MyQmlObject::MyType type; + type.value = 0x8971123; + emit object->signalWithUnknownType(type); + + MyQmlObject::MyType result = qvariant_cast(object->variant()); + + QCOMPARE(result.value, type.value); + + + delete object; +} + +// Test that assigning a null object works +// Regressed with: df1788b4dbbb2826ae63f26bdf166342595343f4 +void tst_qdeclarativeecmascript::nullObjectBinding() +{ + QDeclarativeComponent component(&engine, TEST_FILE("nullObjectBinding.qml")); + + QObject *object = component.create(); + QVERIFY(object != 0); + + QVERIFY(object->property("test") == QVariant::fromValue((QObject *)0)); + + delete object; +} + +// Test that bindings don't evaluate once the engine has been destroyed +void tst_qdeclarativeecmascript::deletedEngine() +{ + QDeclarativeEngine *engine = new QDeclarativeEngine; + QDeclarativeComponent component(engine, TEST_FILE("deletedEngine.qml")); + + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("a").toInt(), 39); + object->setProperty("b", QVariant(9)); + QCOMPARE(object->property("a").toInt(), 117); + + delete engine; + + QCOMPARE(object->property("a").toInt(), 117); + object->setProperty("b", QVariant(10)); + QCOMPARE(object->property("a").toInt(), 117); + + delete object; +} + +// Test the crashing part of QTBUG-9705 +void tst_qdeclarativeecmascript::libraryScriptAssert() +{ + QDeclarativeComponent component(&engine, TEST_FILE("libraryScriptAssert.qml")); + + QObject *object = component.create(); + QVERIFY(object != 0); + + delete object; +} + +void tst_qdeclarativeecmascript::variantsAssignedUndefined() +{ + QDeclarativeComponent component(&engine, TEST_FILE("variantsAssignedUndefined.qml")); + + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("test1").toInt(), 10); + QCOMPARE(object->property("test2").toInt(), 11); + + object->setProperty("runTest", true); + + QCOMPARE(object->property("test1"), QVariant()); + QCOMPARE(object->property("test2"), QVariant()); + + + delete object; +} + +void tst_qdeclarativeecmascript::qtbug_9792() +{ + QDeclarativeComponent component(&engine, TEST_FILE("qtbug_9792.qml")); + + QDeclarativeContext *context = new QDeclarativeContext(engine.rootContext()); + + MyQmlObject *object = qobject_cast(component.create(context)); + QVERIFY(object != 0); + + QTest::ignoreMessage(QtDebugMsg, "Hello world!"); + object->basicSignal(); + + delete context; + + transientErrorsMsgCount = 0; + QtMsgHandler old = qInstallMsgHandler(transientErrorsMsgHandler); + + object->basicSignal(); + + qInstallMsgHandler(old); + + QCOMPARE(transientErrorsMsgCount, 0); + + delete object; +} + +// Verifies that QDeclarativeGuard<>s used in the vmemetaobject are cleaned correctly +void tst_qdeclarativeecmascript::qtcreatorbug_1289() +{ + QDeclarativeComponent component(&engine, TEST_FILE("qtcreatorbug_1289.qml")); + + QObject *o = component.create(); + QVERIFY(o != 0); + + QObject *nested = qvariant_cast(o->property("object")); + QVERIFY(nested != 0); + + QVERIFY(qvariant_cast(nested->property("nestedObject")) == o); + + delete nested; + nested = qvariant_cast(o->property("object")); + QVERIFY(nested == 0); + + // If the bug is present, the next line will crash + delete o; +} + +// Test that we shut down without stupid warnings +void tst_qdeclarativeecmascript::noSpuriousWarningsAtShutdown() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("noSpuriousWarningsAtShutdown.qml")); + + QObject *o = component.create(); + + transientErrorsMsgCount = 0; + QtMsgHandler old = qInstallMsgHandler(transientErrorsMsgHandler); + + delete o; + + qInstallMsgHandler(old); + + QCOMPARE(transientErrorsMsgCount, 0); + } + + + { + QDeclarativeComponent component(&engine, TEST_FILE("noSpuriousWarningsAtShutdown.2.qml")); + + QObject *o = component.create(); + + transientErrorsMsgCount = 0; + QtMsgHandler old = qInstallMsgHandler(transientErrorsMsgHandler); + + delete o; + + qInstallMsgHandler(old); + + QCOMPARE(transientErrorsMsgCount, 0); + } +} + +void tst_qdeclarativeecmascript::canAssignNullToQObject() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("canAssignNullToQObject.1.qml")); + + MyQmlObject *o = qobject_cast(component.create()); + QVERIFY(o != 0); + + QVERIFY(o->objectProperty() != 0); + + o->setProperty("runTest", true); + + QVERIFY(o->objectProperty() == 0); + + delete o; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("canAssignNullToQObject.2.qml")); + + MyQmlObject *o = qobject_cast(component.create()); + QVERIFY(o != 0); + + QVERIFY(o->objectProperty() == 0); + + delete o; + } +} + +void tst_qdeclarativeecmascript::functionAssignment_fromBinding() +{ + QDeclarativeComponent component(&engine, TEST_FILE("functionAssignment.1.qml")); + + QString url = component.url().toString(); + QString warning = url + ":4: Unable to assign a function to a property."; + QTest::ignoreMessage(QtWarningMsg, warning.toLatin1().constData()); + + MyQmlObject *o = qobject_cast(component.create()); + QVERIFY(o != 0); + + QVERIFY(!o->property("a").isValid()); + + delete o; +} + +void tst_qdeclarativeecmascript::functionAssignment_fromJS() +{ + QFETCH(QString, triggerProperty); + + QDeclarativeComponent component(&engine, TEST_FILE("functionAssignment.2.qml")); + QVERIFY2(component.errorString().isEmpty(), qPrintable(component.errorString())); + + MyQmlObject *o = qobject_cast(component.create()); + QVERIFY(o != 0); + QVERIFY(!o->property("a").isValid()); + + o->setProperty("aNumber", QVariant(5)); + o->setProperty(triggerProperty.toUtf8().constData(), true); + QCOMPARE(o->property("a"), QVariant(50)); + + o->setProperty("aNumber", QVariant(10)); + QCOMPARE(o->property("a"), QVariant(100)); + + delete o; +} + +void tst_qdeclarativeecmascript::functionAssignment_fromJS_data() +{ + QTest::addColumn("triggerProperty"); + + QTest::newRow("assign to property") << "assignToProperty"; + QTest::newRow("assign to property, from JS file") << "assignToPropertyFromJsFile"; + + QTest::newRow("assign to value type") << "assignToValueType"; + + QTest::newRow("use 'this'") << "assignWithThis"; + QTest::newRow("use 'this' from JS file") << "assignWithThisFromJsFile"; +} + +void tst_qdeclarativeecmascript::functionAssignmentfromJS_invalid() +{ + QDeclarativeComponent component(&engine, TEST_FILE("functionAssignment.2.qml")); + QVERIFY2(component.errorString().isEmpty(), qPrintable(component.errorString())); + + MyQmlObject *o = qobject_cast(component.create()); + QVERIFY(o != 0); + QVERIFY(!o->property("a").isValid()); + + o->setProperty("assignFuncWithoutReturn", true); + QVERIFY(!o->property("a").isValid()); + + QString url = component.url().toString(); + QString warning = url + ":63: Unable to assign QString to int"; + QTest::ignoreMessage(QtWarningMsg, warning.toLatin1().constData()); + o->setProperty("assignWrongType", true); + + warning = url + ":70: Unable to assign QString to int"; + QTest::ignoreMessage(QtWarningMsg, warning.toLatin1().constData()); + o->setProperty("assignWrongTypeToValueType", true); + + delete o; +} + +void tst_qdeclarativeecmascript::eval() +{ + QDeclarativeComponent component(&engine, TEST_FILE("eval.qml")); + + QObject *o = component.create(); + QVERIFY(o != 0); + + QCOMPARE(o->property("test1").toBool(), true); + QCOMPARE(o->property("test2").toBool(), true); + QCOMPARE(o->property("test3").toBool(), true); + QCOMPARE(o->property("test4").toBool(), true); + QCOMPARE(o->property("test5").toBool(), true); + + delete o; +} + +void tst_qdeclarativeecmascript::function() +{ + QDeclarativeComponent component(&engine, TEST_FILE("function.qml")); + + QObject *o = component.create(); + QVERIFY(o != 0); + + QCOMPARE(o->property("test1").toBool(), true); + QCOMPARE(o->property("test2").toBool(), true); + QCOMPARE(o->property("test3").toBool(), true); + + delete o; +} + +// Test the "Qt.include" method +void tst_qdeclarativeecmascript::include() +{ + // Non-library relative include + { + QDeclarativeComponent component(&engine, TEST_FILE("include.qml")); + QObject *o = component.create(); + QVERIFY(o != 0); + + QCOMPARE(o->property("test0").toInt(), 99); + QCOMPARE(o->property("test1").toBool(), true); + QCOMPARE(o->property("test2").toBool(), true); + QCOMPARE(o->property("test2_1").toBool(), true); + QCOMPARE(o->property("test3").toBool(), true); + QCOMPARE(o->property("test3_1").toBool(), true); + + delete o; + } + + // Library relative include + { + QDeclarativeComponent component(&engine, TEST_FILE("include_shared.qml")); + QObject *o = component.create(); + QVERIFY(o != 0); + + QCOMPARE(o->property("test0").toInt(), 99); + QCOMPARE(o->property("test1").toBool(), true); + QCOMPARE(o->property("test2").toBool(), true); + QCOMPARE(o->property("test2_1").toBool(), true); + QCOMPARE(o->property("test3").toBool(), true); + QCOMPARE(o->property("test3_1").toBool(), true); + + delete o; + } + + // Callback + { + QDeclarativeComponent component(&engine, TEST_FILE("include_callback.qml")); + QObject *o = component.create(); + QVERIFY(o != 0); + + QCOMPARE(o->property("test1").toBool(), true); + QCOMPARE(o->property("test2").toBool(), true); + QCOMPARE(o->property("test3").toBool(), true); + QCOMPARE(o->property("test4").toBool(), true); + QCOMPARE(o->property("test5").toBool(), true); + QCOMPARE(o->property("test6").toBool(), true); + + delete o; + } + + // Including file with ".pragma library" + { + QDeclarativeComponent component(&engine, TEST_FILE("include_pragma.qml")); + QObject *o = component.create(); + QVERIFY(o != 0); + QCOMPARE(o->property("test1").toInt(), 100); + + delete o; + } + + // Remote - success + { + TestHTTPServer server(8111); + QVERIFY(server.isValid()); + server.serveDirectory(SRCDIR "/data"); + + QDeclarativeComponent component(&engine, TEST_FILE("include_remote.qml")); + QObject *o = component.create(); + QVERIFY(o != 0); + + QTRY_VERIFY(o->property("done").toBool() == true); + QTRY_VERIFY(o->property("done2").toBool() == true); + + QCOMPARE(o->property("test1").toBool(), true); + QCOMPARE(o->property("test2").toBool(), true); + QCOMPARE(o->property("test3").toBool(), true); + QCOMPARE(o->property("test4").toBool(), true); + QCOMPARE(o->property("test5").toBool(), true); + + QCOMPARE(o->property("test6").toBool(), true); + QCOMPARE(o->property("test7").toBool(), true); + QCOMPARE(o->property("test8").toBool(), true); + QCOMPARE(o->property("test9").toBool(), true); + QCOMPARE(o->property("test10").toBool(), true); + + delete o; + } + + // Remote - error + { + TestHTTPServer server(8111); + QVERIFY(server.isValid()); + server.serveDirectory(SRCDIR "/data"); + + QDeclarativeComponent component(&engine, TEST_FILE("include_remote_missing.qml")); + QObject *o = component.create(); + QVERIFY(o != 0); + + QTRY_VERIFY(o->property("done").toBool() == true); + + QCOMPARE(o->property("test1").toBool(), true); + QCOMPARE(o->property("test2").toBool(), true); + QCOMPARE(o->property("test3").toBool(), true); + + delete o; + } +} + +void tst_qdeclarativeecmascript::qtbug_10696() +{ + QDeclarativeComponent component(&engine, TEST_FILE("qtbug_10696.qml")); + QObject *o = component.create(); + QVERIFY(o != 0); + delete o; +} + +void tst_qdeclarativeecmascript::qtbug_11606() +{ + QDeclarativeComponent component(&engine, TEST_FILE("qtbug_11606.qml")); + QObject *o = component.create(); + QVERIFY(o != 0); + QCOMPARE(o->property("test").toBool(), true); + delete o; +} + +void tst_qdeclarativeecmascript::qtbug_11600() +{ + QDeclarativeComponent component(&engine, TEST_FILE("qtbug_11600.qml")); + QObject *o = component.create(); + QVERIFY(o != 0); + QCOMPARE(o->property("test").toBool(), true); + delete o; +} + +// Reading and writing non-scriptable properties should fail +void tst_qdeclarativeecmascript::nonscriptable() +{ + QDeclarativeComponent component(&engine, TEST_FILE("nonscriptable.qml")); + QObject *o = component.create(); + QVERIFY(o != 0); + QCOMPARE(o->property("readOk").toBool(), true); + QCOMPARE(o->property("writeOk").toBool(), true); + delete o; +} + +// deleteLater() should not be callable from QML +void tst_qdeclarativeecmascript::deleteLater() +{ + QDeclarativeComponent component(&engine, TEST_FILE("deleteLater.qml")); + QObject *o = component.create(); + QVERIFY(o != 0); + QCOMPARE(o->property("test").toBool(), true); + delete o; +} + +void tst_qdeclarativeecmascript::in() +{ + QDeclarativeComponent component(&engine, TEST_FILE("in.qml")); + QObject *o = component.create(); + QVERIFY(o != 0); + QCOMPARE(o->property("test1").toBool(), true); + QCOMPARE(o->property("test2").toBool(), true); + delete o; +} + +void tst_qdeclarativeecmascript::sharedAttachedObject() +{ + QDeclarativeComponent component(&engine, TEST_FILE("sharedAttachedObject.qml")); + QObject *o = component.create(); + QVERIFY(o != 0); + QCOMPARE(o->property("test1").toBool(), true); + QCOMPARE(o->property("test2").toBool(), true); + delete o; +} + +// QTBUG-13999 +void tst_qdeclarativeecmascript::objectName() +{ + QDeclarativeComponent component(&engine, TEST_FILE("objectName.qml")); + QObject *o = component.create(); + QVERIFY(o != 0); + + QCOMPARE(o->property("test1").toString(), QString("hello")); + QCOMPARE(o->property("test2").toString(), QString("ell")); + + o->setObjectName("world"); + + QCOMPARE(o->property("test1").toString(), QString("world")); + QCOMPARE(o->property("test2").toString(), QString("orl")); + + delete o; +} + +void tst_qdeclarativeecmascript::writeRemovesBinding() +{ + QDeclarativeComponent component(&engine, TEST_FILE("writeRemovesBinding.qml")); + QObject *o = component.create(); + QVERIFY(o != 0); + + QCOMPARE(o->property("test").toBool(), true); + + delete o; +} + +// Test bindings assigned to alias properties actually assign to the alias' target +void tst_qdeclarativeecmascript::aliasBindingsAssignCorrectly() +{ + QDeclarativeComponent component(&engine, TEST_FILE("aliasBindingsAssignCorrectly.qml")); + QObject *o = component.create(); + QVERIFY(o != 0); + + QCOMPARE(o->property("test").toBool(), true); + + delete o; +} + +// Test bindings assigned to alias properties override a binding on the target (QTBUG-13719) +void tst_qdeclarativeecmascript::aliasBindingsOverrideTarget() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("aliasBindingsOverrideTarget.qml")); + QObject *o = component.create(); + QVERIFY(o != 0); + + QCOMPARE(o->property("test").toBool(), true); + + delete o; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("aliasBindingsOverrideTarget.2.qml")); + QObject *o = component.create(); + QVERIFY(o != 0); + + QCOMPARE(o->property("test").toBool(), true); + + delete o; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("aliasBindingsOverrideTarget.3.qml")); + QObject *o = component.create(); + QVERIFY(o != 0); + + QCOMPARE(o->property("test").toBool(), true); + + delete o; + } +} + +// Test that writes to alias properties override bindings on the alias target (QTBUG-13719) +void tst_qdeclarativeecmascript::aliasWritesOverrideBindings() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("aliasWritesOverrideBindings.qml")); + QObject *o = component.create(); + QVERIFY(o != 0); + + QCOMPARE(o->property("test").toBool(), true); + + delete o; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("aliasWritesOverrideBindings.2.qml")); + QObject *o = component.create(); + QVERIFY(o != 0); + + QCOMPARE(o->property("test").toBool(), true); + + delete o; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("aliasWritesOverrideBindings.3.qml")); + QObject *o = component.create(); + QVERIFY(o != 0); + + QCOMPARE(o->property("test").toBool(), true); + + delete o; + } +} + +void tst_qdeclarativeecmascript::revisionErrors() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("metaobjectRevisionErrors.qml")); + QString url = component.url().toString(); + + QString warning1 = url + ":8: ReferenceError: Can't find variable: prop2"; + QString warning2 = url + ":11: ReferenceError: Can't find variable: prop2"; + QString warning3 = url + ":13: ReferenceError: Can't find variable: method2"; + + QTest::ignoreMessage(QtWarningMsg, warning1.toLatin1().constData()); + QTest::ignoreMessage(QtWarningMsg, warning2.toLatin1().constData()); + QTest::ignoreMessage(QtWarningMsg, warning3.toLatin1().constData()); + MyRevisionedClass *object = qobject_cast(component.create()); + QVERIFY(object != 0); + } + { + QDeclarativeComponent component(&engine, TEST_FILE("metaobjectRevisionErrors2.qml")); + QString url = component.url().toString(); + + // MyRevisionedSubclass 1.0 uses MyRevisionedClass revision 0 + // method2, prop2 from MyRevisionedClass not available + // method4, prop4 from MyRevisionedSubclass not available + QString warning1 = url + ":8: ReferenceError: Can't find variable: prop2"; + QString warning2 = url + ":14: ReferenceError: Can't find variable: prop2"; + QString warning3 = url + ":10: ReferenceError: Can't find variable: prop4"; + QString warning4 = url + ":16: ReferenceError: Can't find variable: prop4"; + QString warning5 = url + ":20: ReferenceError: Can't find variable: method2"; + + QTest::ignoreMessage(QtWarningMsg, warning1.toLatin1().constData()); + QTest::ignoreMessage(QtWarningMsg, warning2.toLatin1().constData()); + QTest::ignoreMessage(QtWarningMsg, warning3.toLatin1().constData()); + QTest::ignoreMessage(QtWarningMsg, warning4.toLatin1().constData()); + QTest::ignoreMessage(QtWarningMsg, warning5.toLatin1().constData()); + MyRevisionedClass *object = qobject_cast(component.create()); + QVERIFY(object != 0); + } + { + QDeclarativeComponent component(&engine, TEST_FILE("metaobjectRevisionErrors3.qml")); + QString url = component.url().toString(); + + // MyRevisionedSubclass 1.1 uses MyRevisionedClass revision 1 + // All properties/methods available, except MyRevisionedBaseClassUnregistered rev 1 + QString warning1 = url + ":30: ReferenceError: Can't find variable: methodD"; + QString warning2 = url + ":10: ReferenceError: Can't find variable: propD"; + QString warning3 = url + ":20: ReferenceError: Can't find variable: propD"; + QTest::ignoreMessage(QtWarningMsg, warning1.toLatin1().constData()); + QTest::ignoreMessage(QtWarningMsg, warning2.toLatin1().constData()); + QTest::ignoreMessage(QtWarningMsg, warning3.toLatin1().constData()); + MyRevisionedClass *object = qobject_cast(component.create()); + QVERIFY(object != 0); + } +} + +void tst_qdeclarativeecmascript::revision() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("metaobjectRevision.qml")); + QString url = component.url().toString(); + + MyRevisionedClass *object = qobject_cast(component.create()); + QVERIFY(object != 0); + } + { + QDeclarativeComponent component(&engine, TEST_FILE("metaobjectRevision2.qml")); + QString url = component.url().toString(); + + MyRevisionedClass *object = qobject_cast(component.create()); + QVERIFY(object != 0); + } + { + QDeclarativeComponent component(&engine, TEST_FILE("metaobjectRevision3.qml")); + QString url = component.url().toString(); + + MyRevisionedClass *object = qobject_cast(component.create()); + QVERIFY(object != 0); + } + // Test that non-root classes can resolve revisioned methods + { + QDeclarativeComponent component(&engine, TEST_FILE("metaobjectRevision4.qml")); + + QObject *object = component.create(); + QVERIFY(object != 0); + QCOMPARE(object->property("test").toReal(), 11.); + delete object; + } +} + +// Test for QScriptDeclarativeClass::pushCleanContext() +void tst_qdeclarativeecmascript::pushCleanContext() +{ + QScriptEngine engine; + engine.globalObject().setProperty("a", 6); + QCOMPARE(engine.evaluate("a").toInt32(), 6); + + // First confirm pushContext() behaves as we expect + QScriptValue object = engine.newObject(); + object.setProperty("a", 15); + QScriptContext *context1 = engine.pushContext(); + context1->pushScope(object); + QCOMPARE(engine.evaluate("a").toInt32(), 15); + + QScriptContext *context2 = engine.pushContext(); + Q_UNUSED(context2); + QCOMPARE(engine.evaluate("a").toInt32(), 15); + QScriptValue func1 = engine.evaluate("(function() { return a; })"); + + // Now check that pushCleanContext() works + QScriptDeclarativeClass::pushCleanContext(&engine); + QCOMPARE(engine.evaluate("a").toInt32(), 6); + QScriptValue func2 = engine.evaluate("(function() { return a; })"); + + engine.popContext(); + QCOMPARE(engine.evaluate("a").toInt32(), 15); + + engine.popContext(); + QCOMPARE(engine.evaluate("a").toInt32(), 15); + + engine.popContext(); + QCOMPARE(engine.evaluate("a").toInt32(), 6); + + // Check that function objects created in these contexts work + QCOMPARE(func1.call().toInt32(), 15); + QCOMPARE(func2.call().toInt32(), 6); +} + +void tst_qdeclarativeecmascript::realToInt() +{ + QDeclarativeComponent component(&engine, TEST_FILE("realToInt.qml")); + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QMetaObject::invokeMethod(object, "test1"); + QCOMPARE(object->value(), int(4)); + QMetaObject::invokeMethod(object, "test2"); + QCOMPARE(object->value(), int(8)); +} + +void tst_qdeclarativeecmascript::qtbug_20648() +{ + QDeclarativeComponent component(&engine, TEST_FILE("qtbug_20648.qml")); + QObject *o = component.create(); + QVERIFY(o != 0); + QCOMPARE(o->property("test").toInt(), 100); + delete o; +} + +QTEST_MAIN(tst_qdeclarativeecmascript) + +#include "tst_qdeclarativeecmascript.moc" diff --git a/tests/auto/declarative/qdeclarativeengine/qdeclarativeengine.pro b/tests/auto/declarative/qdeclarativeengine/qdeclarativeengine.pro new file mode 100644 index 00000000..7119ad99 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeengine/qdeclarativeengine.pro @@ -0,0 +1,12 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative network +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativeengine.cpp + +!symbian: { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativeengine/tst_qdeclarativeengine.cpp b/tests/auto/declarative/qdeclarativeengine/tst_qdeclarativeengine.cpp new file mode 100644 index 00000000..152a8150 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeengine/tst_qdeclarativeengine.cpp @@ -0,0 +1,333 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_qdeclarativeengine : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativeengine() {} + +private slots: + void rootContext(); + void networkAccessManager(); + void baseUrl(); + void contextForObject(); + void offlineStoragePath(); + void clearComponentCache(); + void outputWarningsToStandardError(); + void objectOwnership(); +}; + +void tst_qdeclarativeengine::rootContext() +{ + QDeclarativeEngine engine; + + QVERIFY(engine.rootContext()); + + QCOMPARE(engine.rootContext()->engine(), &engine); + QVERIFY(engine.rootContext()->parentContext() == 0); +} + +class NetworkAccessManagerFactory : public QDeclarativeNetworkAccessManagerFactory +{ +public: + NetworkAccessManagerFactory() : manager(0) {} + + QNetworkAccessManager *create(QObject *parent) { + manager = new QNetworkAccessManager(parent); + return manager; + } + + QNetworkAccessManager *manager; +}; + +void tst_qdeclarativeengine::networkAccessManager() +{ + QDeclarativeEngine *engine = new QDeclarativeEngine; + + // Test QDeclarativeEngine created manager + QPointer manager = engine->networkAccessManager(); + QVERIFY(manager != 0); + delete engine; + + // Test factory created manager + engine = new QDeclarativeEngine; + NetworkAccessManagerFactory factory; + engine->setNetworkAccessManagerFactory(&factory); + QVERIFY(engine->networkAccessManagerFactory() == &factory); + QVERIFY(engine->networkAccessManager() == factory.manager); + delete engine; +} + +void tst_qdeclarativeengine::baseUrl() +{ + QDeclarativeEngine engine; + + QUrl cwd = QUrl::fromLocalFile(QDir::currentPath() + QDir::separator()); + + QCOMPARE(engine.baseUrl(), cwd); + QCOMPARE(engine.rootContext()->resolvedUrl(QUrl("main.qml")), cwd.resolved(QUrl("main.qml"))); + + QDir dir = QDir::current(); + dir.cdUp(); + QVERIFY(dir != QDir::current()); + QDir::setCurrent(dir.path()); + QVERIFY(QDir::current() == dir); + + QUrl cwd2 = QUrl::fromLocalFile(QDir::currentPath() + QDir::separator()); + QCOMPARE(engine.baseUrl(), cwd2); + QCOMPARE(engine.rootContext()->resolvedUrl(QUrl("main.qml")), cwd2.resolved(QUrl("main.qml"))); + + engine.setBaseUrl(cwd); + QCOMPARE(engine.baseUrl(), cwd); + QCOMPARE(engine.rootContext()->resolvedUrl(QUrl("main.qml")), cwd.resolved(QUrl("main.qml"))); +} + +void tst_qdeclarativeengine::contextForObject() +{ + QDeclarativeEngine *engine = new QDeclarativeEngine; + + // Test null-object + QVERIFY(QDeclarativeEngine::contextForObject(0) == 0); + + // Test an object with no context + QObject object; + QVERIFY(QDeclarativeEngine::contextForObject(&object) == 0); + + // Test setting null-object + QDeclarativeEngine::setContextForObject(0, engine->rootContext()); + + // Test setting null-context + QDeclarativeEngine::setContextForObject(&object, 0); + + // Test setting context + QDeclarativeEngine::setContextForObject(&object, engine->rootContext()); + QVERIFY(QDeclarativeEngine::contextForObject(&object) == engine->rootContext()); + + QDeclarativeContext context(engine->rootContext()); + + // Try changing context + QTest::ignoreMessage(QtWarningMsg, "QDeclarativeEngine::setContextForObject(): Object already has a QDeclarativeContext"); + QDeclarativeEngine::setContextForObject(&object, &context); + QVERIFY(QDeclarativeEngine::contextForObject(&object) == engine->rootContext()); + + // Delete context + delete engine; engine = 0; + QVERIFY(QDeclarativeEngine::contextForObject(&object) == 0); +} + +void tst_qdeclarativeengine::offlineStoragePath() +{ + // Without these set, QDesktopServices::storageLocation returns + // strings with extra "//" at the end. We set them to ignore this problem. + qApp->setApplicationName("tst_qdeclarativeengine"); + qApp->setOrganizationName("Nokia"); + qApp->setOrganizationDomain("nokia.com"); + + QDeclarativeEngine engine; + + QDir dir(QDesktopServices::storageLocation(QDesktopServices::DataLocation)); + dir.mkpath("QML"); + dir.cd("QML"); + dir.mkpath("OfflineStorage"); + dir.cd("OfflineStorage"); + + QCOMPARE(QDir::fromNativeSeparators(engine.offlineStoragePath()), dir.path()); + + engine.setOfflineStoragePath(QDir::homePath()); + QCOMPARE(engine.offlineStoragePath(), QDir::homePath()); +} + +void tst_qdeclarativeengine::clearComponentCache() +{ + QDeclarativeEngine engine; + + // Create original qml file + { + QFile file("temp.qml"); + QVERIFY(file.open(QIODevice::WriteOnly)); + file.write("import QtQuick 1.0\nQtObject {\nproperty int test: 10\n}\n"); + file.close(); + } + + // Test "test" property + { + QDeclarativeComponent component(&engine, "temp.qml"); + QObject *obj = component.create(); + QVERIFY(obj != 0); + QCOMPARE(obj->property("test").toInt(), 10); + delete obj; + } + + // Modify qml file + { + QFile file("temp.qml"); + QVERIFY(file.open(QIODevice::WriteOnly)); + file.write("import QtQuick 1.0\nQtObject {\nproperty int test: 11\n}\n"); + file.close(); + } + + // Test cache hit + { + QDeclarativeComponent component(&engine, "temp.qml"); + QObject *obj = component.create(); + QVERIFY(obj != 0); + QCOMPARE(obj->property("test").toInt(), 10); + delete obj; + } + + // Clear cache + engine.clearComponentCache(); + + // Test cache refresh + { + QDeclarativeComponent component(&engine, "temp.qml"); + QObject *obj = component.create(); + QVERIFY(obj != 0); + QCOMPARE(obj->property("test").toInt(), 11); + delete obj; + } +} + +static QStringList warnings; +static void msgHandler(QtMsgType, const char *warning) +{ + warnings << QString::fromUtf8(warning); +} + +void tst_qdeclarativeengine::outputWarningsToStandardError() +{ + QDeclarativeEngine engine; + + QCOMPARE(engine.outputWarningsToStandardError(), true); + + QDeclarativeComponent c(&engine); + c.setData("import QtQuick 1.0; QtObject { property int a: undefined }", QUrl()); + + QVERIFY(c.isReady() == true); + + warnings.clear(); + QtMsgHandler old = qInstallMsgHandler(msgHandler); + + QObject *o = c.create(); + + qInstallMsgHandler(old); + + QVERIFY(o != 0); + delete o; + + QCOMPARE(warnings.count(), 1); + QCOMPARE(warnings.at(0), QLatin1String(":1: Unable to assign [undefined] to int a")); + warnings.clear(); + + + engine.setOutputWarningsToStandardError(false); + QCOMPARE(engine.outputWarningsToStandardError(), false); + + + old = qInstallMsgHandler(msgHandler); + + o = c.create(); + + qInstallMsgHandler(old); + + QVERIFY(o != 0); + delete o; + + QCOMPARE(warnings.count(), 0); +} + +void tst_qdeclarativeengine::objectOwnership() +{ + { + QCOMPARE(QDeclarativeEngine::objectOwnership(0), QDeclarativeEngine::CppOwnership); + QDeclarativeEngine::setObjectOwnership(0, QDeclarativeEngine::JavaScriptOwnership); + QCOMPARE(QDeclarativeEngine::objectOwnership(0), QDeclarativeEngine::CppOwnership); + } + + { + QObject o; + QCOMPARE(QDeclarativeEngine::objectOwnership(&o), QDeclarativeEngine::CppOwnership); + QDeclarativeEngine::setObjectOwnership(&o, QDeclarativeEngine::CppOwnership); + QCOMPARE(QDeclarativeEngine::objectOwnership(&o), QDeclarativeEngine::CppOwnership); + QDeclarativeEngine::setObjectOwnership(&o, QDeclarativeEngine::JavaScriptOwnership); + QCOMPARE(QDeclarativeEngine::objectOwnership(&o), QDeclarativeEngine::JavaScriptOwnership); + QDeclarativeEngine::setObjectOwnership(&o, QDeclarativeEngine::CppOwnership); + QCOMPARE(QDeclarativeEngine::objectOwnership(&o), QDeclarativeEngine::CppOwnership); + } + + { + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine); + c.setData("import QtQuick 1.0; QtObject { property QtObject object: QtObject {} }", QUrl()); + + QObject *o = c.create(); + QVERIFY(o != 0); + + QCOMPARE(QDeclarativeEngine::objectOwnership(o), QDeclarativeEngine::CppOwnership); + + QObject *o2 = qvariant_cast(o->property("object")); + QCOMPARE(QDeclarativeEngine::objectOwnership(o2), QDeclarativeEngine::JavaScriptOwnership); + + delete o; + } + +} + +QTEST_MAIN(tst_qdeclarativeengine) + +#include "tst_qdeclarativeengine.moc" diff --git a/tests/auto/declarative/qdeclarativeerror/qdeclarativeerror.pro b/tests/auto/declarative/qdeclarativeerror/qdeclarativeerror.pro new file mode 100644 index 00000000..0c7240a0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeerror/qdeclarativeerror.pro @@ -0,0 +1,12 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +SOURCES += tst_qdeclarativeerror.cpp +macx:CONFIG -= app_bundle + +!symbian: { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + +CONFIG+=insignificant_test # QTQAINFRA-428 diff --git a/tests/auto/declarative/qdeclarativeerror/test.txt b/tests/auto/declarative/qdeclarativeerror/test.txt new file mode 100644 index 00000000..cdafd9ed --- /dev/null +++ b/tests/auto/declarative/qdeclarativeerror/test.txt @@ -0,0 +1,3 @@ +Line Content +Line2 Content +Line3 Content diff --git a/tests/auto/declarative/qdeclarativeerror/tst_qdeclarativeerror.cpp b/tests/auto/declarative/qdeclarativeerror/tst_qdeclarativeerror.cpp new file mode 100644 index 00000000..f01cf223 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeerror/tst_qdeclarativeerror.cpp @@ -0,0 +1,247 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_qdeclarativeerror : public QObject +{ + Q_OBJECT +private slots: + void url(); + void description(); + void line(); + void column(); + void toString(); + + void copy(); + void debug(); +}; + +void tst_qdeclarativeerror::url() +{ + QDeclarativeError error; + + QCOMPARE(error.url(), QUrl()); + + error.setUrl(QUrl("http://www.nokia.com/main.qml")); + + QCOMPARE(error.url(), QUrl("http://www.nokia.com/main.qml")); + + QDeclarativeError error2 = error; + + QCOMPARE(error2.url(), QUrl("http://www.nokia.com/main.qml")); + + error.setUrl(QUrl("http://qt.nokia.com/main.qml")); + + QCOMPARE(error.url(), QUrl("http://qt.nokia.com/main.qml")); + QCOMPARE(error2.url(), QUrl("http://www.nokia.com/main.qml")); +} + +void tst_qdeclarativeerror::description() +{ + QDeclarativeError error; + + QCOMPARE(error.description(), QString()); + + error.setDescription("An Error"); + + QCOMPARE(error.description(), QString("An Error")); + + QDeclarativeError error2 = error; + + QCOMPARE(error2.description(), QString("An Error")); + + error.setDescription("Another Error"); + + QCOMPARE(error.description(), QString("Another Error")); + QCOMPARE(error2.description(), QString("An Error")); +} + +void tst_qdeclarativeerror::line() +{ + QDeclarativeError error; + + QCOMPARE(error.line(), -1); + + error.setLine(102); + + QCOMPARE(error.line(), 102); + + QDeclarativeError error2 = error; + + QCOMPARE(error2.line(), 102); + + error.setLine(4); + + QCOMPARE(error.line(), 4); + QCOMPARE(error2.line(), 102); +} + +void tst_qdeclarativeerror::column() +{ + QDeclarativeError error; + + QCOMPARE(error.column(), -1); + + error.setColumn(16); + + QCOMPARE(error.column(), 16); + + QDeclarativeError error2 = error; + + QCOMPARE(error2.column(), 16); + + error.setColumn(3); + + QCOMPARE(error.column(), 3); + QCOMPARE(error2.column(), 16); +} + +void tst_qdeclarativeerror::toString() +{ + { + QDeclarativeError error; + error.setUrl(QUrl("http://www.nokia.com/main.qml")); + error.setDescription("An Error"); + error.setLine(92); + error.setColumn(13); + + QCOMPARE(error.toString(), QString("http://www.nokia.com/main.qml:92:13: An Error")); + } + + { + QDeclarativeError error; + error.setUrl(QUrl("http://www.nokia.com/main.qml")); + error.setDescription("An Error"); + error.setLine(92); + + QCOMPARE(error.toString(), QString("http://www.nokia.com/main.qml:92: An Error")); + } +} + +void tst_qdeclarativeerror::copy() +{ + QDeclarativeError error; + error.setUrl(QUrl("http://www.nokia.com/main.qml")); + error.setDescription("An Error"); + error.setLine(92); + error.setColumn(13); + + QDeclarativeError error2(error); + QDeclarativeError error3; + error3 = error; + + error.setUrl(QUrl("http://qt.nokia.com/main.qml")); + error.setDescription("Another Error"); + error.setLine(2); + error.setColumn(33); + + QCOMPARE(error.url(), QUrl("http://qt.nokia.com/main.qml")); + QCOMPARE(error.description(), QString("Another Error")); + QCOMPARE(error.line(), 2); + QCOMPARE(error.column(), 33); + + QCOMPARE(error2.url(), QUrl("http://www.nokia.com/main.qml")); + QCOMPARE(error2.description(), QString("An Error")); + QCOMPARE(error2.line(), 92); + QCOMPARE(error2.column(), 13); + + QCOMPARE(error3.url(), QUrl("http://www.nokia.com/main.qml")); + QCOMPARE(error3.description(), QString("An Error")); + QCOMPARE(error3.line(), 92); + QCOMPARE(error3.column(), 13); + +} + +void tst_qdeclarativeerror::debug() +{ + { + QDeclarativeError error; + error.setUrl(QUrl("http://www.nokia.com/main.qml")); + error.setDescription("An Error"); + error.setLine(92); + error.setColumn(13); + + QTest::ignoreMessage(QtWarningMsg, "http://www.nokia.com/main.qml:92:13: An Error "); + qWarning() << error; + } + + { + QUrl url(QUrl::fromLocalFile(QString(SRCDIR) + "/").resolved(QUrl("test.txt"))); + QDeclarativeError error; + error.setUrl(url); + error.setDescription("An Error"); + error.setLine(2); + error.setColumn(5); + + QString out = url.toString() + ":2:5: An Error \n Line2 Content \n ^ "; + QTest::ignoreMessage(QtWarningMsg, qPrintable(out)); + + qWarning() << error; + } + + { + QUrl url(QUrl::fromLocalFile(QString(SRCDIR) + "/").resolved(QUrl("foo.txt"))); + QDeclarativeError error; + error.setUrl(url); + error.setDescription("An Error"); + error.setLine(2); + error.setColumn(5); + + QString out = url.toString() + ":2:5: An Error "; + QTest::ignoreMessage(QtWarningMsg, qPrintable(out)); + + qWarning() << error; + } +} + + + +QTEST_MAIN(tst_qdeclarativeerror) + +#include "tst_qdeclarativeerror.moc" diff --git a/tests/auto/declarative/qdeclarativeflickable/data/disabledcontent.qml b/tests/auto/declarative/qdeclarativeflickable/data/disabledcontent.qml new file mode 100644 index 00000000..dcbb20bd --- /dev/null +++ b/tests/auto/declarative/qdeclarativeflickable/data/disabledcontent.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 + +Flickable { + width: 100; height: 100 + contentWidth: 200; contentHeight: 300 + + QGraphicsWidget { width: 200; height: 300; enabled: false } +} diff --git a/tests/auto/declarative/qdeclarativeflickable/data/flickable01.qml b/tests/auto/declarative/qdeclarativeflickable/data/flickable01.qml new file mode 100644 index 00000000..c53ae3f9 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeflickable/data/flickable01.qml @@ -0,0 +1,4 @@ +import QtQuick 1.0 + +Flickable { +} diff --git a/tests/auto/declarative/qdeclarativeflickable/data/flickable02.qml b/tests/auto/declarative/qdeclarativeflickable/data/flickable02.qml new file mode 100644 index 00000000..98925ae3 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeflickable/data/flickable02.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 + +Flickable { + width: 100; height: 100 + contentWidth: row.width; contentHeight: row.height + + Row { + id: row + Repeater { + model: 4 + Rectangle { width: 200; height: 300; color: "blue" } + } + } +} diff --git a/tests/auto/declarative/qdeclarativeflickable/data/flickable03.qml b/tests/auto/declarative/qdeclarativeflickable/data/flickable03.qml new file mode 100644 index 00000000..8359ad1b --- /dev/null +++ b/tests/auto/declarative/qdeclarativeflickable/data/flickable03.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 + +Flickable { + width: 100; height: 200 + contentWidth: column.width; contentHeight: column.height + + Column { + id: column + Repeater { + model: 4 + Rectangle { width: 200; height: 300; color: "blue" } + } + } +} diff --git a/tests/auto/declarative/qdeclarativeflickable/data/flickable04.qml b/tests/auto/declarative/qdeclarativeflickable/data/flickable04.qml new file mode 100644 index 00000000..fcc683ae --- /dev/null +++ b/tests/auto/declarative/qdeclarativeflickable/data/flickable04.qml @@ -0,0 +1,22 @@ +import QtQuick 1.0 + +Flickable { + property bool ok: false + function check() { + if (column.parent == contentItem) + ok = true; + } + + width: 100; height: 100 + contentWidth: column.width; contentHeight: column.height + pressDelay: 200; boundsBehavior: Flickable.StopAtBounds; interactive: false + maximumFlickVelocity: 2000 + + Column { + id: column + Repeater { + model: 4 + Rectangle { width: 200; height: 300; color: "blue" } + } + } +} diff --git a/tests/auto/declarative/qdeclarativeflickable/data/flickableqgraphicswidget.qml b/tests/auto/declarative/qdeclarativeflickable/data/flickableqgraphicswidget.qml new file mode 100644 index 00000000..6cbf12c1 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeflickable/data/flickableqgraphicswidget.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +Flickable { + width: 100; height: 100 + + QGraphicsWidget { objectName: "widget1"; width: 200; height: 300 } +} diff --git a/tests/auto/declarative/qdeclarativeflickable/data/nestedPressDelay.qml b/tests/auto/declarative/qdeclarativeflickable/data/nestedPressDelay.qml new file mode 100644 index 00000000..d0ee545f --- /dev/null +++ b/tests/auto/declarative/qdeclarativeflickable/data/nestedPressDelay.qml @@ -0,0 +1,33 @@ +import QtQuick 1.0 + +Flickable { + property bool pressed: ma.pressed + width: 240 + height: 320 + contentWidth: 480 + contentHeight: 320 + flickableDirection: Flickable.HorizontalFlick + pressDelay: 50 + Flickable { + objectName: "innerFlickable" + flickableDirection: Flickable.VerticalFlick + width: 480 + height: 320 + contentWidth: 480 + contentHeight: 400 + pressDelay: 10000 + Rectangle { + y: 100 + anchors.horizontalCenter: parent.horizontalCenter + width: 240 + height: 100 + color: ma.pressed ? 'blue' : 'green' + MouseArea { + id: ma + objectName: "mouseArea" + anchors.fill: parent + } + } + } +} + diff --git a/tests/auto/declarative/qdeclarativeflickable/data/resize.qml b/tests/auto/declarative/qdeclarativeflickable/data/resize.qml new file mode 100644 index 00000000..e2abb99f --- /dev/null +++ b/tests/auto/declarative/qdeclarativeflickable/data/resize.qml @@ -0,0 +1,27 @@ +import QtQuick 1.1 + +Rectangle { + function resizeContent() { + flick.resizeContent(600, 600, Qt.point(100, 100)) + } + function returnToBounds() { + flick.returnToBounds() + } + width: 400 + height: 360 + color: "gray" + + Flickable { + id: flick + objectName: "flick" + anchors.fill: parent + contentWidth: 300 + contentHeight: 300 + + Rectangle { + width: flick.contentWidth + height: flick.contentHeight + color: "red" + } + } +} diff --git a/tests/auto/declarative/qdeclarativeflickable/data/wheel.qml b/tests/auto/declarative/qdeclarativeflickable/data/wheel.qml new file mode 100644 index 00000000..6ea81b2d --- /dev/null +++ b/tests/auto/declarative/qdeclarativeflickable/data/wheel.qml @@ -0,0 +1,21 @@ +import QtQuick 1.1 + +Rectangle { + width: 400 + height: 400 + color: "gray" + + Flickable { + id: flick + objectName: "flick" + anchors.fill: parent + contentWidth: 800 + contentHeight: 800 + + Rectangle { + width: flick.contentWidth + height: flick.contentHeight + color: "red" + } + } +} diff --git a/tests/auto/declarative/qdeclarativeflickable/qdeclarativeflickable.pro b/tests/auto/declarative/qdeclarativeflickable/qdeclarativeflickable.pro new file mode 100644 index 00000000..c176e072 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeflickable/qdeclarativeflickable.pro @@ -0,0 +1,16 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative gui +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativeflickable.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativeflickable/tst_qdeclarativeflickable.cpp b/tests/auto/declarative/qdeclarativeflickable/tst_qdeclarativeflickable.cpp new file mode 100644 index 00000000..748760a9 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeflickable/tst_qdeclarativeflickable.cpp @@ -0,0 +1,554 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../../../shared/util.h" + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_qdeclarativeflickable : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativeflickable(); + +private slots: + void create(); + void horizontalViewportSize(); + void verticalViewportSize(); + void properties(); + void boundsBehavior(); + void maximumFlickVelocity(); + void flickDeceleration(); + void pressDelay(); + void disabledContent(); + void nestedPressDelay(); + void flickableDirection(); + void qgraphicswidget(); + void resizeContent(); + void returnToBounds(); + void testQtQuick11Attributes(); + void testQtQuick11Attributes_data(); + void wheel(); + void flickVelocity(); + +private: + QDeclarativeEngine engine; + + void flick(QGraphicsView *canvas, const QPoint &from, const QPoint &to, int duration); + template + T *findItem(QGraphicsObject *parent, const QString &objectName); +}; + +tst_qdeclarativeflickable::tst_qdeclarativeflickable() +{ +} + +void tst_qdeclarativeflickable::create() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/flickable01.qml")); + QDeclarativeFlickable *obj = qobject_cast(c.create()); + + QVERIFY(obj != 0); + QCOMPARE(obj->isAtXBeginning(), true); + QCOMPARE(obj->isAtXEnd(), false); + QCOMPARE(obj->isAtYBeginning(), true); + QCOMPARE(obj->isAtYEnd(), false); + QCOMPARE(obj->contentX(), 0.); + QCOMPARE(obj->contentY(), 0.); + + QCOMPARE(obj->horizontalVelocity(), 0.); + QCOMPARE(obj->verticalVelocity(), 0.); + + QCOMPARE(obj->isInteractive(), true); + QCOMPARE(obj->boundsBehavior(), QDeclarativeFlickable::DragAndOvershootBounds); + QCOMPARE(obj->pressDelay(), 0); + QCOMPARE(obj->maximumFlickVelocity(), 2500.); + + delete obj; +} + +void tst_qdeclarativeflickable::horizontalViewportSize() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/flickable02.qml")); + QDeclarativeFlickable *obj = qobject_cast(c.create()); + + QVERIFY(obj != 0); + QCOMPARE(obj->contentWidth(), 800.); + QCOMPARE(obj->contentHeight(), 300.); + QCOMPARE(obj->isAtXBeginning(), true); + QCOMPARE(obj->isAtXEnd(), false); + QCOMPARE(obj->isAtYBeginning(), true); + QCOMPARE(obj->isAtYEnd(), false); + + delete obj; +} + +void tst_qdeclarativeflickable::verticalViewportSize() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/flickable03.qml")); + QDeclarativeFlickable *obj = qobject_cast(c.create()); + + QVERIFY(obj != 0); + QCOMPARE(obj->contentWidth(), 200.); + QCOMPARE(obj->contentHeight(), 1200.); + QCOMPARE(obj->isAtXBeginning(), true); + QCOMPARE(obj->isAtXEnd(), false); + QCOMPARE(obj->isAtYBeginning(), true); + QCOMPARE(obj->isAtYEnd(), false); + + delete obj; +} + +void tst_qdeclarativeflickable::properties() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/flickable04.qml")); + QDeclarativeFlickable *obj = qobject_cast(c.create()); + + QVERIFY(obj != 0); + QCOMPARE(obj->isInteractive(), false); + QCOMPARE(obj->boundsBehavior(), QDeclarativeFlickable::StopAtBounds); + QCOMPARE(obj->pressDelay(), 200); + QCOMPARE(obj->maximumFlickVelocity(), 2000.); + + QVERIFY(obj->property("ok").toBool() == false); + QMetaObject::invokeMethod(obj, "check"); + QVERIFY(obj->property("ok").toBool() == true); + + delete obj; +} + +void tst_qdeclarativeflickable::boundsBehavior() +{ + QDeclarativeComponent component(&engine); + component.setData("import QtQuick 1.0; Flickable { boundsBehavior: Flickable.StopAtBounds }", QUrl::fromLocalFile("")); + QDeclarativeFlickable *flickable = qobject_cast(component.create()); + QSignalSpy spy(flickable, SIGNAL(boundsBehaviorChanged())); + + QVERIFY(flickable); + QVERIFY(flickable->boundsBehavior() == QDeclarativeFlickable::StopAtBounds); + + flickable->setBoundsBehavior(QDeclarativeFlickable::DragAndOvershootBounds); + QVERIFY(flickable->boundsBehavior() == QDeclarativeFlickable::DragAndOvershootBounds); + QCOMPARE(spy.count(),1); + flickable->setBoundsBehavior(QDeclarativeFlickable::DragAndOvershootBounds); + QCOMPARE(spy.count(),1); + + flickable->setBoundsBehavior(QDeclarativeFlickable::DragOverBounds); + QVERIFY(flickable->boundsBehavior() == QDeclarativeFlickable::DragOverBounds); + QCOMPARE(spy.count(),2); + flickable->setBoundsBehavior(QDeclarativeFlickable::DragOverBounds); + QCOMPARE(spy.count(),2); + + flickable->setBoundsBehavior(QDeclarativeFlickable::StopAtBounds); + QVERIFY(flickable->boundsBehavior() == QDeclarativeFlickable::StopAtBounds); + QCOMPARE(spy.count(),3); + flickable->setBoundsBehavior(QDeclarativeFlickable::StopAtBounds); + QCOMPARE(spy.count(),3); +} + +void tst_qdeclarativeflickable::maximumFlickVelocity() +{ + QDeclarativeComponent component(&engine); + component.setData("import QtQuick 1.0; Flickable { maximumFlickVelocity: 1.0; }", QUrl::fromLocalFile("")); + QDeclarativeFlickable *flickable = qobject_cast(component.create()); + QSignalSpy spy(flickable, SIGNAL(maximumFlickVelocityChanged())); + + QVERIFY(flickable); + QCOMPARE(flickable->maximumFlickVelocity(), 1.0); + + flickable->setMaximumFlickVelocity(2.0); + QCOMPARE(flickable->maximumFlickVelocity(), 2.0); + QCOMPARE(spy.count(),1); + flickable->setMaximumFlickVelocity(2.0); + QCOMPARE(spy.count(),1); +} + +void tst_qdeclarativeflickable::flickDeceleration() +{ + QDeclarativeComponent component(&engine); + component.setData("import QtQuick 1.0; Flickable { flickDeceleration: 1.0; }", QUrl::fromLocalFile("")); + QDeclarativeFlickable *flickable = qobject_cast(component.create()); + QSignalSpy spy(flickable, SIGNAL(flickDecelerationChanged())); + + QVERIFY(flickable); + QCOMPARE(flickable->flickDeceleration(), 1.0); + + flickable->setFlickDeceleration(2.0); + QCOMPARE(flickable->flickDeceleration(), 2.0); + QCOMPARE(spy.count(),1); + flickable->setFlickDeceleration(2.0); + QCOMPARE(spy.count(),1); +} + +void tst_qdeclarativeflickable::pressDelay() +{ + QDeclarativeComponent component(&engine); + component.setData("import QtQuick 1.0; Flickable { pressDelay: 100; }", QUrl::fromLocalFile("")); + QDeclarativeFlickable *flickable = qobject_cast(component.create()); + QSignalSpy spy(flickable, SIGNAL(pressDelayChanged())); + + QVERIFY(flickable); + QCOMPARE(flickable->pressDelay(), 100); + + flickable->setPressDelay(200); + QCOMPARE(flickable->pressDelay(), 200); + QCOMPARE(spy.count(),1); + flickable->setPressDelay(200); + QCOMPARE(spy.count(),1); +} + +// QT-4677 +void tst_qdeclarativeflickable::disabledContent() +{ + QDeclarativeView *canvas = new QDeclarativeView; + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/disabledcontent.qml")); + canvas->show(); + canvas->setFocus(); + QVERIFY(canvas->rootObject() != 0); + + QDeclarativeFlickable *flickable = qobject_cast(canvas->rootObject()); + QVERIFY(flickable != 0); + + QVERIFY(flickable->contentX() == 0); + QVERIFY(flickable->contentY() == 0); + + QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(50, 50))); + { + QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(QPoint(70,70)), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(canvas->viewport(), &mv); + } + { + QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(QPoint(90,90)), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(canvas->viewport(), &mv); + } + { + QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(QPoint(100,100)), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(canvas->viewport(), &mv); + } + + QVERIFY(flickable->contentX() < 0); + QVERIFY(flickable->contentY() < 0); + + QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(90, 90))); + + delete canvas; +} + + +// QTBUG-17361 +void tst_qdeclarativeflickable::nestedPressDelay() +{ + QDeclarativeView *canvas = new QDeclarativeView; + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/nestedPressDelay.qml")); + canvas->show(); + canvas->setFocus(); + QVERIFY(canvas->rootObject() != 0); + + QDeclarativeFlickable *outer = qobject_cast(canvas->rootObject()); + QVERIFY(outer != 0); + + QDeclarativeFlickable *inner = canvas->rootObject()->findChild("innerFlickable"); + QVERIFY(inner != 0); + + QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(150, 150))); + // the MouseArea is not pressed immediately + QVERIFY(outer->property("pressed").toBool() == false); + + // The outer pressDelay will prevail (50ms, vs. 10sec) + // QTRY_VERIFY() has 5sec timeout, so will timeout well within 10sec. + QTRY_VERIFY(outer->property("pressed").toBool() == true); + + QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(150, 150))); + + delete canvas; +} + +void tst_qdeclarativeflickable::flickableDirection() +{ + QDeclarativeComponent component(&engine); + component.setData("import QtQuick 1.0; Flickable { flickableDirection: Flickable.VerticalFlick; }", QUrl::fromLocalFile("")); + QDeclarativeFlickable *flickable = qobject_cast(component.create()); + QSignalSpy spy(flickable, SIGNAL(flickableDirectionChanged())); + + QVERIFY(flickable); + QCOMPARE(flickable->flickableDirection(), QDeclarativeFlickable::VerticalFlick); + + flickable->setFlickableDirection(QDeclarativeFlickable::HorizontalAndVerticalFlick); + QCOMPARE(flickable->flickableDirection(), QDeclarativeFlickable::HorizontalAndVerticalFlick); + QCOMPARE(spy.count(),1); + + flickable->setFlickableDirection(QDeclarativeFlickable::AutoFlickDirection); + QCOMPARE(flickable->flickableDirection(), QDeclarativeFlickable::AutoFlickDirection); + QCOMPARE(spy.count(),2); + + flickable->setFlickableDirection(QDeclarativeFlickable::HorizontalFlick); + QCOMPARE(flickable->flickableDirection(), QDeclarativeFlickable::HorizontalFlick); + QCOMPARE(spy.count(),3); + + flickable->setFlickableDirection(QDeclarativeFlickable::HorizontalFlick); + QCOMPARE(flickable->flickableDirection(), QDeclarativeFlickable::HorizontalFlick); + QCOMPARE(spy.count(),3); +} + +void tst_qdeclarativeflickable::qgraphicswidget() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/flickableqgraphicswidget.qml")); + QDeclarativeFlickable *flickable = qobject_cast(c.create()); + + QVERIFY(flickable != 0); + QGraphicsWidget *widget = findItem(flickable->contentItem(), "widget1"); + QVERIFY(widget); +} + +// QtQuick 1.1 +void tst_qdeclarativeflickable::resizeContent() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/resize.qml")); + QDeclarativeItem *root = qobject_cast(c.create()); + QDeclarativeFlickable *obj = findItem(root, "flick"); + + QVERIFY(obj != 0); + QCOMPARE(obj->contentX(), 0.); + QCOMPARE(obj->contentY(), 0.); + QCOMPARE(obj->contentWidth(), 300.); + QCOMPARE(obj->contentHeight(), 300.); + + QMetaObject::invokeMethod(root, "resizeContent"); + + QCOMPARE(obj->contentX(), 100.); + QCOMPARE(obj->contentY(), 100.); + QCOMPARE(obj->contentWidth(), 600.); + QCOMPARE(obj->contentHeight(), 600.); + + delete root; +} + +// QtQuick 1.1 +void tst_qdeclarativeflickable::returnToBounds() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/resize.qml")); + QDeclarativeItem *root = qobject_cast(c.create()); + QDeclarativeFlickable *obj = findItem(root, "flick"); + + QVERIFY(obj != 0); + QCOMPARE(obj->contentX(), 0.); + QCOMPARE(obj->contentY(), 0.); + QCOMPARE(obj->contentWidth(), 300.); + QCOMPARE(obj->contentHeight(), 300.); + + obj->setContentX(100); + obj->setContentY(400); + QTRY_COMPARE(obj->contentX(), 100.); + QTRY_COMPARE(obj->contentY(), 400.); + + QMetaObject::invokeMethod(root, "returnToBounds"); + + QTRY_COMPARE(obj->contentX(), 0.); + QTRY_COMPARE(obj->contentY(), 0.); + + delete root; +} + +void tst_qdeclarativeflickable::testQtQuick11Attributes() +{ + QFETCH(QString, code); + QFETCH(QString, warning); + QFETCH(QString, error); + + QDeclarativeEngine engine; + QObject *obj; + + QDeclarativeComponent invalid(&engine); + invalid.setData("import QtQuick 1.0; Flickable { " + code.toUtf8() + " }", QUrl("")); + QTest::ignoreMessage(QtWarningMsg, warning.toUtf8()); + obj = invalid.create(); + QCOMPARE(invalid.errorString(), error); + delete obj; + + QDeclarativeComponent valid(&engine); + valid.setData("import QtQuick 1.1; Flickable { " + code.toUtf8() + " }", QUrl("")); + obj = valid.create(); + QVERIFY(obj); + QVERIFY(valid.errorString().isEmpty()); + delete obj; +} + +void tst_qdeclarativeflickable::testQtQuick11Attributes_data() +{ + QTest::addColumn("code"); + QTest::addColumn("warning"); + QTest::addColumn("error"); + + QTest::newRow("resizeContent") << "Component.onCompleted: resizeContent(100,100,Qt.point(50,50))" + << ":1: ReferenceError: Can't find variable: resizeContent" + << ""; + + QTest::newRow("returnToBounds") << "Component.onCompleted: returnToBounds()" + << ":1: ReferenceError: Can't find variable: returnToBounds" + << ""; + +} + +void tst_qdeclarativeflickable::wheel() +{ + QDeclarativeView *canvas = new QDeclarativeView; + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/wheel.qml")); + canvas->show(); + canvas->setFocus(); + QVERIFY(canvas->rootObject() != 0); + + QDeclarativeFlickable *flick = canvas->rootObject()->findChild("flick"); + QVERIFY(flick != 0); + + QGraphicsScene *scene = canvas->scene(); + QGraphicsSceneWheelEvent event(QEvent::GraphicsSceneWheel); + event.setScenePos(QPointF(200, 200)); + event.setDelta(-120); + event.setOrientation(Qt::Vertical); + event.setAccepted(false); + QApplication::sendEvent(scene, &event); + + QTRY_VERIFY(flick->contentY() > 0); + QVERIFY(flick->contentX() == 0); + + flick->setContentY(0); + QVERIFY(flick->contentY() == 0); + + event.setScenePos(QPointF(200, 200)); + event.setDelta(-120); + event.setOrientation(Qt::Horizontal); + event.setAccepted(false); + QApplication::sendEvent(scene, &event); + + QTRY_VERIFY(flick->contentX() > 0); + QVERIFY(flick->contentY() == 0); + + delete canvas; +} + +void tst_qdeclarativeflickable::flickVelocity() +{ +#ifdef Q_WS_MAC + QSKIP("Producing flicks on Mac CI impossible due to timing problems", SkipAll); +#endif + + QDeclarativeView *canvas = new QDeclarativeView; + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/flickable03.qml")); + canvas->show(); + canvas->setFocus(); + QVERIFY(canvas->rootObject() != 0); + + QDeclarativeFlickable *flickable = qobject_cast(canvas->rootObject()); + QVERIFY(flickable != 0); + + // flick up + flick(canvas, QPoint(20,190), QPoint(20, 50), 200); + QVERIFY(flickable->verticalVelocity() > 0.0); + QTRY_VERIFY(flickable->verticalVelocity() == 0.0); + + // flick down + flick(canvas, QPoint(20,10), QPoint(20, 140), 200); + QVERIFY(flickable->verticalVelocity() < 0.0); + QTRY_VERIFY(flickable->verticalVelocity() == 0.0); + + delete canvas; +} + +void tst_qdeclarativeflickable::flick(QGraphicsView *canvas, const QPoint &from, const QPoint &to, int duration) +{ + const int pointCount = 5; + QPoint diff = to - from; + + // send press, five equally spaced moves, and release. + QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(from)); + + for (int i = 0; i < pointCount; ++i) { + QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(from + (i+1)*diff/pointCount), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(canvas->viewport(), &mv); + QTest::qWait(duration/pointCount); + QCoreApplication::processEvents(); + } + + QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(to)); +} + +template +T *tst_qdeclarativeflickable::findItem(QGraphicsObject *parent, const QString &objectName) +{ + const QMetaObject &mo = T::staticMetaObject; + //qDebug() << parent->childItems().count() << "children"; + for (int i = 0; i < parent->childItems().count(); ++i) { + QGraphicsObject *item = qobject_cast(parent->childItems().at(i)); + if(!item) + continue; + //qDebug() << "try" << item; + if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName)) { + return static_cast(item); + } + item = findItem(item, objectName); + if (item) + return static_cast(item); + } + + return 0; +} + +QTEST_MAIN(tst_qdeclarativeflickable) + +#include "tst_qdeclarativeflickable.moc" diff --git a/tests/auto/declarative/qdeclarativeflipable/data/crash.qml b/tests/auto/declarative/qdeclarativeflipable/data/crash.qml new file mode 100644 index 00000000..bc5229b5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeflipable/data/crash.qml @@ -0,0 +1,9 @@ +import QtQuick 1.0 + +Flipable { + transform: Rotation { + axis.y: 1 + axis.z: 0 + angle: 180 + } +} diff --git a/tests/auto/declarative/qdeclarativeflipable/data/flipable-abort.qml b/tests/auto/declarative/qdeclarativeflipable/data/flipable-abort.qml new file mode 100644 index 00000000..69ff4a22 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeflipable/data/flipable-abort.qml @@ -0,0 +1,10 @@ +import QtQuick 1.0 + +Rectangle { + Flipable { + id: flipable + } + Rectangle { + visible: flipable.side == Flipable.Front + } +} diff --git a/tests/auto/declarative/qdeclarativeflipable/data/test-flipable.qml b/tests/auto/declarative/qdeclarativeflipable/data/test-flipable.qml new file mode 100644 index 00000000..02b69e07 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeflipable/data/test-flipable.qml @@ -0,0 +1,9 @@ +import QtQuick 1.0 + +Flipable { + id: flipable + width: 640; height: 480 + + front: Rectangle { anchors.fill: flipable } + back: Rectangle { anchors.fill: flipable } +} diff --git a/tests/auto/declarative/qdeclarativeflipable/qdeclarativeflipable.pro b/tests/auto/declarative/qdeclarativeflipable/qdeclarativeflipable.pro new file mode 100644 index 00000000..3b6d19a6 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeflipable/qdeclarativeflipable.pro @@ -0,0 +1,16 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative gui +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativeflipable.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativeflipable/tst_qdeclarativeflipable.cpp b/tests/auto/declarative/qdeclarativeflipable/tst_qdeclarativeflipable.cpp new file mode 100644 index 00000000..1835c656 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeflipable/tst_qdeclarativeflipable.cpp @@ -0,0 +1,143 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_qdeclarativeflipable : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativeflipable(); + +private slots: + void create(); + void checkFrontAndBack(); + void setFrontAndBack(); + + // below here task issues + void QTBUG_9161_crash(); + void QTBUG_8474_qgv_abort(); + +private: + QDeclarativeEngine engine; +}; + +tst_qdeclarativeflipable::tst_qdeclarativeflipable() +{ +} + +void tst_qdeclarativeflipable::create() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/test-flipable.qml")); + QDeclarativeFlipable *obj = qobject_cast(c.create()); + + QVERIFY(obj != 0); + delete obj; +} + +void tst_qdeclarativeflipable::checkFrontAndBack() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/test-flipable.qml")); + QDeclarativeFlipable *obj = qobject_cast(c.create()); + + QVERIFY(obj != 0); + QVERIFY(obj->front() != 0); + QVERIFY(obj->back() != 0); + delete obj; +} + +void tst_qdeclarativeflipable::setFrontAndBack() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/test-flipable.qml")); + QDeclarativeFlipable *obj = qobject_cast(c.create()); + + QVERIFY(obj != 0); + QVERIFY(obj->front() != 0); + QVERIFY(obj->back() != 0); + + QString message = c.url().toString() + ":3:1: QML Flipable: front is a write-once property"; + QTest::ignoreMessage(QtWarningMsg, qPrintable(message)); + obj->setFront(new QDeclarativeRectangle()); + + message = c.url().toString() + ":3:1: QML Flipable: back is a write-once property"; + QTest::ignoreMessage(QtWarningMsg, qPrintable(message)); + obj->setBack(new QDeclarativeRectangle()); + delete obj; +} + +void tst_qdeclarativeflipable::QTBUG_9161_crash() +{ + QDeclarativeView *canvas = new QDeclarativeView; + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/crash.qml")); + QGraphicsObject *root = canvas->rootObject(); + QVERIFY(root != 0); + canvas->show(); + delete canvas; +} + +void tst_qdeclarativeflipable::QTBUG_8474_qgv_abort() +{ + QDeclarativeView *canvas = new QDeclarativeView; + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/flipable-abort.qml")); + QGraphicsObject *root = canvas->rootObject(); + QVERIFY(root != 0); + canvas->show(); + delete canvas; +} + +QTEST_MAIN(tst_qdeclarativeflipable) + +#include "tst_qdeclarativeflipable.moc" diff --git a/tests/auto/declarative/qdeclarativefocusscope/data/chain.qml b/tests/auto/declarative/qdeclarativefocusscope/data/chain.qml new file mode 100644 index 00000000..a40bc2cd --- /dev/null +++ b/tests/auto/declarative/qdeclarativefocusscope/data/chain.qml @@ -0,0 +1,28 @@ +import QtQuick 1.0 + +Rectangle { + id: root + width:300; height:400 + + property bool focus1: root.activeFocus + property bool focus2: item1.activeFocus + property bool focus3: fs1.activeFocus + property bool focus4: fs2.activeFocus + property bool focus5: theItem.activeFocus + + Item { + id: item1 + FocusScope { + id: fs1 + focus: true + FocusScope { + id: fs2 + focus: true + Item { + id: theItem + focus: true + } + } + } + } +} diff --git a/tests/auto/declarative/qdeclarativefocusscope/data/forceActiveFocus.qml b/tests/auto/declarative/qdeclarativefocusscope/data/forceActiveFocus.qml new file mode 100644 index 00000000..6c39d4a4 --- /dev/null +++ b/tests/auto/declarative/qdeclarativefocusscope/data/forceActiveFocus.qml @@ -0,0 +1,26 @@ +import QtQuick 1.0 + +Rectangle { + objectName: "root" + FocusScope { + objectName: "scope" + Item { + objectName: "item-a1" + FocusScope { + objectName: "scope-a" + Item { + objectName: "item-a2" + } + } + } + Item { + objectName: "item-b1" + FocusScope { + objectName: "scope-b" + Item { + objectName: "item-b2" + } + } + } + } +} diff --git a/tests/auto/declarative/qdeclarativefocusscope/data/forcefocus.qml b/tests/auto/declarative/qdeclarativefocusscope/data/forcefocus.qml new file mode 100644 index 00000000..708e8991 --- /dev/null +++ b/tests/auto/declarative/qdeclarativefocusscope/data/forcefocus.qml @@ -0,0 +1,81 @@ +import QtQuick 1.0 + +Rectangle { + width: 800; height: 600 + + FocusScope { + focus: true + + FocusScope { + id: firstScope + objectName: "item0" + focus: true + + Rectangle { + height: 120; width: 420 + + color: "transparent" + border.width: 5; border.color: firstScope.activeFocus?"blue":"black" + + Rectangle { + id: item1; objectName: "item1" + x: 10; y: 10; width: 100; height: 100; color: "green" + border.width: 5; border.color: activeFocus?"blue":"black" + focus: true + + Rectangle { + width: 50; height: 50; anchors.centerIn: parent + color: parent.activeFocus?"red":"transparent" + } + } + + Rectangle { + id: item2; objectName: "item2" + x: 310; y: 10; width: 100; height: 100; color: "green" + border.width: 5; border.color: activeFocus?"blue":"black" + + Rectangle { + width: 50; height: 50; anchors.centerIn: parent + color: parent.activeFocus?"red":"transparent" + } + } + } + } + + FocusScope { + id: secondScope + objectName: "item3" + + Rectangle { + y: 160; height: 120; width: 420 + + color: "transparent" + border.width: 5; border.color: secondScope.activeFocus?"blue":"black" + + Rectangle { + id: item4; objectName: "item4" + x: 10; y: 10; width: 100; height: 100; color: "green" + border.width: 5; border.color: activeFocus?"blue":"black" + + Rectangle { + width: 50; height: 50; anchors.centerIn: parent + color: parent.activeFocus?"red":"transparent" + } + } + + Rectangle { + id: item5; objectName: "item5" + x: 310; y: 10; width: 100; height: 100; color: "green" + border.width: 5; border.color: activeFocus?"blue":"black" + + Rectangle { + width: 50; height: 50; anchors.centerIn: parent + color: parent.activeFocus?"red":"transparent" + } + } + } + } + } + Keys.onDigit4Pressed: item4.focus = true + Keys.onDigit5Pressed: item5.forceActiveFocus() +} diff --git a/tests/auto/declarative/qdeclarativefocusscope/data/qtBug13380.qml b/tests/auto/declarative/qdeclarativefocusscope/data/qtBug13380.qml new file mode 100644 index 00000000..1784202e --- /dev/null +++ b/tests/auto/declarative/qdeclarativefocusscope/data/qtBug13380.qml @@ -0,0 +1,24 @@ +import QtQuick 1.0 + +Rectangle { + width: 400; height: 400 + + property bool showRect: false + onShowRectChanged: if (showRect) rect.visible = true + property bool noFocus: !fs2.activeFocus + + FocusScope { + id: fs1 + focus: true + } + Rectangle { + id: rect + visible: false + FocusScope { + id: fs2 + Rectangle { + focus: true + } + } + } +} diff --git a/tests/auto/declarative/qdeclarativefocusscope/data/signalEmission.qml b/tests/auto/declarative/qdeclarativefocusscope/data/signalEmission.qml new file mode 100644 index 00000000..58507917 --- /dev/null +++ b/tests/auto/declarative/qdeclarativefocusscope/data/signalEmission.qml @@ -0,0 +1,33 @@ +import QtQuick 1.0 + +Rectangle { + width: 200 + height: 200 + + FocusScope { + focus: true + Rectangle { + objectName: "item1" + color: "blue" + onFocusChanged: focus ? color = "red" : color = "blue" + } + Rectangle { + objectName: "item2" + color: "blue" + onFocusChanged: focus ? color = "red" : color = "blue" + } + } + + FocusScope { + Rectangle { + objectName: "item3" + color: "blue" + onFocusChanged: focus ? color = "red" : color = "blue" + } + Rectangle { + objectName: "item4" + color: "blue" + onFocusChanged: focus ? color = "red" : color = "blue" + } + } +} diff --git a/tests/auto/declarative/qdeclarativefocusscope/data/test.qml b/tests/auto/declarative/qdeclarativefocusscope/data/test.qml new file mode 100644 index 00000000..5983c190 --- /dev/null +++ b/tests/auto/declarative/qdeclarativefocusscope/data/test.qml @@ -0,0 +1,77 @@ +import QtQuick 1.0 + +Rectangle { + color: "white" + width: 800 + height: 600 + + Keys.onDigit9Pressed: console.log("Error - Root") + + FocusScope { + id: myScope + objectName: "item0" + focus: true + + Keys.onDigit9Pressed: console.log("Error - FocusScope") + + Rectangle { + height: 120 + width: 420 + + color: "transparent" + border.width: 5 + border.color: myScope.activeFocus?"blue":"black" + + Rectangle { + id: item1; objectName: "item1" + x: 10; y: 10 + width: 100; height: 100; color: "green" + border.width: 5 + border.color: activeFocus?"blue":"black" + Keys.onDigit9Pressed: console.debug("Top Left"); + KeyNavigation.right: item2 + focus: true + + Rectangle { + width: 50; height: 50; anchors.centerIn: parent + color: parent.activeFocus?"red":"transparent" + } + } + + Rectangle { + id: item2; objectName: "item2" + x: 310; y: 10 + width: 100; height: 100; color: "green" + border.width: 5 + border.color: activeFocus?"blue":"black" + KeyNavigation.left: item1 + Keys.onDigit9Pressed: console.log("Top Right"); + + Rectangle { + width: 50; height: 50; anchors.centerIn: parent + color: parent.activeFocus?"red":"transparent" + } + } + } + KeyNavigation.down: item3 + } + + Text { x:100; y:170; text: "Blue border indicates scoped focus\nBlack border indicates NOT scoped focus\nRed box indicates active focus\nUse arrow keys to navigate\nPress \"9\" to print currently focused item" } + + Rectangle { + id: item3; objectName: "item3" + x: 10; y: 300 + width: 100; height: 100; color: "green" + border.width: 5 + border.color: activeFocus?"blue":"black" + + Keys.onDigit9Pressed: console.log("Bottom Left"); + KeyNavigation.up: myScope + + Rectangle { + width: 50; height: 50; anchors.centerIn: parent + color: parent.activeFocus?"red":"transparent" + } + } + +} diff --git a/tests/auto/declarative/qdeclarativefocusscope/data/test2.qml b/tests/auto/declarative/qdeclarativefocusscope/data/test2.qml new file mode 100644 index 00000000..8c0b3b42 --- /dev/null +++ b/tests/auto/declarative/qdeclarativefocusscope/data/test2.qml @@ -0,0 +1,39 @@ +import QtQuick 1.0 + +Rectangle { + color: "white" + width: 800 + height: 600 + + Text { text: "All five rectangles should be red" } + + FocusScope { + y: 100 + focus: true; objectName: "item1" + Rectangle { width: 50; height: 50; color: parent.activeFocus?"red":"blue" } + + FocusScope { + y: 100 + focus: true; objectName: "item2" + Rectangle { width: 50; height: 50; color: parent.activeFocus?"red":"blue" } + + FocusScope { + y: 100 + focus: true; objectName: "item3" + Rectangle { width: 50; height: 50; color: parent.activeFocus?"red":"blue" } + + FocusScope { + y: 100 + focus: true; objectName: "item4" + Rectangle { width: 50; height: 50; color: parent.activeFocus?"red":"blue" } + + FocusScope { + y: 100 + focus: true; objectName: "item5" + Rectangle { width: 50; height: 50; color: parent.activeFocus?"red":"blue" } + } + } + } + } + } +} diff --git a/tests/auto/declarative/qdeclarativefocusscope/data/test3.qml b/tests/auto/declarative/qdeclarativefocusscope/data/test3.qml new file mode 100644 index 00000000..2e025cb6 --- /dev/null +++ b/tests/auto/declarative/qdeclarativefocusscope/data/test3.qml @@ -0,0 +1,52 @@ +import QtQuick 1.0 + +Rectangle { + color: "white" + width: 800 + height: 600 + + ListModel { + id: model + ListElement { name: "1" } + ListElement { name: "2" } + ListElement { name: "3" } + ListElement { name: "4" } + ListElement { name: "5" } + ListElement { name: "6" } + ListElement { name: "7" } + ListElement { name: "8" } + ListElement { name: "9" } + } + + Component { + id: verticalDelegate + FocusScope { + id: root + width: 50; height: 50; + Keys.onDigit9Pressed: console.log("Error - " + name) + Rectangle { + focus: true + Keys.onDigit9Pressed: console.log(name) + width: 50; height: 50; + color: root.ListView.isCurrentItem?"red":"green" + Text { text: name; anchors.centerIn: parent } + } + } + } + + ListView { + width: 800; height: 50; orientation: "Horizontal" + focus: true + model: model + delegate: verticalDelegate + preferredHighlightBegin: 100 + preferredHighlightEnd: 100 + highlightRangeMode: "StrictlyEnforceRange" + } + + + Text { + y: 100; x: 50 + text: "Currently selected element should be red\nPressing \"9\" should print the number of the currently selected item\nBe sure to scroll all the way to the right, pause, and then all the way to the left." + } +} diff --git a/tests/auto/declarative/qdeclarativefocusscope/data/test4.qml b/tests/auto/declarative/qdeclarativefocusscope/data/test4.qml new file mode 100644 index 00000000..7192dee6 --- /dev/null +++ b/tests/auto/declarative/qdeclarativefocusscope/data/test4.qml @@ -0,0 +1,76 @@ +import QtQuick 1.0 + +Rectangle { + color: "white" + width: 800 + height: 600 + + Keys.onDigit9Pressed: console.log("Error - Root") + + FocusScope { + id: myScope + + Keys.onDigit9Pressed: console.log("Error - FocusScope") + + Rectangle { + objectName: "item0" + height: 120 + width: 420 + + color: "transparent" + border.width: 5 + border.color: myScope.activeFocus?"blue":"black" + + Rectangle { + id: item1; objectName: "item1" + x: 10; y: 10 + width: 100; height: 100; color: "green" + border.width: 5 + border.color: activeFocus?"blue":"black" + Keys.onDigit9Pressed: console.log("Error - Top Left"); + KeyNavigation.right: item2 + focus: true + + Rectangle { + width: 50; height: 50; anchors.centerIn: parent + color: parent.activeFocus?"red":"transparent" + } + } + + Rectangle { + id: item2; objectName: "item2" + x: 310; y: 10 + width: 100; height: 100; color: "green" + border.width: 5 + border.color: activeFocus?"blue":"black" + KeyNavigation.left: item1 + Keys.onDigit9Pressed: console.log("Error - Top Right"); + + Rectangle { + width: 50; height: 50; anchors.centerIn: parent + color: parent.activeFocus?"red":"transparent" + } + } + } + KeyNavigation.down: item3 + } + + Text { x:100; y:170; text: "There should be no blue borders, or red squares.\nPressing \"9\" should do nothing.\nArrow keys should have no effect." } + + Rectangle { + id: item3; objectName: "item3" + x: 10; y: 300 + width: 100; height: 100; color: "green" + border.width: 5 + border.color: activeFocus?"blue":"black" + + Keys.onDigit9Pressed: console.log("Error - Bottom Left"); + KeyNavigation.up: myScope + + Rectangle { + width: 50; height: 50; anchors.centerIn: parent + color: parent.activeFocus?"red":"transparent" + } + } + +} diff --git a/tests/auto/declarative/qdeclarativefocusscope/data/test5.qml b/tests/auto/declarative/qdeclarativefocusscope/data/test5.qml new file mode 100644 index 00000000..01dada5d --- /dev/null +++ b/tests/auto/declarative/qdeclarativefocusscope/data/test5.qml @@ -0,0 +1,84 @@ +import QtQuick 1.0 + +Rectangle { + color: "white" + width: 800 + height: 600 + + Keys.onReturnPressed: console.log("Error - Root") + + FocusScope { + id: myScope + objectName: "item0" + focus: true + + Keys.onReturnPressed: console.log("Error - FocusScope") + + Rectangle { + height: 120 + width: 420 + + color: "transparent" + border.width: 5 + border.color: myScope.activeFocus?"blue":"black" + + Rectangle { + x: 10; y: 10 + width: 100; height: 100; color: "green" + border.width: 5 + border.color: item1.activeFocus?"blue":"black" + } + + TextEdit { + id: item1; objectName: "item1" + x: 20; y: 20 + width: 90; height: 90 + color: "white" + font.pixelSize: 20 + Keys.onReturnPressed: console.log("Top Left"); + KeyNavigation.right: item2 + focus: true + wrapMode: TextEdit.WordWrap + text: "Box 1" + } + + Rectangle { + id: item2; objectName: "item2" + x: 310; y: 10 + width: 100; height: 100; color: "green" + border.width: 5 + border.color: activeFocus?"blue":"black" + KeyNavigation.left: item1 + Keys.onReturnPressed: console.log("Top Right"); + + Rectangle { + width: 50; height: 50; anchors.centerIn: parent + color: parent.activeFocus?"red":"transparent" + } + } + } + KeyNavigation.down: item3 + } + + Text { x:100; y:170; text: "Blue border indicates scoped focus\nBlack border indicates NOT scoped focus\nRed box or flashing cursor indicates active focus\nUse arrow keys to navigate\nPress Ctrl-Return to print currently focused item" } + + Rectangle { + x: 10; y: 300 + width: 100; height: 100; color: "green" + border.width: 5 + border.color: item3.activeFocus?"blue":"black" + } + + TextEdit { + id: item3; objectName: "item3" + x: 20; y: 310 + width: 90; height: 90 + color: "white" + font.pixelSize: 20 + text: "Box 3" + + Keys.onReturnPressed: console.log("Bottom Left"); + KeyNavigation.up: myScope + wrapMode: TextEdit.WordWrap + } +} diff --git a/tests/auto/declarative/qdeclarativefocusscope/qdeclarativefocusscope.pro b/tests/auto/declarative/qdeclarativefocusscope/qdeclarativefocusscope.pro new file mode 100644 index 00000000..eab983ff --- /dev/null +++ b/tests/auto/declarative/qdeclarativefocusscope/qdeclarativefocusscope.pro @@ -0,0 +1,13 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +SOURCES += tst_qdeclarativefocusscope.cpp +macx:CONFIG -= app_bundle + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + diff --git a/tests/auto/declarative/qdeclarativefocusscope/tst_qdeclarativefocusscope.cpp b/tests/auto/declarative/qdeclarativefocusscope/tst_qdeclarativefocusscope.cpp new file mode 100644 index 00000000..78aa5a9e --- /dev/null +++ b/tests/auto/declarative/qdeclarativefocusscope/tst_qdeclarativefocusscope.cpp @@ -0,0 +1,546 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_qdeclarativefocusscope : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativefocusscope() {} + + template + T *findItem(QGraphicsObject *parent, const QString &id); + +private slots: + void basic(); + void nested(); + void noFocus(); + void textEdit(); + void forceFocus(); + void noParentFocus(); + void signalEmission(); + void qtBug13380(); + void forceActiveFocus(); +}; + +/* + Find an item with the specified id. +*/ +template +T *tst_qdeclarativefocusscope::findItem(QGraphicsObject *parent, const QString &objectName) +{ + const QMetaObject &mo = T::staticMetaObject; + QList children = parent->childItems(); + for (int i = 0; i < children.count(); ++i) { + QDeclarativeItem *item = qobject_cast(children.at(i)->toGraphicsObject()); + if (item) { + if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName)) { + return static_cast(item); + } + item = findItem(item, objectName); + if (item) + return static_cast(item); + } + } + return 0; +} + +void tst_qdeclarativefocusscope::basic() +{ + QDeclarativeView *view = new QDeclarativeView; + view->setSource(QUrl::fromLocalFile(SRCDIR "/data/test.qml")); + + QDeclarativeFocusScope *item0 = findItem(view->rootObject(), QLatin1String("item0")); + QDeclarativeRectangle *item1 = findItem(view->rootObject(), QLatin1String("item1")); + QDeclarativeRectangle *item2 = findItem(view->rootObject(), QLatin1String("item2")); + QDeclarativeRectangle *item3 = findItem(view->rootObject(), QLatin1String("item3")); + QVERIFY(item0 != 0); + QVERIFY(item1 != 0); + QVERIFY(item2 != 0); + QVERIFY(item3 != 0); + + view->show(); + qApp->setActiveWindow(view); + qApp->processEvents(); + +#ifdef Q_WS_X11 + // to be safe and avoid failing setFocus with window managers + qt_x11_wait_for_window_manager(view); +#endif + + QVERIFY(view->hasFocus()); + QVERIFY(view->scene()->hasFocus()); + QVERIFY(item0->hasActiveFocus() == true); + QVERIFY(item1->hasActiveFocus() == true); + QVERIFY(item2->hasActiveFocus() == false); + QVERIFY(item3->hasActiveFocus() == false); + + QTest::keyClick(view, Qt::Key_Right); + QVERIFY(item0->hasActiveFocus() == true); + QVERIFY(item1->hasActiveFocus() == false); + QVERIFY(item2->hasActiveFocus() == true); + QVERIFY(item3->hasActiveFocus() == false); + + QTest::keyClick(view, Qt::Key_Down); + QVERIFY(item0->hasActiveFocus() == false); + QVERIFY(item1->hasActiveFocus() == false); + QVERIFY(item2->hasActiveFocus() == false); + QVERIFY(item3->hasActiveFocus() == true); + + delete view; +} + +void tst_qdeclarativefocusscope::nested() +{ + QDeclarativeView *view = new QDeclarativeView; + view->setSource(QUrl::fromLocalFile(SRCDIR "/data/test2.qml")); + + QDeclarativeFocusScope *item1 = findItem(view->rootObject(), QLatin1String("item1")); + QDeclarativeFocusScope *item2 = findItem(view->rootObject(), QLatin1String("item2")); + QDeclarativeFocusScope *item3 = findItem(view->rootObject(), QLatin1String("item3")); + QDeclarativeFocusScope *item4 = findItem(view->rootObject(), QLatin1String("item4")); + QDeclarativeFocusScope *item5 = findItem(view->rootObject(), QLatin1String("item5")); + QVERIFY(item1 != 0); + QVERIFY(item2 != 0); + QVERIFY(item3 != 0); + QVERIFY(item4 != 0); + QVERIFY(item5 != 0); + + view->show(); + qApp->setActiveWindow(view); + qApp->processEvents(); + +#ifdef Q_WS_X11 + // to be safe and avoid failing setFocus with window managers + qt_x11_wait_for_window_manager(view); +#endif + + QVERIFY(view->hasFocus()); + QVERIFY(view->scene()->hasFocus()); + + QVERIFY(item1->hasActiveFocus() == true); + QVERIFY(item2->hasActiveFocus() == true); + QVERIFY(item3->hasActiveFocus() == true); + QVERIFY(item4->hasActiveFocus() == true); + QVERIFY(item5->hasActiveFocus() == true); + delete view; +} + +void tst_qdeclarativefocusscope::noFocus() +{ + QDeclarativeView *view = new QDeclarativeView; + view->setSource(QUrl::fromLocalFile(SRCDIR "/data/test4.qml")); + + QDeclarativeRectangle *item0 = findItem(view->rootObject(), QLatin1String("item0")); + QDeclarativeRectangle *item1 = findItem(view->rootObject(), QLatin1String("item1")); + QDeclarativeRectangle *item2 = findItem(view->rootObject(), QLatin1String("item2")); + QDeclarativeRectangle *item3 = findItem(view->rootObject(), QLatin1String("item3")); + QVERIFY(item0 != 0); + QVERIFY(item1 != 0); + QVERIFY(item2 != 0); + QVERIFY(item3 != 0); + + view->show(); + qApp->setActiveWindow(view); + qApp->processEvents(); + +#ifdef Q_WS_X11 + // to be safe and avoid failing setFocus with window managers + qt_x11_wait_for_window_manager(view); +#endif + + QVERIFY(view->hasFocus()); + QVERIFY(view->scene()->hasFocus()); + QVERIFY(item0->hasActiveFocus() == false); + QVERIFY(item1->hasActiveFocus() == false); + QVERIFY(item2->hasActiveFocus() == false); + QVERIFY(item3->hasActiveFocus() == false); + + QTest::keyClick(view, Qt::Key_Right); + QVERIFY(item0->hasActiveFocus() == false); + QVERIFY(item1->hasActiveFocus() == false); + QVERIFY(item2->hasActiveFocus() == false); + QVERIFY(item3->hasActiveFocus() == false); + + QTest::keyClick(view, Qt::Key_Down); + QVERIFY(item0->hasActiveFocus() == false); + QVERIFY(item1->hasActiveFocus() == false); + QVERIFY(item2->hasActiveFocus() == false); + QVERIFY(item3->hasActiveFocus() == false); + + delete view; +} + +void tst_qdeclarativefocusscope::textEdit() +{ + QDeclarativeView *view = new QDeclarativeView; + view->setSource(QUrl::fromLocalFile(SRCDIR "/data/test5.qml")); + + QDeclarativeFocusScope *item0 = findItem(view->rootObject(), QLatin1String("item0")); + QDeclarativeTextEdit *item1 = findItem(view->rootObject(), QLatin1String("item1")); + QDeclarativeRectangle *item2 = findItem(view->rootObject(), QLatin1String("item2")); + QDeclarativeTextEdit *item3 = findItem(view->rootObject(), QLatin1String("item3")); + QVERIFY(item0 != 0); + QVERIFY(item1 != 0); + QVERIFY(item2 != 0); + QVERIFY(item3 != 0); + + view->show(); + qApp->setActiveWindow(view); + qApp->processEvents(); + +#ifdef Q_WS_X11 + // to be safe and avoid failing setFocus with window managers + qt_x11_wait_for_window_manager(view); +#endif + + QVERIFY(view->hasFocus()); + QVERIFY(view->scene()->hasFocus()); + QVERIFY(item0->hasActiveFocus() == true); + QVERIFY(item1->hasActiveFocus() == true); + QVERIFY(item2->hasActiveFocus() == false); + QVERIFY(item3->hasActiveFocus() == false); + + QTest::keyClick(view, Qt::Key_Right); + QVERIFY(item0->hasActiveFocus() == true); + QVERIFY(item1->hasActiveFocus() == true); + QVERIFY(item2->hasActiveFocus() == false); + QVERIFY(item3->hasActiveFocus() == false); + + QTest::keyClick(view, Qt::Key_Right); + QTest::keyClick(view, Qt::Key_Right); + QTest::keyClick(view, Qt::Key_Right); + QTest::keyClick(view, Qt::Key_Right); + QTest::keyClick(view, Qt::Key_Right); + QVERIFY(item0->hasActiveFocus() == true); + QVERIFY(item1->hasActiveFocus() == false); + QVERIFY(item2->hasActiveFocus() == true); + QVERIFY(item3->hasActiveFocus() == false); + + QTest::keyClick(view, Qt::Key_Down); + QVERIFY(item0->hasActiveFocus() == false); + QVERIFY(item1->hasActiveFocus() == false); + QVERIFY(item2->hasActiveFocus() == false); + QVERIFY(item3->hasActiveFocus() == true); + + delete view; +} + +void tst_qdeclarativefocusscope::forceFocus() +{ + QDeclarativeView *view = new QDeclarativeView; + view->setSource(QUrl::fromLocalFile(SRCDIR "/data/forcefocus.qml")); + + QDeclarativeFocusScope *item0 = findItem(view->rootObject(), QLatin1String("item0")); + QDeclarativeRectangle *item1 = findItem(view->rootObject(), QLatin1String("item1")); + QDeclarativeRectangle *item2 = findItem(view->rootObject(), QLatin1String("item2")); + QDeclarativeFocusScope *item3 = findItem(view->rootObject(), QLatin1String("item3")); + QDeclarativeRectangle *item4 = findItem(view->rootObject(), QLatin1String("item4")); + QDeclarativeRectangle *item5 = findItem(view->rootObject(), QLatin1String("item5")); + QVERIFY(item0 != 0); + QVERIFY(item1 != 0); + QVERIFY(item2 != 0); + QVERIFY(item3 != 0); + QVERIFY(item4 != 0); + QVERIFY(item5 != 0); + + view->show(); + qApp->setActiveWindow(view); + qApp->processEvents(); + +#ifdef Q_WS_X11 + // to be safe and avoid failing setFocus with window managers + qt_x11_wait_for_window_manager(view); +#endif + + QVERIFY(view->hasFocus()); + QVERIFY(view->scene()->hasFocus()); + QVERIFY(item0->hasActiveFocus() == true); + QVERIFY(item1->hasActiveFocus() == true); + QVERIFY(item2->hasActiveFocus() == false); + QVERIFY(item3->hasActiveFocus() == false); + QVERIFY(item4->hasActiveFocus() == false); + QVERIFY(item5->hasActiveFocus() == false); + + QTest::keyClick(view, Qt::Key_4); + QVERIFY(item0->hasActiveFocus() == true); + QVERIFY(item1->hasActiveFocus() == true); + QVERIFY(item2->hasActiveFocus() == false); + QVERIFY(item3->hasActiveFocus() == false); + QVERIFY(item4->hasActiveFocus() == false); + QVERIFY(item5->hasActiveFocus() == false); + + QTest::keyClick(view, Qt::Key_5); + QVERIFY(item0->hasActiveFocus() == false); + QVERIFY(item1->hasActiveFocus() == false); + QVERIFY(item2->hasActiveFocus() == false); + QVERIFY(item3->hasActiveFocus() == true); + QVERIFY(item4->hasActiveFocus() == false); + QVERIFY(item5->hasActiveFocus() == true); + + delete view; +} + +void tst_qdeclarativefocusscope::noParentFocus() +{ + QDeclarativeView *view = new QDeclarativeView; + view->setSource(QUrl::fromLocalFile(SRCDIR "/data/chain.qml")); + QVERIFY(view->rootObject()); + + QVERIFY(view->rootObject()->property("focus1") == false); + QVERIFY(view->rootObject()->property("focus2") == false); + QVERIFY(view->rootObject()->property("focus3") == true); + QVERIFY(view->rootObject()->property("focus4") == true); + QVERIFY(view->rootObject()->property("focus5") == true); + + delete view; +} + +void tst_qdeclarativefocusscope::signalEmission() +{ + QDeclarativeView *view = new QDeclarativeView; + view->setSource(QUrl::fromLocalFile(SRCDIR "/data/signalEmission.qml")); + + QDeclarativeRectangle *item1 = findItem(view->rootObject(), QLatin1String("item1")); + QDeclarativeRectangle *item2 = findItem(view->rootObject(), QLatin1String("item2")); + QDeclarativeRectangle *item3 = findItem(view->rootObject(), QLatin1String("item3")); + QDeclarativeRectangle *item4 = findItem(view->rootObject(), QLatin1String("item4")); + QVERIFY(item1 != 0); + QVERIFY(item2 != 0); + QVERIFY(item3 != 0); + QVERIFY(item4 != 0); + + view->show(); + qApp->setActiveWindow(view); + qApp->processEvents(); + +#ifdef Q_WS_X11 + // to be safe and avoid failing setFocus with window managers + qt_x11_wait_for_window_manager(view); +#endif + + QVariant blue(QColor("blue")); + QVariant red(QColor("red")); + + QVERIFY(view->hasFocus()); + QVERIFY(view->scene()->hasFocus()); + item1->setFocus(true); + QCOMPARE(item1->property("color"), red); + QCOMPARE(item2->property("color"), blue); + QCOMPARE(item3->property("color"), blue); + QCOMPARE(item4->property("color"), blue); + + item2->setFocus(true); + QCOMPARE(item1->property("color"), blue); + QCOMPARE(item2->property("color"), red); + QCOMPARE(item3->property("color"), blue); + QCOMPARE(item4->property("color"), blue); + + item3->setFocus(true); + QCOMPARE(item1->property("color"), blue); + QCOMPARE(item2->property("color"), red); + QCOMPARE(item3->property("color"), red); + QCOMPARE(item4->property("color"), blue); + + item4->setFocus(true); + QCOMPARE(item1->property("color"), blue); + QCOMPARE(item2->property("color"), red); + QCOMPARE(item3->property("color"), blue); + QCOMPARE(item4->property("color"), red); + + item4->setFocus(false); + QCOMPARE(item1->property("color"), blue); + QCOMPARE(item2->property("color"), red); + QCOMPARE(item3->property("color"), blue); + QCOMPARE(item4->property("color"), blue); + + delete view; +} + +void tst_qdeclarativefocusscope::qtBug13380() +{ + QDeclarativeView *view = new QDeclarativeView; + view->setSource(QUrl::fromLocalFile(SRCDIR "/data/qtBug13380.qml")); + + view->show(); + QVERIFY(view->rootObject()); + qApp->setActiveWindow(view); + qApp->processEvents(); + +#ifdef Q_WS_X11 + // to be safe and avoid failing setFocus with window managers + qt_x11_wait_for_window_manager(view); +#endif + + QVERIFY(view->hasFocus()); + QVERIFY(view->scene()->hasFocus()); + QVERIFY(view->rootObject()->property("noFocus").toBool()); + + view->rootObject()->setProperty("showRect", true); + QVERIFY(view->rootObject()->property("noFocus").toBool()); + + delete view; +} + +void tst_qdeclarativefocusscope::forceActiveFocus() +{ + QDeclarativeView *view = new QDeclarativeView; + view->setSource(QUrl::fromLocalFile(SRCDIR "/data/forceActiveFocus.qml")); + + QGraphicsObject *rootObject = view->rootObject(); + QVERIFY(rootObject); + + QDeclarativeItem *scope = findItem(rootObject, QLatin1String("scope")); + QDeclarativeItem *itemA1 = findItem(rootObject, QLatin1String("item-a1")); + QDeclarativeItem *scopeA = findItem(rootObject, QLatin1String("scope-a")); + QDeclarativeItem *itemA2 = findItem(rootObject, QLatin1String("item-a2")); + QDeclarativeItem *itemB1 = findItem(rootObject, QLatin1String("item-b1")); + QDeclarativeItem *scopeB = findItem(rootObject, QLatin1String("scope-b")); + QDeclarativeItem *itemB2 = findItem(rootObject, QLatin1String("item-b2")); + + QVERIFY(scope); + QVERIFY(itemA1); + QVERIFY(scopeA); + QVERIFY(itemA2); + QVERIFY(itemB1); + QVERIFY(scopeB); + QVERIFY(itemB2); + + QSignalSpy rootSpy(rootObject, SIGNAL(activeFocusChanged(bool))); + QSignalSpy scopeSpy(scope, SIGNAL(activeFocusChanged(bool))); + QSignalSpy scopeASpy(scopeA, SIGNAL(activeFocusChanged(bool))); + QSignalSpy scopeBSpy(scopeB, SIGNAL(activeFocusChanged(bool))); + + // First, walk the focus from item-a1 down to item-a2 and back again + itemA1->forceActiveFocus(); + QVERIFY(itemA1->hasActiveFocus()); + QCOMPARE(rootSpy.count(), 1); + QCOMPARE(scopeSpy.count(), 1); + + scopeA->forceActiveFocus(); + QVERIFY(!itemA1->hasActiveFocus()); + QVERIFY(scopeA->hasActiveFocus()); + QCOMPARE(scopeASpy.count(), 1); + QCOMPARE(rootSpy.count(), 1); + QCOMPARE(scopeSpy.count(), 1); + + itemA2->forceActiveFocus(); + QVERIFY(!itemA1->hasActiveFocus()); + QVERIFY(itemA2->hasActiveFocus()); + QVERIFY(scopeA->hasActiveFocus()); + QCOMPARE(scopeASpy.count(), 1); + QCOMPARE(rootSpy.count(), 1); + QCOMPARE(scopeSpy.count(), 1); + + scopeA->forceActiveFocus(); + QVERIFY(!itemA1->hasActiveFocus()); + QVERIFY(itemA2->hasActiveFocus()); + QVERIFY(scopeA->hasActiveFocus()); + QCOMPARE(scopeASpy.count(), 1); + QCOMPARE(rootSpy.count(), 1); + QCOMPARE(scopeSpy.count(), 1); + + itemA1->forceActiveFocus(); + QVERIFY(itemA1->hasActiveFocus()); + QVERIFY(!scopeA->hasActiveFocus()); + QVERIFY(!itemA2->hasActiveFocus()); + QCOMPARE(scopeASpy.count(), 2); + QCOMPARE(rootSpy.count(), 1); + QCOMPARE(scopeSpy.count(), 1); + + // Then jump back and forth between branch 'a' and 'b' + itemB1->forceActiveFocus(); + QVERIFY(itemB1->hasActiveFocus()); + QCOMPARE(rootSpy.count(), 1); + QCOMPARE(scopeSpy.count(), 1); + + scopeA->forceActiveFocus(); + QVERIFY(!itemA1->hasActiveFocus()); + QVERIFY(!itemB1->hasActiveFocus()); + QVERIFY(scopeA->hasActiveFocus()); + QCOMPARE(scopeASpy.count(), 3); + QCOMPARE(rootSpy.count(), 1); + QCOMPARE(scopeSpy.count(), 1); + + scopeB->forceActiveFocus(); + QVERIFY(!scopeA->hasActiveFocus()); + QVERIFY(!itemB1->hasActiveFocus()); + QVERIFY(scopeB->hasActiveFocus()); + QCOMPARE(scopeASpy.count(), 4); + QCOMPARE(scopeBSpy.count(), 1); + QCOMPARE(rootSpy.count(), 1); + QCOMPARE(scopeSpy.count(), 1); + + itemA2->forceActiveFocus(); + QVERIFY(!scopeB->hasActiveFocus()); + QVERIFY(itemA2->hasActiveFocus()); + QCOMPARE(scopeASpy.count(), 5); + QCOMPARE(scopeBSpy.count(), 2); + QCOMPARE(rootSpy.count(), 1); + QCOMPARE(scopeSpy.count(), 1); + + itemB2->forceActiveFocus(); + QVERIFY(!itemA2->hasActiveFocus()); + QVERIFY(itemB2->hasActiveFocus()); + QCOMPARE(scopeASpy.count(), 6); + QCOMPARE(scopeBSpy.count(), 3); + QCOMPARE(rootSpy.count(), 1); + QCOMPARE(scopeSpy.count(), 1); + + delete view; +} + +QTEST_MAIN(tst_qdeclarativefocusscope) + +#include "tst_qdeclarativefocusscope.moc" diff --git a/tests/auto/declarative/qdeclarativefolderlistmodel/data/basic.qml b/tests/auto/declarative/qdeclarativefolderlistmodel/data/basic.qml new file mode 100644 index 00000000..2c4977d0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativefolderlistmodel/data/basic.qml @@ -0,0 +1,5 @@ +import Qt.labs.folderlistmodel 1.0 + +FolderListModel { + nameFilters: [ "*.qml" ] +} diff --git a/tests/auto/declarative/qdeclarativefolderlistmodel/data/dummy.qml b/tests/auto/declarative/qdeclarativefolderlistmodel/data/dummy.qml new file mode 100644 index 00000000..609638be --- /dev/null +++ b/tests/auto/declarative/qdeclarativefolderlistmodel/data/dummy.qml @@ -0,0 +1 @@ +// This file is not used, it is just content for QDirModel diff --git a/tests/auto/declarative/qdeclarativefolderlistmodel/qdeclarativefolderlistmodel.pro b/tests/auto/declarative/qdeclarativefolderlistmodel/qdeclarativefolderlistmodel.pro new file mode 100644 index 00000000..b7e5e5fc --- /dev/null +++ b/tests/auto/declarative/qdeclarativefolderlistmodel/qdeclarativefolderlistmodel.pro @@ -0,0 +1,15 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativefolderlistmodel.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test diff --git a/tests/auto/declarative/qdeclarativefolderlistmodel/tst_qdeclarativefolderlistmodel.cpp b/tests/auto/declarative/qdeclarativefolderlistmodel/tst_qdeclarativefolderlistmodel.cpp new file mode 100644 index 00000000..bfccc8af --- /dev/null +++ b/tests/auto/declarative/qdeclarativefolderlistmodel/tst_qdeclarativefolderlistmodel.cpp @@ -0,0 +1,152 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include "../../../shared/util.h" +#include +#include +#include +#include +#include +#include + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +// From qdeclarastivefolderlistmodel.h +const int FileNameRole = Qt::UserRole+1; +const int FilePathRole = Qt::UserRole+2; +enum SortField { Unsorted, Name, Time, Size, Type }; + +class tst_qdeclarativefolderlistmodel : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativefolderlistmodel() : removeStart(0), removeEnd(0) {} + +public slots: + void removed(const QModelIndex &, int start, int end) { + removeStart = start; + removeEnd = end; + } + +private slots: + void basicProperties(); + void refresh(); + +private: + void checkNoErrors(const QDeclarativeComponent& component); + QDeclarativeEngine engine; + + int removeStart; + int removeEnd; +}; + +void tst_qdeclarativefolderlistmodel::checkNoErrors(const QDeclarativeComponent& component) +{ + // Wait until the component is ready + QTRY_VERIFY(component.isReady() || component.isError()); + + if (component.isError()) { + QList errors = component.errors(); + for (int ii = 0; ii < errors.count(); ++ii) { + const QDeclarativeError &error = errors.at(ii); + QByteArray errorStr = QByteArray::number(error.line()) + ":" + + QByteArray::number(error.column()) + ":" + + error.description().toUtf8(); + qWarning() << errorStr; + } + } + QVERIFY(!component.isError()); +} + +void tst_qdeclarativefolderlistmodel::basicProperties() +{ + QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/basic.qml")); + checkNoErrors(component); + + QAbstractListModel *flm = qobject_cast(component.create()); + QVERIFY(flm != 0); + + flm->setProperty("folder",QUrl::fromLocalFile(SRCDIR "/data")); + QTRY_COMPARE(flm->property("count").toInt(),2); // wait for refresh + QCOMPARE(flm->property("folder").toUrl(), QUrl::fromLocalFile(SRCDIR "/data")); + QCOMPARE(flm->property("parentFolder").toUrl(), QUrl::fromLocalFile(SRCDIR)); + QCOMPARE(flm->property("sortField").toInt(), int(Name)); + QCOMPARE(flm->property("nameFilters").toStringList(), QStringList() << "*.qml"); + QCOMPARE(flm->property("sortReversed").toBool(), false); + QCOMPARE(flm->property("showDirs").toBool(), true); + QCOMPARE(flm->property("showDotAndDotDot").toBool(), false); + QCOMPARE(flm->property("showOnlyReadable").toBool(), false); + QCOMPARE(flm->data(flm->index(0),FileNameRole).toString(), QLatin1String("basic.qml")); + QCOMPARE(flm->data(flm->index(1),FileNameRole).toString(), QLatin1String("dummy.qml")); + + flm->setProperty("folder",QUrl::fromLocalFile("")); + QCOMPARE(flm->property("folder").toUrl(), QUrl::fromLocalFile("")); +} + +void tst_qdeclarativefolderlistmodel::refresh() +{ + QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/basic.qml")); + checkNoErrors(component); + + QAbstractListModel *flm = qobject_cast(component.create()); + QVERIFY(flm != 0); + + flm->setProperty("folder",QUrl::fromLocalFile(SRCDIR "/data")); + QTRY_COMPARE(flm->property("count").toInt(),2); // wait for refresh + + int count = flm->rowCount(); + + connect(flm, SIGNAL(rowsRemoved(const QModelIndex&,int,int)), + this, SLOT(removed(const QModelIndex&,int,int))); + + flm->setProperty("sortReversed", true); + + QCOMPARE(removeStart, 0); + QCOMPARE(removeEnd, count-1); +} + +QTEST_MAIN(tst_qdeclarativefolderlistmodel) + +#include "tst_qdeclarativefolderlistmodel.moc" diff --git a/tests/auto/declarative/qdeclarativefontloader/data/daniel.ttf b/tests/auto/declarative/qdeclarativefontloader/data/daniel.ttf new file mode 100644 index 00000000..aae50d50 Binary files /dev/null and b/tests/auto/declarative/qdeclarativefontloader/data/daniel.ttf differ diff --git a/tests/auto/declarative/qdeclarativefontloader/data/dummy.ttf b/tests/auto/declarative/qdeclarativefontloader/data/dummy.ttf new file mode 100644 index 00000000..e69de29b diff --git a/tests/auto/declarative/qdeclarativefontloader/data/tarzeau_ocr_a.ttf b/tests/auto/declarative/qdeclarativefontloader/data/tarzeau_ocr_a.ttf new file mode 100644 index 00000000..cf93f965 Binary files /dev/null and b/tests/auto/declarative/qdeclarativefontloader/data/tarzeau_ocr_a.ttf differ diff --git a/tests/auto/declarative/qdeclarativefontloader/qdeclarativefontloader.pro b/tests/auto/declarative/qdeclarativefontloader/qdeclarativefontloader.pro new file mode 100644 index 00000000..357268b2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativefontloader/qdeclarativefontloader.pro @@ -0,0 +1,17 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative gui network +macx:CONFIG -= app_bundle + +HEADERS += ../shared/testhttpserver.h +SOURCES += tst_qdeclarativefontloader.cpp ../shared/testhttpserver.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativefontloader/tst_qdeclarativefontloader.cpp b/tests/auto/declarative/qdeclarativefontloader/tst_qdeclarativefontloader.cpp new file mode 100644 index 00000000..4d024c78 --- /dev/null +++ b/tests/auto/declarative/qdeclarativefontloader/tst_qdeclarativefontloader.cpp @@ -0,0 +1,230 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include "../../../shared/util.h" +#include "../shared/testhttpserver.h" + +#define SERVER_PORT 14448 + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_qdeclarativefontloader : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativefontloader(); + +private slots: + void init(); + void noFont(); + void namedFont(); + void localFont(); + void failLocalFont(); + void webFont(); + void redirWebFont(); + void failWebFont(); + void changeFont(); + +private: + QDeclarativeEngine engine; + TestHTTPServer server; +}; + +tst_qdeclarativefontloader::tst_qdeclarativefontloader() : + server(SERVER_PORT) +{ + server.serveDirectory(SRCDIR "/data"); +} + +void tst_qdeclarativefontloader::init() +{ + QVERIFY(server.isValid()); +} + +void tst_qdeclarativefontloader::noFont() +{ + QString componentStr = "import QtQuick 1.0\nFontLoader { }"; + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeFontLoader *fontObject = qobject_cast(component.create()); + + QVERIFY(fontObject != 0); + QCOMPARE(fontObject->name(), QString("")); + QCOMPARE(fontObject->source(), QUrl("")); + QTRY_VERIFY(fontObject->status() == QDeclarativeFontLoader::Null); + + delete fontObject; +} + +void tst_qdeclarativefontloader::namedFont() +{ + QString componentStr = "import QtQuick 1.0\nFontLoader { name: \"Helvetica\" }"; + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeFontLoader *fontObject = qobject_cast(component.create()); + + QVERIFY(fontObject != 0); + QCOMPARE(fontObject->source(), QUrl("")); + QCOMPARE(fontObject->name(), QString("Helvetica")); + QTRY_VERIFY(fontObject->status() == QDeclarativeFontLoader::Ready); +} + +void tst_qdeclarativefontloader::localFont() +{ + QString componentStr = "import QtQuick 1.0\nFontLoader { source: \"" SRCDIR "/data/tarzeau_ocr_a.ttf\" }"; + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeFontLoader *fontObject = qobject_cast(component.create()); + + QVERIFY(fontObject != 0); + QVERIFY(fontObject->source() != QUrl("")); + QTRY_COMPARE(fontObject->name(), QString("OCRA")); + QTRY_VERIFY(fontObject->status() == QDeclarativeFontLoader::Ready); +} + +void tst_qdeclarativefontloader::failLocalFont() +{ + QString componentStr = "import QtQuick 1.0\nFontLoader { source: \"" + QUrl::fromLocalFile(SRCDIR "/data/dummy.ttf").toString() + "\" }"; + QTest::ignoreMessage(QtWarningMsg, QString("file::2:1: QML FontLoader: Cannot load font: \"" + QUrl::fromLocalFile(SRCDIR "/data/dummy.ttf").toString() + "\"").toUtf8().constData()); + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeFontLoader *fontObject = qobject_cast(component.create()); + + QVERIFY(fontObject != 0); + QVERIFY(fontObject->source() != QUrl("")); + QTRY_COMPARE(fontObject->name(), QString("")); + QTRY_VERIFY(fontObject->status() == QDeclarativeFontLoader::Error); +} + +void tst_qdeclarativefontloader::webFont() +{ + QString componentStr = "import QtQuick 1.0\nFontLoader { source: \"http://localhost:14448/tarzeau_ocr_a.ttf\" }"; + QDeclarativeComponent component(&engine); + + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeFontLoader *fontObject = qobject_cast(component.create()); + + QVERIFY(fontObject != 0); + QVERIFY(fontObject->source() != QUrl("")); + QTRY_COMPARE(fontObject->name(), QString("OCRA")); + QTRY_VERIFY(fontObject->status() == QDeclarativeFontLoader::Ready); +} + +void tst_qdeclarativefontloader::redirWebFont() +{ + server.addRedirect("olddir/oldname.ttf","../tarzeau_ocr_a.ttf"); + + QString componentStr = "import QtQuick 1.0\nFontLoader { source: \"http://localhost:14448/olddir/oldname.ttf\" }"; + QDeclarativeComponent component(&engine); + + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeFontLoader *fontObject = qobject_cast(component.create()); + + QVERIFY(fontObject != 0); + QVERIFY(fontObject->source() != QUrl("")); + QTRY_COMPARE(fontObject->name(), QString("OCRA")); + QTRY_VERIFY(fontObject->status() == QDeclarativeFontLoader::Ready); +} + +void tst_qdeclarativefontloader::failWebFont() +{ + QString componentStr = "import QtQuick 1.0\nFontLoader { source: \"http://localhost:14448/nonexist.ttf\" }"; + QTest::ignoreMessage(QtWarningMsg, "file::2:1: QML FontLoader: Cannot load font: \"http://localhost:14448/nonexist.ttf\""); + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeFontLoader *fontObject = qobject_cast(component.create()); + + QVERIFY(fontObject != 0); + QVERIFY(fontObject->source() != QUrl("")); + QTRY_COMPARE(fontObject->name(), QString("")); + QTRY_VERIFY(fontObject->status() == QDeclarativeFontLoader::Error); +} + +void tst_qdeclarativefontloader::changeFont() +{ + QString componentStr = "import QtQuick 1.0\nFontLoader { source: font }"; + QDeclarativeContext *ctxt = engine.rootContext(); + ctxt->setContextProperty("font", QUrl::fromLocalFile(SRCDIR "/data/tarzeau_ocr_a.ttf")); + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeFontLoader *fontObject = qobject_cast(component.create()); + + QVERIFY(fontObject != 0); + + QSignalSpy nameSpy(fontObject, SIGNAL(nameChanged())); + QSignalSpy statusSpy(fontObject, SIGNAL(statusChanged())); + + QTRY_VERIFY(fontObject->status() == QDeclarativeFontLoader::Ready); + QCOMPARE(nameSpy.count(), 0); + QCOMPARE(statusSpy.count(), 0); + QTRY_COMPARE(fontObject->name(), QString("OCRA")); + + ctxt->setContextProperty("font", "http://localhost:14448/daniel.ttf"); + QTRY_VERIFY(fontObject->status() == QDeclarativeFontLoader::Loading); + QTRY_VERIFY(fontObject->status() == QDeclarativeFontLoader::Ready); + QCOMPARE(nameSpy.count(), 1); + QCOMPARE(statusSpy.count(), 2); + QTRY_COMPARE(fontObject->name(), QString("Daniel")); + + ctxt->setContextProperty("font", QUrl::fromLocalFile(SRCDIR "/data/tarzeau_ocr_a.ttf")); + QTRY_VERIFY(fontObject->status() == QDeclarativeFontLoader::Ready); + QCOMPARE(nameSpy.count(), 2); + QCOMPARE(statusSpy.count(), 2); + QTRY_COMPARE(fontObject->name(), QString("OCRA")); + + ctxt->setContextProperty("font", "http://localhost:14448/daniel.ttf"); + QTRY_VERIFY(fontObject->status() == QDeclarativeFontLoader::Ready); + QCOMPARE(nameSpy.count(), 3); + QCOMPARE(statusSpy.count(), 2); + QTRY_COMPARE(fontObject->name(), QString("Daniel")); +} + +QTEST_MAIN(tst_qdeclarativefontloader) + +#include "tst_qdeclarativefontloader.moc" diff --git a/tests/auto/declarative/qdeclarativegridview/data/attachedSignals.qml b/tests/auto/declarative/qdeclarativegridview/data/attachedSignals.qml new file mode 100644 index 00000000..d527e9d2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativegridview/data/attachedSignals.qml @@ -0,0 +1,27 @@ +import QtQuick 1.0 + +GridView { + id: view + width: 240; height: 320 + + property variant addedDelegates: [] + property int removedDelegateCount + + model: testModel + + cellWidth: delegateWidth; cellHeight: delegateHeight + + delegate: Rectangle { + width: delegateWidth; height: delegateHeight + border.width: 1 + GridView.onAdd: { + var obj = GridView.view.addedDelegates + obj.push(model.name) + GridView.view.addedDelegates = obj + } + GridView.onRemove: { + view.removedDelegateCount += 1 + } + } +} + diff --git a/tests/auto/declarative/qdeclarativegridview/data/displaygrid.qml b/tests/auto/declarative/qdeclarativegridview/data/displaygrid.qml new file mode 100644 index 00000000..93f39ffd --- /dev/null +++ b/tests/auto/declarative/qdeclarativegridview/data/displaygrid.qml @@ -0,0 +1,39 @@ +import QtQuick 1.0 + +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 { + y: 20 + id: displayText + objectName: "displayText" + text: display + } + color: GridView.isCurrentItem ? "lightsteelblue" : "white" + } + } + ] + GridView { + id: grid + objectName: "grid" + width: 240 + height: 320 + cellWidth: 80 + cellHeight: 60 + model: testModel + delegate: myDelegate + } +} diff --git a/tests/auto/declarative/qdeclarativegridview/data/footer.qml b/tests/auto/declarative/qdeclarativegridview/data/footer.qml new file mode 100644 index 00000000..b41e2ac0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativegridview/data/footer.qml @@ -0,0 +1,40 @@ +import QtQuick 1.0 + +Rectangle { + function changeFooter() { + grid.footer = footer2 + } + width: 240 + height: 320 + color: "#ffffff" + Component { + id: myDelegate + Rectangle { + id: wrapper + objectName: "wrapper" + width: 80 + height: 60 + border.color: "blue" + Text { + text: index + } + color: GridView.isCurrentItem ? "lightsteelblue" : "white" + } + } + GridView { + id: grid + objectName: "grid" + width: 240 + height: 320 + cellWidth: 80 + cellHeight: 60 + model: testModel + delegate: myDelegate + footer: Text { objectName: "footer"; text: "Footer"; height: 30 } + } + + Component { + id: footer2 + Text { objectName: "footer2"; text: "Footer 2"; height: 20 } + } +} diff --git a/tests/auto/declarative/qdeclarativegridview/data/gridview-enforcerange.qml b/tests/auto/declarative/qdeclarativegridview/data/gridview-enforcerange.qml new file mode 100644 index 00000000..69eaa477 --- /dev/null +++ b/tests/auto/declarative/qdeclarativegridview/data/gridview-enforcerange.qml @@ -0,0 +1,58 @@ +import QtQuick 1.1 + +Rectangle { + width: 240 + height: 320 + color: "#ffffff" + Component { + id: myDelegate + Item { + id: wrapper + objectName: "wrapper" + height: 100 + width: 100 + Text { + text: index + } + Text { + y: 25 + id: textName + objectName: "textName" + text: name + } + Text { + y: 50 + id: textNumber + objectName: "textNumber" + text: number + } + Text { + y: 75 + text: wrapper.y + } + } + } + + Component { + id: myHighlight + Rectangle { + color: "lightsteelblue" + } + } + + GridView { + id: grid + objectName: "grid" + width: 240 + height: 320 + model: testModel + delegate: myDelegate + highlight: myHighlight + flow: (testTopToBottom == true) ? GridView.TopToBottom : GridView.LeftToRight + layoutDirection: (testRightToLeft == true) ? Qt.RightToLeft : Qt.LeftToRight + preferredHighlightBegin: 100 + preferredHighlightEnd: 100 + highlightRangeMode: "StrictlyEnforceRange" + focus: true + } +} diff --git a/tests/auto/declarative/qdeclarativegridview/data/gridview-initCurrent.qml b/tests/auto/declarative/qdeclarativegridview/data/gridview-initCurrent.qml new file mode 100644 index 00000000..421f810f --- /dev/null +++ b/tests/auto/declarative/qdeclarativegridview/data/gridview-initCurrent.qml @@ -0,0 +1,52 @@ +import QtQuick 1.0 + +Rectangle { + property int current: grid.currentIndex + 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: 35 + cellWidth: 80 + cellHeight: 60 + delegate: myDelegate + model: testModel + } +} diff --git a/tests/auto/declarative/qdeclarativegridview/data/gridview-noCurrent.qml b/tests/auto/declarative/qdeclarativegridview/data/gridview-noCurrent.qml new file mode 100644 index 00000000..1189649e --- /dev/null +++ b/tests/auto/declarative/qdeclarativegridview/data/gridview-noCurrent.qml @@ -0,0 +1,52 @@ +import QtQuick 1.0 + +Rectangle { + property int current: grid.currentIndex + 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: -1 + cellWidth: 80 + cellHeight: 60 + delegate: myDelegate + model: testModel + } +} diff --git a/tests/auto/declarative/qdeclarativegridview/data/gridview1.qml b/tests/auto/declarative/qdeclarativegridview/data/gridview1.qml new file mode 100644 index 00000000..a2b0a915 --- /dev/null +++ b/tests/auto/declarative/qdeclarativegridview/data/gridview1.qml @@ -0,0 +1,66 @@ +import QtQuick 1.1 + +Rectangle { + id: root + property int count: grid.count + property bool showHeader: false + property bool showFooter: false + property int added: -1 + property variant removed + + 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.onAdd: root.added = index + GridView.onRemove: root.removed = name + } + }, + Component { + id: headerFooter + Rectangle { width: 30; height: 320; color: "blue" } + } + ] + GridView { + id: grid + objectName: "grid" + width: 240 + height: 320 + cellWidth: 80 + cellHeight: 60 + flow: (testTopToBottom == false) ? GridView.LeftToRight : GridView.TopToBottom + layoutDirection: (testRightToLeft == true) ? Qt.RightToLeft : Qt.LeftToRight + model: testModel + delegate: myDelegate + header: root.showHeader ? headerFooter : null + footer: root.showFooter ? headerFooter : null + } +} diff --git a/tests/auto/declarative/qdeclarativegridview/data/gridview2.qml b/tests/auto/declarative/qdeclarativegridview/data/gridview2.qml new file mode 100644 index 00000000..7559a7ff --- /dev/null +++ b/tests/auto/declarative/qdeclarativegridview/data/gridview2.qml @@ -0,0 +1,26 @@ +import QtQuick 1.0 + +GridView { + anchors.fill: parent + width: 320; height: 200 + cellWidth: 100; cellHeight: 100; cacheBuffer: 200; focus: true + keyNavigationWraps: true; highlightFollowsCurrentItem: false + + model: ListModel { + id: appModel + ListElement { lColor: "red" } + ListElement { lColor: "yellow" } + ListElement { lColor: "green" } + ListElement { lColor: "blue" } + } + + delegate: Item { + width: 100; height: 100 + Rectangle { + color: lColor; x: 4; y: 4 + width: 92; height: 92 + } + } + + highlight: Rectangle { width: 100; height: 100; color: "black" } +} diff --git a/tests/auto/declarative/qdeclarativegridview/data/gridview3.qml b/tests/auto/declarative/qdeclarativegridview/data/gridview3.qml new file mode 100644 index 00000000..ab4ceeb7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativegridview/data/gridview3.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +GridView { + anchors.fill: parent + width: 320; height: 200 +} diff --git a/tests/auto/declarative/qdeclarativegridview/data/header.qml b/tests/auto/declarative/qdeclarativegridview/data/header.qml new file mode 100644 index 00000000..f39da55d --- /dev/null +++ b/tests/auto/declarative/qdeclarativegridview/data/header.qml @@ -0,0 +1,40 @@ +import QtQuick 1.0 + +Rectangle { + function changeHeader() { + grid.header = header2 + } + width: 240 + height: 320 + color: "#ffffff" + Component { + id: myDelegate + Rectangle { + id: wrapper + objectName: "wrapper" + width: 80 + height: 60 + border.color: "blue" + Text { + text: index + } + color: GridView.isCurrentItem ? "lightsteelblue" : "white" + } + } + GridView { + id: grid + objectName: "grid" + width: 240 + height: 320 + cellWidth: 80 + cellHeight: 60 + model: testModel + delegate: myDelegate + header: Text { objectName: "header"; text: "Header"; height: 30 } + } + + Component { + id: header2 + Text { objectName: "header2"; text: "Header 2"; height: 20 } + } +} diff --git a/tests/auto/declarative/qdeclarativegridview/data/manual-highlight.qml b/tests/auto/declarative/qdeclarativegridview/data/manual-highlight.qml new file mode 100644 index 00000000..d0828479 --- /dev/null +++ b/tests/auto/declarative/qdeclarativegridview/data/manual-highlight.qml @@ -0,0 +1,48 @@ +import QtQuick 1.0 + +Item { + + ListModel { + id: model + ListElement { + name: "Bill Smith" + number: "555 3264" + } + ListElement { + name: "John Brown" + number: "555 8426" + } + ListElement { + name: "Sam Wise" + number: "555 0473" + } + ListElement { + name: "Bob Brown" + number: "555 5845" + } + } + + Component { + id: highlight + Rectangle { + objectName: "highlight" + width: 80; height: 80 + color: "lightsteelblue"; radius: 5 + y: grid.currentItem.y+5 + x: grid.currentItem.x+5 + } + } + + GridView { + id: grid + objectName: "grid" + anchors.fill: parent + model: model + delegate: Text { objectName: "wrapper"; text: name; width: 80; height: 80 } + + highlight: highlight + highlightFollowsCurrentItem: false + focus: true + } + +} diff --git a/tests/auto/declarative/qdeclarativegridview/data/mirroring.qml b/tests/auto/declarative/qdeclarativegridview/data/mirroring.qml new file mode 100644 index 00000000..54de16bc --- /dev/null +++ b/tests/auto/declarative/qdeclarativegridview/data/mirroring.qml @@ -0,0 +1,43 @@ +// This example demonstrates how item positioning +// changes in right-to-left layout direction + +import QtQuick 1.1 + +Rectangle { + color: "lightgray" + width: 340 + height: 370 + + VisualItemModel { + id: itemModel + objectName: "itemModel" + Rectangle { + objectName: "item1" + height: 110; width: 120; color: "#FFFEF0" + Text { objectName: "text1"; text: "index: " + parent.VisualItemModel.index; font.bold: true; anchors.centerIn: parent } + } + Rectangle { + objectName: "item2" + height: 130; width: 150; color: "#F0FFF7" + Text { objectName: "text2"; text: "index: " + parent.VisualItemModel.index; font.bold: true; anchors.centerIn: parent } + } + Rectangle { + objectName: "item3" + height: 170; width: 190; color: "#F4F0FF" + Text { objectName: "text3"; text: "index: " + parent.VisualItemModel.index; font.bold: true; anchors.centerIn: parent } + } + } + + GridView { + id: view + objectName: "view" + cellWidth: 190 + cellHeight: 170 + anchors.fill: parent + anchors.bottomMargin: 30 + model: itemModel + highlightRangeMode: "StrictlyEnforceRange" + flow: GridView.TopToBottom + flickDeceleration: 2000 + } +} diff --git a/tests/auto/declarative/qdeclarativegridview/data/propertychangestest.qml b/tests/auto/declarative/qdeclarativegridview/data/propertychangestest.qml new file mode 100644 index 00000000..10df2342 --- /dev/null +++ b/tests/auto/declarative/qdeclarativegridview/data/propertychangestest.qml @@ -0,0 +1,69 @@ +import QtQuick 1.0 + +Rectangle { + width: 360; height: 120; color: "white" + Component { + id: delegate + Item { + id: wrapper + width: 180; height: 40; + Column { + x: 5; y: 5 + Text { text: 'Name: ' + name } + Text { text: 'Number: ' + number } + } + } + } + Component { + id: highlightRed + Rectangle { + color: "red" + radius: 10 + opacity: 0.5 + } + } + GridView { + cellWidth:180 + cellHeight:40 + objectName: "gridView" + anchors.fill: parent + model: listModel + delegate: delegate + highlight: highlightRed + focus: true + keyNavigationWraps: true + cacheBuffer: 10 + flow: GridView.LeftToRight + } + + data:[ + ListModel { + id: listModel + ListElement { + name: "Bill Smith" + number: "555 3264" + } + ListElement { + name: "John Brown" + number: "555 8426" + } + ListElement { + name: "Sam Wise" + number: "555 0473" + } + }, + ListModel { + objectName: "alternateModel" + ListElement { + name: "Jack" + number: "555 8426" + } + ListElement { + name: "Mary" + number: "555 3264" + } + } + ] +} + + diff --git a/tests/auto/declarative/qdeclarativegridview/data/setindex.qml b/tests/auto/declarative/qdeclarativegridview/data/setindex.qml new file mode 100644 index 00000000..36bf67de --- /dev/null +++ b/tests/auto/declarative/qdeclarativegridview/data/setindex.qml @@ -0,0 +1,29 @@ +import QtQuick 1.0 + +Rectangle { + width: 200 + height: 200 + Component { + id: appDelegate + + Item { + id : wrapper + function startupFunction() { + if (index == 5) view.currentIndex = index; + } + Component.onCompleted: startupFunction(); + width: 30; height: 30 + Text { text: index } + } + } + + GridView { + id: view + objectName: "grid" + anchors.fill: parent + cellWidth: 30; cellHeight: 30 + model: 35 + delegate: appDelegate + focus: true + } +} diff --git a/tests/auto/declarative/qdeclarativegridview/qdeclarativegridview.pro b/tests/auto/declarative/qdeclarativegridview/qdeclarativegridview.pro new file mode 100644 index 00000000..bc196fb5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativegridview/qdeclarativegridview.pro @@ -0,0 +1,16 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativegridview.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp b/tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp new file mode 100644 index 00000000..aa7f116f --- /dev/null +++ b/tests/auto/declarative/qdeclarativegridview/tst_qdeclarativegridview.cpp @@ -0,0 +1,2213 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../../../shared/util.h" + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_QDeclarativeGridView : public QObject +{ + Q_OBJECT +public: + tst_QDeclarativeGridView(); + +private slots: + void items(); + void changed(); + void inserted(); + void removed(); + void clear(); + void moved(); + void changeFlow(); + void currentIndex(); + void noCurrentIndex(); + void defaultValues(); + void properties(); + void propertyChanges(); + void componentChanges(); + void modelChanges(); + void positionViewAtIndex(); + void positionViewAtIndex_rightToLeft(); + void mirroring(); + void snapping(); + void resetModel(); + void enforceRange(); + void enforceRange_rightToLeft(); + void QTBUG_8456(); + void manualHighlight(); + void footer(); + void header(); + void indexAt(); + void onAdd(); + void onAdd_data(); + void onRemove(); + void onRemove_data(); + void testQtQuick11Attributes(); + void testQtQuick11Attributes_data(); + void contentPosJump(); + +private: + QDeclarativeView *createView(); + template + T *findItem(QGraphicsObject *parent, const QString &id, int index=-1); + template + QList findItems(QGraphicsObject *parent, const QString &objectName); + void dumpTree(QDeclarativeItem *parent, int depth = 0); +}; + +class TestModel : public QAbstractListModel +{ +public: + enum Roles { Name = Qt::UserRole+1, Number = Qt::UserRole+2 }; + + TestModel(QObject *parent=0) : QAbstractListModel(parent) { + QHash roles; + roles[Name] = "name"; + roles[Number] = "number"; + setRoleNames(roles); + } + + int rowCount(const QModelIndex &parent=QModelIndex()) const { Q_UNUSED(parent); return list.count(); } + QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const { + QVariant rv; + if (role == Name) + rv = list.at(index.row()).first; + else if (role == Number) + rv = list.at(index.row()).second; + + return rv; + } + + int count() const { return rowCount(); } + QString name(int index) const { return list.at(index).first; } + QString number(int index) const { return list.at(index).second; } + + void addItem(const QString &name, const QString &number) { + emit beginInsertRows(QModelIndex(), list.count(), list.count()); + list.append(QPair(name, number)); + emit endInsertRows(); + } + + void addItems(const QList > &items) { + emit beginInsertRows(QModelIndex(), list.count(), list.count()+items.count()-1); + for (int i=0; i(items[i].first, items[i].second)); + emit endInsertRows(); + } + + void insertItem(int index, const QString &name, const QString &number) { + emit beginInsertRows(QModelIndex(), index, index); + list.insert(index, QPair(name, number)); + emit endInsertRows(); + } + + void removeItem(int index) { + emit beginRemoveRows(QModelIndex(), index, index); + list.removeAt(index); + emit endRemoveRows(); + } + + void removeItems(int index, int count) { + emit beginRemoveRows(QModelIndex(), index, index+count-1); + while (count--) + list.removeAt(index); + emit endRemoveRows(); + } + + void moveItem(int from, int to) { + emit beginMoveRows(QModelIndex(), from, from, QModelIndex(), to); + list.move(from, to); + emit endMoveRows(); + } + + void modifyItem(int idx, const QString &name, const QString &number) { + list[idx] = QPair(name, number); + emit dataChanged(index(idx,0), index(idx,0)); + } + + void clear() { + int count = list.count(); + emit beginRemoveRows(QModelIndex(), 0, count-1); + list.clear(); + emit endRemoveRows(); + } + + +private: + QList > list; +}; + +tst_QDeclarativeGridView::tst_QDeclarativeGridView() +{ +} + +void tst_QDeclarativeGridView::items() +{ + QDeclarativeView *canvas = createView(); + + TestModel model; + model.addItem("Fred", "12345"); + model.addItem("John", "2345"); + model.addItem("Bob", "54321"); + model.addItem("Billy", "22345"); + model.addItem("Sam", "2945"); + model.addItem("Ben", "04321"); + model.addItem("Jim", "0780"); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + ctxt->setContextProperty("testRightToLeft", QVariant(false)); + ctxt->setContextProperty("testTopToBottom", QVariant(false)); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml")); + qApp->processEvents(); + + QDeclarativeGridView *gridview = findItem(canvas->rootObject(), "grid"); + QTRY_VERIFY(gridview != 0); + + QDeclarativeItem *contentItem = gridview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + QTRY_COMPARE(gridview->count(), model.count()); + QTRY_COMPARE(canvas->rootObject()->property("count").toInt(), model.count()); + QTRY_COMPARE(contentItem->childItems().count(), model.count()+1); // assumes all are visible, +1 for the (default) highlight item + + for (int i = 0; i < model.count(); ++i) { + QDeclarativeText *name = findItem(contentItem, "textName", i); + QTRY_VERIFY(name != 0); + QTRY_COMPARE(name->text(), model.name(i)); + QDeclarativeText *number = findItem(contentItem, "textNumber", i); + QTRY_VERIFY(number != 0); + QTRY_COMPARE(number->text(), model.number(i)); + } + + // set an empty model and confirm that items are destroyed + TestModel model2; + ctxt->setContextProperty("testModel", &model2); + + int itemCount = findItems(contentItem, "wrapper").count(); + QTRY_VERIFY(itemCount == 0); + + delete canvas; +} + +void tst_QDeclarativeGridView::changed() +{ + QDeclarativeView *canvas = createView(); + + TestModel model; + model.addItem("Fred", "12345"); + model.addItem("John", "2345"); + model.addItem("Bob", "54321"); + model.addItem("Billy", "22345"); + model.addItem("Sam", "2945"); + model.addItem("Ben", "04321"); + model.addItem("Jim", "0780"); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + ctxt->setContextProperty("testRightToLeft", QVariant(false)); + ctxt->setContextProperty("testTopToBottom", QVariant(false)); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml")); + qApp->processEvents(); + + QDeclarativeFlickable *gridview = findItem(canvas->rootObject(), "grid"); + QTRY_VERIFY(gridview != 0); + + QDeclarativeItem *contentItem = gridview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + model.modifyItem(1, "Will", "9876"); + QDeclarativeText *name = findItem(contentItem, "textName", 1); + QTRY_VERIFY(name != 0); + QTRY_COMPARE(name->text(), model.name(1)); + QDeclarativeText *number = findItem(contentItem, "textNumber", 1); + QTRY_VERIFY(number != 0); + QTRY_COMPARE(number->text(), model.number(1)); + + delete canvas; +} + +void tst_QDeclarativeGridView::inserted() +{ + QDeclarativeView *canvas = createView(); + + TestModel model; + model.addItem("Fred", "12345"); + model.addItem("John", "2345"); + model.addItem("Bob", "54321"); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + ctxt->setContextProperty("testRightToLeft", QVariant(false)); + ctxt->setContextProperty("testTopToBottom", QVariant(false)); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml")); + qApp->processEvents(); + + QDeclarativeGridView *gridview = findItem(canvas->rootObject(), "grid"); + QTRY_VERIFY(gridview != 0); + + QDeclarativeItem *contentItem = gridview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + model.insertItem(1, "Will", "9876"); + QCOMPARE(canvas->rootObject()->property("count").toInt(), model.count()); + + QTRY_COMPARE(contentItem->childItems().count(), model.count()+1); // assumes all are visible, +1 for the (default) highlight item + + QDeclarativeText *name = findItem(contentItem, "textName", 1); + QTRY_VERIFY(name != 0); + QTRY_COMPARE(name->text(), model.name(1)); + QDeclarativeText *number = findItem(contentItem, "textNumber", 1); + QTRY_VERIFY(number != 0); + QTRY_COMPARE(number->text(), model.number(1)); + + // Checks that onAdd is called + int added = canvas->rootObject()->property("added").toInt(); + QTRY_COMPARE(added, 1); + + // Confirm items positioned correctly + for (int i = 0; i < model.count(); ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + QTRY_COMPARE(item->x(), (i%3)*80.0); + QTRY_COMPARE(item->y(), (i/3)*60.0); + } + + model.insertItem(0, "Foo", "1111"); // zero index, and current item + + QTRY_COMPARE(contentItem->childItems().count(), model.count()+1); // assumes all are visible, +1 for the (default) highlight item + + name = findItem(contentItem, "textName", 0); + QTRY_VERIFY(name != 0); + QTRY_COMPARE(name->text(), model.name(0)); + number = findItem(contentItem, "textNumber", 0); + QTRY_VERIFY(number != 0); + QTRY_COMPARE(number->text(), model.number(0)); + + QTRY_COMPARE(gridview->currentIndex(), 1); + + // Confirm items positioned correctly + for (int i = 0; i < model.count(); ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + QTRY_VERIFY(item->x() == (i%3)*80); + QTRY_VERIFY(item->y() == (i/3)*60); + } + + for (int i = model.count(); i < 30; ++i) + model.insertItem(i, "Hello", QString::number(i)); + + gridview->setContentY(120); + + // Insert item outside visible area + model.insertItem(1, "Hello", "1324"); + + QTRY_VERIFY(gridview->contentY() == 120); + + delete canvas; +} + +void tst_QDeclarativeGridView::removed() +{ + QDeclarativeView *canvas = createView(); + + TestModel model; + for (int i = 0; i < 40; i++) + model.addItem("Item" + QString::number(i), ""); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + ctxt->setContextProperty("testRightToLeft", QVariant(false)); + ctxt->setContextProperty("testTopToBottom", QVariant(false)); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml")); + qApp->processEvents(); + + QDeclarativeGridView *gridview = findItem(canvas->rootObject(), "grid"); + QTRY_VERIFY(gridview != 0); + + QDeclarativeItem *contentItem = gridview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + model.removeItem(1); + QCOMPARE(canvas->rootObject()->property("count").toInt(), model.count()); + + QDeclarativeText *name = findItem(contentItem, "textName", 1); + QTRY_VERIFY(name != 0); + QTRY_COMPARE(name->text(), model.name(1)); + QDeclarativeText *number = findItem(contentItem, "textNumber", 1); + QTRY_VERIFY(number != 0); + QTRY_COMPARE(number->text(), model.number(1)); + + // Checks that onRemove is called + QString removed = canvas->rootObject()->property("removed").toString(); + QTRY_COMPARE(removed, QString("Item1")); + + // Confirm items positioned correctly + int itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 0; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_VERIFY(item->x() == (i%3)*80); + QTRY_VERIFY(item->y() == (i/3)*60); + } + + // Remove first item (which is the current item); + model.removeItem(0); + + name = findItem(contentItem, "textName", 0); + QTRY_VERIFY(name != 0); + QTRY_COMPARE(name->text(), model.name(0)); + number = findItem(contentItem, "textNumber", 0); + QTRY_VERIFY(number != 0); + QTRY_COMPARE(number->text(), model.number(0)); + + // Confirm items positioned correctly + itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 0; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_VERIFY(item->x() == (i%3)*80); + QTRY_VERIFY(item->y() == (i/3)*60); + } + + // Remove items not visible + model.removeItem(25); + + // Confirm items positioned correctly + itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 0; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_VERIFY(item->x() == (i%3)*80); + QTRY_VERIFY(item->y() == (i/3)*60); + } + + // Remove items before visible + gridview->setContentY(120); + gridview->setCurrentIndex(10); + + // Setting currentIndex above shouldn't cause view to scroll + QTRY_COMPARE(gridview->contentY(), 120.0); + + model.removeItem(1); + + // Confirm items positioned correctly + for (int i = 3; i < 15; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->x(), (i%3)*80.0); + QTRY_COMPARE(item->y(), 60+(i/3)*60.0); + } + + // Remove currentIndex + QDeclarativeItem *oldCurrent = gridview->currentItem(); + model.removeItem(9); + + QTRY_COMPARE(gridview->currentIndex(), 9); + QTRY_VERIFY(gridview->currentItem() != oldCurrent); + + gridview->setContentY(0); + // let transitions settle. + QTest::qWait(100); + + // Confirm items positioned correctly + itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 0; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_VERIFY(item->x() == (i%3)*80); + QTRY_VERIFY(item->y() == 60+(i/3)*60); + } + + // remove item outside current view. + gridview->setCurrentIndex(32); + gridview->setContentY(240); + + model.removeItem(30); + QTRY_VERIFY(gridview->currentIndex() == 31); + + // remove current item beyond visible items. + gridview->setCurrentIndex(20); + gridview->setContentY(0); + model.removeItem(20); + + QTRY_COMPARE(gridview->currentIndex(), 20); + QTRY_VERIFY(gridview->currentItem() != 0); + + // remove item before current, but visible + gridview->setCurrentIndex(8); + gridview->setContentY(240); + oldCurrent = gridview->currentItem(); + model.removeItem(6); + + QTRY_COMPARE(gridview->currentIndex(), 7); + QTRY_VERIFY(gridview->currentItem() == oldCurrent); + + delete canvas; +} + +void tst_QDeclarativeGridView::clear() +{ + QDeclarativeView *canvas = createView(); + + TestModel model; + for (int i = 0; i < 30; i++) + model.addItem("Item" + QString::number(i), ""); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + ctxt->setContextProperty("testRightToLeft", QVariant(false)); + ctxt->setContextProperty("testTopToBottom", QVariant(false)); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml")); + qApp->processEvents(); + + QDeclarativeGridView *gridview = findItem(canvas->rootObject(), "grid"); + QVERIFY(gridview != 0); + + QDeclarativeItem *contentItem = gridview->contentItem(); + QVERIFY(contentItem != 0); + + model.clear(); + + QVERIFY(gridview->count() == 0); + QVERIFY(gridview->currentItem() == 0); + QVERIFY(gridview->contentY() == 0); + QVERIFY(gridview->currentIndex() == -1); + + // confirm sanity when adding an item to cleared list + model.addItem("New", "1"); + QVERIFY(gridview->count() == 1); + QVERIFY(gridview->currentItem() != 0); + QVERIFY(gridview->currentIndex() == 0); + + delete canvas; +} + +void tst_QDeclarativeGridView::moved() +{ + QDeclarativeView *canvas = createView(); + + TestModel model; + for (int i = 0; i < 30; i++) + model.addItem("Item" + QString::number(i), ""); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + ctxt->setContextProperty("testRightToLeft", QVariant(false)); + ctxt->setContextProperty("testTopToBottom", QVariant(false)); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml")); + qApp->processEvents(); + + QDeclarativeGridView *gridview = findItem(canvas->rootObject(), "grid"); + QTRY_VERIFY(gridview != 0); + + QDeclarativeItem *contentItem = gridview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + model.moveItem(1, 8); + + QDeclarativeText *name = findItem(contentItem, "textName", 1); + QTRY_VERIFY(name != 0); + QTRY_COMPARE(name->text(), model.name(1)); + QDeclarativeText *number = findItem(contentItem, "textNumber", 1); + QTRY_VERIFY(number != 0); + QTRY_COMPARE(number->text(), model.number(1)); + + name = findItem(contentItem, "textName", 8); + QTRY_VERIFY(name != 0); + QTRY_COMPARE(name->text(), model.name(8)); + number = findItem(contentItem, "textNumber", 8); + QTRY_VERIFY(number != 0); + QTRY_COMPARE(number->text(), model.number(8)); + + // Confirm items positioned correctly + int itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 0; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_VERIFY(item->x() == (i%3)*80); + QTRY_VERIFY(item->y() == (i/3)*60); + } + + gridview->setContentY(120); + + // move outside visible area + model.moveItem(1, 25); + + // Confirm items positioned correctly and indexes correct + itemCount = findItems(contentItem, "wrapper").count()-1; + for (int i = 6; i < model.count()-6 && i < itemCount+6; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->x(), qreal((i%3)*80)); + QTRY_COMPARE(item->y(), qreal((i/3)*60)); + name = findItem(contentItem, "textName", i); + QTRY_VERIFY(name != 0); + QTRY_COMPARE(name->text(), model.name(i)); + number = findItem(contentItem, "textNumber", i); + QTRY_VERIFY(number != 0); + QTRY_COMPARE(number->text(), model.number(i)); + } + + // move from outside visible into visible + model.moveItem(28, 8); + + // Confirm items positioned correctly and indexes correct + for (int i = 6; i < model.count()-6 && i < itemCount+6; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_VERIFY(item->x() == (i%3)*80); + QTRY_VERIFY(item->y() == (i/3)*60); + name = findItem(contentItem, "textName", i); + QTRY_VERIFY(name != 0); + QTRY_COMPARE(name->text(), model.name(i)); + number = findItem(contentItem, "textNumber", i); + QTRY_VERIFY(number != 0); + QTRY_COMPARE(number->text(), model.number(i)); + } + + // ensure content position is stable + gridview->setContentY(0); + model.moveItem(10, 0); + QTRY_VERIFY(gridview->contentY() == 0); + + delete canvas; +} + +void tst_QDeclarativeGridView::currentIndex() +{ + TestModel model; + for (int i = 0; i < 60; i++) + model.addItem("Item" + QString::number(i), QString::number(i)); + + QDeclarativeView *canvas = new QDeclarativeView(0); + canvas->setFixedSize(240,320); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + QString filename(SRCDIR "/data/gridview-initCurrent.qml"); + canvas->setSource(QUrl::fromLocalFile(filename)); + + qApp->processEvents(); + + QDeclarativeGridView *gridview = findItem(canvas->rootObject(), "grid"); + QVERIFY(gridview != 0); + + QDeclarativeItem *contentItem = gridview->contentItem(); + QVERIFY(contentItem != 0); + + // current item should be third item + QCOMPARE(gridview->currentIndex(), 35); + QCOMPARE(gridview->currentItem(), findItem(contentItem, "wrapper", 35)); + QCOMPARE(gridview->currentItem()->y(), gridview->highlightItem()->y()); + QCOMPARE(gridview->contentY(), 400.0); + + gridview->moveCurrentIndexRight(); + QCOMPARE(gridview->currentIndex(), 36); + gridview->moveCurrentIndexDown(); + QCOMPARE(gridview->currentIndex(), 39); + gridview->moveCurrentIndexUp(); + QCOMPARE(gridview->currentIndex(), 36); + gridview->moveCurrentIndexLeft(); + QCOMPARE(gridview->currentIndex(), 35); + + // no wrap + gridview->setCurrentIndex(0); + QCOMPARE(gridview->currentIndex(), 0); + // confirm that the velocity is updated + QTRY_VERIFY(gridview->verticalVelocity() != 0.0); + + gridview->moveCurrentIndexUp(); + QCOMPARE(gridview->currentIndex(), 0); + + gridview->moveCurrentIndexLeft(); + QCOMPARE(gridview->currentIndex(), 0); + + gridview->setCurrentIndex(model.count()-1); + 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); + + gridview->moveCurrentIndexLeft(); + QCOMPARE(gridview->currentIndex(), model.count()-1); + + QTRY_COMPARE(gridview->contentY(), 880.0); + + gridview->moveCurrentIndexRight(); + QCOMPARE(gridview->currentIndex(), 0); + + QTRY_COMPARE(gridview->contentY(), 0.0); + + // Test keys + canvas->show(); + qApp->setActiveWindow(canvas); +#ifdef Q_WS_X11 + // to be safe and avoid failing setFocus with window managers + qt_x11_wait_for_window_manager(canvas); +#endif + QTRY_VERIFY(canvas->hasFocus()); + QTRY_VERIFY(canvas->scene()->hasFocus()); + qApp->processEvents(); + + QTest::keyClick(canvas, Qt::Key_Down); + QCOMPARE(gridview->currentIndex(), 3); + + QTest::keyClick(canvas, Qt::Key_Up); + QCOMPARE(gridview->currentIndex(), 0); + + gridview->setFlow(QDeclarativeGridView::TopToBottom); + + qApp->setActiveWindow(canvas); +#ifdef Q_WS_X11 + // to be safe and avoid failing setFocus with window managers + qt_x11_wait_for_window_manager(canvas); +#endif + QTRY_VERIFY(canvas->hasFocus()); + QTRY_VERIFY(canvas->scene()->hasFocus()); + qApp->processEvents(); + + QTest::keyClick(canvas, Qt::Key_Right); + QCOMPARE(gridview->currentIndex(), 5); + + QTest::keyClick(canvas, Qt::Key_Left); + QCOMPARE(gridview->currentIndex(), 0); + + QTest::keyClick(canvas, Qt::Key_Down); + QCOMPARE(gridview->currentIndex(), 1); + + QTest::keyClick(canvas, Qt::Key_Up); + QCOMPARE(gridview->currentIndex(), 0); + + + // turn off auto highlight + gridview->setHighlightFollowsCurrentItem(false); + QVERIFY(gridview->highlightFollowsCurrentItem() == false); + QVERIFY(gridview->highlightItem()); + qreal hlPosX = gridview->highlightItem()->x(); + qreal hlPosY = gridview->highlightItem()->y(); + + gridview->setCurrentIndex(5); + QTRY_COMPARE(gridview->highlightItem()->x(), hlPosX); + QTRY_COMPARE(gridview->highlightItem()->y(), hlPosY); + + // insert item before currentIndex + gridview->setCurrentIndex(28); + model.insertItem(0, "Foo", "1111"); + QTRY_COMPARE(canvas->rootObject()->property("current").toInt(), 29); + + // check removing highlight by setting currentIndex to -1; + gridview->setCurrentIndex(-1); + + QCOMPARE(gridview->currentIndex(), -1); + QVERIFY(!gridview->highlightItem()); + QVERIFY(!gridview->currentItem()); + + gridview->setHighlightFollowsCurrentItem(true); + + gridview->setFlow(QDeclarativeGridView::LeftToRight); + gridview->setLayoutDirection(Qt::RightToLeft); + + qApp->setActiveWindow(canvas); +#ifdef Q_WS_X11 + // to be safe and avoid failing setFocus with window managers + qt_x11_wait_for_window_manager(canvas); +#endif + QTRY_VERIFY(canvas->hasFocus()); + QTRY_VERIFY(canvas->scene()->hasFocus()); + qApp->processEvents(); + + gridview->setCurrentIndex(35); + + QTest::keyClick(canvas, Qt::Key_Right); + QCOMPARE(gridview->currentIndex(), 34); + + QTest::keyClick(canvas, Qt::Key_Down); + QCOMPARE(gridview->currentIndex(), 37); + + QTest::keyClick(canvas, Qt::Key_Up); + QCOMPARE(gridview->currentIndex(), 34); + + QTest::keyClick(canvas, Qt::Key_Left); + QCOMPARE(gridview->currentIndex(), 35); + + + // turn off auto highlight + gridview->setHighlightFollowsCurrentItem(false); + QVERIFY(gridview->highlightFollowsCurrentItem() == false); + QVERIFY(gridview->highlightItem()); + hlPosX = gridview->highlightItem()->x(); + hlPosY = gridview->highlightItem()->y(); + + gridview->setCurrentIndex(5); + QTRY_COMPARE(gridview->highlightItem()->x(), hlPosX); + QTRY_COMPARE(gridview->highlightItem()->y(), hlPosY); + + // insert item before currentIndex + gridview->setCurrentIndex(28); + model.insertItem(0, "Foo", "1111"); + QTRY_COMPARE(canvas->rootObject()->property("current").toInt(), 29); + + // check removing highlight by setting currentIndex to -1; + gridview->setCurrentIndex(-1); + + QCOMPARE(gridview->currentIndex(), -1); + QVERIFY(!gridview->highlightItem()); + QVERIFY(!gridview->currentItem()); + + delete canvas; +} + +void tst_QDeclarativeGridView::noCurrentIndex() +{ + TestModel model; + for (int i = 0; i < 60; i++) + model.addItem("Item" + QString::number(i), QString::number(i)); + + QDeclarativeView *canvas = new QDeclarativeView(0); + canvas->setFixedSize(240,320); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + QString filename(SRCDIR "/data/gridview-noCurrent.qml"); + canvas->setSource(QUrl::fromLocalFile(filename)); + + qApp->processEvents(); + + QDeclarativeGridView *gridview = findItem(canvas->rootObject(), "grid"); + QVERIFY(gridview != 0); + + QDeclarativeItem *contentItem = gridview->contentItem(); + QVERIFY(contentItem != 0); + + // current index should be -1 + QCOMPARE(gridview->currentIndex(), -1); + QVERIFY(!gridview->currentItem()); + QVERIFY(!gridview->highlightItem()); + QCOMPARE(gridview->contentY(), 0.0); + + gridview->setCurrentIndex(5); + QCOMPARE(gridview->currentIndex(), 5); + QVERIFY(gridview->currentItem()); + QVERIFY(gridview->highlightItem()); +} + +void tst_QDeclarativeGridView::changeFlow() +{ + QDeclarativeView *canvas = createView(); + + TestModel model; + for (int i = 0; i < 30; i++) + model.addItem("Item" + QString::number(i), QString::number(i)); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + ctxt->setContextProperty("testRightToLeft", QVariant(false)); + ctxt->setContextProperty("testTopToBottom", QVariant(false)); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml")); + qApp->processEvents(); + + QDeclarativeGridView *gridview = findItem(canvas->rootObject(), "grid"); + QTRY_VERIFY(gridview != 0); + + QDeclarativeItem *contentItem = gridview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + // Confirm items positioned correctly and indexes correct + int itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 0; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->x(), qreal((i%3)*80)); + QTRY_COMPARE(item->y(), qreal((i/3)*60)); + QDeclarativeText *name = findItem(contentItem, "textName", i); + QTRY_VERIFY(name != 0); + QTRY_COMPARE(name->text(), model.name(i)); + QDeclarativeText *number = findItem(contentItem, "textNumber", i); + QTRY_VERIFY(number != 0); + QTRY_COMPARE(number->text(), model.number(i)); + } + + ctxt->setContextProperty("testTopToBottom", QVariant(true)); + + // Confirm items positioned correctly and indexes correct + itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 0; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->x(), qreal((i/5)*80)); + QTRY_COMPARE(item->y(), qreal((i%5)*60)); + QDeclarativeText *name = findItem(contentItem, "textName", i); + QTRY_VERIFY(name != 0); + QTRY_COMPARE(name->text(), model.name(i)); + QDeclarativeText *number = findItem(contentItem, "textNumber", i); + QTRY_VERIFY(number != 0); + QTRY_COMPARE(number->text(), model.number(i)); + } + + ctxt->setContextProperty("testRightToLeft", QVariant(true)); + + // Confirm items positioned correctly and indexes correct + itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 0; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->x(), qreal(-(i/5)*80 - item->width())); + QTRY_COMPARE(item->y(), qreal((i%5)*60)); + QDeclarativeText *name = findItem(contentItem, "textName", i); + QTRY_VERIFY(name != 0); + QTRY_COMPARE(name->text(), model.name(i)); + QDeclarativeText *number = findItem(contentItem, "textNumber", i); + QTRY_VERIFY(number != 0); + QTRY_COMPARE(number->text(), model.number(i)); + } + gridview->setContentX(100); + QTRY_COMPARE(gridview->contentX(), 100.); + ctxt->setContextProperty("testTopToBottom", QVariant(false)); + QTRY_COMPARE(gridview->contentX(), 0.); + + // Confirm items positioned correctly and indexes correct + itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 0; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->x(), qreal(240 - (i%3+1)*80)); + QTRY_COMPARE(item->y(), qreal((i/3)*60)); + QDeclarativeText *name = findItem(contentItem, "textName", i); + QTRY_VERIFY(name != 0); + QTRY_COMPARE(name->text(), model.name(i)); + QDeclarativeText *number = findItem(contentItem, "textNumber", i); + QTRY_VERIFY(number != 0); + QTRY_COMPARE(number->text(), model.number(i)); + } + + delete canvas; +} + +void tst_QDeclarativeGridView::defaultValues() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/gridview3.qml")); + QDeclarativeGridView *obj = qobject_cast(c.create()); + + QTRY_VERIFY(obj != 0); + QTRY_VERIFY(obj->model() == QVariant()); + QTRY_VERIFY(obj->delegate() == 0); + QTRY_COMPARE(obj->currentIndex(), -1); + QTRY_VERIFY(obj->currentItem() == 0); + QTRY_COMPARE(obj->count(), 0); + QTRY_VERIFY(obj->highlight() == 0); + QTRY_VERIFY(obj->highlightItem() == 0); + QTRY_COMPARE(obj->highlightFollowsCurrentItem(), true); + QTRY_VERIFY(obj->flow() == 0); + QTRY_COMPARE(obj->isWrapEnabled(), false); + QTRY_COMPARE(obj->cacheBuffer(), 0); + QTRY_COMPARE(obj->cellWidth(), 100); //### Should 100 be the default? + QTRY_COMPARE(obj->cellHeight(), 100); + delete obj; +} + +void tst_QDeclarativeGridView::properties() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/gridview2.qml")); + QDeclarativeGridView *obj = qobject_cast(c.create()); + + QTRY_VERIFY(obj != 0); + QTRY_VERIFY(obj->model() != QVariant()); + QTRY_VERIFY(obj->delegate() != 0); + QTRY_COMPARE(obj->currentIndex(), 0); + QTRY_VERIFY(obj->currentItem() != 0); + QTRY_COMPARE(obj->count(), 4); + QTRY_VERIFY(obj->highlight() != 0); + QTRY_VERIFY(obj->highlightItem() != 0); + QTRY_COMPARE(obj->highlightFollowsCurrentItem(), false); + QTRY_VERIFY(obj->flow() == 0); + QTRY_COMPARE(obj->isWrapEnabled(), true); + QTRY_COMPARE(obj->cacheBuffer(), 200); + QTRY_COMPARE(obj->cellWidth(), 100); + QTRY_COMPARE(obj->cellHeight(), 100); + delete obj; +} + +void tst_QDeclarativeGridView::propertyChanges() +{ + QDeclarativeView *canvas = createView(); + QTRY_VERIFY(canvas); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/propertychangestest.qml")); + + QDeclarativeGridView *gridView = canvas->rootObject()->findChild("gridView"); + QTRY_VERIFY(gridView); + + QSignalSpy keyNavigationWrapsSpy(gridView, SIGNAL(keyNavigationWrapsChanged())); + QSignalSpy cacheBufferSpy(gridView, SIGNAL(cacheBufferChanged())); + QSignalSpy layoutSpy(gridView, SIGNAL(layoutDirectionChanged())); + QSignalSpy flowSpy(gridView, SIGNAL(flowChanged())); + + QTRY_COMPARE(gridView->isWrapEnabled(), true); + QTRY_COMPARE(gridView->cacheBuffer(), 10); + QTRY_COMPARE(gridView->flow(), QDeclarativeGridView::LeftToRight); + + gridView->setWrapEnabled(false); + gridView->setCacheBuffer(3); + gridView->setFlow(QDeclarativeGridView::TopToBottom); + + QTRY_COMPARE(gridView->isWrapEnabled(), false); + QTRY_COMPARE(gridView->cacheBuffer(), 3); + QTRY_COMPARE(gridView->flow(), QDeclarativeGridView::TopToBottom); + + QTRY_COMPARE(keyNavigationWrapsSpy.count(),1); + QTRY_COMPARE(cacheBufferSpy.count(),1); + QTRY_COMPARE(flowSpy.count(),1); + + gridView->setWrapEnabled(false); + gridView->setCacheBuffer(3); + gridView->setFlow(QDeclarativeGridView::TopToBottom); + + QTRY_COMPARE(keyNavigationWrapsSpy.count(),1); + QTRY_COMPARE(cacheBufferSpy.count(),1); + QTRY_COMPARE(flowSpy.count(),1); + + gridView->setFlow(QDeclarativeGridView::LeftToRight); + QTRY_COMPARE(gridView->flow(), QDeclarativeGridView::LeftToRight); + + gridView->setWrapEnabled(true); + gridView->setCacheBuffer(5); + gridView->setLayoutDirection(Qt::RightToLeft); + + QTRY_COMPARE(gridView->isWrapEnabled(), true); + QTRY_COMPARE(gridView->cacheBuffer(), 5); + QTRY_COMPARE(gridView->layoutDirection(), Qt::RightToLeft); + + QTRY_COMPARE(keyNavigationWrapsSpy.count(),2); + QTRY_COMPARE(cacheBufferSpy.count(),2); + QTRY_COMPARE(layoutSpy.count(),1); + QTRY_COMPARE(flowSpy.count(),2); + + gridView->setWrapEnabled(true); + gridView->setCacheBuffer(5); + gridView->setLayoutDirection(Qt::RightToLeft); + + QTRY_COMPARE(keyNavigationWrapsSpy.count(),2); + QTRY_COMPARE(cacheBufferSpy.count(),2); + QTRY_COMPARE(layoutSpy.count(),1); + QTRY_COMPARE(flowSpy.count(),2); + + gridView->setFlow(QDeclarativeGridView::TopToBottom); + QTRY_COMPARE(gridView->flow(), QDeclarativeGridView::TopToBottom); + QTRY_COMPARE(flowSpy.count(),3); + + gridView->setFlow(QDeclarativeGridView::TopToBottom); + QTRY_COMPARE(flowSpy.count(),3); + + delete canvas; +} + +void tst_QDeclarativeGridView::componentChanges() +{ + QDeclarativeView *canvas = createView(); + QTRY_VERIFY(canvas); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/propertychangestest.qml")); + + QDeclarativeGridView *gridView = canvas->rootObject()->findChild("gridView"); + QTRY_VERIFY(gridView); + + QDeclarativeComponent component(canvas->engine()); + component.setData("import QtQuick 1.0; Rectangle { color: \"blue\"; }", QUrl::fromLocalFile("")); + + QDeclarativeComponent delegateComponent(canvas->engine()); + delegateComponent.setData("import QtQuick 1.0; Text { text: 'Name: ' + name }", QUrl::fromLocalFile("")); + + QSignalSpy highlightSpy(gridView, SIGNAL(highlightChanged())); + QSignalSpy delegateSpy(gridView, SIGNAL(delegateChanged())); + QSignalSpy headerSpy(gridView, SIGNAL(headerChanged())); + QSignalSpy footerSpy(gridView, SIGNAL(footerChanged())); + + gridView->setHighlight(&component); + gridView->setDelegate(&delegateComponent); + gridView->setHeader(&component); + gridView->setFooter(&component); + + QTRY_COMPARE(gridView->highlight(), &component); + QTRY_COMPARE(gridView->delegate(), &delegateComponent); + QTRY_COMPARE(gridView->header(), &component); + QTRY_COMPARE(gridView->footer(), &component); + + QTRY_COMPARE(highlightSpy.count(),1); + QTRY_COMPARE(delegateSpy.count(),1); + QTRY_COMPARE(headerSpy.count(),1); + QTRY_COMPARE(footerSpy.count(),1); + + gridView->setHighlight(&component); + gridView->setDelegate(&delegateComponent); + gridView->setHeader(&component); + gridView->setFooter(&component); + + QTRY_COMPARE(highlightSpy.count(),1); + QTRY_COMPARE(delegateSpy.count(),1); + QTRY_COMPARE(headerSpy.count(),1); + QTRY_COMPARE(footerSpy.count(),1); + + delete canvas; +} + +void tst_QDeclarativeGridView::modelChanges() +{ + QDeclarativeView *canvas = createView(); + QTRY_VERIFY(canvas); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/propertychangestest.qml")); + + QDeclarativeGridView *gridView = canvas->rootObject()->findChild("gridView"); + QTRY_VERIFY(gridView); + + QDeclarativeListModel *alternateModel = canvas->rootObject()->findChild("alternateModel"); + QTRY_VERIFY(alternateModel); + QVariant modelVariant = QVariant::fromValue(alternateModel); + QSignalSpy modelSpy(gridView, SIGNAL(modelChanged())); + + gridView->setModel(modelVariant); + QTRY_COMPARE(gridView->model(), modelVariant); + QTRY_COMPARE(modelSpy.count(),1); + + gridView->setModel(modelVariant); + QTRY_COMPARE(modelSpy.count(),1); + + gridView->setModel(QVariant()); + QTRY_COMPARE(modelSpy.count(),2); + delete canvas; +} + +void tst_QDeclarativeGridView::positionViewAtIndex() +{ + QDeclarativeView *canvas = createView(); + + TestModel model; + for (int i = 0; i < 40; i++) + model.addItem("Item" + QString::number(i), ""); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + ctxt->setContextProperty("testRightToLeft", QVariant(false)); + ctxt->setContextProperty("testTopToBottom", QVariant(false)); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml")); + qApp->processEvents(); + + QDeclarativeGridView *gridview = findItem(canvas->rootObject(), "grid"); + QTRY_VERIFY(gridview != 0); + + QDeclarativeItem *contentItem = gridview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + // Confirm items positioned correctly + int itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 0; i < model.count() && i < itemCount-1; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->x(), (i%3)*80.); + QTRY_COMPARE(item->y(), (i/3)*60.); + } + + // Position on a currently visible item + gridview->positionViewAtIndex(4, QDeclarativeGridView::Beginning); + QTRY_COMPARE(gridview->indexAt(120, 90), 4); + QTRY_COMPARE(gridview->contentY(), 60.); + + // Confirm items positioned correctly + itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 3; i < model.count() && i < itemCount-3-1; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->x(), (i%3)*80.); + QTRY_COMPARE(item->y(), (i/3)*60.); + } + + // Position on an item beyond the visible items + gridview->positionViewAtIndex(21, QDeclarativeGridView::Beginning); + QTRY_COMPARE(gridview->indexAt(40, 450), 21); + QTRY_COMPARE(gridview->contentY(), 420.); + + // Confirm items positioned correctly + itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 22; i < model.count() && i < itemCount-22-1; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->x(), (i%3)*80.); + QTRY_COMPARE(item->y(), (i/3)*60.); + } + + // Position on an item that would leave empty space if positioned at the top + gridview->positionViewAtIndex(31, QDeclarativeGridView::Beginning); + QTRY_COMPARE(gridview->indexAt(120, 630), 31); + QTRY_COMPARE(gridview->contentY(), 520.); + + // Confirm items positioned correctly + itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 24; i < model.count() && i < itemCount-24-1; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->x(), (i%3)*80.); + QTRY_COMPARE(item->y(), (i/3)*60.); + } + + // Position at the beginning again + gridview->positionViewAtIndex(0, QDeclarativeGridView::Beginning); + QTRY_COMPARE(gridview->indexAt(0, 0), 0); + QTRY_COMPARE(gridview->indexAt(40, 30), 0); + QTRY_COMPARE(gridview->indexAt(80, 60), 4); + QTRY_COMPARE(gridview->contentY(), 0.); + + // Confirm items positioned correctly + itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 0; i < model.count() && i < itemCount-1; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->x(), (i%3)*80.); + QTRY_COMPARE(item->y(), (i/3)*60.); + } + + // Position at End + gridview->positionViewAtIndex(30, QDeclarativeGridView::End); + QTRY_COMPARE(gridview->contentY(), 340.); + + // Position in Center + gridview->positionViewAtIndex(15, QDeclarativeGridView::Center); + QTRY_COMPARE(gridview->contentY(), 170.); + + // Ensure at least partially visible + gridview->positionViewAtIndex(15, QDeclarativeGridView::Visible); + QTRY_COMPARE(gridview->contentY(), 170.); + + gridview->setContentY(302); + gridview->positionViewAtIndex(15, QDeclarativeGridView::Visible); + QTRY_COMPARE(gridview->contentY(), 302.); + + gridview->setContentY(360); + gridview->positionViewAtIndex(15, QDeclarativeGridView::Visible); + QTRY_COMPARE(gridview->contentY(), 300.); + + gridview->setContentY(60); + gridview->positionViewAtIndex(20, QDeclarativeGridView::Visible); + QTRY_COMPARE(gridview->contentY(), 60.); + + gridview->setContentY(20); + gridview->positionViewAtIndex(20, QDeclarativeGridView::Visible); + QTRY_COMPARE(gridview->contentY(), 100.); + + // Ensure completely visible + gridview->setContentY(120); + gridview->positionViewAtIndex(20, QDeclarativeGridView::Contain); + QTRY_COMPARE(gridview->contentY(), 120.); + + gridview->setContentY(302); + gridview->positionViewAtIndex(15, QDeclarativeGridView::Contain); + QTRY_COMPARE(gridview->contentY(), 300.); + + gridview->setContentY(60); + gridview->positionViewAtIndex(20, QDeclarativeGridView::Contain); + QTRY_COMPARE(gridview->contentY(), 100.); + + // Test for Top To Bottom layout + ctxt->setContextProperty("testTopToBottom", QVariant(true)); + + // Confirm items positioned correctly + itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 0; i < model.count() && i < itemCount-1; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->x(), (i/5)*80.); + QTRY_COMPARE(item->y(), (i%5)*60.); + } + + // Position at End + gridview->positionViewAtIndex(30, QDeclarativeGridView::End); + QTRY_COMPARE(gridview->contentX(), 320.); + QTRY_COMPARE(gridview->contentY(), 0.); + + // Position in Center + gridview->positionViewAtIndex(15, QDeclarativeGridView::Center); + QTRY_COMPARE(gridview->contentX(), 160.); + + // Ensure at least partially visible + gridview->positionViewAtIndex(15, QDeclarativeGridView::Visible); + QTRY_COMPARE(gridview->contentX(), 160.); + + gridview->setContentX(170); + gridview->positionViewAtIndex(25, QDeclarativeGridView::Visible); + QTRY_COMPARE(gridview->contentX(), 170.); + + gridview->positionViewAtIndex(30, QDeclarativeGridView::Visible); + QTRY_COMPARE(gridview->contentX(), 320.); + + gridview->setContentX(170); + gridview->positionViewAtIndex(25, QDeclarativeGridView::Contain); + QTRY_COMPARE(gridview->contentX(), 240.); + + // positionViewAtBeginning + gridview->positionViewAtBeginning(); + QTRY_COMPARE(gridview->contentX(), 0.); + + gridview->setContentX(80); + canvas->rootObject()->setProperty("showHeader", true); + gridview->positionViewAtBeginning(); + QTRY_COMPARE(gridview->contentX(), -30.); + + // positionViewAtEnd + gridview->positionViewAtEnd(); + QTRY_COMPARE(gridview->contentX(), 430.); + + gridview->setContentX(80); + canvas->rootObject()->setProperty("showFooter", true); + gridview->positionViewAtEnd(); + QTRY_COMPARE(gridview->contentX(), 460.); + + delete canvas; +} + +void tst_QDeclarativeGridView::snapping() +{ + QDeclarativeView *canvas = createView(); + + TestModel model; + for (int i = 0; i < 40; i++) + model.addItem("Item" + QString::number(i), ""); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + ctxt->setContextProperty("testTopToBottom", QVariant(false)); + ctxt->setContextProperty("testRightToLeft", QVariant(false)); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml")); + qApp->processEvents(); + + QDeclarativeGridView *gridview = findItem(canvas->rootObject(), "grid"); + QTRY_VERIFY(gridview != 0); + + gridview->setHeight(220); + QCOMPARE(gridview->height(), 220.); + + gridview->positionViewAtIndex(12, QDeclarativeGridView::Visible); + QCOMPARE(gridview->contentY(), 80.); + + gridview->setContentY(0); + QCOMPARE(gridview->contentY(), 0.); + + gridview->setSnapMode(QDeclarativeGridView::SnapToRow); + QCOMPARE(gridview->snapMode(), QDeclarativeGridView::SnapToRow); + + gridview->positionViewAtIndex(12, QDeclarativeGridView::Visible); + QCOMPARE(gridview->contentY(), 60.); + + gridview->positionViewAtIndex(15, QDeclarativeGridView::End); + QCOMPARE(gridview->contentY(), 120.); + + delete canvas; + +} + +void tst_QDeclarativeGridView::mirroring() +{ + QDeclarativeView *canvasA = createView(); + canvasA->setSource(QUrl::fromLocalFile(SRCDIR "/data/mirroring.qml")); + QDeclarativeGridView *gridviewA = findItem(canvasA->rootObject(), "view"); + QTRY_VERIFY(gridviewA != 0); + + QDeclarativeView *canvasB = createView(); + canvasB->setSource(QUrl::fromLocalFile(SRCDIR "/data/mirroring.qml")); + QDeclarativeGridView *gridviewB = findItem(canvasB->rootObject(), "view"); + QTRY_VERIFY(gridviewA != 0); + qApp->processEvents(); + + QList objectNames; + objectNames << "item1" << "item2"; // << "item3" + + gridviewA->setProperty("layoutDirection", Qt::LeftToRight); + gridviewB->setProperty("layoutDirection", Qt::RightToLeft); + QCOMPARE(gridviewA->layoutDirection(), gridviewA->effectiveLayoutDirection()); + + // LTR != RTL + foreach(const QString objectName, objectNames) + QVERIFY(findItem(gridviewA, objectName)->x() != findItem(gridviewB, objectName)->x()); + + gridviewA->setProperty("layoutDirection", Qt::LeftToRight); + gridviewB->setProperty("layoutDirection", Qt::LeftToRight); + + // LTR == LTR + foreach(const QString objectName, objectNames) + QCOMPARE(findItem(gridviewA, objectName)->x(), findItem(gridviewB, objectName)->x()); + + QVERIFY(gridviewB->layoutDirection() == gridviewB->effectiveLayoutDirection()); + QDeclarativeItemPrivate::get(gridviewB)->setLayoutMirror(true); + QVERIFY(gridviewB->layoutDirection() != gridviewB->effectiveLayoutDirection()); + + // LTR != LTR+mirror + foreach(const QString objectName, objectNames) + QVERIFY(findItem(gridviewA, objectName)->x() != findItem(gridviewB, objectName)->x()); + + gridviewA->setProperty("layoutDirection", Qt::RightToLeft); + + // RTL == LTR+mirror + foreach(const QString objectName, objectNames) + QCOMPARE(findItem(gridviewA, objectName)->x(), findItem(gridviewB, objectName)->x()); + + gridviewB->setProperty("layoutDirection", Qt::RightToLeft); + + // RTL != RTL+mirror + foreach(const QString objectName, objectNames) + QVERIFY(findItem(gridviewA, objectName)->x() != findItem(gridviewB, objectName)->x()); + + gridviewA->setProperty("layoutDirection", Qt::LeftToRight); + + // LTR == RTL+mirror + foreach(const QString objectName, objectNames) + QCOMPARE(findItem(gridviewA, objectName)->x(), findItem(gridviewB, objectName)->x()); + + delete canvasA; + delete canvasB; +} + +void tst_QDeclarativeGridView::positionViewAtIndex_rightToLeft() +{ + QDeclarativeView *canvas = createView(); + + TestModel model; + for (int i = 0; i < 40; i++) + model.addItem("Item" + QString::number(i), ""); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + ctxt->setContextProperty("testTopToBottom", QVariant(true)); + ctxt->setContextProperty("testRightToLeft", QVariant(true)); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml")); + qApp->processEvents(); + + QDeclarativeGridView *gridview = findItem(canvas->rootObject(), "grid"); + QTRY_VERIFY(gridview != 0); + + QDeclarativeItem *contentItem = gridview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + // Confirm items positioned correctly + int itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 0; i < model.count() && i < itemCount-1; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->x(), qreal(-(i/5)*80-item->width())); + QTRY_COMPARE(item->y(), qreal((i%5)*60)); + } + + // Position on a currently visible item + gridview->positionViewAtIndex(6, QDeclarativeGridView::Beginning); + QTRY_COMPARE(gridview->contentX(), -320.); + + // Confirm items positioned correctly + itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 3; i < model.count() && i < itemCount-3-1; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->x(), qreal(-(i/5)*80-item->width())); + QTRY_COMPARE(item->y(), qreal((i%5)*60)); + } + + // Position on an item beyond the visible items + gridview->positionViewAtIndex(21, QDeclarativeGridView::Beginning); + QTRY_COMPARE(gridview->contentX(), -560.); + + // Confirm items positioned correctly + itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 22; i < model.count() && i < itemCount-22-1; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->x(), qreal(-(i/5)*80-item->width())); + QTRY_COMPARE(item->y(), qreal((i%5)*60)); + } + + // Position on an item that would leave empty space if positioned at the top + gridview->positionViewAtIndex(31, QDeclarativeGridView::Beginning); + QTRY_COMPARE(gridview->contentX(), -639.); + + // Confirm items positioned correctly + itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 24; i < model.count() && i < itemCount-24-1; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->x(), qreal(-(i/5)*80-item->width())); + QTRY_COMPARE(item->y(), qreal((i%5)*60)); + } + + // Position at the beginning again + gridview->positionViewAtIndex(0, QDeclarativeGridView::Beginning); + QTRY_COMPARE(gridview->contentX(), -240.); + + // Confirm items positioned correctly + itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 0; i < model.count() && i < itemCount-1; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->x(), qreal(-(i/5)*80-item->width())); + QTRY_COMPARE(item->y(), qreal((i%5)*60)); + } + + // Position at End + gridview->positionViewAtIndex(30, QDeclarativeGridView::End); + QTRY_COMPARE(gridview->contentX(), -560.); + + // Position in Center + gridview->positionViewAtIndex(15, QDeclarativeGridView::Center); + QTRY_COMPARE(gridview->contentX(), -400.); + + // Ensure at least partially visible + gridview->positionViewAtIndex(15, QDeclarativeGridView::Visible); + QTRY_COMPARE(gridview->contentX(), -400.); + + gridview->setContentX(-555.); + gridview->positionViewAtIndex(15, QDeclarativeGridView::Visible); + QTRY_COMPARE(gridview->contentX(), -555.); + + gridview->setContentX(-239); + gridview->positionViewAtIndex(15, QDeclarativeGridView::Visible); + QTRY_COMPARE(gridview->contentX(), -320.); + + gridview->setContentX(-239); + gridview->positionViewAtIndex(20, QDeclarativeGridView::Visible); + QTRY_COMPARE(gridview->contentX(), -400.); + + gridview->setContentX(-640); + gridview->positionViewAtIndex(20, QDeclarativeGridView::Visible); + QTRY_COMPARE(gridview->contentX(), -560.); + + // Ensure completely visible + gridview->setContentX(-400); + gridview->positionViewAtIndex(20, QDeclarativeGridView::Contain); + QTRY_COMPARE(gridview->contentX(), -400.); + + gridview->setContentX(-315); + gridview->positionViewAtIndex(15, QDeclarativeGridView::Contain); + QTRY_COMPARE(gridview->contentX(), -320.); + + gridview->setContentX(-640); + gridview->positionViewAtIndex(20, QDeclarativeGridView::Contain); + QTRY_COMPARE(gridview->contentX(), -560.); + + delete canvas; +} + +void tst_QDeclarativeGridView::resetModel() +{ + QDeclarativeView *canvas = createView(); + + QStringList strings; + strings << "one" << "two" << "three"; + QStringListModel model(strings); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/displaygrid.qml")); + qApp->processEvents(); + + QDeclarativeGridView *gridview = findItem(canvas->rootObject(), "grid"); + QTRY_VERIFY(gridview != 0); + + QDeclarativeItem *contentItem = gridview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + QTRY_COMPARE(gridview->count(), model.rowCount()); + + for (int i = 0; i < model.rowCount(); ++i) { + QDeclarativeText *display = findItem(contentItem, "displayText", i); + QTRY_VERIFY(display != 0); + QTRY_COMPARE(display->text(), strings.at(i)); + } + + strings.clear(); + strings << "four" << "five" << "six" << "seven"; + model.setStringList(strings); + + QTRY_COMPARE(gridview->count(), model.rowCount()); + + for (int i = 0; i < model.rowCount(); ++i) { + QDeclarativeText *display = findItem(contentItem, "displayText", i); + QTRY_VERIFY(display != 0); + QTRY_COMPARE(display->text(), strings.at(i)); + } +} + +void tst_QDeclarativeGridView::enforceRange() +{ + QDeclarativeView *canvas = createView(); + + TestModel model; + for (int i = 0; i < 30; i++) + model.addItem("Item" + QString::number(i), ""); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + ctxt->setContextProperty("testRightToLeft", QVariant(false)); + ctxt->setContextProperty("testTopToBottom", QVariant(false)); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview-enforcerange.qml")); + qApp->processEvents(); + QVERIFY(canvas->rootObject() != 0); + + QDeclarativeGridView *gridview = findItem(canvas->rootObject(), "grid"); + QTRY_VERIFY(gridview != 0); + + QTRY_COMPARE(gridview->preferredHighlightBegin(), 100.0); + QTRY_COMPARE(gridview->preferredHighlightEnd(), 100.0); + QTRY_COMPARE(gridview->highlightRangeMode(), QDeclarativeGridView::StrictlyEnforceRange); + + QDeclarativeItem *contentItem = gridview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + // view should be positioned at the top of the range. + QDeclarativeItem *item = findItem(contentItem, "wrapper", 0); + QTRY_VERIFY(item); + QTRY_COMPARE(gridview->contentY(), -100.0); + + QDeclarativeText *name = findItem(contentItem, "textName", 0); + QTRY_VERIFY(name != 0); + QTRY_COMPARE(name->text(), model.name(0)); + QDeclarativeText *number = findItem(contentItem, "textNumber", 0); + QTRY_VERIFY(number != 0); + QTRY_COMPARE(number->text(), model.number(0)); + + // Check currentIndex is updated when contentItem moves + gridview->setContentY(0); + QTRY_COMPARE(gridview->currentIndex(), 2); + + gridview->setCurrentIndex(5); + QTRY_COMPARE(gridview->contentY(), 100.); + + TestModel model2; + for (int i = 0; i < 5; i++) + model2.addItem("Item" + QString::number(i), ""); + + ctxt->setContextProperty("testModel", &model2); + QCOMPARE(gridview->count(), 5); + + delete canvas; +} + +void tst_QDeclarativeGridView::enforceRange_rightToLeft() +{ + QDeclarativeView *canvas = createView(); + + TestModel model; + for (int i = 0; i < 30; i++) + model.addItem("Item" + QString::number(i), ""); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + ctxt->setContextProperty("testRightToLeft", QVariant(true)); + ctxt->setContextProperty("testTopToBottom", QVariant(true)); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview-enforcerange.qml")); + qApp->processEvents(); + QVERIFY(canvas->rootObject() != 0); + + QDeclarativeGridView *gridview = findItem(canvas->rootObject(), "grid"); + QTRY_VERIFY(gridview != 0); + + QTRY_COMPARE(gridview->preferredHighlightBegin(), 100.0); + QTRY_COMPARE(gridview->preferredHighlightEnd(), 100.0); + QTRY_COMPARE(gridview->highlightRangeMode(), QDeclarativeGridView::StrictlyEnforceRange); + + QDeclarativeItem *contentItem = gridview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + // view should be positioned at the top of the range. + QDeclarativeItem *item = findItem(contentItem, "wrapper", 0); + QTRY_VERIFY(item); + QTRY_COMPARE(gridview->contentX(), -100.); + QTRY_COMPARE(gridview->contentY(), 0.0); + + QDeclarativeText *name = findItem(contentItem, "textName", 0); + QTRY_VERIFY(name != 0); + QTRY_COMPARE(name->text(), model.name(0)); + QDeclarativeText *number = findItem(contentItem, "textNumber", 0); + QTRY_VERIFY(number != 0); + QTRY_COMPARE(number->text(), model.number(0)); + + // Check currentIndex is updated when contentItem moves + gridview->setContentX(-200); + QTRY_COMPARE(gridview->currentIndex(), 3); + + gridview->setCurrentIndex(7); + QTRY_COMPARE(gridview->contentX(), -300.); + QTRY_COMPARE(gridview->contentY(), 0.0); + + TestModel model2; + for (int i = 0; i < 5; i++) + model2.addItem("Item" + QString::number(i), ""); + + ctxt->setContextProperty("testModel", &model2); + QCOMPARE(gridview->count(), 5); + + delete canvas; +} + +void tst_QDeclarativeGridView::QTBUG_8456() +{ + QDeclarativeView *canvas = createView(); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/setindex.qml")); + qApp->processEvents(); + + QDeclarativeGridView *gridview = findItem(canvas->rootObject(), "grid"); + QTRY_VERIFY(gridview != 0); + + QTRY_COMPARE(gridview->currentIndex(), 0); +} + +void tst_QDeclarativeGridView::manualHighlight() +{ + QDeclarativeView *canvas = createView(); + + QString filename(SRCDIR "/data/manual-highlight.qml"); + canvas->setSource(QUrl::fromLocalFile(filename)); + + qApp->processEvents(); + + QDeclarativeGridView *gridview = findItem(canvas->rootObject(), "grid"); + QTRY_VERIFY(gridview != 0); + + QDeclarativeItem *contentItem = gridview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + QTRY_COMPARE(gridview->currentIndex(), 0); + QTRY_COMPARE(gridview->currentItem(), findItem(contentItem, "wrapper", 0)); + QTRY_COMPARE(gridview->highlightItem()->y() - 5, gridview->currentItem()->y()); + QTRY_COMPARE(gridview->highlightItem()->x() - 5, gridview->currentItem()->x()); + + gridview->setCurrentIndex(2); + + QTRY_COMPARE(gridview->currentIndex(), 2); + QTRY_COMPARE(gridview->currentItem(), findItem(contentItem, "wrapper", 2)); + QTRY_COMPARE(gridview->highlightItem()->y() - 5, gridview->currentItem()->y()); + QTRY_COMPARE(gridview->highlightItem()->x() - 5, gridview->currentItem()->x()); + + gridview->positionViewAtIndex(8, QDeclarativeGridView::Contain); + + QTRY_COMPARE(gridview->currentIndex(), 2); + QTRY_COMPARE(gridview->currentItem(), findItem(contentItem, "wrapper", 2)); + QTRY_COMPARE(gridview->highlightItem()->y() - 5, gridview->currentItem()->y()); + QTRY_COMPARE(gridview->highlightItem()->x() - 5, gridview->currentItem()->x()); + + gridview->setFlow(QDeclarativeGridView::TopToBottom); + QTRY_COMPARE(gridview->flow(), QDeclarativeGridView::TopToBottom); + + gridview->setCurrentIndex(0); + QTRY_COMPARE(gridview->currentIndex(), 0); + QTRY_COMPARE(gridview->currentItem(), findItem(contentItem, "wrapper", 0)); + QTRY_COMPARE(gridview->highlightItem()->y() - 5, gridview->currentItem()->y()); + QTRY_COMPARE(gridview->highlightItem()->x() - 5, gridview->currentItem()->x()); +} + +void tst_QDeclarativeGridView::footer() +{ + QDeclarativeView *canvas = createView(); + + TestModel model; + for (int i = 0; i < 7; i++) + model.addItem("Item" + QString::number(i), ""); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/footer.qml")); + qApp->processEvents(); + + QDeclarativeGridView *gridview = findItem(canvas->rootObject(), "grid"); + QTRY_VERIFY(gridview != 0); + + QDeclarativeItem *contentItem = gridview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + QDeclarativeText *footer = findItem(contentItem, "footer"); + QVERIFY(footer); + + QCOMPARE(footer->y(), 180.0); + QCOMPARE(footer->height(), 30.0); + + model.removeItem(2); + QTRY_COMPARE(footer->y(), 120.0); + + model.clear(); + QTRY_COMPARE(footer->y(), 0.0); + + for (int i = 0; i < 30; i++) + model.addItem("Item" + QString::number(i), ""); + + QMetaObject::invokeMethod(canvas->rootObject(), "changeFooter"); + + footer = findItem(contentItem, "footer"); + QVERIFY(!footer); + footer = findItem(contentItem, "footer2"); + QVERIFY(footer); + + QCOMPARE(footer->y(), 600.0); + QCOMPARE(footer->height(), 20.0); + QCOMPARE(gridview->contentY(), 0.0); +} + +void tst_QDeclarativeGridView::header() +{ + QDeclarativeView *canvas = createView(); + + TestModel model; + for (int i = 0; i < 30; i++) + model.addItem("Item" + QString::number(i), ""); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/header.qml")); + qApp->processEvents(); + + QDeclarativeGridView *gridview = findItem(canvas->rootObject(), "grid"); + QTRY_VERIFY(gridview != 0); + + QDeclarativeItem *contentItem = gridview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + QDeclarativeText *header = findItem(contentItem, "header"); + QVERIFY(header); + + QCOMPARE(header->y(), 0.0); + QCOMPARE(header->height(), 30.0); + QCOMPARE(gridview->contentY(), 0.0); + + QDeclarativeItem *item = findItem(contentItem, "wrapper", 0); + QVERIFY(item); + QCOMPARE(item->y(), 30.0); + + model.clear(); + QTRY_COMPARE(header->y(), 0.0); + + for (int i = 0; i < 30; i++) + model.addItem("Item" + QString::number(i), ""); + + QMetaObject::invokeMethod(canvas->rootObject(), "changeHeader"); + + header = findItem(contentItem, "header"); + QVERIFY(!header); + header = findItem(contentItem, "header2"); + QVERIFY(header); + + QCOMPARE(header->y(), 10.0); + QCOMPARE(header->height(), 20.0); + QCOMPARE(gridview->contentY(), 10.0); +} + +void tst_QDeclarativeGridView::indexAt() +{ + QDeclarativeView *canvas = createView(); + + TestModel model; + model.addItem("Fred", "12345"); + model.addItem("John", "2345"); + model.addItem("Bob", "54321"); + model.addItem("Billy", "22345"); + model.addItem("Sam", "2945"); + model.addItem("Ben", "04321"); + model.addItem("Jim", "0780"); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + ctxt->setContextProperty("testRightToLeft", QVariant(false)); + ctxt->setContextProperty("testTopToBottom", QVariant(false)); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml")); + qApp->processEvents(); + + QDeclarativeGridView *gridview = findItem(canvas->rootObject(), "grid"); + QTRY_VERIFY(gridview != 0); + + QDeclarativeItem *contentItem = gridview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + QTRY_COMPARE(gridview->count(), model.count()); + + QCOMPARE(gridview->indexAt(0, 0), 0); + QCOMPARE(gridview->indexAt(79, 59), 0); + QCOMPARE(gridview->indexAt(80, 0), 1); + QCOMPARE(gridview->indexAt(0, 60), 3); + QCOMPARE(gridview->indexAt(240, 0), -1); + + delete canvas; +} + +void tst_QDeclarativeGridView::onAdd() +{ + QFETCH(int, initialItemCount); + QFETCH(int, itemsToAdd); + + const int delegateWidth = 50; + const int delegateHeight = 100; + TestModel model; + QDeclarativeView *canvas = createView(); + canvas->setFixedSize(5 * delegateWidth, 5 * delegateHeight); // just ensure all items fit + + // these initial items should not trigger GridView.onAdd + for (int i=0; irootContext(); + ctxt->setContextProperty("testModel", &model); + ctxt->setContextProperty("delegateWidth", delegateWidth); + ctxt->setContextProperty("delegateHeight", delegateHeight); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/attachedSignals.qml")); + + QObject *object = canvas->rootObject(); + object->setProperty("width", canvas->width()); + object->setProperty("height", canvas->height()); + qApp->processEvents(); + + QList > items; + for (int i=0; iprocessEvents(); + + QVariantList result = object->property("addedDelegates").toList(); + QCOMPARE(result.count(), items.count()); + for (int i=0; i("initialItemCount"); + QTest::addColumn("itemsToAdd"); + + QTest::newRow("0, add 1") << 0 << 1; + QTest::newRow("0, add 2") << 0 << 2; + QTest::newRow("0, add 10") << 0 << 10; + + QTest::newRow("1, add 1") << 1 << 1; + QTest::newRow("1, add 2") << 1 << 2; + QTest::newRow("1, add 10") << 1 << 10; + + QTest::newRow("5, add 1") << 5 << 1; + QTest::newRow("5, add 2") << 5 << 2; + QTest::newRow("5, add 10") << 5 << 10; +} + +void tst_QDeclarativeGridView::onRemove() +{ + QFETCH(int, initialItemCount); + QFETCH(int, indexToRemove); + QFETCH(int, removeCount); + + const int delegateWidth = 50; + const int delegateHeight = 100; + TestModel model; + for (int i=0; irootContext(); + ctxt->setContextProperty("testModel", &model); + ctxt->setContextProperty("delegateWidth", delegateWidth); + ctxt->setContextProperty("delegateHeight", delegateHeight); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/attachedSignals.qml")); + QObject *object = canvas->rootObject(); + + qApp->processEvents(); + + model.removeItems(indexToRemove, removeCount); + qApp->processEvents(); + QCOMPARE(object->property("removedDelegateCount"), QVariant(removeCount)); + + delete canvas; +} + +void tst_QDeclarativeGridView::onRemove_data() +{ + QTest::addColumn("initialItemCount"); + QTest::addColumn("indexToRemove"); + QTest::addColumn("removeCount"); + + QTest::newRow("remove first") << 1 << 0 << 1; + QTest::newRow("two items, remove first") << 2 << 0 << 1; + QTest::newRow("two items, remove last") << 2 << 1 << 1; + QTest::newRow("two items, remove all") << 2 << 0 << 2; + + QTest::newRow("four items, remove first") << 4 << 0 << 1; + QTest::newRow("four items, remove 0-2") << 4 << 0 << 2; + QTest::newRow("four items, remove 1-3") << 4 << 1 << 2; + QTest::newRow("four items, remove 2-4") << 4 << 2 << 2; + QTest::newRow("four items, remove last") << 4 << 3 << 1; + QTest::newRow("four items, remove all") << 4 << 0 << 4; + + QTest::newRow("ten items, remove 1-8") << 10 << 0 << 8; + QTest::newRow("ten items, remove 2-7") << 10 << 2 << 5; + QTest::newRow("ten items, remove 4-10") << 10 << 4 << 6; +} + +void tst_QDeclarativeGridView::testQtQuick11Attributes() +{ + QFETCH(QString, code); + QFETCH(QString, warning); + QFETCH(QString, error); + + QDeclarativeEngine engine; + QObject *obj; + + QDeclarativeComponent valid(&engine); + valid.setData("import QtQuick 1.1; GridView { " + code.toUtf8() + " }", QUrl("")); + obj = valid.create(); + QVERIFY(obj); + QVERIFY(valid.errorString().isEmpty()); + delete obj; + + QDeclarativeComponent invalid(&engine); + invalid.setData("import QtQuick 1.0; GridView { " + code.toUtf8() + " }", QUrl("")); + QTest::ignoreMessage(QtWarningMsg, warning.toUtf8()); + obj = invalid.create(); + QCOMPARE(invalid.errorString(), error); + delete obj; +} + +void tst_QDeclarativeGridView::testQtQuick11Attributes_data() +{ + QTest::addColumn("code"); + QTest::addColumn("warning"); + QTest::addColumn("error"); + + QTest::newRow("positionViewAtBeginning") << "Component.onCompleted: positionViewAtBeginning()" + << ":1: ReferenceError: Can't find variable: positionViewAtBeginning" + << ""; + + QTest::newRow("positionViewAtEnd") << "Component.onCompleted: positionViewAtEnd()" + << ":1: ReferenceError: Can't find variable: positionViewAtEnd" + << ""; +} + +void tst_QDeclarativeGridView::contentPosJump() +{ + QDeclarativeView *canvas = createView(); + + TestModel model; + for (int i = 0; i < 100; i++) + model.addItem("Item" + QString::number(i), ""); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + ctxt->setContextProperty("testRightToLeft", QVariant(false)); + ctxt->setContextProperty("testTopToBottom", QVariant(false)); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/gridview1.qml")); + qApp->processEvents(); + + QDeclarativeGridView *gridview = findItem(canvas->rootObject(), "grid"); + QVERIFY(gridview != 0); + + QDeclarativeItem *contentItem = gridview->contentItem(); + QVERIFY(contentItem != 0); + + // Test jumping more than a page of items. + gridview->setContentY(500); + + // Confirm items positioned correctly + int itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 24; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QVERIFY(item); + QVERIFY(item->x() == (i%3)*80); + QVERIFY(item->y() == (i/3)*60); + } + + gridview->setContentY(-100); + itemCount = findItems(contentItem, "wrapper").count(); + QVERIFY(itemCount < 15); + // Confirm items positioned correctly + for (int i = 0; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QVERIFY(item); + QVERIFY(item->x() == (i%3)*80); + QVERIFY(item->y() == (i/3)*60); + } + + delete canvas; +} + +QDeclarativeView *tst_QDeclarativeGridView::createView() +{ + QDeclarativeView *canvas = new QDeclarativeView(0); + canvas->setFixedSize(240,320); + + return canvas; +} + +/* + Find an item with the specified objectName. If index is supplied then the + item must also evaluate the {index} expression equal to index +*/ +template +T *tst_QDeclarativeGridView::findItem(QGraphicsObject *parent, const QString &objectName, int index) +{ + const QMetaObject &mo = T::staticMetaObject; + //qDebug() << parent->childItems().count() << "children"; + for (int i = 0; i < parent->childItems().count(); ++i) { + QDeclarativeItem *item = qobject_cast(parent->childItems().at(i)); + if(!item) + continue; + //qDebug() << "try" << item; + if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName)) { + if (index != -1) { + QDeclarativeContext *context = QDeclarativeEngine::contextForObject(item); + if (context) { + if (context->contextProperty("index").toInt() == index) { + return static_cast(item); + } + } + } else { + return static_cast(item); + } + } + item = findItem(item, objectName, index); + if (item) + return static_cast(item); + } + + return 0; +} + +template +QList tst_QDeclarativeGridView::findItems(QGraphicsObject *parent, const QString &objectName) +{ + QList items; + const QMetaObject &mo = T::staticMetaObject; + //qDebug() << parent->childItems().count() << "children"; + for (int i = 0; i < parent->childItems().count(); ++i) { + QDeclarativeItem *item = qobject_cast(parent->childItems().at(i)); + if(!item) + continue; + //qDebug() << "try" << item; + if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName)) { + items.append(static_cast(item)); + //qDebug() << " found:" << item; + } + items += findItems(item, objectName); + } + + return items; +} + +void tst_QDeclarativeGridView::dumpTree(QDeclarativeItem *parent, int depth) +{ + static QString padding(" "); + for (int i = 0; i < parent->childItems().count(); ++i) { + QDeclarativeItem *item = qobject_cast(parent->childItems().at(i)); + if(!item) + continue; + QDeclarativeContext *context = QDeclarativeEngine::contextForObject(item); + qDebug() << padding.left(depth*2) << item << (context ? context->contextProperty("index").toInt() : -1); + dumpTree(item, depth+1); + } +} + + +QTEST_MAIN(tst_QDeclarativeGridView) + +#include "tst_qdeclarativegridview.moc" diff --git a/tests/auto/declarative/qdeclarativeimage/data/aspectratio.qml b/tests/auto/declarative/qdeclarativeimage/data/aspectratio.qml new file mode 100644 index 00000000..cd092bc7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeimage/data/aspectratio.qml @@ -0,0 +1,10 @@ +import QtQuick 1.0 + +Image { + property int widthChange: 0 + property int heightChange: 0 + source: "heart.png" + fillMode: Image.PreserveAspectFit; + onWidthChanged: widthChange += 1 + onHeightChanged: heightChange += 1 +} diff --git a/tests/auto/declarative/qdeclarativeimage/data/big.jpeg b/tests/auto/declarative/qdeclarativeimage/data/big.jpeg new file mode 100644 index 00000000..bed7bd65 Binary files /dev/null and b/tests/auto/declarative/qdeclarativeimage/data/big.jpeg differ diff --git a/tests/auto/declarative/qdeclarativeimage/data/big256.png b/tests/auto/declarative/qdeclarativeimage/data/big256.png new file mode 100644 index 00000000..1dc1596d Binary files /dev/null and b/tests/auto/declarative/qdeclarativeimage/data/big256.png differ diff --git a/tests/auto/declarative/qdeclarativeimage/data/colors.png b/tests/auto/declarative/qdeclarativeimage/data/colors.png new file mode 100644 index 00000000..dfb62f3d Binary files /dev/null and b/tests/auto/declarative/qdeclarativeimage/data/colors.png differ diff --git a/tests/auto/declarative/qdeclarativeimage/data/colors1.png b/tests/auto/declarative/qdeclarativeimage/data/colors1.png new file mode 100644 index 00000000..dfb62f3d Binary files /dev/null and b/tests/auto/declarative/qdeclarativeimage/data/colors1.png differ diff --git a/tests/auto/declarative/qdeclarativeimage/data/green.png b/tests/auto/declarative/qdeclarativeimage/data/green.png new file mode 100644 index 00000000..0a2e153b Binary files /dev/null and b/tests/auto/declarative/qdeclarativeimage/data/green.png differ diff --git a/tests/auto/declarative/qdeclarativeimage/data/heart-win32.png b/tests/auto/declarative/qdeclarativeimage/data/heart-win32.png new file mode 100644 index 00000000..351da137 Binary files /dev/null and b/tests/auto/declarative/qdeclarativeimage/data/heart-win32.png differ diff --git a/tests/auto/declarative/qdeclarativeimage/data/heart.png b/tests/auto/declarative/qdeclarativeimage/data/heart.png new file mode 100644 index 00000000..abe97fee Binary files /dev/null and b/tests/auto/declarative/qdeclarativeimage/data/heart.png differ diff --git a/tests/auto/declarative/qdeclarativeimage/data/heart.svg b/tests/auto/declarative/qdeclarativeimage/data/heart.svg new file mode 100644 index 00000000..8c982cd9 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeimage/data/heart.svg @@ -0,0 +1,55 @@ + + + + + +Heart Left-Highlight +This is a normal valentines day heart. + + +holiday +valentines + +valentine +hash(0x8a091c0) +hash(0x8a0916c) +signs_and_symbols +hash(0x8a091f0) +day + + + + +Jon Phillips + + + + +Jon Phillips + + + + +Jon Phillips + + + +image/svg+xml + + +en + + + + + + + + + + + + + + + diff --git a/tests/auto/declarative/qdeclarativeimage/data/heart200-win32.png b/tests/auto/declarative/qdeclarativeimage/data/heart200-win32.png new file mode 100644 index 00000000..4976ff98 Binary files /dev/null and b/tests/auto/declarative/qdeclarativeimage/data/heart200-win32.png differ diff --git a/tests/auto/declarative/qdeclarativeimage/data/heart200.png b/tests/auto/declarative/qdeclarativeimage/data/heart200.png new file mode 100644 index 00000000..7fbb13c5 Binary files /dev/null and b/tests/auto/declarative/qdeclarativeimage/data/heart200.png differ diff --git a/tests/auto/declarative/qdeclarativeimage/data/qtbug_16389.qml b/tests/auto/declarative/qdeclarativeimage/data/qtbug_16389.qml new file mode 100644 index 00000000..29fba400 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeimage/data/qtbug_16389.qml @@ -0,0 +1,30 @@ +import QtQuick 1.0 +Rectangle { + width: 400 + height: 400 + + Item { + anchors.top: parent.top + anchors.left: parent.left + anchors.bottom: blueHandle.top + anchors.right: blueHandle.left + + Image { + id: iconImage + objectName: "iconImage" + anchors.top: parent.top + anchors.bottom: parent.bottom + source: "heart200.png" + fillMode: Image.PreserveAspectFit + smooth: true + } + } + + Rectangle { + id: blueHandle + objectName: "blueHandle" + color: "blue" + width: 25 + height: 25 + } +} diff --git a/tests/auto/declarative/qdeclarativeimage/data/qtbug_22125.qml b/tests/auto/declarative/qdeclarativeimage/data/qtbug_22125.qml new file mode 100644 index 00000000..85880282 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeimage/data/qtbug_22125.qml @@ -0,0 +1,44 @@ +import QtQuick 1.1 + +Item { + id: root + width: 800 + height: 800 + + GridView { + anchors.fill: parent + delegate: Image { + source: imagePath; + asynchronous: true + smooth: true + width: 200 + height: 200 + } + model: ListModel { + ListElement { + imagePath: "http://127.0.0.1:14451/big256.png" + } + ListElement { + imagePath: "http://127.0.0.1:14451/big256.png" + } + ListElement { + imagePath: "http://127.0.0.1:14451/big256.png" + } + ListElement { + imagePath: "http://127.0.0.1:14451/colors.png" + } + ListElement { + imagePath: "http://127.0.0.1:14451/colors1.png" + } + ListElement { + imagePath: "http://127.0.0.1:14451/big.jpeg" + } + ListElement { + imagePath: "http://127.0.0.1:14451/heart.png" + } + ListElement { + imagePath: "http://127.0.0.1:14451/green.png" + } + } + } +} diff --git a/tests/auto/declarative/qdeclarativeimage/data/rect.png b/tests/auto/declarative/qdeclarativeimage/data/rect.png new file mode 100644 index 00000000..d564a2d5 Binary files /dev/null and b/tests/auto/declarative/qdeclarativeimage/data/rect.png differ diff --git a/tests/auto/declarative/qdeclarativeimage/data/tiling.qml b/tests/auto/declarative/qdeclarativeimage/data/tiling.qml new file mode 100644 index 00000000..49715ab3 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeimage/data/tiling.qml @@ -0,0 +1,16 @@ +import QtQuick 1.0 + +Rectangle { + width: 800; height: 600 + + Image { + objectName: "vTiling"; height: 550; width: 200 + source: "green.png"; fillMode: Image.TileVertically + } + + Image { + objectName: "hTiling"; x: 225; height: 250; width: 550 + source: "green.png"; fillMode: Image.TileHorizontally + } +} + diff --git a/tests/auto/declarative/qdeclarativeimage/qdeclarativeimage.pro b/tests/auto/declarative/qdeclarativeimage/qdeclarativeimage.pro new file mode 100644 index 00000000..5bf8095f --- /dev/null +++ b/tests/auto/declarative/qdeclarativeimage/qdeclarativeimage.pro @@ -0,0 +1,18 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative gui network +macx:CONFIG -= app_bundle + +HEADERS += ../shared/testhttpserver.h +SOURCES += tst_qdeclarativeimage.cpp ../shared/testhttpserver.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + +CONFIG+=insignificant_test # QTQAINFRA-428 diff --git a/tests/auto/declarative/qdeclarativeimage/tst_qdeclarativeimage.cpp b/tests/auto/declarative/qdeclarativeimage/tst_qdeclarativeimage.cpp new file mode 100644 index 00000000..48e81510 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeimage/tst_qdeclarativeimage.cpp @@ -0,0 +1,839 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../../../shared/util.h" +#include "../shared/testhttpserver.h" + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +#define SERVER_PORT 14451 +#define SERVER_ADDR "http://127.0.0.1:14451" + +class tst_qdeclarativeimage : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativeimage(); + +private slots: + void noSource(); + void imageSource(); + void imageSource_data(); + void clearSource(); + void resized(); + void preserveAspectRatio(); + void smooth(); + void mirror(); + void mirror_data(); + void svg(); + void geometry(); + void geometry_data(); + void big(); + void tiling_QTBUG_6716(); + void noLoading(); + void paintedWidthHeight(); + void sourceSize_QTBUG_14303(); + void sourceSize_QTBUG_16389(); + void nullPixmapPaint(); + void resetSourceSize(); + void testQtQuick11Attributes(); + void testQtQuick11Attributes_data(); + void readerCrash_QTBUG_22125(); + +private: + template + T *findItem(QGraphicsObject *parent, const QString &id, int index=-1); + + QDeclarativeEngine engine; +}; + +tst_qdeclarativeimage::tst_qdeclarativeimage() +{ +} + +void tst_qdeclarativeimage::noSource() +{ + QString componentStr = "import QtQuick 1.0\nImage { source: \"\" }"; + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeImage *obj = qobject_cast(component.create()); + QVERIFY(obj != 0); + QCOMPARE(obj->source(), QUrl()); + QVERIFY(obj->status() == QDeclarativeImage::Null); + QCOMPARE(obj->width(), 0.); + QCOMPARE(obj->height(), 0.); + QCOMPARE(obj->fillMode(), QDeclarativeImage::Stretch); + QCOMPARE(obj->progress(), 0.0); + + delete obj; +} + +void tst_qdeclarativeimage::imageSource_data() +{ + QTest::addColumn("source"); + QTest::addColumn("width"); + QTest::addColumn("height"); + QTest::addColumn("remote"); + QTest::addColumn("async"); + QTest::addColumn("cache"); + QTest::addColumn("error"); + + QTest::newRow("local") << QUrl::fromLocalFile(SRCDIR "/data/colors.png").toString() << 120.0 << 120.0 << false << false << true << ""; + QTest::newRow("local no cache") << QUrl::fromLocalFile(SRCDIR "/data/colors.png").toString() << 120.0 << 120.0 << false << false << false << ""; + QTest::newRow("local async") << QUrl::fromLocalFile(SRCDIR "/data/colors1.png").toString() << 120.0 << 120.0 << false << true << true << ""; + QTest::newRow("local not found") << QUrl::fromLocalFile(SRCDIR "/data/no-such-file.png").toString() << 0.0 << 0.0 << false + << false << true << "file::2:1: QML Image: Cannot open: " + QUrl::fromLocalFile(SRCDIR "/data/no-such-file.png").toString(); + QTest::newRow("local async not found") << QUrl::fromLocalFile(SRCDIR "/data/no-such-file-1.png").toString() << 0.0 << 0.0 << false + << true << true << "file::2:1: QML Image: Cannot open: " + QUrl::fromLocalFile(SRCDIR "/data/no-such-file-1.png").toString(); + QTest::newRow("remote") << SERVER_ADDR "/colors.png" << 120.0 << 120.0 << true << false << true << ""; + QTest::newRow("remote redirected") << SERVER_ADDR "/oldcolors.png" << 120.0 << 120.0 << true << false << false << ""; + QTest::newRow("remote svg") << SERVER_ADDR "/heart.svg" << 550.0 << 500.0 << true << false << false << ""; + QTest::newRow("remote not found") << SERVER_ADDR "/no-such-file.png" << 0.0 << 0.0 << true + << false << true << "file::2:1: QML Image: Error downloading " SERVER_ADDR "/no-such-file.png - server replied: Not found"; + +} + +void tst_qdeclarativeimage::imageSource() +{ + QFETCH(QString, source); + QFETCH(double, width); + QFETCH(double, height); + QFETCH(bool, remote); + QFETCH(bool, async); + QFETCH(bool, cache); + QFETCH(QString, error); + + TestHTTPServer server(SERVER_PORT); + if (remote) { + QVERIFY(server.isValid()); + server.serveDirectory(SRCDIR "/data"); + server.addRedirect("oldcolors.png", SERVER_ADDR "/colors.png"); + } + + if (!error.isEmpty()) + QTest::ignoreMessage(QtWarningMsg, error.toUtf8()); + + QString componentStr = "import QtQuick 1.1\nImage { source: \"" + source + "\"; asynchronous: " + + (async ? QLatin1String("true") : QLatin1String("false")) + "; cache: " + + (cache ? QLatin1String("true") : QLatin1String("false")) + " }"; + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeImage *obj = qobject_cast(component.create()); + QVERIFY(obj != 0); + + if (async) + QVERIFY(obj->asynchronous() == true); + else + QVERIFY(obj->asynchronous() == false); + + if (cache) + QVERIFY(obj->cache() == true); + else + QVERIFY(obj->cache() == false); + + if (remote || async) + QTRY_VERIFY(obj->status() == QDeclarativeImage::Loading); + + QCOMPARE(obj->source(), remote ? source : QUrl(source)); + + if (error.isEmpty()) { + QTRY_VERIFY(obj->status() == QDeclarativeImage::Ready); + QCOMPARE(obj->width(), qreal(width)); + QCOMPARE(obj->height(), qreal(height)); + QCOMPARE(obj->fillMode(), QDeclarativeImage::Stretch); + QCOMPARE(obj->progress(), 1.0); + } else { + QTRY_VERIFY(obj->status() == QDeclarativeImage::Error); + } + + delete obj; +} + +void tst_qdeclarativeimage::clearSource() +{ + QString componentStr = "import QtQuick 1.0\nImage { source: srcImage }"; + QDeclarativeContext *ctxt = engine.rootContext(); + ctxt->setContextProperty("srcImage", QUrl::fromLocalFile(SRCDIR "/data/colors.png")); + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeImage *obj = qobject_cast(component.create()); + QVERIFY(obj != 0); + QVERIFY(obj->status() == QDeclarativeImage::Ready); + QCOMPARE(obj->width(), 120.); + QCOMPARE(obj->height(), 120.); + QCOMPARE(obj->progress(), 1.0); + + ctxt->setContextProperty("srcImage", ""); + QVERIFY(obj->source().isEmpty()); + QVERIFY(obj->status() == QDeclarativeImage::Null); + QCOMPARE(obj->width(), 0.); + QCOMPARE(obj->height(), 0.); + QCOMPARE(obj->progress(), 0.0); +} + +void tst_qdeclarativeimage::resized() +{ + QString componentStr = "import QtQuick 1.0\nImage { source: \"" SRCDIR "/data/colors.png\"; width: 300; height: 300 }"; + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeImage *obj = qobject_cast(component.create()); + QVERIFY(obj != 0); + QCOMPARE(obj->width(), 300.); + QCOMPARE(obj->height(), 300.); + QCOMPARE(obj->fillMode(), QDeclarativeImage::Stretch); + delete obj; +} + + +void tst_qdeclarativeimage::preserveAspectRatio() +{ + QDeclarativeView *canvas = new QDeclarativeView(0); + canvas->show(); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/aspectratio.qml")); + QDeclarativeImage *image = qobject_cast(canvas->rootObject()); + QVERIFY(image != 0); + QCOMPARE(image->property("widthChange").toInt(), 1); + QCOMPARE(image->property("heightChange").toInt(), 1); + image->setWidth(80.0); + QCOMPARE(image->property("widthChange").toInt(), 2); + QCOMPARE(image->property("heightChange").toInt(), 2); + QCOMPARE(image->width(), 80.); + QCOMPARE(image->height(), 80.); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/aspectratio.qml")); + image = qobject_cast(canvas->rootObject()); + QVERIFY(image != 0); + QCOMPARE(image->property("widthChange").toInt(), 1); + QCOMPARE(image->property("heightChange").toInt(), 1); + image->setHeight(60.0); + QCOMPARE(image->property("widthChange").toInt(), 2); + QCOMPARE(image->property("heightChange").toInt(), 2); + QCOMPARE(image->height(), 60.); + QCOMPARE(image->width(), 60.); + delete canvas; +} + +void tst_qdeclarativeimage::smooth() +{ + QString componentStr = "import QtQuick 1.0\nImage { source: \"" SRCDIR "/data/colors.png\"; smooth: true; width: 300; height: 300 }"; + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeImage *obj = qobject_cast(component.create()); + QVERIFY(obj != 0); + QCOMPARE(obj->width(), 300.); + QCOMPARE(obj->height(), 300.); + QCOMPARE(obj->smooth(), true); + QCOMPARE(obj->fillMode(), QDeclarativeImage::Stretch); + + delete obj; +} + +void tst_qdeclarativeimage::mirror() +{ + QFETCH(int, fillMode); + + qreal width = 300; + qreal height = 250; + + QString src = QUrl::fromLocalFile(SRCDIR "/data/heart200.png").toString(); + QString componentStr = "import QtQuick 1.1\nImage { source: \"" + src + "\"; }"; + + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeImage *obj = qobject_cast(component.create()); + QVERIFY(obj != 0); + + obj->setProperty("width", width); + obj->setProperty("height", height); + obj->setFillMode((QDeclarativeImage::FillMode)fillMode); + obj->setProperty("mirror", true); + + QGraphicsScene scene; + scene.addItem(qobject_cast(obj)); + QPixmap screenshot(width, height); + screenshot.fill(); + QPainter p_screenshot(&screenshot); + scene.render(&p_screenshot, QRect(0, 0, width, height), QRect(0, 0, width, height)); + + QPixmap srcPixmap; + QVERIFY(srcPixmap.load(SRCDIR "/data/heart200.png")); + + QPixmap expected(width, height); + expected.fill(); + QPainter p_e(&expected); + QTransform transform; + transform.translate(width, 0).scale(-1, 1.0); + p_e.setTransform(transform); + + switch (fillMode) { + case QDeclarativeImage::Stretch: + p_e.drawPixmap(QRect(0, 0, width, height), srcPixmap, QRect(0, 0, srcPixmap.width(), srcPixmap.height())); + break; + case QDeclarativeImage::PreserveAspectFit: + p_e.drawPixmap(QRect(25, 0, width / (width/height), height), srcPixmap, QRect(0, 0, srcPixmap.width(), srcPixmap.height())); + break; + case QDeclarativeImage::PreserveAspectCrop: + { + qreal ratio = width/srcPixmap.width(); // width is the longer side + QRect rect(0, 0, srcPixmap.width()*ratio, srcPixmap.height()*ratio); + rect.moveCenter(QRect(0, 0, width, height).center()); + p_e.drawPixmap(rect, srcPixmap, QRect(0, 0, srcPixmap.width(), srcPixmap.height())); + break; + } + case QDeclarativeImage::Tile: + p_e.drawTiledPixmap(QRect(0, 0, width, height), srcPixmap); + break; + case QDeclarativeImage::TileVertically: + transform.scale(width / srcPixmap.width(), 1.0); + p_e.setTransform(transform); + p_e.drawTiledPixmap(QRect(0, 0, width, height), srcPixmap); + break; + case QDeclarativeImage::TileHorizontally: + transform.scale(1.0, height / srcPixmap.height()); + p_e.setTransform(transform); + p_e.drawTiledPixmap(QRect(0, 0, width, height), srcPixmap); + break; + } + + QCOMPARE(screenshot, expected); + + delete obj; +} + +void tst_qdeclarativeimage::mirror_data() +{ + QTest::addColumn("fillMode"); + + QTest::newRow("Stretch") << int(QDeclarativeImage::Stretch); + QTest::newRow("PreserveAspectFit") << int(QDeclarativeImage::PreserveAspectFit); + QTest::newRow("PreserveAspectCrop") << int(QDeclarativeImage::PreserveAspectCrop); + QTest::newRow("Tile") << int(QDeclarativeImage::Tile); + QTest::newRow("TileVertically") << int(QDeclarativeImage::TileVertically); + QTest::newRow("TileHorizontally") << int(QDeclarativeImage::TileHorizontally); +} + +void tst_qdeclarativeimage::svg() +{ + QString src = QUrl::fromLocalFile(SRCDIR "/data/heart.svg").toString(); + QString componentStr = "import QtQuick 1.0\nImage { source: \"" + src + "\"; sourceSize.width: 300; sourceSize.height: 300 }"; + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeImage *obj = qobject_cast(component.create()); + QVERIFY(obj != 0); + QCOMPARE(obj->pixmap().width(), 300); + QCOMPARE(obj->pixmap().height(), 300); + QCOMPARE(obj->width(), 300.0); + QCOMPARE(obj->height(), 300.0); +#if defined(Q_OS_LINUX) + QCOMPARE(obj->pixmap(), QPixmap(SRCDIR "/data/heart.png")); +#elif defined(Q_OS_WIN32) + QCOMPARE(obj->pixmap(), QPixmap(SRCDIR "/data/heart-win32.png")); +#endif + + obj->setSourceSize(QSize(200,200)); + + QCOMPARE(obj->pixmap().width(), 200); + QCOMPARE(obj->pixmap().height(), 200); + QCOMPARE(obj->width(), 200.0); + QCOMPARE(obj->height(), 200.0); +#if defined(Q_OS_LINUX) + QCOMPARE(obj->pixmap(), QPixmap(SRCDIR "/data/heart200.png")); +#elif defined(Q_OS_WIN32) + QCOMPARE(obj->pixmap(), QPixmap(SRCDIR "/data/heart200-win32.png")); +#endif + delete obj; +} + +void tst_qdeclarativeimage::geometry_data() +{ + QTest::addColumn("fillMode"); + QTest::addColumn("explicitWidth"); + QTest::addColumn("explicitHeight"); + QTest::addColumn("itemWidth"); + QTest::addColumn("paintedWidth"); + QTest::addColumn("boundingWidth"); + QTest::addColumn("itemHeight"); + QTest::addColumn("paintedHeight"); + QTest::addColumn("boundingHeight"); + + // tested image has width 200, height 100 + + // bounding rect and item rect are equal with fillMode PreserveAspectFit, painted rect may be smaller if the aspect ratio doesn't match + QTest::newRow("PreserveAspectFit") << "PreserveAspectFit" << false << false << 200.0 << 200.0 << 200.0 << 100.0 << 100.0 << 100.0; + QTest::newRow("PreserveAspectFit explicit width 300") << "PreserveAspectFit" << true << false << 300.0 << 200.0 << 300.0 << 100.0 << 100.0 << 100.0; + QTest::newRow("PreserveAspectFit explicit height 400") << "PreserveAspectFit" << false << true << 200.0 << 200.0 << 200.0 << 400.0 << 100.0 << 400.0; + QTest::newRow("PreserveAspectFit explicit width 300, height 400") << "PreserveAspectFit" << true << true << 300.0 << 300.0 << 300.0 << 400.0 << 150.0 << 400.0; + + // bounding rect and painted rect are equal with fillMode PreserveAspectCrop, item rect may be smaller if the aspect ratio doesn't match + QTest::newRow("PreserveAspectCrop") << "PreserveAspectCrop" << false << false << 200.0 << 200.0 << 200.0 << 100.0 << 100.0 << 100.0; + QTest::newRow("PreserveAspectCrop explicit width 300") << "PreserveAspectCrop" << true << false << 300.0 << 300.0 << 300.0 << 100.0 << 150.0 << 150.0; + QTest::newRow("PreserveAspectCrop explicit height 400") << "PreserveAspectCrop" << false << true << 200.0 << 800.0 << 800.0 << 400.0 << 400.0 << 400.0; + QTest::newRow("PreserveAspectCrop explicit width 300, height 400") << "PreserveAspectCrop" << true << true << 300.0 << 800.0 << 800.0 << 400.0 << 400.0 << 400.0; + + // bounding rect, painted rect and item rect are equal in stretching and tiling images + QStringList fillModes; + fillModes << "Stretch" << "Tile" << "TileVertically" << "TileHorizontally"; + foreach (QString fillMode, fillModes) { + QTest::newRow(fillMode.toLatin1()) << fillMode << false << false << 200.0 << 200.0 << 200.0 << 100.0 << 100.0 << 100.0; + QTest::newRow(QString(fillMode + " explicit width 300").toLatin1()) << fillMode << true << false << 300.0 << 300.0 << 300.0 << 100.0 << 100.0 << 100.0; + QTest::newRow(QString(fillMode + " explicit height 400").toLatin1()) << fillMode << false << true << 200.0 << 200.0 << 200.0 << 400.0 << 400.0 << 400.0; + QTest::newRow(QString(fillMode + " explicit width 300, height 400").toLatin1()) << fillMode << true << true << 300.0 << 300.0 << 300.0 << 400.0 << 400.0 << 400.0; + } +} + +void tst_qdeclarativeimage::geometry() +{ + QFETCH(QString, fillMode); + QFETCH(bool, explicitWidth); + QFETCH(bool, explicitHeight); + QFETCH(double, itemWidth); + QFETCH(double, itemHeight); + QFETCH(double, paintedWidth); + QFETCH(double, paintedHeight); + QFETCH(double, boundingWidth); + QFETCH(double, boundingHeight); + + QString src = QUrl::fromLocalFile(SRCDIR "/data/rect.png").toString(); + QString componentStr = "import QtQuick 1.0\nImage { source: \"" + src + "\"; fillMode: Image." + fillMode + "; "; + + if (explicitWidth) + componentStr.append("width: 300; "); + if (explicitHeight) + componentStr.append("height: 400; "); + componentStr.append("}"); + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeImage *obj = qobject_cast(component.create()); + QVERIFY(obj != 0); + + QCOMPARE(obj->width(), itemWidth); + QCOMPARE(obj->paintedWidth(), paintedWidth); + QCOMPARE(obj->boundingRect().width(), boundingWidth); + + QCOMPARE(obj->height(), itemHeight); + QCOMPARE(obj->paintedHeight(), paintedHeight); + QCOMPARE(obj->boundingRect().height(), boundingHeight); + delete obj; +} + +void tst_qdeclarativeimage::big() +{ + // If the JPEG loader does not implement scaling efficiently, it would + // have to build a 400 MB image. That would be a bug in the JPEG loader. + + QString src = QUrl::fromLocalFile(SRCDIR "/data/big.jpeg").toString(); + QString componentStr = "import QtQuick 1.0\nImage { source: \"" + src + "\"; width: 100; sourceSize.height: 256 }"; + + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeImage *obj = qobject_cast(component.create()); + QVERIFY(obj != 0); + QCOMPARE(obj->pixmap().width(), 256); + QCOMPARE(obj->pixmap().height(), 256); + QCOMPARE(obj->width(), 100.0); + QCOMPARE(obj->height(), 256.0); + QCOMPARE(obj->pixmap(), QPixmap(SRCDIR "/data/big256.png")); + + delete obj; +} + +void tst_qdeclarativeimage::tiling_QTBUG_6716() +{ + QDeclarativeView *canvas = new QDeclarativeView(0); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/tiling.qml")); + canvas->show(); + qApp->processEvents(); + + QDeclarativeImage *vTiling = findItem(canvas->rootObject(), "vTiling"); + QDeclarativeImage *hTiling = findItem(canvas->rootObject(), "hTiling"); + + QVERIFY(vTiling != 0); + QVERIFY(hTiling != 0); + + { + QPixmap pm(vTiling->width(), vTiling->height()); + QPainter p(&pm); + vTiling->paint(&p, 0, 0); + + QImage img = pm.toImage(); + for (int x = 0; x < vTiling->width(); ++x) { + for (int y = 0; y < vTiling->height(); ++y) { + QVERIFY(img.pixel(x, y) == qRgb(0, 255, 0)); + } + } + } + + { + QPixmap pm(hTiling->width(), hTiling->height()); + QPainter p(&pm); + hTiling->paint(&p, 0, 0); + + QImage img = pm.toImage(); + for (int x = 0; x < hTiling->width(); ++x) { + for (int y = 0; y < hTiling->height(); ++y) { + QVERIFY(img.pixel(x, y) == qRgb(0, 255, 0)); + } + } + } +} + +void tst_qdeclarativeimage::noLoading() +{ + TestHTTPServer server(SERVER_PORT); + QVERIFY(server.isValid()); + server.serveDirectory(SRCDIR "/data"); + server.addRedirect("oldcolors.png", SERVER_ADDR "/colors.png"); + + QString componentStr = "import QtQuick 1.0\nImage { source: srcImage }"; + QDeclarativeContext *ctxt = engine.rootContext(); + ctxt->setContextProperty("srcImage", QUrl::fromLocalFile(SRCDIR "/data/heart.png")); + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeImage *obj = qobject_cast(component.create()); + QVERIFY(obj != 0); + QVERIFY(obj->status() == QDeclarativeImage::Ready); + + QSignalSpy sourceSpy(obj, SIGNAL(sourceChanged(const QUrl &))); + QSignalSpy progressSpy(obj, SIGNAL(progressChanged(qreal))); + QSignalSpy statusSpy(obj, SIGNAL(statusChanged(QDeclarativeImageBase::Status))); + + // Loading local file + ctxt->setContextProperty("srcImage", QUrl::fromLocalFile(SRCDIR "/data/colors.png")); + QTRY_VERIFY(obj->status() == QDeclarativeImage::Ready); + QTRY_VERIFY(obj->progress() == 1.0); + QTRY_COMPARE(sourceSpy.count(), 1); + QTRY_COMPARE(progressSpy.count(), 0); + QTRY_COMPARE(statusSpy.count(), 0); + + // Loading remote file + ctxt->setContextProperty("srcImage", QString(SERVER_ADDR) + "/heart200.png"); + QTRY_VERIFY(obj->status() == QDeclarativeImage::Loading); + QTRY_VERIFY(obj->progress() == 0.0); + QTRY_VERIFY(obj->status() == QDeclarativeImage::Ready); + QTRY_VERIFY(obj->progress() == 1.0); + QTRY_COMPARE(sourceSpy.count(), 2); + QTRY_COMPARE(progressSpy.count(), 2); + QTRY_COMPARE(statusSpy.count(), 2); + + // Loading remote file again - should not go through 'Loading' state. + ctxt->setContextProperty("srcImage", QUrl::fromLocalFile(SRCDIR "/data/colors.png")); + ctxt->setContextProperty("srcImage", QString(SERVER_ADDR) + "/heart200.png"); + QTRY_VERIFY(obj->status() == QDeclarativeImage::Ready); + QTRY_VERIFY(obj->progress() == 1.0); + QTRY_COMPARE(sourceSpy.count(), 4); + QTRY_COMPARE(progressSpy.count(), 2); + QTRY_COMPARE(statusSpy.count(), 2); +} + +void tst_qdeclarativeimage::paintedWidthHeight() +{ + { + QString src = QUrl::fromLocalFile(SRCDIR "/data/heart.png").toString(); + QString componentStr = "import QtQuick 1.0\nImage { source: \"" + src + "\"; width: 200; height: 25; fillMode: Image.PreserveAspectFit }"; + + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeImage *obj = qobject_cast(component.create()); + QVERIFY(obj != 0); + QCOMPARE(obj->pixmap().width(), 300); + QCOMPARE(obj->pixmap().height(), 300); + QCOMPARE(obj->width(), 200.0); + QCOMPARE(obj->height(), 25.0); + QCOMPARE(obj->paintedWidth(), 25.0); + QCOMPARE(obj->paintedHeight(), 25.0); + QCOMPARE(obj->pixmap(), QPixmap(SRCDIR "/data/heart.png")); + + delete obj; + } + + { + QString src = QUrl::fromLocalFile(SRCDIR "/data/heart.png").toString(); + QString componentStr = "import QtQuick 1.0\nImage { source: \"" + src + "\"; width: 26; height: 175; fillMode: Image.PreserveAspectFit }"; + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeImage *obj = qobject_cast(component.create()); + QVERIFY(obj != 0); + QCOMPARE(obj->pixmap().width(), 300); + QCOMPARE(obj->pixmap().height(), 300); + QCOMPARE(obj->width(), 26.0); + QCOMPARE(obj->height(), 175.0); + QCOMPARE(obj->paintedWidth(), 26.0); + QCOMPARE(obj->paintedHeight(), 26.0); + QCOMPARE(obj->pixmap(), QPixmap(SRCDIR "/data/heart.png")); + + delete obj; + } +} + +void tst_qdeclarativeimage::sourceSize_QTBUG_14303() +{ + QString componentStr = "import QtQuick 1.0\nImage { source: srcImage }"; + QDeclarativeContext *ctxt = engine.rootContext(); + ctxt->setContextProperty("srcImage", QUrl::fromLocalFile(SRCDIR "/data/heart200.png")); + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeImage *obj = qobject_cast(component.create()); + + QSignalSpy sourceSizeSpy(obj, SIGNAL(sourceSizeChanged())); + + QTRY_VERIFY(obj != 0); + QTRY_VERIFY(obj->status() == QDeclarativeImage::Ready); + + QTRY_COMPARE(obj->sourceSize().width(), 200); + QTRY_COMPARE(obj->sourceSize().height(), 200); + QTRY_COMPARE(sourceSizeSpy.count(), 0); + + ctxt->setContextProperty("srcImage", QUrl::fromLocalFile(SRCDIR "/data/colors.png")); + QTRY_COMPARE(obj->sourceSize().width(), 120); + QTRY_COMPARE(obj->sourceSize().height(), 120); + QTRY_COMPARE(sourceSizeSpy.count(), 1); + + ctxt->setContextProperty("srcImage", QUrl::fromLocalFile(SRCDIR "/data/heart200.png")); + QTRY_COMPARE(obj->sourceSize().width(), 200); + QTRY_COMPARE(obj->sourceSize().height(), 200); + QTRY_COMPARE(sourceSizeSpy.count(), 2); +} + +void tst_qdeclarativeimage::sourceSize_QTBUG_16389() +{ + QDeclarativeView *canvas = new QDeclarativeView(0); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/qtbug_16389.qml")); + canvas->show(); + qApp->processEvents(); + + QDeclarativeImage *image = findItem(canvas->rootObject(), "iconImage"); + QDeclarativeItem *handle = findItem(canvas->rootObject(), "blueHandle"); + + QCOMPARE(image->sourceSize().width(), 200); + QCOMPARE(image->sourceSize().height(), 200); + QCOMPARE(image->paintedWidth(), 0.0); + QCOMPARE(image->paintedHeight(), 0.0); + + handle->setY(20); + + QCOMPARE(image->sourceSize().width(), 200); + QCOMPARE(image->sourceSize().height(), 200); + QCOMPARE(image->paintedWidth(), 20.0); + QCOMPARE(image->paintedHeight(), 20.0); +} + +static int numberOfWarnings = 0; +static void checkWarnings(QtMsgType, const char *) +{ + numberOfWarnings++; +} + +// QTBUG-15690 +void tst_qdeclarativeimage::nullPixmapPaint() +{ + QString componentStr = QString("import QtQuick 1.0\nImage { width: 10; height:10; fillMode: Image.PreserveAspectFit; source: \"") + + SERVER_ADDR + QString("/no-such-file.png\" }"); + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeImage *image = qobject_cast(component.create()); + + QTRY_VERIFY(image != 0); + + QtMsgHandler previousMsgHandler = qInstallMsgHandler(checkWarnings); + + QPixmap pm(100, 100); + QPainter p(&pm); + + // used to print "QTransform::translate with NaN called" + image->paint(&p, 0, 0); + qInstallMsgHandler(previousMsgHandler); + QVERIFY(numberOfWarnings == 0); + delete image; +} + +void tst_qdeclarativeimage::resetSourceSize() +{ + QString src = QUrl::fromLocalFile(SRCDIR "/data/heart200.png").toString(); + QString componentStr = "import QtQuick 1.1\nImage { function reset() { sourceSize = undefined }\nsource: \"" + src + "\"; sourceSize: Qt.size(100,100) }"; + + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeImage *obj = qobject_cast(component.create()); + QVERIFY(obj != 0); + QCOMPARE(obj->pixmap().width(), 100); + QCOMPARE(obj->pixmap().height(), 100); + QCOMPARE(obj->sourceSize().height(), 100); + QCOMPARE(obj->sourceSize().width(), 100); + + QMetaObject::invokeMethod(obj, "reset"); + QCOMPARE(obj->pixmap().width(), 200); + QCOMPARE(obj->pixmap().height(), 200); + QCOMPARE(obj->sourceSize().height(), 200); + QCOMPARE(obj->sourceSize().width(), 200); +} + +void tst_qdeclarativeimage::testQtQuick11Attributes() +{ + QFETCH(QString, code); + QFETCH(QString, warning); + QFETCH(QString, error); + + QDeclarativeEngine engine; + QObject *obj; + + QDeclarativeComponent valid(&engine); + valid.setData("import QtQuick 1.1; Image { " + code.toUtf8() + " }", QUrl("")); + obj = valid.create(); + QVERIFY(obj); + QVERIFY(valid.errorString().isEmpty()); + delete obj; + + QDeclarativeComponent invalid(&engine); + invalid.setData("import QtQuick 1.0; Image { " + code.toUtf8() + " }", QUrl("")); + QTest::ignoreMessage(QtWarningMsg, warning.toUtf8()); + obj = invalid.create(); + QCOMPARE(invalid.errorString(), error); + delete obj; +} + +void tst_qdeclarativeimage::testQtQuick11Attributes_data() +{ + QTest::addColumn("code"); + QTest::addColumn("warning"); + QTest::addColumn("error"); + + QTest::newRow("mirror") << "mirror: true" + << "QDeclarativeComponent: Component is not ready" + << ":1 \"Image.mirror\" is not available in QtQuick 1.0.\n"; + + QTest::newRow("cache") << "cache: true" + << "QDeclarativeComponent: Component is not ready" + << ":1 \"Image.cache\" is not available in QtQuick 1.0.\n"; +} + +void tst_qdeclarativeimage::readerCrash_QTBUG_22125() +{ + { + TestHTTPServer server(SERVER_PORT); + QVERIFY(server.isValid()); + server.serveDirectory(SRCDIR "/data/", TestHTTPServer::Delay); + + { + QDeclarativeView view(QUrl::fromLocalFile(SRCDIR "/data/qtbug_22125.qml")); + view.show(); + qApp->processEvents(); + qApp->processEvents(); + // shouldn't crash when the view drops out of scope due to + // QDeclarativePixmapData attempting to dereference a pointer to + // the destroyed reader. + } + + // shouldn't crash when deleting cancelled QDeclarativePixmapReplys. + QTest::qWait(1000); + qApp->processEvents(QEventLoop::DeferredDeletion); + } + + { + TestHTTPServer server(SERVER_PORT); + QVERIFY(server.isValid()); + server.serveDirectory(SRCDIR "/data/"); + + { + QDeclarativeView view(QUrl::fromLocalFile(SRCDIR "/data/qtbug_22125.qml")); + view.show(); + qApp->processEvents(); + QTest::qWait(1000); + qApp->processEvents(); + // shouldn't crash when the view drops out of scope due to + // the reader thread accessing self-deleted QDeclarativePixmapReplys. + } + qApp->processEvents(); + } +} + +/* + Find an item with the specified objectName. If index is supplied then the + item must also evaluate the {index} expression equal to index +*/ +template +T *tst_qdeclarativeimage::findItem(QGraphicsObject *parent, const QString &objectName, int index) +{ + const QMetaObject &mo = T::staticMetaObject; + //qDebug() << parent->childItems().count() << "children"; + for (int i = 0; i < parent->childItems().count(); ++i) { + QDeclarativeItem *item = qobject_cast(parent->childItems().at(i)); + if(!item) + continue; + //qDebug() << "try" << item; + if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName)) { + if (index != -1) { + QDeclarativeExpression e(qmlContext(item), item, "index"); + if (e.evaluate().toInt() == index) + return static_cast(item); + } else { + return static_cast(item); + } + } + item = findItem(item, objectName, index); + if (item) + return static_cast(item); + } + + return 0; +} + +QTEST_MAIN(tst_qdeclarativeimage) + +#include "tst_qdeclarativeimage.moc" diff --git a/tests/auto/declarative/qdeclarativeimageprovider/qdeclarativeimageprovider.pro b/tests/auto/declarative/qdeclarativeimageprovider/qdeclarativeimageprovider.pro new file mode 100644 index 00000000..3bf0ea13 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeimageprovider/qdeclarativeimageprovider.pro @@ -0,0 +1,16 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +QT += network +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativeimageprovider.cpp + +# QMAKE_CXXFLAGS = -fprofile-arcs -ftest-coverage +# LIBS += -lgcov + +!symbian: { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativeimageprovider/tst_qdeclarativeimageprovider.cpp b/tests/auto/declarative/qdeclarativeimageprovider/tst_qdeclarativeimageprovider.cpp new file mode 100644 index 00000000..b2e5c4e2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeimageprovider/tst_qdeclarativeimageprovider.cpp @@ -0,0 +1,432 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include "../../../shared/util.h" + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +Q_DECLARE_METATYPE(QDeclarativeImageProvider*); + +class tst_qdeclarativeimageprovider : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativeimageprovider() + { + } + +private slots: + void requestImage_sync_data(); + void requestImage_sync(); + void requestImage_async_data(); + void requestImage_async(); + + void requestPixmap_sync_data(); + void requestPixmap_sync(); + void requestPixmap_async(); + + void removeProvider_data(); + void removeProvider(); + + void threadTest(); + +private: + QString newImageFileName() const; + void fillRequestTestsData(const QString &id); + void runTest(bool async, QDeclarativeImageProvider *provider); +}; + + +class TestQImageProvider : public QDeclarativeImageProvider +{ +public: + TestQImageProvider(bool *deleteWatch = 0) + : QDeclarativeImageProvider(Image), deleteWatch(deleteWatch) + { + } + + ~TestQImageProvider() + { + if (deleteWatch) + *deleteWatch = true; + } + + QImage requestImage(const QString &id, QSize *size, const QSize& requestedSize) + { + lastImageId = id; + + if (id == QLatin1String("no-such-file.png")) + return QImage(); + + int width = 100; + int height = 100; + QImage image(width, height, QImage::Format_RGB32); + if (size) + *size = QSize(width, height); + if (requestedSize.isValid()) + image = image.scaled(requestedSize); + return image; + } + + bool *deleteWatch; + QString lastImageId; +}; +Q_DECLARE_METATYPE(TestQImageProvider*); + + +class TestQPixmapProvider : public QDeclarativeImageProvider +{ +public: + TestQPixmapProvider(bool *deleteWatch = 0) + : QDeclarativeImageProvider(Pixmap), deleteWatch(deleteWatch) + { + } + + ~TestQPixmapProvider() + { + if (deleteWatch) + *deleteWatch = true; + } + + QPixmap requestPixmap(const QString &id, QSize *size, const QSize& requestedSize) + { + lastImageId = id; + + if (id == QLatin1String("no-such-file.png")) + return QPixmap(); + + int width = 100; + int height = 100; + QPixmap image(width, height); + if (size) + *size = QSize(width, height); + if (requestedSize.isValid()) + image = image.scaled(requestedSize); + return image; + } + + bool *deleteWatch; + QString lastImageId; +}; +Q_DECLARE_METATYPE(TestQPixmapProvider*); + + +QString tst_qdeclarativeimageprovider::newImageFileName() const +{ + // need to generate new filenames each time or else images are loaded + // from cache and we won't get loading status changes when testing + // async loading + static int count = 0; + return QString("image://test/image-%1.png").arg(count++); +} + +void tst_qdeclarativeimageprovider::fillRequestTestsData(const QString &id) +{ + QTest::addColumn("source"); + QTest::addColumn("imageId"); + QTest::addColumn("properties"); + QTest::addColumn("size"); + QTest::addColumn("error"); + + QString fileName = newImageFileName(); + QTest::newRow(QTest::toString(id + " simple test")) + << "image://test/" + fileName << fileName << "" << QSize(100,100) << ""; + + fileName = newImageFileName(); + QTest::newRow(QTest::toString(id + " simple test with capitalization"))//As it's a URL, should make no difference + << "image://Test/" + fileName << fileName << "" << QSize(100,100) << ""; + + fileName = newImageFileName(); + QTest::newRow(QTest::toString(id + " url with no id")) + << "image://test/" + fileName << "" + fileName << "" << QSize(100,100) << ""; + + fileName = newImageFileName(); + QTest::newRow(QTest::toString(id + " url with path")) + << "image://test/test/path" + fileName << "test/path" + fileName << "" << QSize(100,100) << ""; + + fileName = newImageFileName(); + QTest::newRow(QTest::toString(id + " url with fragment")) + << "image://test/faq.html?#question13" + fileName << "faq.html?#question13" + fileName << "" << QSize(100,100) << ""; + + fileName = newImageFileName(); + QTest::newRow(QTest::toString(id + " url with query")) + << "image://test/cgi-bin/drawgraph.cgi?type=pie&color=green" + fileName << "cgi-bin/drawgraph.cgi?type=pie&color=green" + fileName + << "" << QSize(100,100) << ""; + + fileName = newImageFileName(); + QTest::newRow(QTest::toString(id + " scaled image")) + << "image://test/" + fileName << fileName << "sourceSize: \"80x30\"" << QSize(80,30) << ""; + + QTest::newRow(QTest::toString(id + " missing")) + << "image://test/no-such-file.png" << "no-such-file.png" << "" << QSize(100,100) + << "file::2:1: QML Image: Failed to get image from provider: image://test/no-such-file.png"; + + QTest::newRow(QTest::toString(id + " unknown provider")) + << "image://bogus/exists.png" << "" << "" << QSize() + << "file::2:1: QML Image: Failed to get image from provider: image://bogus/exists.png"; +} + +void tst_qdeclarativeimageprovider::runTest(bool async, QDeclarativeImageProvider *provider) +{ + QFETCH(QString, source); + QFETCH(QString, imageId); + QFETCH(QString, properties); + QFETCH(QSize, size); + QFETCH(QString, error); + + if (!error.isEmpty()) + QTest::ignoreMessage(QtWarningMsg, error.toUtf8()); + + QDeclarativeEngine engine; + + engine.addImageProvider("test", provider); + QVERIFY(engine.imageProvider("test") != 0); + + QString componentStr = "import QtQuick 1.0\nImage { source: \"" + source + "\"; " + + (async ? "asynchronous: true; " : "") + + properties + " }"; + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeImage *obj = qobject_cast(component.create()); + QVERIFY(obj != 0); + + if (async) + QTRY_VERIFY(obj->status() == QDeclarativeImage::Loading); + + QCOMPARE(obj->source(), QUrl(source)); + + if (error.isEmpty()) { + if (async) + QTRY_VERIFY(obj->status() == QDeclarativeImage::Ready); + else + QVERIFY(obj->status() == QDeclarativeImage::Ready); + if (QByteArray(QTest::currentDataTag()).startsWith("qimage")) + QCOMPARE(static_cast(provider)->lastImageId, imageId); + else + QCOMPARE(static_cast(provider)->lastImageId, imageId); + + QCOMPARE(obj->width(), qreal(size.width())); + QCOMPARE(obj->height(), qreal(size.height())); + QCOMPARE(obj->pixmap().width(), size.width()); + QCOMPARE(obj->pixmap().height(), size.height()); + QCOMPARE(obj->fillMode(), QDeclarativeImage::Stretch); + QCOMPARE(obj->progress(), 1.0); + } else { + if (async) + QTRY_VERIFY(obj->status() == QDeclarativeImage::Error); + else + QVERIFY(obj->status() == QDeclarativeImage::Error); + } + + delete obj; +} + +void tst_qdeclarativeimageprovider::requestImage_sync_data() +{ + fillRequestTestsData("qimage|sync"); +} + +void tst_qdeclarativeimageprovider::requestImage_sync() +{ + bool deleteWatch = false; + runTest(false, new TestQImageProvider(&deleteWatch)); + QVERIFY(deleteWatch); +} + +void tst_qdeclarativeimageprovider::requestImage_async_data() +{ + fillRequestTestsData("qimage|async"); +} + +void tst_qdeclarativeimageprovider::requestImage_async() +{ + bool deleteWatch = false; + runTest(true, new TestQImageProvider(&deleteWatch)); + QVERIFY(deleteWatch); +} + +void tst_qdeclarativeimageprovider::requestPixmap_sync_data() +{ + fillRequestTestsData("qpixmap"); +} + +void tst_qdeclarativeimageprovider::requestPixmap_sync() +{ + bool deleteWatch = false; + runTest(false, new TestQPixmapProvider(&deleteWatch)); + QVERIFY(deleteWatch); +} + +void tst_qdeclarativeimageprovider::requestPixmap_async() +{ + QDeclarativeEngine engine; + QDeclarativeImageProvider *provider = new TestQPixmapProvider(); + + engine.addImageProvider("test", provider); + QVERIFY(engine.imageProvider("test") != 0); + + // pixmaps are loaded synchronously regardless of 'asynchronous' value + QString componentStr = "import QtQuick 1.0\nImage { asynchronous: true; source: \"image://test/pixmap-async-test.png\" }"; + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeImage *obj = qobject_cast(component.create()); + QVERIFY(obj != 0); + + delete obj; +} + +void tst_qdeclarativeimageprovider::removeProvider_data() +{ + QTest::addColumn("provider"); + + QTest::newRow("qimage") << static_cast(new TestQImageProvider); + QTest::newRow("qpixmap") << static_cast(new TestQPixmapProvider); +} + +void tst_qdeclarativeimageprovider::removeProvider() +{ + QFETCH(QDeclarativeImageProvider*, provider); + + QDeclarativeEngine engine; + + engine.addImageProvider("test", provider); + QVERIFY(engine.imageProvider("test") != 0); + + // add provider, confirm it works + QString componentStr = "import QtQuick 1.0\nImage { source: \"" + newImageFileName() + "\" }"; + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeImage *obj = qobject_cast(component.create()); + QVERIFY(obj != 0); + + QCOMPARE(obj->status(), QDeclarativeImage::Ready); + + // remove the provider and confirm + QString fileName = newImageFileName(); + QString error("file::2:1: QML Image: Failed to get image from provider: " + fileName); + QTest::ignoreMessage(QtWarningMsg, error.toUtf8()); + + engine.removeImageProvider("test"); + + obj->setSource(QUrl(fileName)); + QCOMPARE(obj->status(), QDeclarativeImage::Error); + + delete obj; +} + +class TestThreadProvider : public QDeclarativeImageProvider +{ + public: + TestThreadProvider() : QDeclarativeImageProvider(Image), ok(false) {} + + ~TestThreadProvider() {} + + QImage requestImage(const QString &id, QSize *size, const QSize& requestedSize) + { + mutex.lock(); + if (!ok) + cond.wait(&mutex); + mutex.unlock(); + QVector v; + for (int i = 0; i < 10000; i++) + v.prepend(i); //do some computation + QImage image(50,50, QImage::Format_RGB32); + image.fill(QColor(id).rgb()); + if (size) + *size = image.size(); + if (requestedSize.isValid()) + image = image.scaled(requestedSize); + return image; + } + + QWaitCondition cond; + QMutex mutex; + bool ok; +}; + + +void tst_qdeclarativeimageprovider::threadTest() +{ + QDeclarativeEngine engine; + + TestThreadProvider *provider = new TestThreadProvider; + + engine.addImageProvider("test_thread", provider); + QVERIFY(engine.imageProvider("test_thread") != 0); + + QString componentStr = "import QtQuick 1.0\nItem { \n" + "Image { source: \"image://test_thread/blue\"; asynchronous: true; }\n" + "Image { source: \"image://test_thread/red\"; asynchronous: true; }\n" + "Image { source: \"image://test_thread/green\"; asynchronous: true; }\n" + "Image { source: \"image://test_thread/yellow\"; asynchronous: true; }\n" + " }"; + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QObject *obj = component.create(); + //MUST not deadlock + QVERIFY(obj != 0); + QList images = obj->findChildren(); + QCOMPARE(images.count(), 4); + QTest::qWait(100); + foreach(QDeclarativeImage *img, images) { + QCOMPARE(img->status(), QDeclarativeImage::Loading); + } + provider->ok = true; + provider->cond.wakeAll(); + QTest::qWait(250); + foreach(QDeclarativeImage *img, images) { + QTRY_VERIFY(img->status() == QDeclarativeImage::Ready); + } +} + + +QTEST_MAIN(tst_qdeclarativeimageprovider) + +#include "tst_qdeclarativeimageprovider.moc" diff --git a/tests/auto/declarative/qdeclarativeinfo/data/NestedObject.qml b/tests/auto/declarative/qdeclarativeinfo/data/NestedObject.qml new file mode 100644 index 00000000..a2afb610 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeinfo/data/NestedObject.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 + +QtObject { + property variant nested + + nested: QtObject {} +} + diff --git a/tests/auto/declarative/qdeclarativeinfo/data/nestedQmlObject.qml b/tests/auto/declarative/qdeclarativeinfo/data/nestedQmlObject.qml new file mode 100644 index 00000000..f3516c60 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeinfo/data/nestedQmlObject.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 + +QtObject { + property variant nested + nested: NestedObject { } + property variant nested2: nested.nested +} + diff --git a/tests/auto/declarative/qdeclarativeinfo/data/qmlObject.qml b/tests/auto/declarative/qdeclarativeinfo/data/qmlObject.qml new file mode 100644 index 00000000..937cd641 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeinfo/data/qmlObject.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 + +QtObject { + property variant nested + + nested: QtObject { + } +} diff --git a/tests/auto/declarative/qdeclarativeinfo/qdeclarativeinfo.pro b/tests/auto/declarative/qdeclarativeinfo/qdeclarativeinfo.pro new file mode 100644 index 00000000..423390f1 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeinfo/qdeclarativeinfo.pro @@ -0,0 +1,16 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativeinfo.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativeinfo/tst_qdeclarativeinfo.cpp b/tests/auto/declarative/qdeclarativeinfo/tst_qdeclarativeinfo.cpp new file mode 100644 index 00000000..11671363 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeinfo/tst_qdeclarativeinfo.cpp @@ -0,0 +1,208 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#include +#include + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_qdeclarativeinfo : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativeinfo() {} + +private slots: + void qmlObject(); + void nestedQmlObject(); + void nonQmlObject(); + void nullObject(); + void nonQmlContextedObject(); + void types(); + void chaining(); + +private: + QDeclarativeEngine engine; +}; + +inline QUrl TEST_FILE(const QString &filename) +{ + return QUrl::fromLocalFile(QLatin1String(SRCDIR) + QLatin1String("/data/") + filename); +} + +void tst_qdeclarativeinfo::qmlObject() +{ + QDeclarativeComponent component(&engine, TEST_FILE("qmlObject.qml")); + + QObject *object = component.create(); + QVERIFY(object != 0); + + QString message = component.url().toString() + ":3:1: QML QObject_QML_0: Test Message"; + QTest::ignoreMessage(QtWarningMsg, qPrintable(message)); + qmlInfo(object) << "Test Message"; + + QObject *nested = qvariant_cast(object->property("nested")); + QVERIFY(nested != 0); + + message = component.url().toString() + ":6:13: QML QtObject: Second Test Message"; + QTest::ignoreMessage(QtWarningMsg, qPrintable(message)); + qmlInfo(nested) << "Second Test Message"; +} + +void tst_qdeclarativeinfo::nestedQmlObject() +{ + QDeclarativeComponent component(&engine, TEST_FILE("nestedQmlObject.qml")); + + QObject *object = component.create(); + QVERIFY(object != 0); + + QObject *nested = qvariant_cast(object->property("nested")); + QVERIFY(nested != 0); + QObject *nested2 = qvariant_cast(object->property("nested2")); + QVERIFY(nested2 != 0); + + QString message = component.url().toString() + ":5:13: QML NestedObject: Outer Object"; + QTest::ignoreMessage(QtWarningMsg, qPrintable(message)); + qmlInfo(nested) << "Outer Object"; + + message = TEST_FILE("NestedObject.qml").toString() + ":6:14: QML QtObject: Inner Object"; + QTest::ignoreMessage(QtWarningMsg, qPrintable(message)); + qmlInfo(nested2) << "Inner Object"; +} + +void tst_qdeclarativeinfo::nonQmlObject() +{ + QObject object; + QTest::ignoreMessage(QtWarningMsg, ": QML QtObject: Test Message"); + qmlInfo(&object) << "Test Message"; + + QPushButton pbObject; + QTest::ignoreMessage(QtWarningMsg, ": QML QPushButton: Test Message"); + qmlInfo(&pbObject) << "Test Message"; +} + +void tst_qdeclarativeinfo::nullObject() +{ + QTest::ignoreMessage(QtWarningMsg, ": Null Object Test Message"); + qmlInfo(0) << "Null Object Test Message"; +} + +void tst_qdeclarativeinfo::nonQmlContextedObject() +{ + QObject object; + QDeclarativeContext context(&engine); + QDeclarativeEngine::setContextForObject(&object, &context); + QTest::ignoreMessage(QtWarningMsg, ": QML QtObject: Test Message"); + qmlInfo(&object) << "Test Message"; +} + +void tst_qdeclarativeinfo::types() +{ + QTest::ignoreMessage(QtWarningMsg, ": false"); + qmlInfo(0) << false; + + QTest::ignoreMessage(QtWarningMsg, ": 1.1"); + qmlInfo(0) << 1.1; + + QTest::ignoreMessage(QtWarningMsg, ": 1.2"); + qmlInfo(0) << 1.2f; + + QTest::ignoreMessage(QtWarningMsg, ": 15"); + qmlInfo(0) << 15; + + QTest::ignoreMessage(QtWarningMsg, ": 'b'"); + qmlInfo(0) << QChar('b'); + + QTest::ignoreMessage(QtWarningMsg, ": \"Qt\""); + qmlInfo(0) << QByteArray("Qt"); + + QTest::ignoreMessage(QtWarningMsg, ": true"); + qmlInfo(0) << QBool(true); + + //### do we actually want QUrl to show up in the output? + //### why the extra space at the end? + QTest::ignoreMessage(QtWarningMsg, ": QUrl(\"http://qt.nokia.com\") "); + qmlInfo(0) << QUrl("http://qt.nokia.com"); + + //### should this be quoted? + QTest::ignoreMessage(QtWarningMsg, ": hello"); + qmlInfo(0) << QLatin1String("hello"); + + //### should this be quoted? + QTest::ignoreMessage(QtWarningMsg, ": World"); + QString str("Hello World"); + QStringRef ref(&str, 6, 5); + qmlInfo(0) << ref; + + //### should this be quoted? + QTest::ignoreMessage(QtWarningMsg, ": Quick"); + qmlInfo(0) << QString ("Quick"); +} + +void tst_qdeclarativeinfo::chaining() +{ + //### should more of these be automatically inserting spaces? + QString str("Hello World"); + QStringRef ref(&str, 6, 5); + QTest::ignoreMessage(QtWarningMsg, ": false 1.1 1.2 15 hello 'b' QUrl(\"http://qt.nokia.com\") World \"Qt\" true Quick "); + qmlInfo(0) << false << ' ' + << 1.1 << ' ' + << 1.2f << ' ' + << 15 << ' ' + << QLatin1String("hello") << ' ' + << QChar('b') << ' ' + << QUrl("http://qt.nokia.com") + << ref + << QByteArray("Qt") + << QBool(true) + << QString ("Quick"); +} + +QTEST_MAIN(tst_qdeclarativeinfo) + +#include "tst_qdeclarativeinfo.moc" diff --git a/tests/auto/declarative/qdeclarativeinstruction/qdeclarativeinstruction.pro b/tests/auto/declarative/qdeclarativeinstruction/qdeclarativeinstruction.pro new file mode 100644 index 00000000..c8a48c94 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeinstruction/qdeclarativeinstruction.pro @@ -0,0 +1,11 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative script +SOURCES += tst_qdeclarativeinstruction.cpp +macx:CONFIG -= app_bundle + +!symbian: { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativeinstruction/tst_qdeclarativeinstruction.cpp b/tests/auto/declarative/qdeclarativeinstruction/tst_qdeclarativeinstruction.cpp new file mode 100644 index 00000000..3537fb28 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeinstruction/tst_qdeclarativeinstruction.cpp @@ -0,0 +1,609 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_qdeclarativeinstruction : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativeinstruction() {} + +private slots: + void dump(); +}; + +static QStringList messages; +static void msgHandler(QtMsgType, const char *msg) +{ + messages << QLatin1String(msg); +} + +void tst_qdeclarativeinstruction::dump() +{ + QDeclarativeCompiledData *data = new QDeclarativeCompiledData(0); + { + QDeclarativeInstruction i; + i.line = 0; + i.type = QDeclarativeInstruction::Init; + i.init.bindingsSize = 0; + i.init.parserStatusSize = 3; + i.init.contextCache = -1; + i.init.compiledBinding = -1; + data->bytecode << i; + } + + { + QDeclarativeCompiledData::TypeReference ref; + ref.className = "Test"; + data->types << ref; + + QDeclarativeInstruction i; + i.line = 1; + i.type = QDeclarativeInstruction::CreateObject; + i.create.type = 0; + i.create.data = -1; + i.create.bindingBits = -1; + i.create.column = 10; + data->bytecode << i; + } + + { + data->primitives << "testId"; + + QDeclarativeInstruction i; + i.line = 2; + i.type = QDeclarativeInstruction::SetId; + i.setId.value = data->primitives.count() - 1; + i.setId.index = 0; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 3; + i.type = QDeclarativeInstruction::SetDefault; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 4; + i.type = QDeclarativeInstruction::CreateComponent; + i.createComponent.count = 3; + i.createComponent.column = 4; + i.createComponent.endLine = 14; + i.createComponent.metaObject = 0; + + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 5; + i.type = QDeclarativeInstruction::StoreMetaObject; + i.storeMeta.data = 3; + i.storeMeta.aliasData = 6; + i.storeMeta.propertyCache = 7; + + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 6; + i.type = QDeclarativeInstruction::StoreFloat; + i.storeFloat.propertyIndex = 3; + i.storeFloat.value = 11.3; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 7; + i.type = QDeclarativeInstruction::StoreDouble; + i.storeDouble.propertyIndex = 4; + i.storeDouble.value = 14.8; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 8; + i.type = QDeclarativeInstruction::StoreInteger; + i.storeInteger.propertyIndex = 5; + i.storeInteger.value = 9; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 9; + i.type = QDeclarativeInstruction::StoreBool; + i.storeBool.propertyIndex = 6; + i.storeBool.value = true; + + data->bytecode << i; + } + + { + data->primitives << "Test String"; + QDeclarativeInstruction i; + i.line = 10; + i.type = QDeclarativeInstruction::StoreString; + i.storeString.propertyIndex = 7; + i.storeString.value = data->primitives.count() - 1; + data->bytecode << i; + } + + { + data->urls << QUrl("http://www.nokia.com"); + QDeclarativeInstruction i; + i.line = 11; + i.type = QDeclarativeInstruction::StoreUrl; + i.storeUrl.propertyIndex = 8; + i.storeUrl.value = data->urls.count() - 1; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 12; + i.type = QDeclarativeInstruction::StoreColor; + i.storeColor.propertyIndex = 9; + i.storeColor.value = 0xFF00FF00; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 13; + i.type = QDeclarativeInstruction::StoreDate; + i.storeDate.propertyIndex = 10; + i.storeDate.value = 9; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 14; + i.type = QDeclarativeInstruction::StoreTime; + i.storeTime.propertyIndex = 11; + i.storeTime.valueIndex = 33; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 15; + i.type = QDeclarativeInstruction::StoreDateTime; + i.storeDateTime.propertyIndex = 12; + i.storeDateTime.valueIndex = 44; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 16; + i.type = QDeclarativeInstruction::StorePoint; + i.storeRealPair.propertyIndex = 13; + i.storeRealPair.valueIndex = 3; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 17; + i.type = QDeclarativeInstruction::StorePointF; + i.storeRealPair.propertyIndex = 14; + i.storeRealPair.valueIndex = 9; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 18; + i.type = QDeclarativeInstruction::StoreSize; + i.storeRealPair.propertyIndex = 15; + i.storeRealPair.valueIndex = 8; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 19; + i.type = QDeclarativeInstruction::StoreSizeF; + i.storeRealPair.propertyIndex = 16; + i.storeRealPair.valueIndex = 99; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 20; + i.type = QDeclarativeInstruction::StoreRect; + i.storeRect.propertyIndex = 17; + i.storeRect.valueIndex = 2; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 21; + i.type = QDeclarativeInstruction::StoreRectF; + i.storeRect.propertyIndex = 18; + i.storeRect.valueIndex = 19; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 22; + i.type = QDeclarativeInstruction::StoreVector3D; + i.storeVector3D.propertyIndex = 19; + i.storeVector3D.valueIndex = 9; + data->bytecode << i; + } + + { + data->primitives << "color(1, 1, 1, 1)"; + QDeclarativeInstruction i; + i.line = 23; + i.type = QDeclarativeInstruction::StoreVariant; + i.storeString.propertyIndex = 20; + i.storeString.value = data->primitives.count() - 1; + + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 24; + i.type = QDeclarativeInstruction::StoreObject; + i.storeObject.propertyIndex = 21; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 25; + i.type = QDeclarativeInstruction::StoreVariantObject; + i.storeObject.propertyIndex = 22; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 26; + i.type = QDeclarativeInstruction::StoreInterface; + i.storeObject.propertyIndex = 23; + data->bytecode << i; + } + + { + data->primitives << "console.log(1921)"; + + QDeclarativeInstruction i; + i.line = 27; + i.type = QDeclarativeInstruction::StoreSignal; + i.storeSignal.signalIndex = 2; + i.storeSignal.value = data->primitives.count() - 1; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 29; + i.type = QDeclarativeInstruction::StoreScriptString; + i.storeScriptString.propertyIndex = 24; + i.storeScriptString.value = 3; + i.storeScriptString.scope = 1; + data->bytecode << i; + } + + { + data->datas << "mySignal"; + + QDeclarativeInstruction i; + i.line = 30; + i.type = QDeclarativeInstruction::AssignSignalObject; + i.assignSignalObject.signal = 0; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 31; + i.type = QDeclarativeInstruction::AssignCustomType; + i.assignCustomType.propertyIndex = 25; + i.assignCustomType.valueIndex = 4; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 32; + i.type = QDeclarativeInstruction::StoreBinding; + i.assignBinding.property = 26; + i.assignBinding.value = 3; + i.assignBinding.context = 2; + i.assignBinding.owner = 0; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 33; + i.type = QDeclarativeInstruction::StoreCompiledBinding; + i.assignBinding.property = 27; + i.assignBinding.value = 2; + i.assignBinding.context = 4; + i.assignBinding.owner = 0; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 34; + i.type = QDeclarativeInstruction::StoreValueSource; + i.assignValueSource.property = 29; + i.assignValueSource.owner = 1; + i.assignValueSource.castValue = 4; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 35; + i.type = QDeclarativeInstruction::StoreValueInterceptor; + i.assignValueInterceptor.property = 30; + i.assignValueInterceptor.owner = 2; + i.assignValueInterceptor.castValue = -4; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 36; + i.type = QDeclarativeInstruction::BeginObject; + i.begin.castValue = 4; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 38; + i.type = QDeclarativeInstruction::StoreObjectQList; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 39; + i.type = QDeclarativeInstruction::AssignObjectList; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 40; + i.type = QDeclarativeInstruction::FetchAttached; + i.fetchAttached.id = 23; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 42; + i.type = QDeclarativeInstruction::FetchQList; + i.fetch.property = 32; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 43; + i.type = QDeclarativeInstruction::FetchObject; + i.fetch.property = 33; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 44; + i.type = QDeclarativeInstruction::FetchValueType; + i.fetchValue.property = 34; + i.fetchValue.type = 6; + i.fetchValue.bindingSkipList = 7; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 45; + i.type = QDeclarativeInstruction::PopFetchedObject; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 46; + i.type = QDeclarativeInstruction::PopQList; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 47; + i.type = QDeclarativeInstruction::PopValueType; + i.fetchValue.property = 35; + i.fetchValue.type = 8; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 48; + i.type = QDeclarativeInstruction::Defer; + i.defer.deferCount = 7; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = -1; + i.type = QDeclarativeInstruction::Defer; + i.defer.deferCount = 7; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 48; + i.type = QDeclarativeInstruction::StoreImportedScript; + i.storeScript.value = 2; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 50; + i.type = (QDeclarativeInstruction::Type)(1234); // Non-existent + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 51; + i.type = QDeclarativeInstruction::StoreVariantInteger; + i.storeInteger.value = 11; + i.storeInteger.propertyIndex = 32; + data->bytecode << i; + } + + { + QDeclarativeInstruction i; + i.line = 52; + i.type = QDeclarativeInstruction::StoreVariantDouble; + i.storeDouble.value = 33.7; + i.storeDouble.propertyIndex = 19; + data->bytecode << i; + } + + QStringList expect; + expect + << "Index\tLine\tOperation\t\tData1\tData2\tData3\tComments" + << "-------------------------------------------------------------------------------" + << "0\t\t0\tINIT\t\t\t0\t3\t-1\t-1" + << "1\t\t1\tCREATE\t\t\t0\t-1\t\t\"Test\"" + << "2\t\t2\tSETID\t\t\t0\t\t\t\"testId\"" + << "3\t\t3\tSET_DEFAULT" + << "4\t\t4\tCREATE_COMPONENT\t3" + << "5\t\t5\tSTORE_META\t\t3" + << "6\t\t6\tSTORE_FLOAT\t\t3\t11.3" + << "7\t\t7\tSTORE_DOUBLE\t\t4\t14.8" + << "8\t\t8\tSTORE_INTEGER\t\t5\t9" + << "9\t\t9\tSTORE_BOOL\t\t6\ttrue" + << "10\t\t10\tSTORE_STRING\t\t7\t1\t\t\"Test String\"" + << "11\t\t11\tSTORE_URL\t\t8\t0\t\tQUrl(\"http://www.nokia.com\") " + << "12\t\t12\tSTORE_COLOR\t\t9\t\t\t\"ff00ff00\"" + << "13\t\t13\tSTORE_DATE\t\t10\t9" + << "14\t\t14\tSTORE_TIME\t\t11\t33" + << "15\t\t15\tSTORE_DATETIME\t\t12\t44" + << "16\t\t16\tSTORE_POINT\t\t13\t3" + << "17\t\t17\tSTORE_POINTF\t\t14\t9" + << "18\t\t18\tSTORE_SIZE\t\t15\t8" + << "19\t\t19\tSTORE_SIZEF\t\t16\t99" + << "20\t\t20\tSTORE_RECT\t\t17\t2" + << "21\t\t21\tSTORE_RECTF\t\t18\t19" + << "22\t\t22\tSTORE_VECTOR3D\t\t19\t9" + << "23\t\t23\tSTORE_VARIANT\t\t20\t2\t\t\"color(1, 1, 1, 1)\"" + << "24\t\t24\tSTORE_OBJECT\t\t21" + << "25\t\t25\tSTORE_VARIANT_OBJECT\t22" + << "26\t\t26\tSTORE_INTERFACE\t\t23" + << "27\t\t27\tSTORE_SIGNAL\t\t2\t3\t\t\"console.log(1921)\"" + << "28\t\t29\tSTORE_SCRIPT_STRING\t24\t3\t1" + << "29\t\t30\tASSIGN_SIGNAL_OBJECT\t0\t\t\t\"mySignal\"" + << "30\t\t31\tASSIGN_CUSTOMTYPE\t25\t4" + << "31\t\t32\tSTORE_BINDING\t26\t3\t2" + << "32\t\t33\tSTORE_COMPILED_BINDING\t27\t2\t4" + << "33\t\t34\tSTORE_VALUE_SOURCE\t29\t4" + << "34\t\t35\tSTORE_VALUE_INTERCEPTOR\t30\t-4" + << "35\t\t36\tBEGIN\t\t\t4" + << "36\t\t38\tSTORE_OBJECT_QLIST" + << "37\t\t39\tASSIGN_OBJECT_LIST" + << "38\t\t40\tFETCH_ATTACHED\t\t23" + << "39\t\t42\tFETCH_QLIST\t\t32" + << "40\t\t43\tFETCH\t\t\t33" + << "41\t\t44\tFETCH_VALUE\t\t34\t6\t7" + << "42\t\t45\tPOP" + << "43\t\t46\tPOP_QLIST" + << "44\t\t47\tPOP_VALUE\t\t35\t8" + << "45\t\t48\tDEFER\t\t\t7" + << "46\t\tNA\tDEFER\t\t\t7" + << "47\t\t48\tSTORE_IMPORTED_SCRIPT\t2" + << "48\t\t50\tXXX UNKNOWN INSTRUCTION\t1234" + << "49\t\t51\tSTORE_VARIANT_INTEGER\t\t32\t11" + << "50\t\t52\tSTORE_VARIANT_DOUBLE\t\t19\t33.7" + << "-------------------------------------------------------------------------------"; + + messages = QStringList(); + QtMsgHandler old = qInstallMsgHandler(msgHandler); + data->dumpInstructions(); + qInstallMsgHandler(old); + + QCOMPARE(messages.count(), expect.count()); + for (int ii = 0; ii < messages.count(); ++ii) { + QCOMPARE(messages.at(ii), expect.at(ii)); + } + + data->release(); +} + +QTEST_MAIN(tst_qdeclarativeinstruction) + +#include "tst_qdeclarativeinstruction.moc" diff --git a/tests/auto/declarative/qdeclarativeitem/data/childrenProperty.qml b/tests/auto/declarative/qdeclarativeitem/data/childrenProperty.qml new file mode 100644 index 00000000..fab23675 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeitem/data/childrenProperty.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 + +Item { + id: root + + property bool test1: root.children.length == 3 + property bool test2: root.children[0] == item1 + property bool test3: root.children[1] == item2 + property bool test4: root.children[2] == item3 + property bool test5: root.children[3] == null + + children: [ Item { id: item1 }, Item { id: item2 }, Item { id: item3 } ] +} + diff --git a/tests/auto/declarative/qdeclarativeitem/data/childrenRect.qml b/tests/auto/declarative/qdeclarativeitem/data/childrenRect.qml new file mode 100644 index 00000000..84f362fe --- /dev/null +++ b/tests/auto/declarative/qdeclarativeitem/data/childrenRect.qml @@ -0,0 +1,27 @@ +import QtQuick 1.0 + +Rectangle { + width: 400 + height: 400 + + property int childCount: 0; + + Item { + objectName: "testItem" + width: childrenRect.width + height: childrenRect.height + + Repeater { + id: repeater + model: childCount + delegate: Rectangle { + x: index*10 + y: index*20 + width: 10 + height: 20 + + color: "red" + } + } + } +} diff --git a/tests/auto/declarative/qdeclarativeitem/data/childrenRectBug.qml b/tests/auto/declarative/qdeclarativeitem/data/childrenRectBug.qml new file mode 100644 index 00000000..2ab73a1f --- /dev/null +++ b/tests/auto/declarative/qdeclarativeitem/data/childrenRectBug.qml @@ -0,0 +1,23 @@ +import QtQuick 1.0 + +Rectangle { + width: 400 + height: 200 + + Item { + objectName: "theItem" + anchors.centerIn: parent + width: childrenRect.width + height: childrenRect.height + Rectangle { + id: text1 + anchors.verticalCenter: parent.verticalCenter + width: 100; height: 100; color: "green" + } + Rectangle { + anchors.left: text1.right + anchors.verticalCenter: parent.verticalCenter + width: 100; height: 100; color: "green" + } + } +} diff --git a/tests/auto/declarative/qdeclarativeitem/data/childrenRectBug2.qml b/tests/auto/declarative/qdeclarativeitem/data/childrenRectBug2.qml new file mode 100644 index 00000000..d67ad0e3 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeitem/data/childrenRectBug2.qml @@ -0,0 +1,53 @@ +import QtQuick 1.0 + +Rectangle { + width:360; + height: 200 + + Item { + objectName: "theItem" + anchors.centerIn: parent + width: childrenRect.width + height: childrenRect.height + Rectangle { + id: header1 + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: parent.top + width: 100; height: 50 + color: "green" + } + Rectangle { + id: text1 + anchors.top: header1.bottom + anchors.topMargin: 10 + anchors.horizontalCenter: parent.horizontalCenter + width: 100; height: 50 + color: "blue" + } + } + + states: [ + State { + name: "row" + AnchorChanges { + target: header1 + anchors.horizontalCenter: undefined + anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.left + anchors.top: undefined + } + AnchorChanges { + target: text1 + anchors.horizontalCenter: undefined + anchors.verticalCenter: parent.verticalCenter + anchors.top: undefined + anchors.left: header1.right + } + PropertyChanges { + target: text1 + anchors.leftMargin: 10 + anchors.topMargin: 0 + } + } + ] +} diff --git a/tests/auto/declarative/qdeclarativeitem/data/childrenRectBug3.qml b/tests/auto/declarative/qdeclarativeitem/data/childrenRectBug3.qml new file mode 100644 index 00000000..9d8e1e86 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeitem/data/childrenRectBug3.qml @@ -0,0 +1,15 @@ +import QtQuick 1.0 + +Rectangle { + width: 300 + height: 300 + + Rectangle { + height: childrenRect.height + + Repeater { + model: 1 + Rectangle { } + } + } +} diff --git a/tests/auto/declarative/qdeclarativeitem/data/implicitsize.qml b/tests/auto/declarative/qdeclarativeitem/data/implicitsize.qml new file mode 100644 index 00000000..869c0fce --- /dev/null +++ b/tests/auto/declarative/qdeclarativeitem/data/implicitsize.qml @@ -0,0 +1,19 @@ +import QtQuick 1.1 + +Item { + implicitWidth: 200 + implicitHeight: 100 + + width: 80 + height: 60 + + function resetSize() { + width = undefined + height = undefined + } + + function changeImplicit() { + implicitWidth = 150 + implicitHeight = 80 + } +} diff --git a/tests/auto/declarative/qdeclarativeitem/data/keynavigationtest.qml b/tests/auto/declarative/qdeclarativeitem/data/keynavigationtest.qml new file mode 100644 index 00000000..f614a12e --- /dev/null +++ b/tests/auto/declarative/qdeclarativeitem/data/keynavigationtest.qml @@ -0,0 +1,87 @@ +import QtQuick 1.0 + +Grid { + columns: 2 + width: 100; height: 100 + function verify() { + if (item1.KeyNavigation.right != item2) + return false; + if (item1.KeyNavigation.down != item3) + return false; + if (item1.KeyNavigation.tab != item2) + return false; + if (item1.KeyNavigation.backtab != item4) + return false; + + if (item2.KeyNavigation.left != item1) + return false; + if (item2.KeyNavigation.down != item4) + return false; + if (item2.KeyNavigation.tab != item3) + return false; + if (item2.KeyNavigation.backtab != item1) + return false; + + if (item3.KeyNavigation.right != item4) + return false; + if (item3.KeyNavigation.up != item1) + return false; + if (item3.KeyNavigation.tab != item4) + return false; + if (item3.KeyNavigation.backtab != item2) + return false; + + if (item4.KeyNavigation.left != item3) + return false; + if (item4.KeyNavigation.up != item2) + return false; + if (item4.KeyNavigation.tab != item1) + return false; + if (item4.KeyNavigation.backtab != item3) + return false; + + return true; + } + + Rectangle { + id: item1 + objectName: "item1" + focus: true + width: 50; height: 50 + color: focus ? "red" : "lightgray" + KeyNavigation.right: item2 + KeyNavigation.down: item3 + KeyNavigation.tab: item2 + KeyNavigation.backtab: item4 + } + Rectangle { + id: item2 + objectName: "item2" + width: 50; height: 50 + color: focus ? "red" : "lightgray" + KeyNavigation.left: item1 + KeyNavigation.down: item4 + KeyNavigation.tab: item3 + KeyNavigation.backtab: item1 + } + Rectangle { + id: item3 + objectName: "item3" + width: 50; height: 50 + color: focus ? "red" : "lightgray" + KeyNavigation.right: item4 + KeyNavigation.up: item1 + KeyNavigation.tab: item4 + KeyNavigation.backtab: item2 + } + Rectangle { + id: item4 + objectName: "item4" + width: 50; height: 50 + color: focus ? "red" : "lightgray" + KeyNavigation.left: item3 + KeyNavigation.up: item2 + KeyNavigation.tab: item1 + KeyNavigation.backtab: item3 + } +} diff --git a/tests/auto/declarative/qdeclarativeitem/data/keyspriority.qml b/tests/auto/declarative/qdeclarativeitem/data/keyspriority.qml new file mode 100644 index 00000000..375a6b61 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeitem/data/keyspriority.qml @@ -0,0 +1,9 @@ +import QtQuick 1.0 +import Test 1.0 + +KeyTestItem { + focus: true + Keys.onPressed: keysTestObject.keyPress(event.key, event.text, event.modifiers) + Keys.onReleased: { keysTestObject.keyRelease(event.key, event.text, event.modifiers); event.accepted = true; } + Keys.priority: keysTestObject.processLast ? Keys.AfterItem : Keys.BeforeItem +} diff --git a/tests/auto/declarative/qdeclarativeitem/data/keystest.qml b/tests/auto/declarative/qdeclarativeitem/data/keystest.qml new file mode 100644 index 00000000..9af6e9fb --- /dev/null +++ b/tests/auto/declarative/qdeclarativeitem/data/keystest.qml @@ -0,0 +1,24 @@ +import QtQuick 1.0 + +Item { + focus: true + + property bool isEnabled: Keys.enabled + + Keys.onPressed: keysTestObject.keyPress(event.key, event.text, event.modifiers) + Keys.onReleased: { keysTestObject.keyRelease(event.key, event.text, event.modifiers); event.accepted = true; } + Keys.onReturnPressed: keysTestObject.keyPress(event.key, "Return", event.modifiers) + Keys.onDigit0Pressed: keysTestObject.keyPress(event.key, event.text, event.modifiers) + Keys.onDigit9Pressed: { event.accepted = false; keysTestObject.keyPress(event.key, event.text, event.modifiers) } + Keys.onTabPressed: keysTestObject.keyPress(event.key, "Tab", event.modifiers) + Keys.onBacktabPressed: keysTestObject.keyPress(event.key, "Backtab", event.modifiers) + Keys.forwardTo: [ item2 ] + Keys.enabled: enableKeyHanding + + Item { + id: item2 + visible: forwardeeVisible + Keys.onPressed: keysTestObject.forwardedKey(event.key) + Keys.onReleased: keysTestObject.forwardedKey(event.key) + } +} diff --git a/tests/auto/declarative/qdeclarativeitem/data/layoutmirroring.qml b/tests/auto/declarative/qdeclarativeitem/data/layoutmirroring.qml new file mode 100644 index 00000000..866b6153 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeitem/data/layoutmirroring.qml @@ -0,0 +1,54 @@ +import QtQuick 1.1 + +Item { + property bool childrenInherit: true + Item { + objectName: "mirrored1" + LayoutMirroring.enabled: true + LayoutMirroring.childrenInherit: parent.childrenInherit + Item { + Item { + objectName: "notMirrored1" + LayoutMirroring.enabled: false + Item { + objectName: "inheritedMirror1" + } + } + Item { + objectName: "inheritedMirror2" + } + } + } + Item { + objectName: "mirrored2" + LayoutMirroring.enabled: true + LayoutMirroring.childrenInherit: false + Item { + objectName: "notMirrored2" + } + } + Item { + LayoutMirroring.enabled: true + LayoutMirroring.childrenInherit: true + Loader { + id: loader + } + } + states: State { + name: "newContent" + PropertyChanges { + target: loader + sourceComponent: component + } + } + Component { + id: component + Item { + objectName: "notMirrored3" + LayoutMirroring.enabled: false + Item { + objectName: "inheritedMirror3" + } + } + } +} diff --git a/tests/auto/declarative/qdeclarativeitem/data/mapCoordinates.qml b/tests/auto/declarative/qdeclarativeitem/data/mapCoordinates.qml new file mode 100644 index 00000000..bb20ecc8 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeitem/data/mapCoordinates.qml @@ -0,0 +1,43 @@ +import QtQuick 1.0 + +Item { + id: root; objectName: "root" + width: 200; height: 200 + + Item { id: itemA; objectName: "itemA"; x: 50; y: 50 } + + Item { + x: 50; y: 50 + Item { id: itemB; objectName: "itemB"; x: 100; y: 100 } + } + + function mapAToB(x, y) { + var pos = itemA.mapToItem(itemB, x, y) + return Qt.point(pos.x, pos.y) + } + + function mapAFromB(x, y) { + var pos = itemA.mapFromItem(itemB, x, y) + return Qt.point(pos.x, pos.y) + } + + function mapAToNull(x, y) { + var pos = itemA.mapToItem(null, x, y) + return Qt.point(pos.x, pos.y) + } + + function mapAFromNull(x, y) { + var pos = itemA.mapFromItem(null, x, y) + return Qt.point(pos.x, pos.y) + } + + function checkMapAToInvalid(x, y) { + var pos = itemA.mapToItem(1122, x, y) + return pos.x == undefined && pos.y == undefined + } + + function checkMapAFromInvalid(x, y) { + var pos = itemA.mapFromItem(1122, x, y) + return pos.x == undefined && pos.y == undefined + } +} diff --git a/tests/auto/declarative/qdeclarativeitem/data/mouseFocus.qml b/tests/auto/declarative/qdeclarativeitem/data/mouseFocus.qml new file mode 100644 index 00000000..afa5397a --- /dev/null +++ b/tests/auto/declarative/qdeclarativeitem/data/mouseFocus.qml @@ -0,0 +1,20 @@ +import QtQuick 1.0 + +QGraphicsWidget { + size: "200x100" + focusPolicy: QGraphicsWidget.ClickFocus + Item { + objectName: "declarativeItem" + id: item + width: 200 + height: 100 + MouseArea { + anchors.fill: parent + onPressed: { + if (!item.focus) { + item.focus = true; + } + } + } + } +} diff --git a/tests/auto/declarative/qdeclarativeitem/data/propertychanges.qml b/tests/auto/declarative/qdeclarativeitem/data/propertychanges.qml new file mode 100644 index 00000000..f1ea9334 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeitem/data/propertychanges.qml @@ -0,0 +1,10 @@ +import QtQuick 1.0 + +Item { + Item { + objectName: "item" + } + Item { + objectName: "parentItem" + } +} diff --git a/tests/auto/declarative/qdeclarativeitem/data/qtbug_16871.qml b/tests/auto/declarative/qdeclarativeitem/data/qtbug_16871.qml new file mode 100644 index 00000000..8102df16 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeitem/data/qtbug_16871.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +Item { + children: [ 10 ] +} diff --git a/tests/auto/declarative/qdeclarativeitem/data/resourcesProperty.qml b/tests/auto/declarative/qdeclarativeitem/data/resourcesProperty.qml new file mode 100644 index 00000000..e82cd029 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeitem/data/resourcesProperty.qml @@ -0,0 +1,21 @@ +import QtQuick 1.0 + +Item { + id: root + + property bool test1 + property bool test2 + property bool test3 + property bool test4 + property bool test5 + + Component.onCompleted: { + test1 = (root.resources.length >= 3) + test2 = root.resources[0] == item1 + test3 = root.resources[1] == item2 + test4 = root.resources[2] == item3 + test5 = root.resources[10] == null + } + + resources: [ Item { id: item1 }, Item { id: item2 }, Item { id: item3 } ] +} diff --git a/tests/auto/declarative/qdeclarativeitem/data/transformCrash.qml b/tests/auto/declarative/qdeclarativeitem/data/transformCrash.qml new file mode 100644 index 00000000..35c1a9ab --- /dev/null +++ b/tests/auto/declarative/qdeclarativeitem/data/transformCrash.qml @@ -0,0 +1,13 @@ +import QtQuick 1.0 + +Item { + id: wrapper + width: 200 + height: 200 + + QtObject { + id: object + } + + Component.onCompleted: wrapper.transform = object +} diff --git a/tests/auto/declarative/qdeclarativeitem/qdeclarativeitem.pro b/tests/auto/declarative/qdeclarativeitem/qdeclarativeitem.pro new file mode 100644 index 00000000..d8007a09 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeitem/qdeclarativeitem.pro @@ -0,0 +1,16 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative gui +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativeitem.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp b/tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp new file mode 100644 index 00000000..80a22332 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeitem/tst_qdeclarativeitem.cpp @@ -0,0 +1,1256 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include "../../../shared/util.h" + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_QDeclarativeItem : public QObject + +{ + Q_OBJECT +public: + tst_QDeclarativeItem(); + +private slots: + void initTestCase(); + void keys(); + void keysProcessingOrder(); + void keyNavigation(); + void keyNavigation_RightToLeft(); + void keyNavigation_skipNotVisible(); + void layoutMirroring(); + void layoutMirroringIllegalParent(); + void smooth(); + void clip(); + void mapCoordinates(); + void mapCoordinates_data(); + void propertyChanges(); + void transforms(); + void transforms_data(); + void childrenRect(); + void childrenRectBug(); + void childrenRectBug2(); + void childrenRectBug3(); + + void childrenProperty(); + void resourcesProperty(); + void mouseFocus(); + + void transformCrash(); + void implicitSize(); + void testQtQuick11Attributes(); + void testQtQuick11Attributes_data(); + void qtbug_16871(); + void qtbug_21045(); +private: + QDeclarativeEngine engine; +}; + +template +T *findItem(QGraphicsObject *parent, const QString &objectName) +{ + if (!parent) + return 0; + + const QMetaObject &mo = T::staticMetaObject; + //qDebug() << parent->QGraphicsObject::children().count() << "children"; + for (int i = 0; i < parent->childItems().count(); ++i) { + QDeclarativeItem *item = qobject_cast(parent->childItems().at(i)); + if(!item) + continue; + //qDebug() << "try" << item; + if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName)) + return static_cast(item); + item = findItem(item, objectName); + if (item) + return static_cast(item); + } + + return 0; +} + +class KeysTestObject : public QObject +{ + Q_OBJECT + + Q_PROPERTY(bool processLast READ processLast NOTIFY processLastChanged) + +public: + KeysTestObject() : mKey(0), mModifiers(0), mForwardedKey(0), mLast(false) {} + + void reset() { + mKey = 0; + mText = QString(); + mModifiers = 0; + mForwardedKey = 0; + } + + bool processLast() const { return mLast; } + void setProcessLast(bool b) { + if (b != mLast) { + mLast = b; + emit processLastChanged(); + } + } + +public slots: + void keyPress(int key, QString text, int modifiers) { + mKey = key; + mText = text; + mModifiers = modifiers; + } + void keyRelease(int key, QString text, int modifiers) { + mKey = key; + mText = text; + mModifiers = modifiers; + } + void forwardedKey(int key) { + mForwardedKey = key; + } + +signals: + void processLastChanged(); + +public: + int mKey; + QString mText; + int mModifiers; + int mForwardedKey; + bool mLast; + +private: +}; + +class KeyTestItem : public QDeclarativeItem +{ + Q_OBJECT +public: + KeyTestItem(QDeclarativeItem *parent=0) : QDeclarativeItem(parent), mKey(0) {} + +protected: + void keyPressEvent(QKeyEvent *e) { + keyPressPreHandler(e); + if (e->isAccepted()) + return; + + mKey = e->key(); + + if (e->key() == Qt::Key_A) + e->accept(); + else + e->ignore(); + + if (!e->isAccepted()) + QDeclarativeItem::keyPressEvent(e); + } + + void keyReleaseEvent(QKeyEvent *e) { + keyReleasePreHandler(e); + + if (e->isAccepted()) + return; + + if (e->key() == Qt::Key_B) + e->accept(); + else + e->ignore(); + + if (!e->isAccepted()) + QDeclarativeItem::keyReleaseEvent(e); + } + +public: + int mKey; +}; + +QML_DECLARE_TYPE(KeyTestItem); + + +tst_QDeclarativeItem::tst_QDeclarativeItem() +{ +} + +void tst_QDeclarativeItem::initTestCase() +{ + qmlRegisterType("Test",1,0,"KeyTestItem"); +} + +void tst_QDeclarativeItem::keys() +{ + QDeclarativeView *canvas = new QDeclarativeView(0); + canvas->setFixedSize(240,320); + + KeysTestObject *testObject = new KeysTestObject; + canvas->rootContext()->setContextProperty("keysTestObject", testObject); + + canvas->rootContext()->setContextProperty("enableKeyHanding", QVariant(true)); + canvas->rootContext()->setContextProperty("forwardeeVisible", QVariant(true)); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/keystest.qml")); + canvas->show(); + qApp->processEvents(); + + QEvent wa(QEvent::WindowActivate); + QApplication::sendEvent(canvas, &wa); + QFocusEvent fe(QEvent::FocusIn); + QApplication::sendEvent(canvas, &fe); + + QVERIFY(canvas->rootObject()); + QCOMPARE(canvas->rootObject()->property("isEnabled").toBool(), true); + + QKeyEvent key(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, "A", false, 1); + QApplication::sendEvent(canvas, &key); + QCOMPARE(testObject->mKey, int(Qt::Key_A)); + QCOMPARE(testObject->mForwardedKey, int(Qt::Key_A)); + QCOMPARE(testObject->mText, QLatin1String("A")); + QVERIFY(testObject->mModifiers == Qt::NoModifier); + QVERIFY(!key.isAccepted()); + + testObject->reset(); + + key = QKeyEvent(QEvent::KeyRelease, Qt::Key_A, Qt::ShiftModifier, "A", false, 1); + QApplication::sendEvent(canvas, &key); + QCOMPARE(testObject->mKey, int(Qt::Key_A)); + QCOMPARE(testObject->mForwardedKey, int(Qt::Key_A)); + QCOMPARE(testObject->mText, QLatin1String("A")); + QVERIFY(testObject->mModifiers == Qt::ShiftModifier); + QVERIFY(key.isAccepted()); + + testObject->reset(); + + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Return, Qt::NoModifier, "", false, 1); + QApplication::sendEvent(canvas, &key); + QCOMPARE(testObject->mKey, int(Qt::Key_Return)); + QCOMPARE(testObject->mForwardedKey, int(Qt::Key_Return)); + QCOMPARE(testObject->mText, QLatin1String("Return")); + QVERIFY(testObject->mModifiers == Qt::NoModifier); + QVERIFY(key.isAccepted()); + + testObject->reset(); + + key = QKeyEvent(QEvent::KeyPress, Qt::Key_0, Qt::NoModifier, "0", false, 1); + QApplication::sendEvent(canvas, &key); + QCOMPARE(testObject->mKey, int(Qt::Key_0)); + QCOMPARE(testObject->mForwardedKey, int(Qt::Key_0)); + QCOMPARE(testObject->mText, QLatin1String("0")); + QVERIFY(testObject->mModifiers == Qt::NoModifier); + QVERIFY(key.isAccepted()); + + testObject->reset(); + + key = QKeyEvent(QEvent::KeyPress, Qt::Key_9, Qt::NoModifier, "9", false, 1); + QApplication::sendEvent(canvas, &key); + QCOMPARE(testObject->mKey, int(Qt::Key_9)); + QCOMPARE(testObject->mForwardedKey, int(Qt::Key_9)); + QCOMPARE(testObject->mText, QLatin1String("9")); + QVERIFY(testObject->mModifiers == Qt::NoModifier); + QVERIFY(!key.isAccepted()); + + testObject->reset(); + + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1); + QApplication::sendEvent(canvas, &key); + QCOMPARE(testObject->mKey, int(Qt::Key_Tab)); + QCOMPARE(testObject->mForwardedKey, int(Qt::Key_Tab)); + QCOMPARE(testObject->mText, QLatin1String("Tab")); + QVERIFY(testObject->mModifiers == Qt::NoModifier); + QVERIFY(key.isAccepted()); + + testObject->reset(); + + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1); + QApplication::sendEvent(canvas, &key); + QCOMPARE(testObject->mKey, int(Qt::Key_Backtab)); + QCOMPARE(testObject->mForwardedKey, int(Qt::Key_Backtab)); + QCOMPARE(testObject->mText, QLatin1String("Backtab")); + QVERIFY(testObject->mModifiers == Qt::NoModifier); + QVERIFY(key.isAccepted()); + + testObject->reset(); + + canvas->rootContext()->setContextProperty("forwardeeVisible", QVariant(false)); + key = QKeyEvent(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, "A", false, 1); + QApplication::sendEvent(canvas, &key); + QCOMPARE(testObject->mKey, int(Qt::Key_A)); + QCOMPARE(testObject->mForwardedKey, 0); + QCOMPARE(testObject->mText, QLatin1String("A")); + QVERIFY(testObject->mModifiers == Qt::NoModifier); + QVERIFY(!key.isAccepted()); + + testObject->reset(); + + canvas->rootContext()->setContextProperty("enableKeyHanding", QVariant(false)); + QCOMPARE(canvas->rootObject()->property("isEnabled").toBool(), false); + + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Return, Qt::NoModifier, "", false, 1); + QApplication::sendEvent(canvas, &key); + QCOMPARE(testObject->mKey, 0); + QVERIFY(!key.isAccepted()); + + canvas->rootContext()->setContextProperty("enableKeyHanding", QVariant(true)); + QCOMPARE(canvas->rootObject()->property("isEnabled").toBool(), true); + + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Return, Qt::NoModifier, "", false, 1); + QApplication::sendEvent(canvas, &key); + QCOMPARE(testObject->mKey, int(Qt::Key_Return)); + QVERIFY(key.isAccepted()); + + delete canvas; + delete testObject; +} + +void tst_QDeclarativeItem::keysProcessingOrder() +{ + QDeclarativeView *canvas = new QDeclarativeView(0); + canvas->setFixedSize(240,320); + + KeysTestObject *testObject = new KeysTestObject; + canvas->rootContext()->setContextProperty("keysTestObject", testObject); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/keyspriority.qml")); + canvas->show(); + qApp->processEvents(); + + KeyTestItem *testItem = qobject_cast(canvas->rootObject()); + QVERIFY(testItem); + + QEvent wa(QEvent::WindowActivate); + QApplication::sendEvent(canvas, &wa); + QFocusEvent fe(QEvent::FocusIn); + QApplication::sendEvent(canvas, &fe); + + QKeyEvent key(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, "A", false, 1); + QApplication::sendEvent(canvas, &key); + QCOMPARE(testObject->mKey, int(Qt::Key_A)); + QCOMPARE(testObject->mText, QLatin1String("A")); + QVERIFY(testObject->mModifiers == Qt::NoModifier); + QVERIFY(key.isAccepted()); + + testObject->reset(); + + testObject->setProcessLast(true); + + key = QKeyEvent(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, "A", false, 1); + QApplication::sendEvent(canvas, &key); + QCOMPARE(testObject->mKey, 0); + QVERIFY(key.isAccepted()); + + testObject->reset(); + + key = QKeyEvent(QEvent::KeyPress, Qt::Key_B, Qt::NoModifier, "B", false, 1); + QApplication::sendEvent(canvas, &key); + QCOMPARE(testObject->mKey, int(Qt::Key_B)); + QCOMPARE(testObject->mText, QLatin1String("B")); + QVERIFY(testObject->mModifiers == Qt::NoModifier); + QVERIFY(!key.isAccepted()); + + testObject->reset(); + + key = QKeyEvent(QEvent::KeyRelease, Qt::Key_B, Qt::NoModifier, "B", false, 1); + QApplication::sendEvent(canvas, &key); + QCOMPARE(testObject->mKey, 0); + QVERIFY(key.isAccepted()); + + delete canvas; + delete testObject; +} + +QDeclarativeItemPrivate *childPrivate(QGraphicsObject *rootItem, const char * itemString) +{ + QDeclarativeItem *item = findItem(rootItem, QString(QLatin1String(itemString))); + QDeclarativeItemPrivate* itemPrivate = QDeclarativeItemPrivate::get(item); + return itemPrivate; +} + +QVariant childProperty(QGraphicsObject *rootItem, const char * itemString, const char * property) +{ + QDeclarativeItem *item = findItem(rootItem, QString(QLatin1String(itemString))); + return item->property(property); +} + +bool anchorsMirrored(QGraphicsObject *rootItem, const char * itemString) +{ + QDeclarativeItem *item = findItem(rootItem, QString(QLatin1String(itemString))); + QDeclarativeItemPrivate* itemPrivate = QDeclarativeItemPrivate::get(item); + return itemPrivate->anchors()->mirrored(); +} + +void tst_QDeclarativeItem::layoutMirroring() +{ + QDeclarativeView *canvas = new QDeclarativeView(0); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/layoutmirroring.qml")); + canvas->show(); + + QDeclarativeItem *rootItem = qobject_cast(canvas->rootObject()); + QVERIFY(rootItem); + QDeclarativeItemPrivate *rootPrivate = QDeclarativeItemPrivate::get(rootItem); + QVERIFY(rootPrivate); + + QCOMPARE(childPrivate(rootItem, "mirrored1")->effectiveLayoutMirror, true); + QCOMPARE(childPrivate(rootItem, "mirrored2")->effectiveLayoutMirror, true); + QCOMPARE(childPrivate(rootItem, "notMirrored1")->effectiveLayoutMirror, false); + QCOMPARE(childPrivate(rootItem, "notMirrored2")->effectiveLayoutMirror, false); + QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->effectiveLayoutMirror, true); + QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->effectiveLayoutMirror, true); + + QCOMPARE(anchorsMirrored(rootItem, "mirrored1"), true); + QCOMPARE(anchorsMirrored(rootItem, "mirrored2"), true); + QCOMPARE(anchorsMirrored(rootItem, "notMirrored1"), false); + QCOMPARE(anchorsMirrored(rootItem, "notMirrored2"), false); + QCOMPARE(anchorsMirrored(rootItem, "inheritedMirror1"), true); + QCOMPARE(anchorsMirrored(rootItem, "inheritedMirror2"), true); + + QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritedLayoutMirror, true); + QCOMPARE(childPrivate(rootItem, "mirrored2")->inheritedLayoutMirror, false); + QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritedLayoutMirror, true); + QCOMPARE(childPrivate(rootItem, "notMirrored2")->inheritedLayoutMirror, false); + QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritedLayoutMirror, true); + QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritedLayoutMirror, true); + + QCOMPARE(childPrivate(rootItem, "mirrored1")->isMirrorImplicit, false); + QCOMPARE(childPrivate(rootItem, "mirrored2")->isMirrorImplicit, false); + QCOMPARE(childPrivate(rootItem, "notMirrored1")->isMirrorImplicit, false); + QCOMPARE(childPrivate(rootItem, "notMirrored2")->isMirrorImplicit, true); + QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->isMirrorImplicit, true); + QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->isMirrorImplicit, true); + + QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritMirrorFromParent, true); + QCOMPARE(childPrivate(rootItem, "mirrored2")->inheritMirrorFromParent, false); + QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritMirrorFromParent, true); + QCOMPARE(childPrivate(rootItem, "notMirrored2")->inheritMirrorFromParent, false); + QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritMirrorFromParent, true); + QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritMirrorFromParent, true); + + QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritMirrorFromItem, true); + QCOMPARE(childPrivate(rootItem, "mirrored2")->inheritMirrorFromItem, false); + QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritMirrorFromItem, false); + QCOMPARE(childPrivate(rootItem, "notMirrored2")->inheritMirrorFromItem, false); + QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritMirrorFromItem, false); + QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritMirrorFromItem, false); + + // load dynamic content using Loader that needs to inherit mirroring + rootItem->setProperty("state", "newContent"); + QCOMPARE(childPrivate(rootItem, "notMirrored3")->effectiveLayoutMirror, false); + QCOMPARE(childPrivate(rootItem, "inheritedMirror3")->effectiveLayoutMirror, true); + + QCOMPARE(childPrivate(rootItem, "notMirrored3")->inheritedLayoutMirror, true); + QCOMPARE(childPrivate(rootItem, "inheritedMirror3")->inheritedLayoutMirror, true); + + QCOMPARE(childPrivate(rootItem, "notMirrored3")->isMirrorImplicit, false); + QCOMPARE(childPrivate(rootItem, "inheritedMirror3")->isMirrorImplicit, true); + + QCOMPARE(childPrivate(rootItem, "notMirrored3")->inheritMirrorFromParent, true); + QCOMPARE(childPrivate(rootItem, "inheritedMirror3")->inheritMirrorFromParent, true); + + QCOMPARE(childPrivate(rootItem, "notMirrored3")->inheritMirrorFromItem, false); + QCOMPARE(childPrivate(rootItem, "notMirrored3")->inheritMirrorFromItem, false); + + // disable inheritance + rootItem->setProperty("childrenInherit", false); + + QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->effectiveLayoutMirror, false); + QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->effectiveLayoutMirror, false); + QCOMPARE(childPrivate(rootItem, "mirrored1")->effectiveLayoutMirror, true); + QCOMPARE(childPrivate(rootItem, "notMirrored1")->effectiveLayoutMirror, false); + + QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritedLayoutMirror, false); + QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritedLayoutMirror, false); + QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritedLayoutMirror, false); + QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritedLayoutMirror, false); + + // re-enable inheritance + rootItem->setProperty("childrenInherit", true); + + QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->effectiveLayoutMirror, true); + QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->effectiveLayoutMirror, true); + QCOMPARE(childPrivate(rootItem, "mirrored1")->effectiveLayoutMirror, true); + QCOMPARE(childPrivate(rootItem, "notMirrored1")->effectiveLayoutMirror, false); + + QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritedLayoutMirror, true); + QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritedLayoutMirror, true); + QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritedLayoutMirror, true); + QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritedLayoutMirror, true); + + // + // dynamic parenting + // + QDeclarativeItem *parentItem1 = new QDeclarativeItem(); + QDeclarativeItemPrivate::get(parentItem1)->effectiveLayoutMirror = true; // LayoutMirroring.enabled: true + QDeclarativeItemPrivate::get(parentItem1)->isMirrorImplicit = false; + QDeclarativeItemPrivate::get(parentItem1)->inheritMirrorFromItem = true; // LayoutMirroring.childrenInherit: true + QDeclarativeItemPrivate::get(parentItem1)->resolveLayoutMirror(); + + // inherit in constructor + QDeclarativeItem *childItem1 = new QDeclarativeItem(parentItem1); + QCOMPARE(QDeclarativeItemPrivate::get(childItem1)->effectiveLayoutMirror, true); + QCOMPARE(QDeclarativeItemPrivate::get(childItem1)->inheritMirrorFromParent, true); + + // inherit through a parent change + QDeclarativeItem *childItem2 = new QDeclarativeItem(); + QCOMPARE(QDeclarativeItemPrivate::get(childItem2)->effectiveLayoutMirror, false); + QCOMPARE(QDeclarativeItemPrivate::get(childItem2)->inheritMirrorFromParent, false); + childItem2->setParentItem(parentItem1); + QCOMPARE(QDeclarativeItemPrivate::get(childItem2)->effectiveLayoutMirror, true); + QCOMPARE(QDeclarativeItemPrivate::get(childItem2)->inheritMirrorFromParent, true); + + // stop inherting through a parent change + QDeclarativeItem *parentItem2 = new QDeclarativeItem(); + QDeclarativeItemPrivate::get(parentItem2)->effectiveLayoutMirror = true; // LayoutMirroring.enabled: true + QDeclarativeItemPrivate::get(parentItem2)->resolveLayoutMirror(); + childItem2->setParentItem(parentItem2); + QCOMPARE(QDeclarativeItemPrivate::get(childItem2)->effectiveLayoutMirror, false); + QCOMPARE(QDeclarativeItemPrivate::get(childItem2)->inheritMirrorFromParent, false); + + delete parentItem1; + delete parentItem2; +} + +void tst_QDeclarativeItem::layoutMirroringIllegalParent() +{ + QDeclarativeComponent component(&engine); + component.setData("import QtQuick 1.1; QtObject { LayoutMirroring.enabled: true; LayoutMirroring.childrenInherit: true }", QUrl::fromLocalFile("")); + QTest::ignoreMessage(QtWarningMsg, "file::1:21: QML QtObject: LayoutDirection attached property only works with Items"); + QObject *object = component.create(); + QVERIFY(object != 0); +} + +void tst_QDeclarativeItem::keyNavigation() +{ + QDeclarativeView *canvas = new QDeclarativeView(0); + canvas->setFixedSize(240,320); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/keynavigationtest.qml")); + canvas->show(); + qApp->processEvents(); + + QEvent wa(QEvent::WindowActivate); + QApplication::sendEvent(canvas, &wa); + QFocusEvent fe(QEvent::FocusIn); + QApplication::sendEvent(canvas, &fe); + + QDeclarativeItem *item = findItem(canvas->rootObject(), "item1"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + QVariant result; + QVERIFY(QMetaObject::invokeMethod(canvas->rootObject(), "verify", + Q_RETURN_ARG(QVariant, result))); + QVERIFY(result.toBool()); + + // right + QKeyEvent key(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1); + QApplication::sendEvent(canvas, &key); + QVERIFY(key.isAccepted()); + + item = findItem(canvas->rootObject(), "item2"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // down + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier, "", false, 1); + QApplication::sendEvent(canvas, &key); + QVERIFY(key.isAccepted()); + + item = findItem(canvas->rootObject(), "item4"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // left + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier, "", false, 1); + QApplication::sendEvent(canvas, &key); + QVERIFY(key.isAccepted()); + + item = findItem(canvas->rootObject(), "item3"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // up + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier, "", false, 1); + QApplication::sendEvent(canvas, &key); + QVERIFY(key.isAccepted()); + + item = findItem(canvas->rootObject(), "item1"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // tab + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1); + QApplication::sendEvent(canvas, &key); + QVERIFY(key.isAccepted()); + + item = findItem(canvas->rootObject(), "item2"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // backtab + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1); + QApplication::sendEvent(canvas, &key); + QVERIFY(key.isAccepted()); + + item = findItem(canvas->rootObject(), "item1"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + delete canvas; +} + +void tst_QDeclarativeItem::keyNavigation_RightToLeft() +{ + QDeclarativeView *canvas = new QDeclarativeView(0); + canvas->setFixedSize(240,320); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/keynavigationtest.qml")); + canvas->show(); + qApp->processEvents(); + + QDeclarativeItem *rootItem = qobject_cast(canvas->rootObject()); + QVERIFY(rootItem); + QDeclarativeItemPrivate* rootItemPrivate = QDeclarativeItemPrivate::get(rootItem); + + rootItemPrivate->effectiveLayoutMirror = true; // LayoutMirroring.mirror: true + rootItemPrivate->isMirrorImplicit = false; + rootItemPrivate->inheritMirrorFromItem = true; // LayoutMirroring.inherit: true + rootItemPrivate->resolveLayoutMirror(); + + QEvent wa(QEvent::WindowActivate); + QApplication::sendEvent(canvas, &wa); + QFocusEvent fe(QEvent::FocusIn); + QApplication::sendEvent(canvas, &fe); + + QDeclarativeItem *item = findItem(canvas->rootObject(), "item1"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + QVariant result; + QVERIFY(QMetaObject::invokeMethod(canvas->rootObject(), "verify", + Q_RETURN_ARG(QVariant, result))); + QVERIFY(result.toBool()); + + // right + QKeyEvent key(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier, "", false, 1); + QApplication::sendEvent(canvas, &key); + QVERIFY(key.isAccepted()); + + item = findItem(canvas->rootObject(), "item2"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // left + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1); + QApplication::sendEvent(canvas, &key); + QVERIFY(key.isAccepted()); + + item = findItem(canvas->rootObject(), "item1"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + delete canvas; +} + +void tst_QDeclarativeItem::keyNavigation_skipNotVisible() +{ + QDeclarativeView *canvas = new QDeclarativeView(0); + canvas->setFixedSize(240,320); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/keynavigationtest.qml")); + canvas->show(); + qApp->processEvents(); + + QEvent wa(QEvent::WindowActivate); + QApplication::sendEvent(canvas, &wa); + QFocusEvent fe(QEvent::FocusIn); + QApplication::sendEvent(canvas, &fe); + + QDeclarativeItem *item = findItem(canvas->rootObject(), "item1"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // Set item 2 to not visible + item = findItem(canvas->rootObject(), "item2"); + QVERIFY(item); + item->setVisible(false); + QVERIFY(!item->isVisible()); + + // right + QKeyEvent key(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1); + QApplication::sendEvent(canvas, &key); + QVERIFY(key.isAccepted()); + + item = findItem(canvas->rootObject(), "item1"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // tab + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1); + QApplication::sendEvent(canvas, &key); + QVERIFY(key.isAccepted()); + + item = findItem(canvas->rootObject(), "item3"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // backtab + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1); + QApplication::sendEvent(canvas, &key); + QVERIFY(key.isAccepted()); + + item = findItem(canvas->rootObject(), "item1"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + //Set item 3 to not visible + item = findItem(canvas->rootObject(), "item3"); + QVERIFY(item); + item->setVisible(false); + QVERIFY(!item->isVisible()); + + // tab + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1); + QApplication::sendEvent(canvas, &key); + QVERIFY(key.isAccepted()); + + item = findItem(canvas->rootObject(), "item4"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // backtab + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1); + QApplication::sendEvent(canvas, &key); + QVERIFY(key.isAccepted()); + + item = findItem(canvas->rootObject(), "item1"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + delete canvas; +} + +void tst_QDeclarativeItem::smooth() +{ + QDeclarativeComponent component(&engine); + component.setData("import QtQuick 1.0; Item { smooth: false; }", QUrl::fromLocalFile("")); + QDeclarativeItem *item = qobject_cast(component.create()); + QSignalSpy spy(item, SIGNAL(smoothChanged(bool))); + + QVERIFY(item); + QVERIFY(!item->smooth()); + + item->setSmooth(true); + QVERIFY(item->smooth()); + QCOMPARE(spy.count(),1); + QList arguments = spy.first(); + QVERIFY(arguments.count() == 1); + QVERIFY(arguments.at(0).toBool() == true); + + item->setSmooth(true); + QCOMPARE(spy.count(),1); + + item->setSmooth(false); + QVERIFY(!item->smooth()); + QCOMPARE(spy.count(),2); + item->setSmooth(false); + QCOMPARE(spy.count(),2); + + delete item; +} + +void tst_QDeclarativeItem::clip() +{ + QDeclarativeComponent component(&engine); + component.setData("import QtQuick 1.0\nItem { clip: false\n }", QUrl::fromLocalFile("")); + QDeclarativeItem *item = qobject_cast(component.create()); + QSignalSpy spy(item, SIGNAL(clipChanged(bool))); + + QVERIFY(item); + QVERIFY(!item->clip()); + + item->setClip(true); + QVERIFY(item->clip()); + + QList arguments = spy.first(); + QVERIFY(arguments.count() == 1); + QVERIFY(arguments.at(0).toBool() == true); + + QCOMPARE(spy.count(),1); + item->setClip(true); + QCOMPARE(spy.count(),1); + + item->setClip(false); + QVERIFY(!item->clip()); + QCOMPARE(spy.count(),2); + item->setClip(false); + QCOMPARE(spy.count(),2); + + delete item; +} + +void tst_QDeclarativeItem::mapCoordinates() +{ + QFETCH(int, x); + QFETCH(int, y); + + QDeclarativeView *canvas = new QDeclarativeView(0); + canvas->setFixedSize(300, 300); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/mapCoordinates.qml")); + canvas->show(); + qApp->processEvents(); + + QDeclarativeItem *root = qobject_cast(canvas->rootObject()); + QVERIFY(root != 0); + QDeclarativeItem *a = findItem(canvas->rootObject(), "itemA"); + QVERIFY(a != 0); + QDeclarativeItem *b = findItem(canvas->rootObject(), "itemB"); + QVERIFY(b != 0); + + QVariant result; + + QVERIFY(QMetaObject::invokeMethod(root, "mapAToB", + Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y))); + QCOMPARE(result.value(), qobject_cast(a)->mapToItem(b, x, y)); + + QVERIFY(QMetaObject::invokeMethod(root, "mapAFromB", + Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y))); + QCOMPARE(result.value(), qobject_cast(a)->mapFromItem(b, x, y)); + + QVERIFY(QMetaObject::invokeMethod(root, "mapAToNull", + Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y))); + QCOMPARE(result.value(), qobject_cast(a)->mapToScene(x, y)); + + QVERIFY(QMetaObject::invokeMethod(root, "mapAFromNull", + Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y))); + QCOMPARE(result.value(), qobject_cast(a)->mapFromScene(x, y)); + + QString warning1 = QUrl::fromLocalFile(SRCDIR "/data/mapCoordinates.qml").toString() + ":7:5: QML Item: mapToItem() given argument \"1122\" which is neither null nor an Item"; + QString warning2 = QUrl::fromLocalFile(SRCDIR "/data/mapCoordinates.qml").toString() + ":7:5: QML Item: mapFromItem() given argument \"1122\" which is neither null nor an Item"; + + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1)); + QVERIFY(QMetaObject::invokeMethod(root, "checkMapAToInvalid", + Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y))); + QVERIFY(result.toBool()); + + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2)); + QVERIFY(QMetaObject::invokeMethod(root, "checkMapAFromInvalid", + Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y))); + QVERIFY(result.toBool()); + + delete canvas; +} + +void tst_QDeclarativeItem::mapCoordinates_data() +{ + QTest::addColumn("x"); + QTest::addColumn("y"); + + for (int i=-20; i<=20; i+=10) + QTest::newRow(QTest::toString(i)) << i << i; +} + +void tst_QDeclarativeItem::transforms_data() +{ + QTest::addColumn("qml"); + QTest::addColumn("matrix"); + QTest::newRow("translate") << QByteArray("Translate { x: 10; y: 20 }") + << QMatrix(1,0,0,1,10,20); + QTest::newRow("rotation") << QByteArray("Rotation { angle: 90 }") + << QMatrix(0,1,-1,0,0,0); + QTest::newRow("scale") << QByteArray("Scale { xScale: 1.5; yScale: -2 }") + << QMatrix(1.5,0,0,-2,0,0); + QTest::newRow("sequence") << QByteArray("[ Translate { x: 10; y: 20 }, Scale { xScale: 1.5; yScale: -2 } ]") + << QMatrix(1,0,0,1,10,20) * QMatrix(1.5,0,0,-2,0,0); +} + +void tst_QDeclarativeItem::transforms() +{ + QFETCH(QByteArray, qml); + QFETCH(QMatrix, matrix); + QDeclarativeComponent component(&engine); + component.setData("import QtQuick 1.0\nItem { transform: "+qml+"}", QUrl::fromLocalFile("")); + QDeclarativeItem *item = qobject_cast(component.create()); + QVERIFY(item); + QCOMPARE(item->sceneMatrix(), matrix); +} + +void tst_QDeclarativeItem::childrenProperty() +{ + QDeclarativeComponent component(&engine, SRCDIR "/data/childrenProperty.qml"); + + QObject *o = component.create(); + QVERIFY(o != 0); + + QCOMPARE(o->property("test1").toBool(), true); + QCOMPARE(o->property("test2").toBool(), true); + QCOMPARE(o->property("test3").toBool(), true); + QCOMPARE(o->property("test4").toBool(), true); + QCOMPARE(o->property("test5").toBool(), true); + delete o; +} + +void tst_QDeclarativeItem::resourcesProperty() +{ + QDeclarativeComponent component(&engine, SRCDIR "/data/resourcesProperty.qml"); + + QObject *o = component.create(); + QVERIFY(o != 0); + + QCOMPARE(o->property("test1").toBool(), true); + QCOMPARE(o->property("test2").toBool(), true); + QCOMPARE(o->property("test3").toBool(), true); + QCOMPARE(o->property("test4").toBool(), true); + QCOMPARE(o->property("test5").toBool(), true); + delete o; +} + +void tst_QDeclarativeItem::mouseFocus() +{ + QDeclarativeView *canvas = new QDeclarativeView(0); + QVERIFY(canvas); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/mouseFocus.qml")); + canvas->show(); + QVERIFY(canvas->rootObject()); + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(canvas)); + + QDeclarativeItem *item = findItem(canvas->rootObject(), "declarativeItem"); + QVERIFY(item); + QSignalSpy focusSpy(item, SIGNAL(activeFocusChanged(bool))); + + QTest::mouseClick(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(item->scenePos())); + QApplication::processEvents(); + QCOMPARE(focusSpy.count(), 1); + QVERIFY(item->hasActiveFocus()); + + // make sure focusable graphics widget underneath does not steal focus + QTest::mouseClick(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(item->scenePos())); + QApplication::processEvents(); + QCOMPARE(focusSpy.count(), 1); + QVERIFY(item->hasActiveFocus()); + + item->setFocus(false); + QVERIFY(!item->hasActiveFocus()); + QCOMPARE(focusSpy.count(), 2); + item->setFocus(true); + QCOMPARE(focusSpy.count(), 3); + + delete canvas; +} + +void tst_QDeclarativeItem::propertyChanges() +{ + QDeclarativeView *canvas = new QDeclarativeView(0); + canvas->setFixedSize(240,320); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/propertychanges.qml")); + canvas->show(); + + QEvent wa(QEvent::WindowActivate); + QApplication::sendEvent(canvas, &wa); + QFocusEvent fe(QEvent::FocusIn); + QApplication::sendEvent(canvas, &fe); + + QDeclarativeItem *item = findItem(canvas->rootObject(), "item"); + QDeclarativeItem *parentItem = findItem(canvas->rootObject(), "parentItem"); + + QVERIFY(item); + QVERIFY(parentItem); + + QSignalSpy parentSpy(item, SIGNAL(parentChanged(QDeclarativeItem *))); + QSignalSpy widthSpy(item, SIGNAL(widthChanged())); + QSignalSpy heightSpy(item, SIGNAL(heightChanged())); + QSignalSpy baselineOffsetSpy(item, SIGNAL(baselineOffsetChanged(qreal))); + QSignalSpy childrenRectSpy(parentItem, SIGNAL(childrenRectChanged(QRectF))); + QSignalSpy focusSpy(item, SIGNAL(focusChanged(bool))); + QSignalSpy wantsFocusSpy(parentItem, SIGNAL(activeFocusChanged(bool))); + QSignalSpy childrenChangedSpy(parentItem, SIGNAL(childrenChanged())); + QSignalSpy xSpy(item, SIGNAL(xChanged())); + QSignalSpy ySpy(item, SIGNAL(yChanged())); + + item->setParentItem(parentItem); + item->setWidth(100.0); + item->setHeight(200.0); + item->setFocus(true); + item->setBaselineOffset(10.0); + + QCOMPARE(item->parentItem(), parentItem); + QCOMPARE(parentSpy.count(),1); + QList parentArguments = parentSpy.first(); + QVERIFY(parentArguments.count() == 1); + QCOMPARE(item->parentItem(), qvariant_cast(parentArguments.at(0))); + QCOMPARE(childrenChangedSpy.count(),1); + + item->setParentItem(parentItem); + QCOMPARE(childrenChangedSpy.count(),1); + + QCOMPARE(item->width(), 100.0); + QCOMPARE(widthSpy.count(),1); + + QCOMPARE(item->height(), 200.0); + QCOMPARE(heightSpy.count(),1); + + QCOMPARE(item->baselineOffset(), 10.0); + QCOMPARE(baselineOffsetSpy.count(),1); + QList baselineOffsetArguments = baselineOffsetSpy.first(); + QVERIFY(baselineOffsetArguments.count() == 1); + QCOMPARE(item->baselineOffset(), baselineOffsetArguments.at(0).toReal()); + + QCOMPARE(parentItem->childrenRect(), QRectF(0.0,0.0,100.0,200.0)); + QCOMPARE(childrenRectSpy.count(),2); + QList childrenRectArguments = childrenRectSpy.at(1); + QVERIFY(childrenRectArguments.count() == 1); + QCOMPARE(parentItem->childrenRect(), childrenRectArguments.at(0).toRectF()); + + QCOMPARE(item->hasActiveFocus(), true); + QCOMPARE(focusSpy.count(),1); + QList focusArguments = focusSpy.first(); + QVERIFY(focusArguments.count() == 1); + QCOMPARE(focusArguments.at(0).toBool(), true); + + QCOMPARE(parentItem->hasActiveFocus(), false); + QCOMPARE(parentItem->hasFocus(), false); + QCOMPARE(wantsFocusSpy.count(),0); + + item->setX(10.0); + QCOMPARE(item->x(), 10.0); + QCOMPARE(xSpy.count(), 1); + + item->setY(10.0); + QCOMPARE(item->y(), 10.0); + QCOMPARE(ySpy.count(), 1); + + delete canvas; +} + +void tst_QDeclarativeItem::childrenRect() +{ + QDeclarativeView *canvas = new QDeclarativeView(0); + canvas->setFixedSize(240,320); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/childrenRect.qml")); + canvas->show(); + + QGraphicsObject *o = canvas->rootObject(); + QDeclarativeItem *item = o->findChild("testItem"); + QCOMPARE(item->width(), qreal(0)); + QCOMPARE(item->height(), qreal(0)); + + o->setProperty("childCount", 1); + QCOMPARE(item->width(), qreal(10)); + QCOMPARE(item->height(), qreal(20)); + + o->setProperty("childCount", 5); + QCOMPARE(item->width(), qreal(50)); + QCOMPARE(item->height(), qreal(100)); + + o->setProperty("childCount", 0); + QCOMPARE(item->width(), qreal(0)); + QCOMPARE(item->height(), qreal(0)); + + delete o; +} + +// QTBUG-11383 +void tst_QDeclarativeItem::childrenRectBug() +{ + QDeclarativeView *canvas = new QDeclarativeView(0); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/childrenRectBug.qml")); + canvas->show(); + + QGraphicsObject *o = canvas->rootObject(); + QDeclarativeItem *item = o->findChild("theItem"); + QCOMPARE(item->width(), qreal(200)); + QCOMPARE(item->height(), qreal(100)); + QCOMPARE(item->x(), qreal(100)); + + delete canvas; +} + +// QTBUG-11465 +void tst_QDeclarativeItem::childrenRectBug2() +{ + QDeclarativeView *canvas = new QDeclarativeView(0); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/childrenRectBug2.qml")); + canvas->show(); + + QDeclarativeRectangle *rect = qobject_cast(canvas->rootObject()); + QVERIFY(rect); + QDeclarativeItem *item = rect->findChild("theItem"); + QCOMPARE(item->width(), qreal(100)); + QCOMPARE(item->height(), qreal(110)); + QCOMPARE(item->x(), qreal(130)); + + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + rectPrivate->setState("row"); + QCOMPARE(item->width(), qreal(210)); + QCOMPARE(item->height(), qreal(50)); + QCOMPARE(item->x(), qreal(75)); + + delete canvas; +} + +// QTBUG-12722 +void tst_QDeclarativeItem::childrenRectBug3() +{ + QDeclarativeView *canvas = new QDeclarativeView(0); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/childrenRectBug3.qml")); + canvas->show(); + + //don't crash on delete + delete canvas; +} + +// QTBUG-13893 +void tst_QDeclarativeItem::transformCrash() +{ + QDeclarativeView *canvas = new QDeclarativeView(0); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/transformCrash.qml")); + canvas->show(); + + delete canvas; +} + +void tst_QDeclarativeItem::implicitSize() +{ + QDeclarativeView *canvas = new QDeclarativeView(0); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/implicitsize.qml")); + canvas->show(); + + QDeclarativeItem *item = qobject_cast(canvas->rootObject()); + QVERIFY(item); + QCOMPARE(item->width(), qreal(80)); + QCOMPARE(item->height(), qreal(60)); + + QCOMPARE(item->implicitWidth(), qreal(200)); + QCOMPARE(item->implicitHeight(), qreal(100)); + + QMetaObject::invokeMethod(item, "resetSize"); + + QCOMPARE(item->width(), qreal(200)); + QCOMPARE(item->height(), qreal(100)); + + QMetaObject::invokeMethod(item, "changeImplicit"); + + QCOMPARE(item->implicitWidth(), qreal(150)); + QCOMPARE(item->implicitHeight(), qreal(80)); + QCOMPARE(item->width(), qreal(150)); + QCOMPARE(item->height(), qreal(80)); + + delete canvas; +} + +void tst_QDeclarativeItem::testQtQuick11Attributes() +{ + QFETCH(QString, code); + QFETCH(QString, warning); + QFETCH(QString, error); + + QDeclarativeEngine engine; + QObject *obj; + + QDeclarativeComponent valid(&engine); + valid.setData("import QtQuick 1.1; Item { " + code.toUtf8() + " }", QUrl("")); + obj = valid.create(); + QVERIFY(obj); + QVERIFY(valid.errorString().isEmpty()); + delete obj; + + QDeclarativeComponent invalid(&engine); + invalid.setData("import QtQuick 1.0; Item { " + code.toUtf8() + " }", QUrl("")); + QTest::ignoreMessage(QtWarningMsg, warning.toUtf8()); + obj = invalid.create(); + QCOMPARE(invalid.errorString(), error); + delete obj; +} + +void tst_QDeclarativeItem::testQtQuick11Attributes_data() +{ + QTest::addColumn("code"); + QTest::addColumn("warning"); + QTest::addColumn("error"); + + QTest::newRow("implicitWidth") << "implicitWidth: 100" + << "QDeclarativeComponent: Component is not ready" + << ":1 \"Item.implicitWidth\" is not available in QtQuick 1.0.\n"; + + QTest::newRow("implicitHeight") << "implicitHeight: 100" + << "QDeclarativeComponent: Component is not ready" + << ":1 \"Item.implicitHeight\" is not available in QtQuick 1.0.\n"; + + QTest::newRow("onImplicitWidthChanged") << "onImplicitWidthChanged: x" + << "QDeclarativeComponent: Component is not ready" + << ":1 \"Item.onImplicitWidthChanged\" is not available in QtQuick 1.0.\n"; + + QTest::newRow("onImplicitHeightChanged") << "onImplicitHeightChanged: x" + << "QDeclarativeComponent: Component is not ready" + << ":1 \"Item.onImplicitHeightChanged\" is not available in QtQuick 1.0.\n"; +} + +void tst_QDeclarativeItem::qtbug_16871() +{ + QDeclarativeComponent component(&engine, SRCDIR "/data/qtbug_16871.qml"); + QObject *o = component.create(); + QVERIFY(o != 0); + delete o; +} + +void tst_QDeclarativeItem::qtbug_21045() +{ + QDeclarativeComponent component(&engine); + QGraphicsScene scene; + component.setData("import QtQuick 1.1\nItem{visible: false; focus: true}", QUrl::fromLocalFile("file:")); + QObject *o = component.create(); + QDeclarativeItem* i = qobject_cast(o); + QVERIFY(i); + scene.addItem(i); + QVERIFY(!i->hasActiveFocus()); +} + +QTEST_MAIN(tst_QDeclarativeItem) + +#include "tst_qdeclarativeitem.moc" diff --git a/tests/auto/declarative/qdeclarativelanguage/data/Alias.qml b/tests/auto/declarative/qdeclarativelanguage/data/Alias.qml new file mode 100644 index 00000000..6a33deff --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/Alias.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 + +QtObject { + id: root + property int value: 1892 + property alias aliasValue: root.value +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/Alias2.qml b/tests/auto/declarative/qdeclarativelanguage/data/Alias2.qml new file mode 100644 index 00000000..919f5d86 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/Alias2.qml @@ -0,0 +1,9 @@ +import Test 1.0 +import QtQuick 1.0 + +QtObject { + property variant other + other: MyTypeObject { id: obj } + property alias enumAlias: obj.enumProperty; +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/Alias3.qml b/tests/auto/declarative/qdeclarativelanguage/data/Alias3.qml new file mode 100644 index 00000000..3f73538b --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/Alias3.qml @@ -0,0 +1,12 @@ +import Test 1.0 +import QtQuick 1.0 + +QtObject { + property alias obj : otherObj + property variant child + child: QtObject { + id: otherObj + property int myValue: 10 + } +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/Alias4.qml b/tests/auto/declarative/qdeclarativelanguage/data/Alias4.qml new file mode 100644 index 00000000..428790d8 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/Alias4.qml @@ -0,0 +1,5 @@ +import Test 1.0 +import QtQuick 1.0 + +Alias3 {} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/AliasPropertyChangeSignalsType.qml b/tests/auto/declarative/qdeclarativelanguage/data/AliasPropertyChangeSignalsType.qml new file mode 100644 index 00000000..0bc20254 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/AliasPropertyChangeSignalsType.qml @@ -0,0 +1,20 @@ +import QtQuick 1.0 + +QtObject { + id: root + + signal sig1 + signal sig2 + signal sig3 + signal sig4 + + property alias aliasProperty: root.realProperty + + property int realProperty: 0 + + property bool test: false + + Component.onCompleted: { + root.realProperty = 10; + } +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/ComponentComposite.qml b/tests/auto/declarative/qdeclarativelanguage/data/ComponentComposite.qml new file mode 100644 index 00000000..9349a938 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/ComponentComposite.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +Component { + QtObject {} +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/CompositeType.qml b/tests/auto/declarative/qdeclarativelanguage/data/CompositeType.qml new file mode 100644 index 00000000..cf32b456 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/CompositeType.qml @@ -0,0 +1,4 @@ +import QtQuick 1.0 + +QtObject { +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/CompositeType2.qml b/tests/auto/declarative/qdeclarativelanguage/data/CompositeType2.qml new file mode 100644 index 00000000..86210e90 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/CompositeType2.qml @@ -0,0 +1,5 @@ +import Test 1.0 + +MyQmlObject { +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/CompositeType3.qml b/tests/auto/declarative/qdeclarativelanguage/data/CompositeType3.qml new file mode 100644 index 00000000..0687ce39 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/CompositeType3.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +QtObject { + property int a +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/CompositeType4.qml b/tests/auto/declarative/qdeclarativelanguage/data/CompositeType4.qml new file mode 100644 index 00000000..a6a8168d --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/CompositeType4.qml @@ -0,0 +1,6 @@ +import Test 1.0 + +MyQmlObject { + property int a +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/DontDoubleCallClassBeginItem.qml b/tests/auto/declarative/qdeclarativelanguage/data/DontDoubleCallClassBeginItem.qml new file mode 100644 index 00000000..1f8eac8a --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/DontDoubleCallClassBeginItem.qml @@ -0,0 +1,4 @@ +import Test 1.0 + +MyParserStatus { +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/DynamicPropertiesNestedType.qml b/tests/auto/declarative/qdeclarativelanguage/data/DynamicPropertiesNestedType.qml new file mode 100644 index 00000000..5de8a4a7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/DynamicPropertiesNestedType.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +QtObject { + property int super_a: 10 + property int super_c: 14 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/HelperAlias.qml b/tests/auto/declarative/qdeclarativelanguage/data/HelperAlias.qml new file mode 100644 index 00000000..3a7022bd --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/HelperAlias.qml @@ -0,0 +1,9 @@ +import Test 1.0 +import QtQuick 1.0 + +QtObject { + property variant child + child: QtObject { id: obj } + property alias objAlias: obj; +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/I18n.qml b/tests/auto/declarative/qdeclarativelanguage/data/I18n.qml new file mode 100644 index 00000000..558c836e --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/I18n.qml @@ -0,0 +1,6 @@ +import Test 1.0 + +MyTypeObject { + property int áâãäå: 10 + stringProperty: "Test áâãäå: " + áâãäå +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/I18nType30.qml b/tests/auto/declarative/qdeclarativelanguage/data/I18nType30.qml new file mode 100644 index 00000000..42dbc690 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/I18nType30.qml @@ -0,0 +1,5 @@ +import Test 1.0 + +MyTypeObject { + stringProperty: "Test áâãäå: 30" +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/InlineAssignmentsOverrideBindingsType.qml b/tests/auto/declarative/qdeclarativelanguage/data/InlineAssignmentsOverrideBindingsType.qml new file mode 100644 index 00000000..4526cf04 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/InlineAssignmentsOverrideBindingsType.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +QtObject { + property InlineAssignmentsOverrideBindingsType2 nested: InlineAssignmentsOverrideBindingsType2 { + value: 19 * 33 + } +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/InlineAssignmentsOverrideBindingsType2.qml b/tests/auto/declarative/qdeclarativelanguage/data/InlineAssignmentsOverrideBindingsType2.qml new file mode 100644 index 00000000..4127ca43 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/InlineAssignmentsOverrideBindingsType2.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +QtObject { + property int value +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/LocalLast.qml b/tests/auto/declarative/qdeclarativelanguage/data/LocalLast.qml new file mode 100644 index 00000000..f63283e7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/LocalLast.qml @@ -0,0 +1,2 @@ +import QtQuick 1.0 +Text {} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/MyComponent.qml b/tests/auto/declarative/qdeclarativelanguage/data/MyComponent.qml new file mode 100644 index 00000000..1a23277f --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/MyComponent.qml @@ -0,0 +1,6 @@ +import Test 1.0 + +MyQmlObject { + property real x; + property real y; +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/MyCompositeValueSource.qml b/tests/auto/declarative/qdeclarativelanguage/data/MyCompositeValueSource.qml new file mode 100644 index 00000000..e620e264 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/MyCompositeValueSource.qml @@ -0,0 +1,6 @@ +import Test 1.0 + +MyPropertyValueSource { + property int x +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/MyContainerComponent.qml b/tests/auto/declarative/qdeclarativelanguage/data/MyContainerComponent.qml new file mode 100644 index 00000000..61f54c5e --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/MyContainerComponent.qml @@ -0,0 +1,5 @@ +import Test 1.0 + +MyContainer { + property int x +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/NestedAlias.qml b/tests/auto/declarative/qdeclarativelanguage/data/NestedAlias.qml new file mode 100644 index 00000000..8aaddace --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/NestedAlias.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 + +QtObject { + property QtObject o1 + property QtObject o2 + + property alias a: object2.a + + o1: QtObject { id: object1 } + o2: QtObject { + id: object2 + property int a: 1923 + } +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/NestedComponentRoot.qml b/tests/auto/declarative/qdeclarativelanguage/data/NestedComponentRoot.qml new file mode 100644 index 00000000..785a27dd --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/NestedComponentRoot.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +Component { + Item { + } +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/NestedErrorsType.qml b/tests/auto/declarative/qdeclarativelanguage/data/NestedErrorsType.qml new file mode 100644 index 00000000..0ba4bd6d --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/NestedErrorsType.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +Item { + x: "You can't assign a string to a real!" +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/OnCompletedType.qml b/tests/auto/declarative/qdeclarativelanguage/data/OnCompletedType.qml new file mode 100644 index 00000000..c2ac5c84 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/OnCompletedType.qml @@ -0,0 +1,8 @@ +import Test 1.0 +import QtQuick 1.0 + +MyQmlObject { + property int a: Math.max(10, 9) + property int b: 11 + Component.onCompleted: console.log("Completed " + a + " " + b); +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/OnDestructionType.qml b/tests/auto/declarative/qdeclarativelanguage/data/OnDestructionType.qml new file mode 100644 index 00000000..c3d0e1ef --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/OnDestructionType.qml @@ -0,0 +1,8 @@ +import Test 1.0 +import QtQuick 1.0 + +MyQmlObject { + property int a: Math.max(10, 9) + property int b: 11 + Component.onDestruction: console.log("Destruction " + a + " " + b); +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/alias.1.qml b/tests/auto/declarative/qdeclarativelanguage/data/alias.1.qml new file mode 100644 index 00000000..44167af1 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/alias.1.qml @@ -0,0 +1,8 @@ +import Test 1.0 +import QtQuick 1.0 + +QtObject { + id: root + property int value: 10 + property alias valueAlias: root.value +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/alias.10.qml b/tests/auto/declarative/qdeclarativelanguage/data/alias.10.qml new file mode 100644 index 00000000..bf6352e8 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/alias.10.qml @@ -0,0 +1,8 @@ +import Test 1.0 + +MyTypeObject { + id: root + property alias valueAlias: root.rectProperty + + rectProperty: "10,11,9x8" +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/alias.11.qml b/tests/auto/declarative/qdeclarativelanguage/data/alias.11.qml new file mode 100644 index 00000000..fbd50d9d --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/alias.11.qml @@ -0,0 +1,8 @@ +import Test 1.0 + +MyTypeObject { + id: root + + property alias aliasProperty: root.rectProperty.x + rectProperty: "19,13,100x120" +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/alias.2.qml b/tests/auto/declarative/qdeclarativelanguage/data/alias.2.qml new file mode 100644 index 00000000..5c922709 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/alias.2.qml @@ -0,0 +1,8 @@ +import Test 1.0 + +MyQmlObject { + id: root + property alias aliasObject: root.qmlobjectProperty + + qmlobjectProperty: MyQmlObject { value : 10 } +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/alias.3.qml b/tests/auto/declarative/qdeclarativelanguage/data/alias.3.qml new file mode 100644 index 00000000..7e5559a7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/alias.3.qml @@ -0,0 +1,10 @@ +import QtQuick 1.0 + +QtObject { + property variant other + other: Alias { id: myAliasObject } + + property alias value: myAliasObject.aliasValue + property alias value2: myAliasObject.value +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/alias.4.qml b/tests/auto/declarative/qdeclarativelanguage/data/alias.4.qml new file mode 100644 index 00000000..bd6a7693 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/alias.4.qml @@ -0,0 +1,6 @@ +import Test 1.0 + +Alias2 { + enumAlias: MyTypeObject.EnumVal2 +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/alias.5.qml b/tests/auto/declarative/qdeclarativelanguage/data/alias.5.qml new file mode 100644 index 00000000..0c839ee7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/alias.5.qml @@ -0,0 +1,13 @@ +import QtQuick 1.0 +import Test 1.0 + +QtObject { + property alias otherAlias: otherObject + + property variant other + other: MyQmlObject { + id: otherObject + value: 10 + } +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/alias.6.qml b/tests/auto/declarative/qdeclarativelanguage/data/alias.6.qml new file mode 100644 index 00000000..663e8d0e --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/alias.6.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 + +QtObject { + property QtObject o; + property alias a: object.a + o: NestedAlias { id: object } +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/alias.7.qml b/tests/auto/declarative/qdeclarativelanguage/data/alias.7.qml new file mode 100644 index 00000000..ec5536e7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/alias.7.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 + +QtObject { + property QtObject object + property alias aliasedObject: target.object + + object: QtObject { + id: target + + property QtObject object + object: QtObject {} + } +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/alias.8.qml b/tests/auto/declarative/qdeclarativelanguage/data/alias.8.qml new file mode 100644 index 00000000..d480611c --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/alias.8.qml @@ -0,0 +1,9 @@ +import QtQuick 1.0 + +QtObject { + property variant other + other: Alias3 { id: myAliasObject } + + property int value: myAliasObject.obj.myValue +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/alias.9.qml b/tests/auto/declarative/qdeclarativelanguage/data/alias.9.qml new file mode 100644 index 00000000..0a49ad51 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/alias.9.qml @@ -0,0 +1,9 @@ +import QtQuick 1.0 + +QtObject { + property variant other + other: Alias4 { id: myAliasObject } + + property int value: myAliasObject.obj.myValue +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/aliasPropertiesAndSignals.qml b/tests/auto/declarative/qdeclarativelanguage/data/aliasPropertiesAndSignals.qml new file mode 100644 index 00000000..f04b1f60 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/aliasPropertiesAndSignals.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 + +QtObject { + id: root + + property bool test: false + property alias myalias: root.objectName + signal go + onGo: test = true + + Component.onCompleted: { + root.go(); + } +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/aliasPropertyChangeSignals.2.qml b/tests/auto/declarative/qdeclarativelanguage/data/aliasPropertyChangeSignals.2.qml new file mode 100644 index 00000000..a15a7188 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/aliasPropertyChangeSignals.2.qml @@ -0,0 +1,10 @@ +import QtQuick 1.0 + +AliasPropertyChangeSignalsType { + id: root + onAliasPropertyChanged: root.test = true + + function blah() {} + property int a +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/aliasPropertyChangeSignals.qml b/tests/auto/declarative/qdeclarativelanguage/data/aliasPropertyChangeSignals.qml new file mode 100644 index 00000000..7944deb4 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/aliasPropertyChangeSignals.qml @@ -0,0 +1,16 @@ +import QtQuick 1.0 + +QtObject { + id: root + + property alias aliasProperty: root.realProperty + onAliasPropertyChanged: root.test = true + + property int realProperty: 0 + + property bool test: false + + Component.onCompleted: { + root.realProperty = 10; + } +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/allowedRevisionOverloads.qml b/tests/auto/declarative/qdeclarativelanguage/data/allowedRevisionOverloads.qml new file mode 100644 index 00000000..64acbd15 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/allowedRevisionOverloads.qml @@ -0,0 +1,6 @@ +import Test 1.0 + +MyRevisionedLegalOverload +{ +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/assignBasicTypes.qml b/tests/auto/declarative/qdeclarativelanguage/data/assignBasicTypes.qml new file mode 100644 index 00000000..9fe0ded4 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/assignBasicTypes.qml @@ -0,0 +1,27 @@ +import Test 1.0 +MyTypeObject { + flagProperty: "FlagVal1 | FlagVal3" + enumProperty: "EnumVal2" + stringProperty: "Hello World!" + uintProperty: 10 + intProperty: -19 + realProperty: 23.2 + doubleProperty: -19.7 + floatProperty: 8.5 + colorProperty: "red" + dateProperty: "1982-11-25" + timeProperty: "11:11:32" + dateTimeProperty: "2009-05-12T13:22:01" + pointProperty: "99,13" + pointFProperty: "-10.1,12.3" + sizeProperty: "99x13" + sizeFProperty: "0.1x0.2" + rectProperty: "9,7,100x200" + rectFProperty: "1000.1,-10.9,400x90.99" + boolProperty: true + variantProperty: "Hello World!" + vectorProperty: "10,1,2.2" + urlProperty: "main.qml" + + objectProperty: MyTypeObject { intProperty: 8 } +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/assignCompositeToType.qml b/tests/auto/declarative/qdeclarativelanguage/data/assignCompositeToType.qml new file mode 100644 index 00000000..ed214ffe --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/assignCompositeToType.qml @@ -0,0 +1,18 @@ +import QtQuick 1.0 +import Test 1.0 + +QtObject { + property QtObject myProperty + property QtObject myProperty2 + property QtObject myProperty3 + property QtObject myProperty4 + property MyQmlObject myProperty5 + property MyQmlObject myProperty6 + + myProperty: CompositeType {} + myProperty2: CompositeType2 {} + myProperty3: CompositeType3 {} + myProperty4: CompositeType4 {} + myProperty5: CompositeType2 {} + myProperty6: CompositeType4 {} +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/assignLiteralSignalProperty.qml b/tests/auto/declarative/qdeclarativelanguage/data/assignLiteralSignalProperty.qml new file mode 100644 index 00000000..399fcea0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/assignLiteralSignalProperty.qml @@ -0,0 +1,4 @@ +import Test 1.0 +MyQmlObject { + onLiteralSignal: 10 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/assignLiteralToVariant.qml b/tests/auto/declarative/qdeclarativelanguage/data/assignLiteralToVariant.qml new file mode 100644 index 00000000..ab6f3df8 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/assignLiteralToVariant.qml @@ -0,0 +1,16 @@ +import QtQuick 1.0 + +QtObject { + property variant test1: 1 + property variant test2: 1.7 + property variant test3: "Hello world!" + property variant test4: "#FF008800" + property variant test5: "10,10,10x10" + property variant test6: "10,10" + property variant test7: "10x10" + property variant test8: "100,100,100" + property variant test9: String("#FF008800") + property variant test10: true + property variant test11: false +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/assignObjectToSignal.qml b/tests/auto/declarative/qdeclarativelanguage/data/assignObjectToSignal.qml new file mode 100644 index 00000000..789cc662 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/assignObjectToSignal.qml @@ -0,0 +1,4 @@ +import Test 1.0 +MyQmlObject { + onBasicSignal: MyQmlObject {} +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/assignObjectToVariant.qml b/tests/auto/declarative/qdeclarativelanguage/data/assignObjectToVariant.qml new file mode 100644 index 00000000..aab7ed2c --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/assignObjectToVariant.qml @@ -0,0 +1,7 @@ +import Test 1.0 +import QtQuick 1.0 + +QtObject { + property variant a; + a: MyQmlObject {} +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/assignQmlComponent.qml b/tests/auto/declarative/qdeclarativelanguage/data/assignQmlComponent.qml new file mode 100644 index 00000000..20bdc559 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/assignQmlComponent.qml @@ -0,0 +1,4 @@ +import Test 1.0 +MyContainer { + MyComponent { x: 10; y: 11; } +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/assignSignal.qml b/tests/auto/declarative/qdeclarativelanguage/data/assignSignal.qml new file mode 100644 index 00000000..2a48df8f --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/assignSignal.qml @@ -0,0 +1,5 @@ +import Test 1.0 +MyQmlObject { + onBasicSignal: basicSlot() + onBasicParameterizedSignal: basicSlotWithArgs(parameter) +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/assignToNamespace.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/assignToNamespace.errors.txt new file mode 100644 index 00000000..78aa4713 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/assignToNamespace.errors.txt @@ -0,0 +1 @@ +4:5:Invalid use of namespace diff --git a/tests/auto/declarative/qdeclarativelanguage/data/assignToNamespace.qml b/tests/auto/declarative/qdeclarativelanguage/data/assignToNamespace.qml new file mode 100644 index 00000000..3cde2e82 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/assignToNamespace.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 as Qt47 + +Qt47.QtObject { + Qt47: 10 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/assignTypeExtremes.qml b/tests/auto/declarative/qdeclarativelanguage/data/assignTypeExtremes.qml new file mode 100644 index 00000000..60ede525 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/assignTypeExtremes.qml @@ -0,0 +1,5 @@ +import Test 1.0 +MyTypeObject { + uintProperty: 4000000000 + intProperty: -2000000000 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/assignValueToSignal.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/assignValueToSignal.errors.txt new file mode 100644 index 00000000..eb1430a7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/assignValueToSignal.errors.txt @@ -0,0 +1 @@ +4:5:Cannot assign a value to a signal (expecting a script to be run) diff --git a/tests/auto/declarative/qdeclarativelanguage/data/assignValueToSignal.qml b/tests/auto/declarative/qdeclarativelanguage/data/assignValueToSignal.qml new file mode 100644 index 00000000..6fa1259f --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/assignValueToSignal.qml @@ -0,0 +1,6 @@ +import Test 1.0 + +MyQmlObject { + onBasicSignal: "hello world" +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/attachedProperties.qml b/tests/auto/declarative/qdeclarativelanguage/data/attachedProperties.qml new file mode 100644 index 00000000..1e932251 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/attachedProperties.qml @@ -0,0 +1,8 @@ +import Test 1.0 +import Test 1.0 as Namespace +import QtQuick 1.0 + +QtObject { + MyQmlObject.value: 10 + Namespace.MyQmlObject.value2: 13 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/autoComponentCreation.qml b/tests/auto/declarative/qdeclarativelanguage/data/autoComponentCreation.qml new file mode 100644 index 00000000..5d00144e --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/autoComponentCreation.qml @@ -0,0 +1,4 @@ +import Test 1.0 +MyTypeObject { + componentProperty : MyTypeObject { realProperty: 9 } +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/autoNotifyConnection.qml b/tests/auto/declarative/qdeclarativelanguage/data/autoNotifyConnection.qml new file mode 100644 index 00000000..640fb54f --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/autoNotifyConnection.qml @@ -0,0 +1,6 @@ +import Test 1.0 +MyQmlObject { + property bool receivedNotify : false + onPropertyWithNotifyChanged: { receivedNotify = true; } +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/component.1.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/component.1.errors.txt new file mode 100644 index 00000000..091aad61 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/component.1.errors.txt @@ -0,0 +1 @@ +3:1:Cannot create empty component specification diff --git a/tests/auto/declarative/qdeclarativelanguage/data/component.1.qml b/tests/auto/declarative/qdeclarativelanguage/data/component.1.qml new file mode 100644 index 00000000..f4f66dda --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/component.1.qml @@ -0,0 +1,4 @@ +import QtQuick 1.0 + +Component { +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/component.2.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/component.2.errors.txt new file mode 100644 index 00000000..76e7656a --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/component.2.errors.txt @@ -0,0 +1 @@ +6:9:id is not unique diff --git a/tests/auto/declarative/qdeclarativelanguage/data/component.2.qml b/tests/auto/declarative/qdeclarativelanguage/data/component.2.qml new file mode 100644 index 00000000..7d677b57 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/component.2.qml @@ -0,0 +1,9 @@ +import QtQuick 1.0 + +Item { + id: myId + Component { + id: myId + QtObject {} + } +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/component.3.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/component.3.errors.txt new file mode 100644 index 00000000..450fc163 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/component.3.errors.txt @@ -0,0 +1 @@ +6:9:Property value set multiple times diff --git a/tests/auto/declarative/qdeclarativelanguage/data/component.3.qml b/tests/auto/declarative/qdeclarativelanguage/data/component.3.qml new file mode 100644 index 00000000..1b9af8bd --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/component.3.qml @@ -0,0 +1,9 @@ +import QtQuick 1.0 + +Item { + Component { + id: myId + id: myId2 + QtObject {} + } +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/component.4.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/component.4.errors.txt new file mode 100644 index 00000000..2ab18685 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/component.4.errors.txt @@ -0,0 +1 @@ +3:1:Invalid component body specification diff --git a/tests/auto/declarative/qdeclarativelanguage/data/component.4.qml b/tests/auto/declarative/qdeclarativelanguage/data/component.4.qml new file mode 100644 index 00000000..806613c2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/component.4.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +Component { + QtObject {} + QtObject {} +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/component.5.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/component.5.errors.txt new file mode 100644 index 00000000..e3c2df75 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/component.5.errors.txt @@ -0,0 +1 @@ +4:5:Component elements may not contain properties other than id diff --git a/tests/auto/declarative/qdeclarativelanguage/data/component.5.qml b/tests/auto/declarative/qdeclarativelanguage/data/component.5.qml new file mode 100644 index 00000000..e94022a1 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/component.5.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +Component { + x: 10 + QtObject {} +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/component.6.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/component.6.errors.txt new file mode 100644 index 00000000..2b1c6ca6 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/component.6.errors.txt @@ -0,0 +1 @@ +4:5:Invalid component id specification diff --git a/tests/auto/declarative/qdeclarativelanguage/data/component.6.qml b/tests/auto/declarative/qdeclarativelanguage/data/component.6.qml new file mode 100644 index 00000000..8f81a5a9 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/component.6.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +Component { + id: QtObject {} + QtObject {} +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/component.7.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/component.7.errors.txt new file mode 100644 index 00000000..b144814a --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/component.7.errors.txt @@ -0,0 +1 @@ +3:1:Component objects cannot declare new properties. diff --git a/tests/auto/declarative/qdeclarativelanguage/data/component.7.qml b/tests/auto/declarative/qdeclarativelanguage/data/component.7.qml new file mode 100644 index 00000000..94bf189b --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/component.7.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +Component { + property int a + QtObject {} +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/component.8.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/component.8.errors.txt new file mode 100644 index 00000000..6f2d0d20 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/component.8.errors.txt @@ -0,0 +1 @@ +3:1:Component objects cannot declare new signals. diff --git a/tests/auto/declarative/qdeclarativelanguage/data/component.8.qml b/tests/auto/declarative/qdeclarativelanguage/data/component.8.qml new file mode 100644 index 00000000..69990cae --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/component.8.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +Component { + signal a + QtObject {} +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/component.9.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/component.9.errors.txt new file mode 100644 index 00000000..92f14568 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/component.9.errors.txt @@ -0,0 +1 @@ +3:1:Component objects cannot declare new functions. diff --git a/tests/auto/declarative/qdeclarativelanguage/data/component.9.qml b/tests/auto/declarative/qdeclarativelanguage/data/component.9.qml new file mode 100644 index 00000000..5db98152 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/component.9.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +Component { + function a() {} + QtObject {} +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/componentCompositeType.qml b/tests/auto/declarative/qdeclarativelanguage/data/componentCompositeType.qml new file mode 100644 index 00000000..d04da624 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/componentCompositeType.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 + +QtObject { + property variant test + + test: ComponentComposite {} +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/cppnamespace.2.qml b/tests/auto/declarative/qdeclarativelanguage/data/cppnamespace.2.qml new file mode 100644 index 00000000..e3b32ca5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/cppnamespace.2.qml @@ -0,0 +1,5 @@ +import Test 1.0 + +MySecondNamespacedType { + list: [ MyNamespacedType {} ] +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/cppnamespace.qml b/tests/auto/declarative/qdeclarativelanguage/data/cppnamespace.qml new file mode 100644 index 00000000..e1daf3b7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/cppnamespace.qml @@ -0,0 +1,4 @@ +import Test 1.0 + +MyNamespacedType { +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/crash2.qml b/tests/auto/declarative/qdeclarativelanguage/data/crash2.qml new file mode 100644 index 00000000..6ac71eea --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/crash2.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +QtObject { + objectName: "Hello" + "World" +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/customOnProperty.qml b/tests/auto/declarative/qdeclarativelanguage/data/customOnProperty.qml new file mode 100644 index 00000000..c1e47900 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/customOnProperty.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +QtObject { + property int on + + Component.onCompleted: on = 10 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/customParserIdNotAllowed.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/customParserIdNotAllowed.errors.txt new file mode 100644 index 00000000..43a8bb28 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/customParserIdNotAllowed.errors.txt @@ -0,0 +1 @@ +4:19:ListElement: cannot use reserved "id" property diff --git a/tests/auto/declarative/qdeclarativelanguage/data/customParserIdNotAllowed.qml b/tests/auto/declarative/qdeclarativelanguage/data/customParserIdNotAllowed.qml new file mode 100644 index 00000000..50bc2aeb --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/customParserIdNotAllowed.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 +ListModel { + ListElement { a: 10 } + ListElement { id: foo; a: 12 } +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/customParserTypes.qml b/tests/auto/declarative/qdeclarativelanguage/data/customParserTypes.qml new file mode 100644 index 00000000..4cf68272 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/customParserTypes.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 +ListModel { + ListElement { a: 10 } + ListElement { a: 12 } +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/customVariantTypes.qml b/tests/auto/declarative/qdeclarativelanguage/data/customVariantTypes.qml new file mode 100644 index 00000000..0263ed20 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/customVariantTypes.qml @@ -0,0 +1,4 @@ +import Test 1.0 +MyQmlObject { + customType: "10" +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/declaredPropertyValues.qml b/tests/auto/declarative/qdeclarativelanguage/data/declaredPropertyValues.qml new file mode 100644 index 00000000..f15373f1 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/declaredPropertyValues.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 + +QtObject { + property int a: 10 + property int b: 10 + a + property QtObject c: QtObject {} + property list d: [ QtObject {}, QtObject {} ] +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/defaultGrouped.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/defaultGrouped.errors.txt new file mode 100644 index 00000000..32055f66 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/defaultGrouped.errors.txt @@ -0,0 +1 @@ +7:9:Cannot assign a value directly to a grouped property diff --git a/tests/auto/declarative/qdeclarativelanguage/data/defaultGrouped.qml b/tests/auto/declarative/qdeclarativelanguage/data/defaultGrouped.qml new file mode 100644 index 00000000..d98dfdb5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/defaultGrouped.qml @@ -0,0 +1,10 @@ +import Test 1.0 +import QtQuick 1.0 + +MyTypeObject { + grouped { + script: console.log(1921) + QtObject {} + } +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/defaultPropertyListOrder.qml b/tests/auto/declarative/qdeclarativelanguage/data/defaultPropertyListOrder.qml new file mode 100644 index 00000000..87dc3d3e --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/defaultPropertyListOrder.qml @@ -0,0 +1,29 @@ +import Test 1.0 +import QtQuick 1.0 + +MyContainer { + QtObject { + property int index: 0 + } + + QtObject { + property int index: 1 + } + + children: [ + QtObject { + property int index: 2 + }, + QtObject { + property int index: 3 + } + ] + + QtObject { + property int index: 4 + } + + QtObject { + property int index: 5 + } +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/destroyedSignal.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/destroyedSignal.errors.txt new file mode 100644 index 00000000..3348494a --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/destroyedSignal.errors.txt @@ -0,0 +1 @@ +4:5:Cannot assign to non-existent property "onDestroyed" diff --git a/tests/auto/declarative/qdeclarativelanguage/data/destroyedSignal.qml b/tests/auto/declarative/qdeclarativelanguage/data/destroyedSignal.qml new file mode 100644 index 00000000..ba65d783 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/destroyedSignal.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +QtObject { + onDestroyed: print("Hello World!") +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/disallowedRevisionOverloads.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/disallowedRevisionOverloads.errors.txt new file mode 100644 index 00000000..e9b449d8 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/disallowedRevisionOverloads.errors.txt @@ -0,0 +1 @@ +3:1:Type Test/MyRevisionedIllegalOverload 1.0 contains an illegal property "propA". This is an error in the type's implementation. diff --git a/tests/auto/declarative/qdeclarativelanguage/data/disallowedRevisionOverloads.qml b/tests/auto/declarative/qdeclarativelanguage/data/disallowedRevisionOverloads.qml new file mode 100644 index 00000000..612bcfe0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/disallowedRevisionOverloads.qml @@ -0,0 +1,7 @@ +import Test 1.0 + +MyRevisionedIllegalOverload +{ +} + + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/dontDoubleCallClassBegin.qml b/tests/auto/declarative/qdeclarativelanguage/data/dontDoubleCallClassBegin.qml new file mode 100644 index 00000000..0cdbdd73 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/dontDoubleCallClassBegin.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +Item { + property QtObject object: DontDoubleCallClassBeginItem {} +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/doubleSignal.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/doubleSignal.errors.txt new file mode 100644 index 00000000..e1f7ec5b --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/doubleSignal.errors.txt @@ -0,0 +1 @@ +5:5:Property value set multiple times diff --git a/tests/auto/declarative/qdeclarativelanguage/data/doubleSignal.qml b/tests/auto/declarative/qdeclarativelanguage/data/doubleSignal.qml new file mode 100644 index 00000000..fb07b9f6 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/doubleSignal.qml @@ -0,0 +1,7 @@ +import Test 1.0 + +MyQmlObject { + onBasicSignal: console.log(1921) + onBasicSignal: console.log(1921) +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/duplicateIDs.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/duplicateIDs.errors.txt new file mode 100644 index 00000000..66241cf1 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/duplicateIDs.errors.txt @@ -0,0 +1 @@ +4:19:id is not unique diff --git a/tests/auto/declarative/qdeclarativelanguage/data/duplicateIDs.qml b/tests/auto/declarative/qdeclarativelanguage/data/duplicateIDs.qml new file mode 100644 index 00000000..a993abdd --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/duplicateIDs.qml @@ -0,0 +1,6 @@ +import Test 1.0 +MyContainer { + MyQmlObject { id: myID } + MyQmlObject { id: myID } +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.1.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.1.errors.txt new file mode 100644 index 00000000..1f9f9169 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.1.errors.txt @@ -0,0 +1 @@ +5:5:Duplicate default property diff --git a/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.1.qml b/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.1.qml new file mode 100644 index 00000000..2b6dd5d5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.1.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +QtObject { + default property QtObject a + default property QtObject b +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.2.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.2.errors.txt new file mode 100644 index 00000000..7a4f63bf --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.2.errors.txt @@ -0,0 +1 @@ +5:5:Duplicate property name diff --git a/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.2.qml b/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.2.qml new file mode 100644 index 00000000..7d11d990 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.2.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +QtObject { + property int a + property bool a +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.3.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.3.errors.txt new file mode 100644 index 00000000..c5860a2f --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.3.errors.txt @@ -0,0 +1 @@ +3:1:Duplicate signal name diff --git a/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.3.qml b/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.3.qml new file mode 100644 index 00000000..b0f2828e --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.3.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +QtObject { + signal a + signal a +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.4.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.4.errors.txt new file mode 100644 index 00000000..b293c862 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.4.errors.txt @@ -0,0 +1 @@ +3:1:Duplicate method name diff --git a/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.4.qml b/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.4.qml new file mode 100644 index 00000000..e28cad3a --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.4.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +QtObject { + function a() {} + function a() {} +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.5.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.5.errors.txt new file mode 100644 index 00000000..015d55b0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.5.errors.txt @@ -0,0 +1 @@ +3:1:UnknownType is not a type diff --git a/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.5.qml b/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.5.qml new file mode 100644 index 00000000..8e4acc05 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/dynamicMeta.5.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +QtObject { + property UnknownType a +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/dynamicObject.1.qml b/tests/auto/declarative/qdeclarativelanguage/data/dynamicObject.1.qml new file mode 100644 index 00000000..cdad72b5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/dynamicObject.1.qml @@ -0,0 +1,8 @@ +import Test 1.0 +import QtQuick 1.0 +MyCustomParserType { + propa: a + 10 + propb: Math.min(a, 10) + propc: MyPropertyValueSource {} + onPropA: a +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/dynamicObjectProperties.2.qml b/tests/auto/declarative/qdeclarativelanguage/data/dynamicObjectProperties.2.qml new file mode 100644 index 00000000..c03ec492 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/dynamicObjectProperties.2.qml @@ -0,0 +1,11 @@ +import QtQuick 1.0 +import QtQuick 1.0 as Qt47 + +Qt.QtObject { + property Qt47.QtObject objectProperty + property list objectPropertyList + + objectProperty: QtObject {} + objectPropertyList: QtObject {} +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/dynamicObjectProperties.qml b/tests/auto/declarative/qdeclarativelanguage/data/dynamicObjectProperties.qml new file mode 100644 index 00000000..ed25c4b8 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/dynamicObjectProperties.qml @@ -0,0 +1,13 @@ +import Test 1.0 +import QtQuick 1.0 +import QtQuick 1.0 as Qt47 + +QtObject { + property QtObject objectProperty + property QtObject objectProperty2 + objectProperty2: QtObject {} + + property MyComponent myComponentProperty + property MyComponent myComponentProperty2 + myComponentProperty2: MyComponent {} +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/dynamicProperties.qml b/tests/auto/declarative/qdeclarativelanguage/data/dynamicProperties.qml new file mode 100644 index 00000000..782adefa --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/dynamicProperties.qml @@ -0,0 +1,13 @@ +import Test 1.0 +import QtQuick 1.0 +QtObject { + default property int intProperty : 10 + property bool boolProperty: false + property double doubleProperty: -10.1 + property real realProperty: -19.9 + property string stringProperty: "Hello World!" + property color colorProperty: "red" + property url urlProperty: "main.qml" + property date dateProperty: "1945-09-02" + property variant varProperty: "Hello World!" +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/dynamicPropertiesNested.qml b/tests/auto/declarative/qdeclarativelanguage/data/dynamicPropertiesNested.qml new file mode 100644 index 00000000..64848fe8 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/dynamicPropertiesNested.qml @@ -0,0 +1,9 @@ +import QtQuick 1.0 + +DynamicPropertiesNestedType { + property int a: 13 + property int b: 12 + + super_a: 11 +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/dynamicSignalsAndSlots.qml b/tests/auto/declarative/qdeclarativelanguage/data/dynamicSignalsAndSlots.qml new file mode 100644 index 00000000..78978dba --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/dynamicSignalsAndSlots.qml @@ -0,0 +1,10 @@ +import QtQuick 1.0 +QtObject { + signal signal1 + function slot1() {} + signal signal2 + function slot2() {} + + property int test: 0 + function slot3(a) { console.log(1921); test = a; } +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/empty.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/empty.errors.txt new file mode 100644 index 00000000..d416e76a --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/empty.errors.txt @@ -0,0 +1,2 @@ +0:0:Expected token `numeric literal' +0:0:Expected a qualified name id diff --git a/tests/auto/declarative/qdeclarativelanguage/data/empty.qml b/tests/auto/declarative/qdeclarativelanguage/data/empty.qml new file mode 100644 index 00000000..e69de29b diff --git a/tests/auto/declarative/qdeclarativelanguage/data/emptySignal.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/emptySignal.errors.txt new file mode 100644 index 00000000..8b204349 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/emptySignal.errors.txt @@ -0,0 +1 @@ +4:5:Incorrectly specified signal assignment diff --git a/tests/auto/declarative/qdeclarativelanguage/data/emptySignal.qml b/tests/auto/declarative/qdeclarativelanguage/data/emptySignal.qml new file mode 100644 index 00000000..c84fea3f --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/emptySignal.qml @@ -0,0 +1,7 @@ +import Test 1.0 + +MyQmlObject { + onBasicSignal { + } +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/enumTypes.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/enumTypes.errors.txt new file mode 100644 index 00000000..d4e0cc0b --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/enumTypes.errors.txt @@ -0,0 +1 @@ +3:1:Element is not creatable. diff --git a/tests/auto/declarative/qdeclarativelanguage/data/enumTypes.qml b/tests/auto/declarative/qdeclarativelanguage/data/enumTypes.qml new file mode 100644 index 00000000..3eda6612 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/enumTypes.qml @@ -0,0 +1,4 @@ +import QtQuick 1.0 + +Font { +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/failingComponent.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/failingComponent.errors.txt new file mode 100644 index 00000000..364ca674 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/failingComponent.errors.txt @@ -0,0 +1 @@ +3:5:FailingComponent is not a type diff --git a/tests/auto/declarative/qdeclarativelanguage/data/failingComponentTest.qml b/tests/auto/declarative/qdeclarativelanguage/data/failingComponentTest.qml new file mode 100644 index 00000000..74a6acfc --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/failingComponentTest.qml @@ -0,0 +1,4 @@ +import Test 1.0 +MyContainer { + FailingComponent {} +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/fakeDotProperty.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/fakeDotProperty.errors.txt new file mode 100644 index 00000000..30748234 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/fakeDotProperty.errors.txt @@ -0,0 +1 @@ +3:5:Invalid grouped property access diff --git a/tests/auto/declarative/qdeclarativelanguage/data/fakeDotProperty.qml b/tests/auto/declarative/qdeclarativelanguage/data/fakeDotProperty.qml new file mode 100644 index 00000000..d971eee4 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/fakeDotProperty.qml @@ -0,0 +1,4 @@ +import Test 1.0 +MyQmlObject { + value.something: "hello" +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/finalOverride.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/finalOverride.errors.txt new file mode 100644 index 00000000..49e06cbd --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/finalOverride.errors.txt @@ -0,0 +1 @@ +3:5:Cannot override FINAL property diff --git a/tests/auto/declarative/qdeclarativelanguage/data/finalOverride.qml b/tests/auto/declarative/qdeclarativelanguage/data/finalOverride.qml new file mode 100644 index 00000000..a84393af --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/finalOverride.qml @@ -0,0 +1,4 @@ +import Test 1.0 +MyQmlObject { + property int value: 10 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/i18nDeclaredPropertyNames.qml b/tests/auto/declarative/qdeclarativelanguage/data/i18nDeclaredPropertyNames.qml new file mode 100644 index 00000000..558c836e --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/i18nDeclaredPropertyNames.qml @@ -0,0 +1,6 @@ +import Test 1.0 + +MyTypeObject { + property int áâãäå: 10 + stringProperty: "Test áâãäå: " + áâãäå +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/i18nDeclaredPropertyUse.qml b/tests/auto/declarative/qdeclarativelanguage/data/i18nDeclaredPropertyUse.qml new file mode 100644 index 00000000..74918e27 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/i18nDeclaredPropertyUse.qml @@ -0,0 +1,3 @@ +I18n { + áâãäå: 15 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/i18nNameSpace.qml b/tests/auto/declarative/qdeclarativelanguage/data/i18nNameSpace.qml new file mode 100644 index 00000000..c0b2f948 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/i18nNameSpace.qml @@ -0,0 +1,5 @@ +import Test 1.0 as Áâãäå + +Áâãäå.MyTypeObject { + stringProperty: "Test áâãäå: 40" +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/i18nScript.qml b/tests/auto/declarative/qdeclarativelanguage/data/i18nScript.qml new file mode 100644 index 00000000..e77cb520 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/i18nScript.qml @@ -0,0 +1,9 @@ +import Test 1.0 + +MyTypeObject { + function val() { + var áâãäå = 20 + return "Test áâãäå: " + áâãäå + } + stringProperty: val() +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/i18nStrings.qml b/tests/auto/declarative/qdeclarativelanguage/data/i18nStrings.qml new file mode 100644 index 00000000..764c9263 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/i18nStrings.qml @@ -0,0 +1,5 @@ +import Test 1.0 + +MyTypeObject { + stringProperty: "Test áâãäå (5 accented 'a' letters)" +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/i18nType.qml b/tests/auto/declarative/qdeclarativelanguage/data/i18nType.qml new file mode 100644 index 00000000..d7954ef7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/i18nType.qml @@ -0,0 +1 @@ +I18nTypeÁâãäå { } diff --git a/tests/auto/declarative/qdeclarativelanguage/data/idProperty.qml b/tests/auto/declarative/qdeclarativelanguage/data/idProperty.qml new file mode 100644 index 00000000..bf048ea6 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/idProperty.qml @@ -0,0 +1,8 @@ +import Test 1.0 +MyContainer { + property variant object : myObjectId + + MyTypeObject { + id: "myObjectId" + } +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/importFile.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/importFile.errors.txt new file mode 100644 index 00000000..3fdac092 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/importFile.errors.txt @@ -0,0 +1 @@ +1:1:"MyComponent.qml": no such directory diff --git a/tests/auto/declarative/qdeclarativelanguage/data/importFile.qml b/tests/auto/declarative/qdeclarativelanguage/data/importFile.qml new file mode 100644 index 00000000..a0d8410c --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/importFile.qml @@ -0,0 +1,3 @@ +import "MyComponent.qml" 1.0 + +MyComponent { text: "Hello" } diff --git a/tests/auto/declarative/qdeclarativelanguage/data/importIncorrectCase.qml b/tests/auto/declarative/qdeclarativelanguage/data/importIncorrectCase.qml new file mode 100644 index 00000000..247f527f --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/importIncorrectCase.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 +import com.Nokia.installedtest 1.0 + +QtObject { +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/importNamespaceConflict.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/importNamespaceConflict.errors.txt new file mode 100644 index 00000000..231998da --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/importNamespaceConflict.errors.txt @@ -0,0 +1 @@ +4:1:Namespace Rectangle cannot be used as a type diff --git a/tests/auto/declarative/qdeclarativelanguage/data/importNamespaceConflict.qml b/tests/auto/declarative/qdeclarativelanguage/data/importNamespaceConflict.qml new file mode 100644 index 00000000..39e38466 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/importNamespaceConflict.qml @@ -0,0 +1,4 @@ +import Test 1.0 as Rectangle +import QtQuick 1.0 + +Rectangle { } diff --git a/tests/auto/declarative/qdeclarativelanguage/data/importNewerVersion.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/importNewerVersion.errors.txt new file mode 100644 index 00000000..413f0963 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/importNewerVersion.errors.txt @@ -0,0 +1 @@ +1:1:module "Test" version 2.0 is not installed diff --git a/tests/auto/declarative/qdeclarativelanguage/data/importNewerVersion.qml b/tests/auto/declarative/qdeclarativelanguage/data/importNewerVersion.qml new file mode 100644 index 00000000..c4a0d386 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/importNewerVersion.qml @@ -0,0 +1,3 @@ +import Test 2.0 + +MyTypeObject { } diff --git a/tests/auto/declarative/qdeclarativelanguage/data/importNonExist.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/importNonExist.errors.txt new file mode 100644 index 00000000..1baf05ce --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/importNonExist.errors.txt @@ -0,0 +1 @@ +2:1:"will-not-be-found": no such directory diff --git a/tests/auto/declarative/qdeclarativelanguage/data/importNonExist.qml b/tests/auto/declarative/qdeclarativelanguage/data/importNonExist.qml new file mode 100644 index 00000000..9589692e --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/importNonExist.qml @@ -0,0 +1,5 @@ +// imports... +import "will-not-be-found" +import QtQuick 1.0 + +Rectangle { } diff --git a/tests/auto/declarative/qdeclarativelanguage/data/importNonExistOlder.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/importNonExistOlder.errors.txt new file mode 100644 index 00000000..dfa7a369 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/importNonExistOlder.errors.txt @@ -0,0 +1 @@ +1:1:module "Test" version 0.1 is not installed diff --git a/tests/auto/declarative/qdeclarativelanguage/data/importNonExistOlder.qml b/tests/auto/declarative/qdeclarativelanguage/data/importNonExistOlder.qml new file mode 100644 index 00000000..18514b1e --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/importNonExistOlder.qml @@ -0,0 +1,3 @@ +import Test 0.1 + +MyTypeObject { } diff --git a/tests/auto/declarative/qdeclarativelanguage/data/importVersionMissingBuiltIn.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/importVersionMissingBuiltIn.errors.txt new file mode 100644 index 00000000..c7d880e7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/importVersionMissingBuiltIn.errors.txt @@ -0,0 +1 @@ +1:16:Library import requires a version diff --git a/tests/auto/declarative/qdeclarativelanguage/data/importVersionMissingBuiltIn.qml b/tests/auto/declarative/qdeclarativelanguage/data/importVersionMissingBuiltIn.qml new file mode 100644 index 00000000..23ed566e --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/importVersionMissingBuiltIn.qml @@ -0,0 +1,7 @@ +import Test as S + +S.MyQmlObject { + property real x; + property real y; +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/importVersionMissingInstalled.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/importVersionMissingInstalled.errors.txt new file mode 100644 index 00000000..89e58ee7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/importVersionMissingInstalled.errors.txt @@ -0,0 +1 @@ +1:35:Library import requires a version diff --git a/tests/auto/declarative/qdeclarativelanguage/data/importVersionMissingInstalled.qml b/tests/auto/declarative/qdeclarativelanguage/data/importVersionMissingInstalled.qml new file mode 100644 index 00000000..97ec2228 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/importVersionMissingInstalled.qml @@ -0,0 +1,3 @@ +import com.nokia.installedtest as T + +T.InstalledTest {} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/importscript.1.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/importscript.1.errors.txt new file mode 100644 index 00000000..ebc936d1 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/importscript.1.errors.txt @@ -0,0 +1 @@ +1:8:Script import requires a qualifier diff --git a/tests/auto/declarative/qdeclarativelanguage/data/importscript.1.qml b/tests/auto/declarative/qdeclarativelanguage/data/importscript.1.qml new file mode 100644 index 00000000..2b2ab6ba --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/importscript.1.qml @@ -0,0 +1,3 @@ +import "test.js" + +Item { } diff --git a/tests/auto/declarative/qdeclarativelanguage/data/incorrectCase.errors.insensitive.txt b/tests/auto/declarative/qdeclarativelanguage/data/incorrectCase.errors.insensitive.txt new file mode 100644 index 00000000..38136805 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/incorrectCase.errors.insensitive.txt @@ -0,0 +1,2 @@ +3:1:Type IncorrectCaseType unavailable +-1:-1:File name case mismatch diff --git a/tests/auto/declarative/qdeclarativelanguage/data/incorrectCase.errors.sensitive.txt b/tests/auto/declarative/qdeclarativelanguage/data/incorrectCase.errors.sensitive.txt new file mode 100644 index 00000000..abed1a73 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/incorrectCase.errors.sensitive.txt @@ -0,0 +1 @@ +3:1:IncorrectCaseType is not a type diff --git a/tests/auto/declarative/qdeclarativelanguage/data/incorrectCase.qml b/tests/auto/declarative/qdeclarativelanguage/data/incorrectCase.qml new file mode 100644 index 00000000..d11000be --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/incorrectCase.qml @@ -0,0 +1,4 @@ +import QtQuick 1.0 + +IncorrectCaseType { +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/incorrectCaseType.qml b/tests/auto/declarative/qdeclarativelanguage/data/incorrectCaseType.qml new file mode 100644 index 00000000..cf32b456 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/incorrectCaseType.qml @@ -0,0 +1,4 @@ +import QtQuick 1.0 + +QtObject { +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/inlineAssignmentsOverrideBindings.qml b/tests/auto/declarative/qdeclarativelanguage/data/inlineAssignmentsOverrideBindings.qml new file mode 100644 index 00000000..8f3c5cef --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/inlineAssignmentsOverrideBindings.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +InlineAssignmentsOverrideBindingsType { + property int test: nested.value + nested.value: 11 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/inlineQmlComponents.qml b/tests/auto/declarative/qdeclarativelanguage/data/inlineQmlComponents.qml new file mode 100644 index 00000000..a52bd23d --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/inlineQmlComponents.qml @@ -0,0 +1,10 @@ +import Test 1.0 +import QtQuick 1.0 +MyContainer { + Component { + id: myComponent + MyQmlObject { + value: 11 + } + } +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/insertedSemicolon.1.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/insertedSemicolon.1.errors.txt new file mode 100644 index 00000000..651009cf --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/insertedSemicolon.1.errors.txt @@ -0,0 +1 @@ +9:5:Expected a qualified name id diff --git a/tests/auto/declarative/qdeclarativelanguage/data/insertedSemicolon.1.qml b/tests/auto/declarative/qdeclarativelanguage/data/insertedSemicolon.1.qml new file mode 100644 index 00000000..4e561b48 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/insertedSemicolon.1.qml @@ -0,0 +1,10 @@ +import Test 1.0 + +MyQmlObject { + function foo() + { + return + } + + 1223 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/interfaceProperty.qml b/tests/auto/declarative/qdeclarativelanguage/data/interfaceProperty.qml new file mode 100644 index 00000000..444e2348 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/interfaceProperty.qml @@ -0,0 +1,5 @@ +import Test 1.0 +import QtQuick 1.0 +MyQmlObject { + interfaceProperty: MyQmlObject {} +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/interfaceQList.qml b/tests/auto/declarative/qdeclarativelanguage/data/interfaceQList.qml new file mode 100644 index 00000000..c87dfae7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/interfaceQList.qml @@ -0,0 +1,7 @@ +import Test 1.0 +MyContainer { + qlistInterfaces: [ + MyQmlObject {}, + MyQmlObject {} + ] +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.1.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.1.errors.txt new file mode 100644 index 00000000..9848e485 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.1.errors.txt @@ -0,0 +1 @@ +3:1:No property alias location diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.1.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.1.qml new file mode 100644 index 00000000..13bdb121 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.1.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +QtObject { + property alias a +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.10.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.10.errors.txt new file mode 100644 index 00000000..93652a70 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.10.errors.txt @@ -0,0 +1 @@ +5:23:Invalid alias location diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.10.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.10.qml new file mode 100644 index 00000000..3ff7b16f --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.10.qml @@ -0,0 +1,6 @@ +import Test 1.0 + +MyTypeObject { + id: root + property alias a: root.rectProperty.blah +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.2.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.2.errors.txt new file mode 100644 index 00000000..3e15628a --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.2.errors.txt @@ -0,0 +1 @@ +4:23:Invalid alias location diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.2.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.2.qml new file mode 100644 index 00000000..b6378c39 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.2.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +QtObject { + property alias a: 10 +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.3.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.3.errors.txt new file mode 100644 index 00000000..fbf1b580 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.3.errors.txt @@ -0,0 +1 @@ +5:23:Invalid alias reference. An alias reference must be specified as , . or .. diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.3.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.3.qml new file mode 100644 index 00000000..a3633737 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.3.qml @@ -0,0 +1,6 @@ +import Test 1.0 + +MyTypeObject { + id: root + property alias a: root.rectProperty.x.y +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.4.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.4.errors.txt new file mode 100644 index 00000000..fbf1b580 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.4.errors.txt @@ -0,0 +1 @@ +5:23:Invalid alias reference. An alias reference must be specified as , . or .. diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.4.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.4.qml new file mode 100644 index 00000000..cfdfca05 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.4.qml @@ -0,0 +1,7 @@ +import Test 1.0 + +MyTypeObject { + id: root + property alias a: print("Hello!") +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.5.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.5.errors.txt new file mode 100644 index 00000000..6f78e599 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.5.errors.txt @@ -0,0 +1 @@ +5:23:Invalid alias reference. Unable to find id "otherroot" diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.5.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.5.qml new file mode 100644 index 00000000..0c1d5d7e --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.5.qml @@ -0,0 +1,7 @@ +import Test 1.0 + +MyTypeObject { + id: root + property alias a: otherroot +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.6.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.6.errors.txt new file mode 100644 index 00000000..93652a70 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.6.errors.txt @@ -0,0 +1 @@ +5:23:Invalid alias location diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.6.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.6.qml new file mode 100644 index 00000000..edfdb24b --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.6.qml @@ -0,0 +1,7 @@ +import Test 1.0 + +MyTypeObject { + id: root + property alias a: root.foobar +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.7.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.7.errors.txt new file mode 100644 index 00000000..93652a70 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.7.errors.txt @@ -0,0 +1 @@ +5:23:Invalid alias location diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.7.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.7.qml new file mode 100644 index 00000000..2a09648d --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.7.qml @@ -0,0 +1,6 @@ +import Test 1.0 + +MyTypeObject { + id: root + property alias a: root.nonScriptable +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.8.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.8.errors.txt new file mode 100644 index 00000000..93652a70 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.8.errors.txt @@ -0,0 +1 @@ +5:23:Invalid alias location diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.8.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.8.qml new file mode 100644 index 00000000..4faa52d2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.8.qml @@ -0,0 +1,7 @@ +import Test 1.0 + +MyTypeObject { + id: root + property alias a: root.imaginary.x +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.9.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.9.errors.txt new file mode 100644 index 00000000..93652a70 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.9.errors.txt @@ -0,0 +1 @@ +5:23:Invalid alias location diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.9.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.9.qml new file mode 100644 index 00000000..f1839127 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAlias.9.qml @@ -0,0 +1,6 @@ +import Test 1.0 + +MyTypeObject { + id: root + property alias a: root.floatProperty.x +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.1.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.1.errors.txt new file mode 100644 index 00000000..492bbb48 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.1.errors.txt @@ -0,0 +1 @@ +5:17:Cannot assign to non-existent property "foo" diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.1.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.1.qml new file mode 100644 index 00000000..c6dc44c4 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.1.qml @@ -0,0 +1,7 @@ +import Test 1.0 +import QtQuick 1.0 + +QtObject { + MyQmlObject.foo: 10 +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.10.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.10.errors.txt new file mode 100644 index 00000000..ff2409bd --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.10.errors.txt @@ -0,0 +1 @@ +5:15:Non-existent attached object diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.10.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.10.qml new file mode 100644 index 00000000..4942c212 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.10.qml @@ -0,0 +1,6 @@ +import Test 1.0 as Namespace +import QtQuick 1.0 + +QtObject { + Namespace.MadeUpClass.foo: 10 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.11.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.11.errors.txt new file mode 100644 index 00000000..fee50507 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.11.errors.txt @@ -0,0 +1 @@ +5:15:Not an attached property name diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.11.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.11.qml new file mode 100644 index 00000000..e1fc8c15 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.11.qml @@ -0,0 +1,7 @@ +import Test 1.0 as Namespace +import QtQuick 1.0 + +QtObject { + Namespace.madeUpClass.foo: 10 +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.12.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.12.errors.txt new file mode 100644 index 00000000..189a7958 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.12.errors.txt @@ -0,0 +1 @@ +4:13:Attached properties cannot be used here diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.12.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.12.qml new file mode 100644 index 00000000..7de503e7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.12.qml @@ -0,0 +1,6 @@ +import Test 1.0 + +MyTypeObject { + grouped.MyQmlObject.value: 10 +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.13.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.13.errors.txt new file mode 100644 index 00000000..46d7be2a --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.13.errors.txt @@ -0,0 +1 @@ +5:9:Attached properties cannot be used here diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.13.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.13.qml new file mode 100644 index 00000000..986ab855 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.13.qml @@ -0,0 +1,8 @@ +import Test 1.0 + +MyTypeObject { + grouped { + MyQmlObject.value: 10 + } +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.2.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.2.errors.txt new file mode 100644 index 00000000..34de769e --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.2.errors.txt @@ -0,0 +1 @@ +5:27:Cannot assign to non-existent property "foo" diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.2.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.2.qml new file mode 100644 index 00000000..69381221 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.2.qml @@ -0,0 +1,6 @@ +import Test 1.0 as Namespace +import QtQuick 1.0 + +QtObject { + Namespace.MyQmlObject.foo: 10 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.3.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.3.errors.txt new file mode 100644 index 00000000..05161c4d --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.3.errors.txt @@ -0,0 +1 @@ +5:5:Invalid attached object assignment diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.3.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.3.qml new file mode 100644 index 00000000..842600f0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.3.qml @@ -0,0 +1,8 @@ +import Test 1.0 +import QtQuick 1.0 + +QtObject { + MyQmlObject: 10 +} + + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.4.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.4.errors.txt new file mode 100644 index 00000000..a208bcfa --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.4.errors.txt @@ -0,0 +1 @@ +5:15:Invalid attached object assignment diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.4.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.4.qml new file mode 100644 index 00000000..6f372a63 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.4.qml @@ -0,0 +1,7 @@ +import Test 1.0 as Namespace +import QtQuick 1.0 + +QtObject { + Namespace.MyQmlObject: 10 +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.5.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.5.errors.txt new file mode 100644 index 00000000..05161c4d --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.5.errors.txt @@ -0,0 +1 @@ +5:5:Invalid attached object assignment diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.5.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.5.qml new file mode 100644 index 00000000..07eb6f34 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.5.qml @@ -0,0 +1,7 @@ +import Test 1.0 +import QtQuick 1.0 + +QtObject { + MyQmlObject: QtObject {} +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.6.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.6.errors.txt new file mode 100644 index 00000000..6770e1f3 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.6.errors.txt @@ -0,0 +1 @@ +5:5:Non-existent attached object diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.6.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.6.qml new file mode 100644 index 00000000..b7256741 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.6.qml @@ -0,0 +1,7 @@ +import Test 1.0 +import QtQuick 1.0 + +QtObject { + Test.MyQmlObject: QtObject {} +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.7.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.7.errors.txt new file mode 100644 index 00000000..6770e1f3 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.7.errors.txt @@ -0,0 +1 @@ +5:5:Non-existent attached object diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.7.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.7.qml new file mode 100644 index 00000000..50004edf --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.7.qml @@ -0,0 +1,6 @@ +import Test 1.0 +import QtQuick 1.0 + +QtObject { + MyTypeObject.foo: 10 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.8.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.8.errors.txt new file mode 100644 index 00000000..ff2409bd --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.8.errors.txt @@ -0,0 +1 @@ +5:15:Non-existent attached object diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.8.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.8.qml new file mode 100644 index 00000000..7cdf5cde --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.8.qml @@ -0,0 +1,6 @@ +import Test 1.0 as Namespace +import QtQuick 1.0 + +QtObject { + Namespace.MyTypeObject.foo: 10 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.9.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.9.errors.txt new file mode 100644 index 00000000..6770e1f3 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.9.errors.txt @@ -0,0 +1 @@ +5:5:Non-existent attached object diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.9.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.9.qml new file mode 100644 index 00000000..503e9fa7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidAttachedProperty.9.qml @@ -0,0 +1,7 @@ +import Test 1.0 +import QtQuick 1.0 + +QtObject { + MadeUpClass.foo: 10 +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.1.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.1.errors.txt new file mode 100644 index 00000000..810fd31b --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.1.errors.txt @@ -0,0 +1 @@ +5:5:Invalid grouped property access diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.1.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.1.qml new file mode 100644 index 00000000..94afb16c --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.1.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +QtObject { + property variant o; + o.blah: 10 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.10.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.10.errors.txt new file mode 100644 index 00000000..1fcb1b65 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.10.errors.txt @@ -0,0 +1 @@ +4:14:Cannot assign a value directly to a grouped property diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.10.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.10.qml new file mode 100644 index 00000000..41aa3e29 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.10.qml @@ -0,0 +1,7 @@ +import Test 1.0 + +MyTypeObject { + grouped: "10x10" + grouped.value: 10 +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.2.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.2.errors.txt new file mode 100644 index 00000000..810fd31b --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.2.errors.txt @@ -0,0 +1 @@ +5:5:Invalid grouped property access diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.2.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.2.qml new file mode 100644 index 00000000..d4fbf423 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.2.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +QtObject { + property int o; + o.blah: 10 +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.3.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.3.errors.txt new file mode 100644 index 00000000..f6d6f29f --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.3.errors.txt @@ -0,0 +1 @@ +4:5:Invalid grouped property access diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.3.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.3.qml new file mode 100644 index 00000000..0bbfc4f5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.3.qml @@ -0,0 +1,5 @@ +import Test 1.0 + +MyQmlObject { + customType.x: 10 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.4.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.4.errors.txt new file mode 100644 index 00000000..69c68716 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.4.errors.txt @@ -0,0 +1 @@ +4:5:Cannot assign to non-existent property "foo" diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.4.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.4.qml new file mode 100644 index 00000000..134fef9b --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.4.qml @@ -0,0 +1,5 @@ +import Test 1.0 + +MyQmlObject { + foo.x: 10 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.5.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.5.errors.txt new file mode 100644 index 00000000..2c8a970d --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.5.errors.txt @@ -0,0 +1 @@ +4:18:Property assignment expected diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.5.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.5.qml new file mode 100644 index 00000000..55cefe66 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.5.qml @@ -0,0 +1,5 @@ +import Test 1.0 + +MyTypeObject { + rectProperty.x.foo: 100 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.6.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.6.errors.txt new file mode 100644 index 00000000..e1f7ec5b --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.6.errors.txt @@ -0,0 +1 @@ +5:5:Property value set multiple times diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.6.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.6.qml new file mode 100644 index 00000000..9ec33abe --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.6.qml @@ -0,0 +1,6 @@ +import Test 1.0 + +MyTypeObject { + rectProperty.x: 100 + rectProperty.x: 101 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.7.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.7.errors.txt new file mode 100644 index 00000000..4a7e3830 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.7.errors.txt @@ -0,0 +1 @@ +4:-1:Cannot set properties on nullGrouped as it is null diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.7.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.7.qml new file mode 100644 index 00000000..977539a3 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.7.qml @@ -0,0 +1,5 @@ +import Test 1.0 + +MyTypeObject { + nullGrouped.script: console.log(1921) +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.8.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.8.errors.txt new file mode 100644 index 00000000..fa0da21c --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.8.errors.txt @@ -0,0 +1 @@ +5:19:Property has already been assigned a value diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.8.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.8.qml new file mode 100644 index 00000000..56fca9b9 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.8.qml @@ -0,0 +1,6 @@ +import Test 1.0 + +MyTypeObject { + pointProperty: "10x10" + pointProperty.x: 10 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.9.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.9.errors.txt new file mode 100644 index 00000000..6d837a72 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.9.errors.txt @@ -0,0 +1 @@ +5:20:Property has already been assigned a value diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.9.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.9.qml new file mode 100644 index 00000000..982ab260 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidGroupedProperty.9.qml @@ -0,0 +1,6 @@ +import Test 1.0 + +MyTypeObject { + pointProperty.x: 10 + pointProperty: "10x10" +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidID.2.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.2.errors.txt new file mode 100644 index 00000000..2c6b8bf0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.2.errors.txt @@ -0,0 +1,2 @@ +3:9:Invalid empty ID + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidID.2.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.2.qml new file mode 100644 index 00000000..4fb3b298 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.2.qml @@ -0,0 +1,5 @@ +import Test 1.0 +MyQmlObject { + id: "" +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidID.3.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.3.errors.txt new file mode 100644 index 00000000..bb811cfe --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.3.errors.txt @@ -0,0 +1 @@ +3:5:Invalid use of id property diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidID.3.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.3.qml new file mode 100644 index 00000000..66841728 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.3.qml @@ -0,0 +1,5 @@ +import Test 1.0 +MyQmlObject { + id.other: 10 +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidID.4.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.4.errors.txt new file mode 100644 index 00000000..c721fe91 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.4.errors.txt @@ -0,0 +1 @@ +4:5:Property value set multiple times diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidID.4.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.4.qml new file mode 100644 index 00000000..86010bf7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.4.qml @@ -0,0 +1,6 @@ +import Test 1.0 +MyQmlObject { + id: hello + id: world +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidID.5.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.5.errors.txt new file mode 100644 index 00000000..c167de38 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.5.errors.txt @@ -0,0 +1 @@ +2:20:Invalid import qualifier ID diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidID.5.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.5.qml new file mode 100644 index 00000000..5b92a1a0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.5.qml @@ -0,0 +1,6 @@ +import Test 1.0 +import Test 1.0 as hello +MyQmlObject { + id: hello +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidID.6.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.6.errors.txt new file mode 100644 index 00000000..7251de11 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.6.errors.txt @@ -0,0 +1 @@ +3:9:IDs cannot start with an uppercase letter diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidID.6.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.6.qml new file mode 100644 index 00000000..62187d94 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.6.qml @@ -0,0 +1,5 @@ +import Test 1.0 +MyQmlObject { + id: StartsWithUpperCase +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidID.7.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.7.errors.txt new file mode 100644 index 00000000..e4fd1db3 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.7.errors.txt @@ -0,0 +1 @@ +3:9:ID illegally masks global JavaScript property diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidID.7.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.7.qml new file mode 100644 index 00000000..d4bc5396 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.7.qml @@ -0,0 +1,5 @@ +import Test 1.0 +MyQmlObject { + id: gc +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidID.8.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.8.errors.txt new file mode 100644 index 00000000..b03ec6cc --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.8.errors.txt @@ -0,0 +1 @@ +3:9:IDs must contain only letters, numbers, and underscores diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidID.8.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.8.qml new file mode 100644 index 00000000..1ea615c3 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.8.qml @@ -0,0 +1,5 @@ +import Test 1.0 +MyQmlObject { + id: hello.world +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidID.9.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.9.errors.txt new file mode 100644 index 00000000..c010e794 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.9.errors.txt @@ -0,0 +1 @@ +3:9:IDs must start with a letter or underscore diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidID.9.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.9.qml new file mode 100644 index 00000000..57474b72 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.9.qml @@ -0,0 +1,5 @@ +import Test 1.0 +MyQmlObject { + id: "3hello" +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidID.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.errors.txt new file mode 100644 index 00000000..c010e794 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.errors.txt @@ -0,0 +1 @@ +3:9:IDs must start with a letter or underscore diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidID.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.qml new file mode 100644 index 00000000..04db3eb6 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidID.qml @@ -0,0 +1,4 @@ +import Test 1.0 +MyQmlObject { + id: 1 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidImportID.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidImportID.errors.txt new file mode 100644 index 00000000..034e9373 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidImportID.errors.txt @@ -0,0 +1 @@ +2:23:Invalid import qualifier ID diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidImportID.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidImportID.qml new file mode 100644 index 00000000..580a0f39 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidImportID.qml @@ -0,0 +1,4 @@ +import QtQuick 1.0 +import QtQuick 1.0 as qt + +QtObject {} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidOn.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidOn.errors.txt new file mode 100644 index 00000000..b4210a11 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidOn.errors.txt @@ -0,0 +1 @@ +3:5:"MyQmlObject" cannot operate on "value" diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidOn.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidOn.qml new file mode 100644 index 00000000..d748bf47 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidOn.qml @@ -0,0 +1,4 @@ +import Test 1.0 +MyQmlObject { + MyQmlObject on value {} +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidProperty.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidProperty.errors.txt new file mode 100644 index 00000000..c83e5ae1 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidProperty.errors.txt @@ -0,0 +1 @@ +4:5:Illegal property name diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidProperty.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidProperty.qml new file mode 100644 index 00000000..bd26bc59 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidProperty.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +QtObject { + property int parseInt +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidRoot.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/invalidRoot.errors.txt new file mode 100644 index 00000000..4bcc948e --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidRoot.errors.txt @@ -0,0 +1 @@ +1:1:Expected type name diff --git a/tests/auto/declarative/qdeclarativelanguage/data/invalidRoot.qml b/tests/auto/declarative/qdeclarativelanguage/data/invalidRoot.qml new file mode 100644 index 00000000..427827ca --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/invalidRoot.qml @@ -0,0 +1,2 @@ +foo { +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/lib/com/nokia/installedtest/InstalledTest.qml b/tests/auto/declarative/qdeclarativelanguage/data/lib/com/nokia/installedtest/InstalledTest.qml new file mode 100644 index 00000000..9985d332 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/lib/com/nokia/installedtest/InstalledTest.qml @@ -0,0 +1,2 @@ +import QtQuick 1.0 as Qt47 +Qt47.Rectangle {} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/lib/com/nokia/installedtest/InstalledTest2.qml b/tests/auto/declarative/qdeclarativelanguage/data/lib/com/nokia/installedtest/InstalledTest2.qml new file mode 100644 index 00000000..f63283e7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/lib/com/nokia/installedtest/InstalledTest2.qml @@ -0,0 +1,2 @@ +import QtQuick 1.0 +Text {} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/lib/com/nokia/installedtest/LocalLast.qml b/tests/auto/declarative/qdeclarativelanguage/data/lib/com/nokia/installedtest/LocalLast.qml new file mode 100644 index 00000000..7f491eb8 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/lib/com/nokia/installedtest/LocalLast.qml @@ -0,0 +1,2 @@ +import QtQuick 1.0 +Rectangle {} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/lib/com/nokia/installedtest/PrivateType.qml b/tests/auto/declarative/qdeclarativelanguage/data/lib/com/nokia/installedtest/PrivateType.qml new file mode 100644 index 00000000..03bf25bc --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/lib/com/nokia/installedtest/PrivateType.qml @@ -0,0 +1,2 @@ +import QtQuick 1.0 +Image {} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/lib/com/nokia/installedtest/qmldir b/tests/auto/declarative/qdeclarativelanguage/data/lib/com/nokia/installedtest/qmldir new file mode 100644 index 00000000..d15720a1 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/lib/com/nokia/installedtest/qmldir @@ -0,0 +1,4 @@ +Rectangle 1.5 InstalledTest2.qml +LocalLast 1.0 LocalLast.qml +InstalledTest 1.4 InstalledTest2.qml +InstalledTest 1.0 InstalledTest.qml diff --git a/tests/auto/declarative/qdeclarativelanguage/data/lib/com/nokia/installedtest0/InstalledTest.qml b/tests/auto/declarative/qdeclarativelanguage/data/lib/com/nokia/installedtest0/InstalledTest.qml new file mode 100644 index 00000000..9985d332 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/lib/com/nokia/installedtest0/InstalledTest.qml @@ -0,0 +1,2 @@ +import QtQuick 1.0 as Qt47 +Qt47.Rectangle {} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/lib/com/nokia/installedtest0/InstalledTest2.qml b/tests/auto/declarative/qdeclarativelanguage/data/lib/com/nokia/installedtest0/InstalledTest2.qml new file mode 100644 index 00000000..f63283e7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/lib/com/nokia/installedtest0/InstalledTest2.qml @@ -0,0 +1,2 @@ +import QtQuick 1.0 +Text {} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/lib/com/nokia/installedtest0/qmldir b/tests/auto/declarative/qdeclarativelanguage/data/lib/com/nokia/installedtest0/qmldir new file mode 100644 index 00000000..b3012260 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/lib/com/nokia/installedtest0/qmldir @@ -0,0 +1,2 @@ +InstalledTest 1.4 InstalledTest2.qml +InstalledTestTP 0.0 InstalledTest.qml diff --git a/tests/auto/declarative/qdeclarativelanguage/data/listAssignment.1.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/listAssignment.1.errors.txt new file mode 100644 index 00000000..35d2d351 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/listAssignment.1.errors.txt @@ -0,0 +1 @@ +4:24:Cannot assign object to list diff --git a/tests/auto/declarative/qdeclarativelanguage/data/listAssignment.1.qml b/tests/auto/declarative/qdeclarativelanguage/data/listAssignment.1.qml new file mode 100644 index 00000000..c02dd33b --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/listAssignment.1.qml @@ -0,0 +1,6 @@ +import Test 1.0 +import QtQuick 1.0 +MyContainer { + containerChildren: QtObject {} +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/listAssignment.2.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/listAssignment.2.errors.txt new file mode 100644 index 00000000..8b40aa3e --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/listAssignment.2.errors.txt @@ -0,0 +1,2 @@ +3:15:Cannot assign primitives to lists + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/listAssignment.2.qml b/tests/auto/declarative/qdeclarativelanguage/data/listAssignment.2.qml new file mode 100644 index 00000000..e3baadb4 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/listAssignment.2.qml @@ -0,0 +1,4 @@ +import Test 1.0 +MyContainer { + children: 2 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/listAssignment.3.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/listAssignment.3.errors.txt new file mode 100644 index 00000000..c721fe91 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/listAssignment.3.errors.txt @@ -0,0 +1 @@ +4:5:Property value set multiple times diff --git a/tests/auto/declarative/qdeclarativelanguage/data/listAssignment.3.qml b/tests/auto/declarative/qdeclarativelanguage/data/listAssignment.3.qml new file mode 100644 index 00000000..00c4c6b5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/listAssignment.3.qml @@ -0,0 +1,6 @@ +import Test 1.0 +MyContainer { + children: childBinding.expression + children: childBinding2.expression +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/listItemDeleteSelf.qml b/tests/auto/declarative/qdeclarativelanguage/data/listItemDeleteSelf.qml new file mode 100644 index 00000000..85abbdc5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/listItemDeleteSelf.qml @@ -0,0 +1,38 @@ +import QtQuick 1.0 + +Item { + ListModel { + id: fruitModel + ListElement { + name: "Apple" + cost: 2.45 + } + ListElement { + name: "Orange" + cost: 3.25 + } + ListElement { + name: "Banana" + cost: 1.95 + } + } + + Component { + id: fruitDelegate + Item { + width: 200; height: 50 + Text { text: name } + Text { text: '$'+cost; anchors.right: parent.right } + MouseArea { + anchors.fill: parent + onClicked: fruitModel.remove(index) + } + } + } + + ListView { + model: fruitModel + delegate: fruitDelegate + anchors.fill: parent + } +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/listProperties.qml b/tests/auto/declarative/qdeclarativelanguage/data/listProperties.qml new file mode 100644 index 00000000..1f60951d --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/listProperties.qml @@ -0,0 +1,9 @@ +import QtQuick 1.0 + +QtObject { + property list listProperty + property int test: listProperty.length + + listProperty: [ QtObject{}, QtObject {} ] +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.1.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.1.errors.txt new file mode 100644 index 00000000..29342dc4 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.1.errors.txt @@ -0,0 +1 @@ +8:5:"MyRevisionedClass.prop2" is not available in Test 1.0. diff --git a/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.1.qml b/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.1.qml new file mode 100644 index 00000000..4b37ed35 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.1.qml @@ -0,0 +1,9 @@ +// Check that a property in a later revision (prop2) cannot be assigned +import QtQuick 1.0 +import Test 1.0 + +MyRevisionedClass +{ + prop1: 1 + prop2: 2 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.2.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.2.errors.txt new file mode 100644 index 00000000..57b5764b --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.2.errors.txt @@ -0,0 +1 @@ +6:5:"MyRevisionedClass.onSignal2" is not available in Test 1.0. diff --git a/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.2.qml b/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.2.qml new file mode 100644 index 00000000..8da7a255 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.2.qml @@ -0,0 +1,7 @@ +import Test 1.0 + +MyRevisionedClass +{ + onSignal1: prop1 = 2 + onSignal2: prop1 = 3 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.3.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.3.errors.txt new file mode 100644 index 00000000..45364a04 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.3.errors.txt @@ -0,0 +1 @@ +9:5:"MyRevisionedClass.propD" is not available in Test 1.1. diff --git a/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.3.qml b/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.3.qml new file mode 100644 index 00000000..195be211 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/metaobjectRevision.3.qml @@ -0,0 +1,10 @@ +import Test 1.1 + +MyRevisionedClass +{ + propA: 10 + propB: 10 + propC: 10 + // propD is in rev 1 of MyRevisionedClassUnregistered, but not registered in 1.1 + propD: 10 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/method.1.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/method.1.errors.txt new file mode 100644 index 00000000..b10984f0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/method.1.errors.txt @@ -0,0 +1 @@ +3:1:Method names cannot begin with an upper case letter diff --git a/tests/auto/declarative/qdeclarativelanguage/data/method.1.qml b/tests/auto/declarative/qdeclarativelanguage/data/method.1.qml new file mode 100644 index 00000000..a3f97f8d --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/method.1.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +QtObject { + function MyMethod() {} +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/missingObject.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/missingObject.errors.txt new file mode 100644 index 00000000..b31b562d --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/missingObject.errors.txt @@ -0,0 +1 @@ +1:10:Expected token `{' diff --git a/tests/auto/declarative/qdeclarativelanguage/data/missingObject.qml b/tests/auto/declarative/qdeclarativelanguage/data/missingObject.qml new file mode 100644 index 00000000..2f170458 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/missingObject.qml @@ -0,0 +1 @@ +something: 24 diff --git a/tests/auto/declarative/qdeclarativelanguage/data/missingSignal.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/missingSignal.errors.txt new file mode 100644 index 00000000..f5622462 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/missingSignal.errors.txt @@ -0,0 +1 @@ +4:5:Cannot assign to non-existent property "onClicked" diff --git a/tests/auto/declarative/qdeclarativelanguage/data/missingSignal.qml b/tests/auto/declarative/qdeclarativelanguage/data/missingSignal.qml new file mode 100644 index 00000000..e0e84423 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/missingSignal.qml @@ -0,0 +1,5 @@ +import Test 1.0 +import QtQuick 1.0 +QtObject { + onClicked: console.log("Hello world!") +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/missingValueTypeProperty.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/missingValueTypeProperty.errors.txt new file mode 100644 index 00000000..caf7e55b --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/missingValueTypeProperty.errors.txt @@ -0,0 +1 @@ +4:18:Cannot assign to non-existent property "foo" diff --git a/tests/auto/declarative/qdeclarativelanguage/data/missingValueTypeProperty.qml b/tests/auto/declarative/qdeclarativelanguage/data/missingValueTypeProperty.qml new file mode 100644 index 00000000..9a0fa6a2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/missingValueTypeProperty.qml @@ -0,0 +1,5 @@ +import Test 1.0 + +MyTypeObject { + rectProperty.foo: 9 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/multiSet.1.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.1.errors.txt new file mode 100644 index 00000000..e1f7ec5b --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.1.errors.txt @@ -0,0 +1 @@ +5:5:Property value set multiple times diff --git a/tests/auto/declarative/qdeclarativelanguage/data/multiSet.1.qml b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.1.qml new file mode 100644 index 00000000..649c49ee --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.1.qml @@ -0,0 +1,7 @@ +import Test 1.0 + +MyTypeObject { + intProperty: 10 + intProperty: 11 +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/multiSet.10.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.10.errors.txt new file mode 100644 index 00000000..e1f7ec5b --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.10.errors.txt @@ -0,0 +1 @@ +5:5:Property value set multiple times diff --git a/tests/auto/declarative/qdeclarativelanguage/data/multiSet.10.qml b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.10.qml new file mode 100644 index 00000000..bc21db98 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.10.qml @@ -0,0 +1,6 @@ +import Test 1.0 + +MyTypeObject { + property int a: 10 + a: 11 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/multiSet.11.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.11.errors.txt new file mode 100644 index 00000000..e1f7ec5b --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.11.errors.txt @@ -0,0 +1 @@ +5:5:Property value set multiple times diff --git a/tests/auto/declarative/qdeclarativelanguage/data/multiSet.11.qml b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.11.qml new file mode 100644 index 00000000..7d031390 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.11.qml @@ -0,0 +1,6 @@ +import Test 1.0 + +MyTypeObject { + rectProperty.x: 10 + rectProperty.x: 11 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/multiSet.2.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.2.errors.txt new file mode 100644 index 00000000..e1f7ec5b --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.2.errors.txt @@ -0,0 +1 @@ +5:5:Property value set multiple times diff --git a/tests/auto/declarative/qdeclarativelanguage/data/multiSet.2.qml b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.2.qml new file mode 100644 index 00000000..abcd2167 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.2.qml @@ -0,0 +1,7 @@ +import Test 1.0 + +MyTypeObject { + intProperty: 10 + intProperty: a + 10 +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/multiSet.3.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.3.errors.txt new file mode 100644 index 00000000..e1f7ec5b --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.3.errors.txt @@ -0,0 +1 @@ +5:5:Property value set multiple times diff --git a/tests/auto/declarative/qdeclarativelanguage/data/multiSet.3.qml b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.3.qml new file mode 100644 index 00000000..77eaba0b --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.3.qml @@ -0,0 +1,7 @@ +import Test 1.0 + +MyTypeObject { + intProperty: a + 10 + intProperty: 10 +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/multiSet.4.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.4.errors.txt new file mode 100644 index 00000000..e1f7ec5b --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.4.errors.txt @@ -0,0 +1 @@ +5:5:Property value set multiple times diff --git a/tests/auto/declarative/qdeclarativelanguage/data/multiSet.4.qml b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.4.qml new file mode 100644 index 00000000..c16d04fe --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.4.qml @@ -0,0 +1,7 @@ +import Test 1.0 + +MyTypeObject { + intProperty: 10 + intProperty: MyTypeObject {} +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/multiSet.5.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.5.errors.txt new file mode 100644 index 00000000..e1f7ec5b --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.5.errors.txt @@ -0,0 +1 @@ +5:5:Property value set multiple times diff --git a/tests/auto/declarative/qdeclarativelanguage/data/multiSet.5.qml b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.5.qml new file mode 100644 index 00000000..2980c5b2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.5.qml @@ -0,0 +1,6 @@ +import Test 1.0 + +MyContainer { + children: MyContainer {} + children: MyContainer {} +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/multiSet.6.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.6.errors.txt new file mode 100644 index 00000000..e1f7ec5b --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.6.errors.txt @@ -0,0 +1 @@ +5:5:Property value set multiple times diff --git a/tests/auto/declarative/qdeclarativelanguage/data/multiSet.6.qml b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.6.qml new file mode 100644 index 00000000..492c720e --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.6.qml @@ -0,0 +1,7 @@ +import Test 1.0 + +MyContainer { + children: MyContainer {} + children: [ MyContainer {}, MyContainer {} ] +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/multiSet.7.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.7.errors.txt new file mode 100644 index 00000000..e1f7ec5b --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.7.errors.txt @@ -0,0 +1 @@ +5:5:Property value set multiple times diff --git a/tests/auto/declarative/qdeclarativelanguage/data/multiSet.7.qml b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.7.qml new file mode 100644 index 00000000..2a9c1d0d --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.7.qml @@ -0,0 +1,7 @@ +import Test 1.0 + +MyContainer { + children: [ MyContainer {}, MyContainer {} ] + children: MyContainer {} +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/multiSet.8.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.8.errors.txt new file mode 100644 index 00000000..450fc163 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.8.errors.txt @@ -0,0 +1 @@ +6:9:Property value set multiple times diff --git a/tests/auto/declarative/qdeclarativelanguage/data/multiSet.8.qml b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.8.qml new file mode 100644 index 00000000..052437ea --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.8.qml @@ -0,0 +1,8 @@ +import Test 1.0 + +MyTypeObject { + grouped { + value: 10 + value: 11 + } +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/multiSet.9.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.9.errors.txt new file mode 100644 index 00000000..e1f7ec5b --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.9.errors.txt @@ -0,0 +1 @@ +5:5:Property value set multiple times diff --git a/tests/auto/declarative/qdeclarativelanguage/data/multiSet.9.qml b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.9.qml new file mode 100644 index 00000000..e2e954f7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/multiSet.9.qml @@ -0,0 +1,6 @@ +import Test 1.0 + +MyTypeObject { + grouped.value: 10 + grouped.value: 11 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/nestedComponentRoots.qml b/tests/auto/declarative/qdeclarativelanguage/data/nestedComponentRoots.qml new file mode 100644 index 00000000..361bcbcb --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/nestedComponentRoots.qml @@ -0,0 +1,4 @@ +import QtQuick 1.0 + +NestedComponentRoot { +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/nestedErrors.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/nestedErrors.errors.txt new file mode 100644 index 00000000..53e752b6 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/nestedErrors.errors.txt @@ -0,0 +1,2 @@ +4:5:Type NestedErrorsType unavailable +4:8:Invalid property assignment: number expected diff --git a/tests/auto/declarative/qdeclarativelanguage/data/nestedErrors.qml b/tests/auto/declarative/qdeclarativelanguage/data/nestedErrors.qml new file mode 100644 index 00000000..bbd05a1f --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/nestedErrors.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +Item { + NestedErrorsType {} +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/noCreation.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/noCreation.errors.txt new file mode 100644 index 00000000..23cd3f35 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/noCreation.errors.txt @@ -0,0 +1 @@ +3:1:Keys is only available via attached properties diff --git a/tests/auto/declarative/qdeclarativelanguage/data/noCreation.qml b/tests/auto/declarative/qdeclarativelanguage/data/noCreation.qml new file mode 100644 index 00000000..548b7b86 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/noCreation.qml @@ -0,0 +1,4 @@ +import QtQuick 1.0 + +Keys { +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/nonScriptableProperty.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/nonScriptableProperty.errors.txt new file mode 100644 index 00000000..cdfa4b2e --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/nonScriptableProperty.errors.txt @@ -0,0 +1 @@ +4:5:Cannot assign to non-existent property "nonScriptable" diff --git a/tests/auto/declarative/qdeclarativelanguage/data/nonScriptableProperty.qml b/tests/auto/declarative/qdeclarativelanguage/data/nonScriptableProperty.qml new file mode 100644 index 00000000..bd59bc80 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/nonScriptableProperty.qml @@ -0,0 +1,5 @@ +import Test 1.0 + +MyQmlObject { + nonScriptable: 11 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.1.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.1.errors.txt new file mode 100644 index 00000000..6bfce9a2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.1.errors.txt @@ -0,0 +1 @@ +2:15:Cannot assign to non-existent property "something" diff --git a/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.1.qml b/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.1.qml new file mode 100644 index 00000000..df7406ce --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.1.qml @@ -0,0 +1,2 @@ +import Test 1.0 +MyQmlObject { something: 24 } diff --git a/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.2.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.2.errors.txt new file mode 100644 index 00000000..4b30056d --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.2.errors.txt @@ -0,0 +1 @@ +3:5:Cannot assign to non-existent property "something" diff --git a/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.2.qml b/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.2.qml new file mode 100644 index 00000000..06ccd379 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.2.qml @@ -0,0 +1,4 @@ +import Test 1.0 +MyQmlObject { + something: 24 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.3.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.3.errors.txt new file mode 100644 index 00000000..4b30056d --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.3.errors.txt @@ -0,0 +1 @@ +3:5:Cannot assign to non-existent property "something" diff --git a/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.3.qml b/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.3.qml new file mode 100644 index 00000000..5b086088 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.3.qml @@ -0,0 +1,4 @@ +import Test 1.0 +MyQmlObject { + something: 1 + 1 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.4.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.4.errors.txt new file mode 100644 index 00000000..4b30056d --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.4.errors.txt @@ -0,0 +1 @@ +3:5:Cannot assign to non-existent property "something" diff --git a/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.4.qml b/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.4.qml new file mode 100644 index 00000000..65791919 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.4.qml @@ -0,0 +1,4 @@ +import Test 1.0 +MyQmlObject { + something: ; +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.5.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.5.errors.txt new file mode 100644 index 00000000..c07f2b99 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.5.errors.txt @@ -0,0 +1 @@ +3:5:Expected a qualified name id diff --git a/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.5.qml b/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.5.qml new file mode 100644 index 00000000..37af0573 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.5.qml @@ -0,0 +1,4 @@ +import Test 1.0 +MyQmlObject { + 24 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.6.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.6.errors.txt new file mode 100644 index 00000000..89925b74 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.6.errors.txt @@ -0,0 +1 @@ +3:5:Cannot assign to non-existent default property diff --git a/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.6.qml b/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.6.qml new file mode 100644 index 00000000..5cd55d08 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/nonexistantProperty.6.qml @@ -0,0 +1,4 @@ +import Test 1.0 +MyQmlObject { + MyQmlObject {} +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/notAvailable.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/notAvailable.errors.txt new file mode 100644 index 00000000..af95a53c --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/notAvailable.errors.txt @@ -0,0 +1 @@ +3:1:UnavailableType is unavailable for testing diff --git a/tests/auto/declarative/qdeclarativelanguage/data/notAvailable.qml b/tests/auto/declarative/qdeclarativelanguage/data/notAvailable.qml new file mode 100644 index 00000000..7c3c7ee0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/notAvailable.qml @@ -0,0 +1,4 @@ +import Test 1.0 + +UnavailableType { +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/nullDotProperty.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/nullDotProperty.errors.txt new file mode 100644 index 00000000..07a40949 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/nullDotProperty.errors.txt @@ -0,0 +1 @@ +3:-1:Cannot set properties on obj as it is null diff --git a/tests/auto/declarative/qdeclarativelanguage/data/nullDotProperty.qml b/tests/auto/declarative/qdeclarativelanguage/data/nullDotProperty.qml new file mode 100644 index 00000000..4e36779b --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/nullDotProperty.qml @@ -0,0 +1,4 @@ +import Test 1.0 +MyDotPropertyObject { + obj.value: 1 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/objectValueTypeProperty.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/objectValueTypeProperty.errors.txt new file mode 100644 index 00000000..db7d9c0f --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/objectValueTypeProperty.errors.txt @@ -0,0 +1 @@ +4:18:Unexpected object assignment diff --git a/tests/auto/declarative/qdeclarativelanguage/data/objectValueTypeProperty.qml b/tests/auto/declarative/qdeclarativelanguage/data/objectValueTypeProperty.qml new file mode 100644 index 00000000..99247735 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/objectValueTypeProperty.qml @@ -0,0 +1,6 @@ +import Test 1.0 + +MyTypeObject { + rectProperty.x: MyTypeObject {} +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/onCompleted.qml b/tests/auto/declarative/qdeclarativelanguage/data/onCompleted.qml new file mode 100644 index 00000000..e75f9044 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/onCompleted.qml @@ -0,0 +1,17 @@ +import Test 1.0 +import QtQuick 1.0 + +MyTypeObject { + // We set a and b to ensure that onCompleted is executed after bindings and + // constants have been assigned + property int a: Math.min(6, 7) + Component.onCompleted: console.log("Completed " + a + " " + nestedObject.b) + + objectProperty: OnCompletedType { + qmlobjectProperty: MyQmlObject { + id: nestedObject + property int b: 10 + Component.onCompleted: console.log("Completed " + a + " " + nestedObject.b) + } + } +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/onDestruction.qml b/tests/auto/declarative/qdeclarativelanguage/data/onDestruction.qml new file mode 100644 index 00000000..77fe2ff3 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/onDestruction.qml @@ -0,0 +1,17 @@ +import Test 1.0 +import QtQuick 1.0 + +MyTypeObject { + // We set a and b to ensure that onCompleted is executed after bindings and + // constants have been assigned + property int a: Math.min(6, 7) + Component.onDestruction: console.log("Destruction " + a + " " + nestedObject.b) + + objectProperty: OnDestructionType { + qmlobjectProperty: MyQmlObject { + id: nestedObject + property int b: 10 + Component.onDestruction: console.log("Destruction " + a + " " + nestedObject.b) + } + } +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/property.1.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/property.1.errors.txt new file mode 100644 index 00000000..3ae6c460 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/property.1.errors.txt @@ -0,0 +1 @@ +4:14:Expected property type diff --git a/tests/auto/declarative/qdeclarativelanguage/data/property.1.qml b/tests/auto/declarative/qdeclarativelanguage/data/property.1.qml new file mode 100644 index 00000000..0b46ceb6 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/property.1.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +QtObject { + property blah a; +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/property.2.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/property.2.errors.txt new file mode 100644 index 00000000..a18e21a0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/property.2.errors.txt @@ -0,0 +1 @@ +4:14:Unexpected property type modifier diff --git a/tests/auto/declarative/qdeclarativelanguage/data/property.2.qml b/tests/auto/declarative/qdeclarativelanguage/data/property.2.qml new file mode 100644 index 00000000..3ff16868 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/property.2.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +QtObject { + property invalidmodifier a; +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/property.3.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/property.3.errors.txt new file mode 100644 index 00000000..5e09a25b --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/property.3.errors.txt @@ -0,0 +1 @@ +4:14:Invalid property type modifier diff --git a/tests/auto/declarative/qdeclarativelanguage/data/property.3.qml b/tests/auto/declarative/qdeclarativelanguage/data/property.3.qml new file mode 100644 index 00000000..b219120a --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/property.3.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +QtObject { + property invalidmodifier a; +} + + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/property.4.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/property.4.errors.txt new file mode 100644 index 00000000..b4471868 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/property.4.errors.txt @@ -0,0 +1 @@ +5:1:Syntax error diff --git a/tests/auto/declarative/qdeclarativelanguage/data/property.4.qml b/tests/auto/declarative/qdeclarativelanguage/data/property.4.qml new file mode 100644 index 00000000..bfadc9d4 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/property.4.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +QtObject { + readonly property int a +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/property.5.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/property.5.errors.txt new file mode 100644 index 00000000..32a8dc11 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/property.5.errors.txt @@ -0,0 +1 @@ +4:5:Readonly not yet supported diff --git a/tests/auto/declarative/qdeclarativelanguage/data/property.5.qml b/tests/auto/declarative/qdeclarativelanguage/data/property.5.qml new file mode 100644 index 00000000..1bb48507 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/property.5.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +QtObject { + readonly property int a: value +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/property.6.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/property.6.errors.txt new file mode 100644 index 00000000..9e8d4544 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/property.6.errors.txt @@ -0,0 +1 @@ +4:5:Property names cannot begin with an upper case letter diff --git a/tests/auto/declarative/qdeclarativelanguage/data/property.6.qml b/tests/auto/declarative/qdeclarativelanguage/data/property.6.qml new file mode 100644 index 00000000..b5b3f423 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/property.6.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +QtObject { + property int Hello +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/property.7.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/property.7.errors.txt new file mode 100644 index 00000000..9e8d4544 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/property.7.errors.txt @@ -0,0 +1 @@ +4:5:Property names cannot begin with an upper case letter diff --git a/tests/auto/declarative/qdeclarativelanguage/data/property.7.qml b/tests/auto/declarative/qdeclarativelanguage/data/property.7.qml new file mode 100644 index 00000000..f9ec68a4 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/property.7.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +QtObject { + property int Hello: 10 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/propertyValueSource.2.qml b/tests/auto/declarative/qdeclarativelanguage/data/propertyValueSource.2.qml new file mode 100644 index 00000000..e48526ab --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/propertyValueSource.2.qml @@ -0,0 +1,5 @@ +import Test 1.0 +MyTypeObject { + MyCompositeValueSource on intProperty {} +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/propertyValueSource.qml b/tests/auto/declarative/qdeclarativelanguage/data/propertyValueSource.qml new file mode 100644 index 00000000..22aa6825 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/propertyValueSource.qml @@ -0,0 +1,4 @@ +import Test 1.0 +MyTypeObject { + MyPropertyValueSource on intProperty {} +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/qmlAttachedPropertiesObjectMethod.1.qml b/tests/auto/declarative/qdeclarativelanguage/data/qmlAttachedPropertiesObjectMethod.1.qml new file mode 100644 index 00000000..dea52c98 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/qmlAttachedPropertiesObjectMethod.1.qml @@ -0,0 +1,5 @@ +import Test 1.0 +import QtQuick 1.0 +QtObject { +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/qmlAttachedPropertiesObjectMethod.2.qml b/tests/auto/declarative/qdeclarativelanguage/data/qmlAttachedPropertiesObjectMethod.2.qml new file mode 100644 index 00000000..18c65c34 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/qmlAttachedPropertiesObjectMethod.2.qml @@ -0,0 +1,6 @@ +import Test 1.0 +import QtQuick 1.0 +QtObject { + MyQmlObject.value: 10 +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/readOnly.1.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/readOnly.1.errors.txt new file mode 100644 index 00000000..b8c34042 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/readOnly.1.errors.txt @@ -0,0 +1 @@ +3:21:Invalid property assignment: "readOnlyString" is a read-only property diff --git a/tests/auto/declarative/qdeclarativelanguage/data/readOnly.1.qml b/tests/auto/declarative/qdeclarativelanguage/data/readOnly.1.qml new file mode 100644 index 00000000..60757bd0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/readOnly.1.qml @@ -0,0 +1,4 @@ +import Test 1.0 +MyQmlObject { + readOnlyString: "Hello World" +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/readOnly.2.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/readOnly.2.errors.txt new file mode 100644 index 00000000..d857a044 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/readOnly.2.errors.txt @@ -0,0 +1 @@ +3:5:Invalid property assignment: "readOnlyString" is a read-only property diff --git a/tests/auto/declarative/qdeclarativelanguage/data/readOnly.2.qml b/tests/auto/declarative/qdeclarativelanguage/data/readOnly.2.qml new file mode 100644 index 00000000..8f1633cc --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/readOnly.2.qml @@ -0,0 +1,4 @@ +import Test 1.0 +MyQmlObject { + readOnlyString: "Hello" + "World" +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/readOnly.3.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/readOnly.3.errors.txt new file mode 100644 index 00000000..c7e9e1bb --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/readOnly.3.errors.txt @@ -0,0 +1 @@ +6:36:Invalid property assignment: "objAlias" is a read-only property diff --git a/tests/auto/declarative/qdeclarativelanguage/data/readOnly.3.qml b/tests/auto/declarative/qdeclarativelanguage/data/readOnly.3.qml new file mode 100644 index 00000000..c70a55c3 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/readOnly.3.qml @@ -0,0 +1,8 @@ +import Test 1.0 +import QtQuick 1.0 + +QtObject { + property variant child + child: HelperAlias { objAlias: QtObject {} } +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/readOnly.4.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/readOnly.4.errors.txt new file mode 100644 index 00000000..d857a044 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/readOnly.4.errors.txt @@ -0,0 +1 @@ +3:5:Invalid property assignment: "readOnlyString" is a read-only property diff --git a/tests/auto/declarative/qdeclarativelanguage/data/readOnly.4.qml b/tests/auto/declarative/qdeclarativelanguage/data/readOnly.4.qml new file mode 100644 index 00000000..5338ac77 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/readOnly.4.qml @@ -0,0 +1,4 @@ +import Test 1.0 +MyQmlObject { + MyPropertyValueSource on readOnlyString {} +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/readOnly.5.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/readOnly.5.errors.txt new file mode 100644 index 00000000..baf47667 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/readOnly.5.errors.txt @@ -0,0 +1 @@ +3:27:Invalid property assignment: "readOnlyEnumProperty" is a read-only property diff --git a/tests/auto/declarative/qdeclarativelanguage/data/readOnly.5.qml b/tests/auto/declarative/qdeclarativelanguage/data/readOnly.5.qml new file mode 100644 index 00000000..422d13d8 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/readOnly.5.qml @@ -0,0 +1,4 @@ +import Test 1.0 +MyTypeObject { + readOnlyEnumProperty: MyTypeObject.EnumValue1 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/revisions11.qml b/tests/auto/declarative/qdeclarativelanguage/data/revisions11.qml new file mode 100644 index 00000000..4d3d7d2a --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/revisions11.qml @@ -0,0 +1,10 @@ +import QtQuick 1.0 +import Test 1.1 + +MyRevisionedClass +{ + prop1: 1 + prop2: 10 + + onSignal2: prop2 = 3 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/revisionsbasesub11.qml b/tests/auto/declarative/qdeclarativelanguage/data/revisionsbasesub11.qml new file mode 100644 index 00000000..57d76b1c --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/revisionsbasesub11.qml @@ -0,0 +1,16 @@ +import QtQuick 1.0 +import Test 1.1 + +MyRevisionedSubclass +{ + propA: 10 + propB: 10 + propC: 10 + // propD is not registered in 1.1 + prop1: 10 + prop2: 10 + prop3: 10 + prop4: 10 + + onSignal4: prop4 = 2 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/revisionssub11.qml b/tests/auto/declarative/qdeclarativelanguage/data/revisionssub11.qml new file mode 100644 index 00000000..f107356e --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/revisionssub11.qml @@ -0,0 +1,12 @@ +import QtQuick 1.0 +import Test 1.1 + +MyRevisionedSubclass +{ + prop1: 10 + prop2: 10 + prop3: 10 + prop4: 10 + + onSignal4: prop4 = 2 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/rootAsQmlComponent.qml b/tests/auto/declarative/qdeclarativelanguage/data/rootAsQmlComponent.qml new file mode 100644 index 00000000..8d72cd38 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/rootAsQmlComponent.qml @@ -0,0 +1,6 @@ +import Test 1.0 +MyContainerComponent { + x: 11 + MyQmlObject {} + MyQmlObject {} +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/scriptString.1.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/scriptString.1.errors.txt new file mode 100644 index 00000000..14463e09 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/scriptString.1.errors.txt @@ -0,0 +1 @@ +4:21:Invalid property assignment: script expected diff --git a/tests/auto/declarative/qdeclarativelanguage/data/scriptString.1.qml b/tests/auto/declarative/qdeclarativelanguage/data/scriptString.1.qml new file mode 100644 index 00000000..f07d2231 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/scriptString.1.qml @@ -0,0 +1,5 @@ +import Test 1.0 + +MyTypeObject { + scriptProperty: MyTypeObject {} +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/scriptString.2.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/scriptString.2.errors.txt new file mode 100644 index 00000000..f8a776f9 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/scriptString.2.errors.txt @@ -0,0 +1 @@ +4:40:Cannot assign multiple values to a script property diff --git a/tests/auto/declarative/qdeclarativelanguage/data/scriptString.2.qml b/tests/auto/declarative/qdeclarativelanguage/data/scriptString.2.qml new file mode 100644 index 00000000..dc825c75 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/scriptString.2.qml @@ -0,0 +1,6 @@ +import Test 1.0 + +MyTypeObject { + scriptProperty: [ MyTypeObject {}, MyTypeObject {} ] +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/scriptString.qml b/tests/auto/declarative/qdeclarativelanguage/data/scriptString.qml new file mode 100644 index 00000000..40a3bbee --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/scriptString.qml @@ -0,0 +1,6 @@ +import Test 1.0 + +MyTypeObject { + scriptProperty: foo + bar + grouped.script: console.log(1921) +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/scriptString2.qml b/tests/auto/declarative/qdeclarativelanguage/data/scriptString2.qml new file mode 100644 index 00000000..c42da2b9 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/scriptString2.qml @@ -0,0 +1,5 @@ +import Test 1.0 + +MyTypeObject { + scriptProperty: "hello\n\"world\"" +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/scriptString3.qml b/tests/auto/declarative/qdeclarativelanguage/data/scriptString3.qml new file mode 100644 index 00000000..0cd82ff5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/scriptString3.qml @@ -0,0 +1,5 @@ +import Test 1.0 + +MyTypeObject { + scriptProperty: 12.345 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/scriptString4.qml b/tests/auto/declarative/qdeclarativelanguage/data/scriptString4.qml new file mode 100644 index 00000000..3e2f9a49 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/scriptString4.qml @@ -0,0 +1,5 @@ +import Test 1.0 + +MyTypeObject { + scriptProperty: true +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/signal.1.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/signal.1.errors.txt new file mode 100644 index 00000000..78d99601 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/signal.1.errors.txt @@ -0,0 +1 @@ +4:12:Expected parameter type diff --git a/tests/auto/declarative/qdeclarativelanguage/data/signal.1.qml b/tests/auto/declarative/qdeclarativelanguage/data/signal.1.qml new file mode 100644 index 00000000..7d1a9db2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/signal.1.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +QtObject { + signal mySignal(nontype a) +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/signal.2.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/signal.2.errors.txt new file mode 100644 index 00000000..fce89285 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/signal.2.errors.txt @@ -0,0 +1 @@ +4:21:Unexpected token `;' diff --git a/tests/auto/declarative/qdeclarativelanguage/data/signal.2.qml b/tests/auto/declarative/qdeclarativelanguage/data/signal.2.qml new file mode 100644 index 00000000..e7780a05 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/signal.2.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +QtObject { + signal mySignal(,) +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/signal.3.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/signal.3.errors.txt new file mode 100644 index 00000000..bf043ac8 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/signal.3.errors.txt @@ -0,0 +1 @@ +4:22:Expected token `identifier' diff --git a/tests/auto/declarative/qdeclarativelanguage/data/signal.3.qml b/tests/auto/declarative/qdeclarativelanguage/data/signal.3.qml new file mode 100644 index 00000000..4289bce2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/signal.3.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +QtObject { + signal mySignal(a) +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/signal.4.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/signal.4.errors.txt new file mode 100644 index 00000000..d96f9e3e --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/signal.4.errors.txt @@ -0,0 +1 @@ +3:1:Signal names cannot begin with an upper case letter diff --git a/tests/auto/declarative/qdeclarativelanguage/data/signal.4.qml b/tests/auto/declarative/qdeclarativelanguage/data/signal.4.qml new file mode 100644 index 00000000..6ce417db --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/signal.4.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +QtObject { + signal MySignal +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/simpleBindings.qml b/tests/auto/declarative/qdeclarativelanguage/data/simpleBindings.qml new file mode 100644 index 00000000..2fcd1a5a --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/simpleBindings.qml @@ -0,0 +1,18 @@ +import Test 1.0 +MyTypeObject { + id: me + property int v1: 10 + property int v2: 11 + + property int value1 + property int value2 + property int value3 + property int value4 + + value1: v1 + value2: me.v1 + value3: v1 + v2 + value4: Math.min(v1, v2) + + objectProperty: me +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/simpleContainer.qml b/tests/auto/declarative/qdeclarativelanguage/data/simpleContainer.qml new file mode 100644 index 00000000..c3a795f5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/simpleContainer.qml @@ -0,0 +1,5 @@ +import Test 1.0 +MyContainer { + MyQmlObject {} + MyQmlObject {} +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/simpleObject.qml b/tests/auto/declarative/qdeclarativelanguage/data/simpleObject.qml new file mode 100644 index 00000000..30c78237 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/simpleObject.qml @@ -0,0 +1,2 @@ +import Test 1.0 +MyQmlObject {} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/singularProperty.2.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/singularProperty.2.errors.txt new file mode 100644 index 00000000..beae562f --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/singularProperty.2.errors.txt @@ -0,0 +1 @@ +5:10:Cannot assign multiple values to a singular property diff --git a/tests/auto/declarative/qdeclarativelanguage/data/singularProperty.2.qml b/tests/auto/declarative/qdeclarativelanguage/data/singularProperty.2.qml new file mode 100644 index 00000000..2fd7fd2b --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/singularProperty.2.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +QtObject { + property QtObject a + a: [ QtObject {}, QtObject {} ] +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/singularProperty.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/singularProperty.errors.txt new file mode 100644 index 00000000..beae562f --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/singularProperty.errors.txt @@ -0,0 +1 @@ +5:10:Cannot assign multiple values to a singular property diff --git a/tests/auto/declarative/qdeclarativelanguage/data/singularProperty.qml b/tests/auto/declarative/qdeclarativelanguage/data/singularProperty.qml new file mode 100644 index 00000000..da56cb82 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/singularProperty.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +QtObject { + property variant a + a: [ QtObject {}, QtObject {} ] +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/subdir/Test.qml b/tests/auto/declarative/qdeclarativelanguage/data/subdir/Test.qml new file mode 100644 index 00000000..0b054d02 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/subdir/Test.qml @@ -0,0 +1,2 @@ +import QtQuick 1.0 +Rectangle { } diff --git a/tests/auto/declarative/qdeclarativelanguage/data/subdir/subsubdir/SubTest.qml b/tests/auto/declarative/qdeclarativelanguage/data/subdir/subsubdir/SubTest.qml new file mode 100644 index 00000000..0b054d02 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/subdir/subsubdir/SubTest.qml @@ -0,0 +1,2 @@ +import QtQuick 1.0 +Rectangle { } diff --git a/tests/auto/declarative/qdeclarativelanguage/data/test.js b/tests/auto/declarative/qdeclarativelanguage/data/test.js new file mode 100644 index 00000000..e69de29b diff --git a/tests/auto/declarative/qdeclarativelanguage/data/test2.js b/tests/auto/declarative/qdeclarativelanguage/data/test2.js new file mode 100644 index 00000000..e69de29b diff --git a/tests/auto/declarative/qdeclarativelanguage/data/unregisteredObject.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/unregisteredObject.errors.txt new file mode 100644 index 00000000..10e5fb2d --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/unregisteredObject.errors.txt @@ -0,0 +1 @@ +2:1:UnregisteredObjectType is not a type diff --git a/tests/auto/declarative/qdeclarativelanguage/data/unregisteredObject.qml b/tests/auto/declarative/qdeclarativelanguage/data/unregisteredObject.qml new file mode 100644 index 00000000..4969f62a --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/unregisteredObject.qml @@ -0,0 +1,2 @@ +import Test 1.0 +UnregisteredObjectType {} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/unsupportedProperty.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/unsupportedProperty.errors.txt new file mode 100644 index 00000000..3cd626de --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/unsupportedProperty.errors.txt @@ -0,0 +1 @@ +3:13:Invalid property assignment: unsupported type "QMatrix" diff --git a/tests/auto/declarative/qdeclarativelanguage/data/unsupportedProperty.qml b/tests/auto/declarative/qdeclarativelanguage/data/unsupportedProperty.qml new file mode 100644 index 00000000..9f196803 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/unsupportedProperty.qml @@ -0,0 +1,4 @@ +import Test 1.0 +MyQmlObject { + matrix: "1,0,0,0,1,0,0,0,1" +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/valueTypes.qml b/tests/auto/declarative/qdeclarativelanguage/data/valueTypes.qml new file mode 100644 index 00000000..bf325a74 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/valueTypes.qml @@ -0,0 +1,13 @@ +import Test 1.0 +MyTypeObject { + rectProperty.x: 10 + rectProperty.y: 11 + rectProperty.width: rectProperty.x + 2 + rectProperty.height: 13 + + intProperty: rectProperty.x + + onAction: { var a = rectProperty; a.x = 12; } + + rectProperty2: rectProperty +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/variantNotify.qml b/tests/auto/declarative/qdeclarativelanguage/data/variantNotify.qml new file mode 100644 index 00000000..cc3f1c25 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/variantNotify.qml @@ -0,0 +1,13 @@ +import QtQuick 1.0 + +QtObject { + property int notifyCount: 0 + + property variant foo + onFooChanged: notifyCount++ + + Component.onCompleted: { + foo = 1; + foo = 1; + } +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/versionedbase.qml b/tests/auto/declarative/qdeclarativelanguage/data/versionedbase.qml new file mode 100644 index 00000000..8c747157 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/versionedbase.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 +import Test 1.1 + +MySubclass +{ + prop1: 10 + prop2: 10 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/wrongType.1.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.1.errors.txt new file mode 100644 index 00000000..ba7a0766 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.1.errors.txt @@ -0,0 +1 @@ +3:12:Invalid property assignment: int expected diff --git a/tests/auto/declarative/qdeclarativelanguage/data/wrongType.1.qml b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.1.qml new file mode 100644 index 00000000..289d37f0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.1.qml @@ -0,0 +1,4 @@ +import Test 1.0 +MyQmlObject { + value: "hello" +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/wrongType.10.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.10.errors.txt new file mode 100644 index 00000000..ae75b528 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.10.errors.txt @@ -0,0 +1 @@ +3:23:Invalid property assignment: datetime expected diff --git a/tests/auto/declarative/qdeclarativelanguage/data/wrongType.10.qml b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.10.qml new file mode 100644 index 00000000..2cf0e502 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.10.qml @@ -0,0 +1,5 @@ +import Test 1.0 +MyTypeObject { + dateTimeProperty: 12 +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/wrongType.11.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.11.errors.txt new file mode 100644 index 00000000..23a4cda4 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.11.errors.txt @@ -0,0 +1 @@ +3:20:Invalid property assignment: point expected diff --git a/tests/auto/declarative/qdeclarativelanguage/data/wrongType.11.qml b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.11.qml new file mode 100644 index 00000000..ae77ba1f --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.11.qml @@ -0,0 +1,5 @@ +import Test 1.0 +MyTypeObject { + pointProperty: "apples" +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/wrongType.12.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.12.errors.txt new file mode 100644 index 00000000..30921002 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.12.errors.txt @@ -0,0 +1 @@ +3:19:Invalid property assignment: size expected diff --git a/tests/auto/declarative/qdeclarativelanguage/data/wrongType.12.qml b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.12.qml new file mode 100644 index 00000000..b7a366f5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.12.qml @@ -0,0 +1,5 @@ +import Test 1.0 +MyTypeObject { + sizeProperty: "red" +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/wrongType.13.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.13.errors.txt new file mode 100644 index 00000000..ba7a0766 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.13.errors.txt @@ -0,0 +1 @@ +3:12:Invalid property assignment: int expected diff --git a/tests/auto/declarative/qdeclarativelanguage/data/wrongType.13.qml b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.13.qml new file mode 100644 index 00000000..477aff1d --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.13.qml @@ -0,0 +1,4 @@ +import Test 1.0 +MyQmlObject { + value: "12" +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/wrongType.14.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.14.errors.txt new file mode 100644 index 00000000..d621fdd6 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.14.errors.txt @@ -0,0 +1 @@ +3:21:Invalid property assignment: string expected diff --git a/tests/auto/declarative/qdeclarativelanguage/data/wrongType.14.qml b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.14.qml new file mode 100644 index 00000000..672d693c --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.14.qml @@ -0,0 +1,5 @@ +import Test 1.0 +MyTypeObject { + stringProperty: 10 +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/wrongType.15.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.15.errors.txt new file mode 100644 index 00000000..44768e30 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.15.errors.txt @@ -0,0 +1 @@ +3:18:Invalid property assignment: url expected diff --git a/tests/auto/declarative/qdeclarativelanguage/data/wrongType.15.qml b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.15.qml new file mode 100644 index 00000000..633a5ba2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.15.qml @@ -0,0 +1,4 @@ +import Test 1.0 +MyTypeObject { + urlProperty: 12 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/wrongType.16.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.16.errors.txt new file mode 100644 index 00000000..77cf2109 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.16.errors.txt @@ -0,0 +1 @@ +4:24:Cannot assign object to property diff --git a/tests/auto/declarative/qdeclarativelanguage/data/wrongType.16.qml b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.16.qml new file mode 100644 index 00000000..0699d67d --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.16.qml @@ -0,0 +1,5 @@ +import Test 1.0 +import QtQuick 1.0 +MyQmlObject { + qmlobjectProperty: QtObject {} +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/wrongType.2.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.2.errors.txt new file mode 100644 index 00000000..9ff9f250 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.2.errors.txt @@ -0,0 +1 @@ +3:14:Invalid property assignment: boolean expected diff --git a/tests/auto/declarative/qdeclarativelanguage/data/wrongType.2.qml b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.2.qml new file mode 100644 index 00000000..34b74f7e --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.2.qml @@ -0,0 +1,4 @@ +import Test 1.0 +MyQmlObject { + enabled: 5 +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/wrongType.3.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.3.errors.txt new file mode 100644 index 00000000..6d971c64 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.3.errors.txt @@ -0,0 +1 @@ +3:11:Invalid property assignment: rect expected diff --git a/tests/auto/declarative/qdeclarativelanguage/data/wrongType.3.qml b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.3.qml new file mode 100644 index 00000000..384181a1 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.3.qml @@ -0,0 +1,4 @@ +import Test 1.0 +MyQmlObject { + rect: "5,5x10" +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/wrongType.4.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.4.errors.txt new file mode 100644 index 00000000..ef34d0ea --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.4.errors.txt @@ -0,0 +1 @@ +3:19:Invalid property assignment: unknown enumeration diff --git a/tests/auto/declarative/qdeclarativelanguage/data/wrongType.4.qml b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.4.qml new file mode 100644 index 00000000..0787bf5f --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.4.qml @@ -0,0 +1,4 @@ +import Test 1.0 +MyTypeObject { + enumProperty: "InvalidEnumName" +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/wrongType.5.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.5.errors.txt new file mode 100644 index 00000000..cab10bdd --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.5.errors.txt @@ -0,0 +1 @@ +3:19:Invalid property assignment: unsigned int expected diff --git a/tests/auto/declarative/qdeclarativelanguage/data/wrongType.5.qml b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.5.qml new file mode 100644 index 00000000..c50ae9a2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.5.qml @@ -0,0 +1,5 @@ +import Test 1.0 +MyTypeObject { + uintProperty: -13 +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/wrongType.6.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.6.errors.txt new file mode 100644 index 00000000..d2b8c54c --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.6.errors.txt @@ -0,0 +1 @@ +3:19:Invalid property assignment: number expected diff --git a/tests/auto/declarative/qdeclarativelanguage/data/wrongType.6.qml b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.6.qml new file mode 100644 index 00000000..da10b789 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.6.qml @@ -0,0 +1,5 @@ +import Test 1.0 +MyTypeObject { + realProperty: "Hello" +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/wrongType.7.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.7.errors.txt new file mode 100644 index 00000000..614346bd --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.7.errors.txt @@ -0,0 +1 @@ +3:20:Invalid property assignment: color expected diff --git a/tests/auto/declarative/qdeclarativelanguage/data/wrongType.7.qml b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.7.qml new file mode 100644 index 00000000..ddc38351 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.7.qml @@ -0,0 +1,5 @@ +import Test 1.0 +MyTypeObject { + colorProperty: 12 +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/wrongType.8.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.8.errors.txt new file mode 100644 index 00000000..1773c008 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.8.errors.txt @@ -0,0 +1 @@ +3:19:Invalid property assignment: date expected diff --git a/tests/auto/declarative/qdeclarativelanguage/data/wrongType.8.qml b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.8.qml new file mode 100644 index 00000000..a5f67563 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.8.qml @@ -0,0 +1,5 @@ +import Test 1.0 +MyTypeObject { + dateProperty: 12 +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/data/wrongType.9.errors.txt b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.9.errors.txt new file mode 100644 index 00000000..8630975c --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.9.errors.txt @@ -0,0 +1 @@ +3:19:Invalid property assignment: time expected diff --git a/tests/auto/declarative/qdeclarativelanguage/data/wrongType.9.qml b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.9.qml new file mode 100644 index 00000000..a3db7326 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/wrongType.9.qml @@ -0,0 +1,5 @@ +import Test 1.0 +MyTypeObject { + timeProperty: 12 +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/qdeclarativelanguage.pro b/tests/auto/declarative/qdeclarativelanguage/qdeclarativelanguage.pro new file mode 100644 index 00000000..cae85a7b --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/qdeclarativelanguage.pro @@ -0,0 +1,22 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +QT += script network +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativelanguage.cpp \ + testtypes.cpp +HEADERS += testtypes.h + +INCLUDEPATH += ../shared/ +HEADERS += ../shared/testhttpserver.h +SOURCES += ../shared/testhttpserver.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test diff --git a/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/LocalInternal.qml b/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/LocalInternal.qml new file mode 100644 index 00000000..289cd216 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/LocalInternal.qml @@ -0,0 +1,3 @@ +import QtQuick 1.0 + +Image { source: "pics/blue.png" } diff --git a/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/Test.qml b/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/Test.qml new file mode 100644 index 00000000..0b054d02 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/Test.qml @@ -0,0 +1,2 @@ +import QtQuick 1.0 +Rectangle { } diff --git a/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/TestLocal.qml b/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/TestLocal.qml new file mode 100644 index 00000000..11443ca6 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/TestLocal.qml @@ -0,0 +1 @@ +LocalInternal {} diff --git a/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/TestNamed.qml b/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/TestNamed.qml new file mode 100644 index 00000000..672cb8f2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/TestNamed.qml @@ -0,0 +1 @@ +NamedLocal { } diff --git a/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/TestSubDir.qml b/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/TestSubDir.qml new file mode 100644 index 00000000..0dfede40 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/TestSubDir.qml @@ -0,0 +1,2 @@ +import "subdir" +SubTest { } diff --git a/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/UndeclaredLocal.qml b/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/UndeclaredLocal.qml new file mode 100644 index 00000000..289cd216 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/UndeclaredLocal.qml @@ -0,0 +1,3 @@ +import QtQuick 1.0 + +Image { source: "pics/blue.png" } diff --git a/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/WrongTestLocal.qml b/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/WrongTestLocal.qml new file mode 100644 index 00000000..8dcb7be2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/WrongTestLocal.qml @@ -0,0 +1 @@ +UndeclaredInternal {} diff --git a/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/noqmldir/Test.qml b/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/noqmldir/Test.qml new file mode 100644 index 00000000..0b054d02 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/noqmldir/Test.qml @@ -0,0 +1,2 @@ +import QtQuick 1.0 +Rectangle { } diff --git a/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/pics/blue.png b/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/pics/blue.png new file mode 100644 index 00000000..46f815f1 Binary files /dev/null and b/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/pics/blue.png differ diff --git a/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/qmldir b/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/qmldir new file mode 100644 index 00000000..60150f83 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/qmldir @@ -0,0 +1,5 @@ +Test Test.qml +TestSubDir TestSubDir.qml +TestLocal TestLocal.qml +NamedLocal LocalInternal.qml +internal LocalInternal LocalInternal.qml diff --git a/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/subdir/SubTest.qml b/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/subdir/SubTest.qml new file mode 100644 index 00000000..76d11dca --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/subdir/SubTest.qml @@ -0,0 +1,3 @@ +import QtQuick 1.0 + +Text {} diff --git a/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/subdir/qmldir b/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/subdir/qmldir new file mode 100644 index 00000000..a54f7dfa --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/qtest/declarative/qmllanguage/subdir/qmldir @@ -0,0 +1 @@ +SubTest SubTest.qml diff --git a/tests/auto/declarative/qdeclarativelanguage/testtypes.cpp b/tests/auto/declarative/qdeclarativelanguage/testtypes.cpp new file mode 100644 index 00000000..10b444cd --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/testtypes.cpp @@ -0,0 +1,81 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "testtypes.h" + +void registerTypes() +{ + qmlRegisterInterface("MyInterface"); + qmlRegisterType("Test",1,0,"MyQmlObject"); + qmlRegisterType("Test",1,0,"MyTypeObject"); + qmlRegisterType("Test",1,0,"MyContainer"); + qmlRegisterType("Test",1,0,"MyPropertyValueSource"); + qmlRegisterType("Test",1,0,"MyDotPropertyObject"); + qmlRegisterType("Test",1,0,"MyNamespacedType"); + qmlRegisterType("Test",1,0,"MySecondNamespacedType"); + qmlRegisterType("Test",1,0,"MyParserStatus"); + qmlRegisterType(); + qmlRegisterType("Test",1,0,"MyRevisionedClass"); + qmlRegisterType("Test",1,1,"MyRevisionedClass"); + qmlRegisterType("Test",1,0,"MyRevisionedIllegalOverload"); + qmlRegisterType("Test",1,0,"MyRevisionedLegalOverload"); + + // Register the uncreatable base class + qmlRegisterRevision("Test",1,1); + // MyRevisionedSubclass 1.0 uses MyRevisionedClass revision 0 + qmlRegisterType("Test",1,0,"MyRevisionedSubclass"); + // MyRevisionedSubclass 1.1 uses MyRevisionedClass revision 1 + qmlRegisterType("Test",1,1,"MyRevisionedSubclass"); + + // Only version 1.0, but its super class is registered in version 1.1 also + qmlRegisterType("Test",1,0,"MySubclass"); + + qmlRegisterCustomType("Test", 1, 0, "MyCustomParserType", new MyCustomParserTypeParser); + + qmlRegisterTypeNotAvailable("Test",1,0,"UnavailableType", "UnavailableType is unavailable for testing"); +} + +QVariant myCustomVariantTypeConverter(const QString &data) +{ + MyCustomVariantType rv; + rv.a = data.toInt(); + return QVariant::fromValue(rv); +} + diff --git a/tests/auto/declarative/qdeclarativelanguage/testtypes.h b/tests/auto/declarative/qdeclarativelanguage/testtypes.h new file mode 100644 index 00000000..6f21e48c --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/testtypes.h @@ -0,0 +1,807 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef TESTTYPES_H +#define TESTTYPES_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +QVariant myCustomVariantTypeConverter(const QString &data); + +class MyInterface +{ +public: + MyInterface() : id(913) {} + int id; +}; + +QT_BEGIN_NAMESPACE +Q_DECLARE_INTERFACE(MyInterface, "com.trolltech.Qt.Test.MyInterface"); +QT_END_NAMESPACE +QML_DECLARE_INTERFACE(MyInterface); + +struct MyCustomVariantType +{ + MyCustomVariantType() : a(0) {} + int a; +}; +Q_DECLARE_METATYPE(MyCustomVariantType); + +class MyAttachedObject : public QObject +{ + Q_OBJECT + Q_PROPERTY(int value READ value WRITE setValue NOTIFY valueChanged) + Q_PROPERTY(int value2 READ value2 WRITE setValue2) +public: + MyAttachedObject(QObject *parent) : QObject(parent), m_value(0), m_value2(0) {} + + int value() const { return m_value; } + void setValue(int v) { if (m_value != v) { m_value = v; emit valueChanged(); } } + + int value2() const { return m_value2; } + void setValue2(int v) { m_value2 = v; } + +signals: + void valueChanged(); + +private: + int m_value; + int m_value2; +}; + +class MyQmlObject : public QObject, public MyInterface +{ + Q_OBJECT + Q_PROPERTY(int value READ value WRITE setValue FINAL) + Q_PROPERTY(QString readOnlyString READ readOnlyString) + Q_PROPERTY(bool enabled READ enabled WRITE setEnabled) + Q_PROPERTY(QRect rect READ rect WRITE setRect) + Q_PROPERTY(QMatrix matrix READ matrix WRITE setMatrix) //assumed to be unsupported by QML + Q_PROPERTY(MyInterface *interfaceProperty READ interface WRITE setInterface) + Q_PROPERTY(int onLiteralSignal READ onLiteralSignal WRITE setOnLiteralSignal) + Q_PROPERTY(MyCustomVariantType customType READ customType WRITE setCustomType) + Q_PROPERTY(MyQmlObject *qmlobjectProperty READ qmlobject WRITE setQmlobject) + Q_PROPERTY(int propertyWithNotify READ propertyWithNotify WRITE setPropertyWithNotify NOTIFY oddlyNamedNotifySignal) + Q_PROPERTY(int nonScriptable READ nonScriptable WRITE setNonScriptable SCRIPTABLE false) + + Q_INTERFACES(MyInterface) +public: + MyQmlObject() : m_value(-1), m_interface(0), m_qmlobject(0) { qRegisterMetaType("MyCustomVariantType"); } + + int value() const { return m_value; } + void setValue(int v) { m_value = v; } + + QString readOnlyString() const { return QLatin1String(""); } + + bool enabled() const { return false; } + void setEnabled(bool) {} + + QRect rect() const { return QRect(); } + void setRect(const QRect&) {} + + QMatrix matrix() const { return QMatrix(); } + void setMatrix(const QMatrix&) {} + + MyInterface *interface() const { return m_interface; } + void setInterface(MyInterface *iface) { m_interface = iface; } + + static MyAttachedObject *qmlAttachedProperties(QObject *other) { + return new MyAttachedObject(other); + } + Q_CLASSINFO("DefaultMethod", "basicSlot()") + + int onLiteralSignal() const { return m_value; } + void setOnLiteralSignal(int v) { m_value = v; } + + MyQmlObject *qmlobject() const { return m_qmlobject; } + void setQmlobject(MyQmlObject *o) { m_qmlobject = o; } + + MyCustomVariantType customType() const { return m_custom; } + void setCustomType(const MyCustomVariantType &v) { m_custom = v; } + + int propertyWithNotify() const { return m_propertyWithNotify; } + void setPropertyWithNotify(int i) { m_propertyWithNotify = i; emit oddlyNamedNotifySignal(); } + + int nonScriptable() const { return 0; } + void setNonScriptable(int) {} +public slots: + void basicSlot() { qWarning("MyQmlObject::basicSlot"); } + void basicSlotWithArgs(int v) { qWarning("MyQmlObject::basicSlotWithArgs(%d)", v); } + +signals: + void basicSignal(); + void basicParameterizedSignal(int parameter); + void oddlyNamedNotifySignal(); + +private: + friend class tst_qdeclarativelanguage; + int m_value; + MyInterface *m_interface; + MyQmlObject *m_qmlobject; + MyCustomVariantType m_custom; + int m_propertyWithNotify; +}; +QML_DECLARE_TYPE(MyQmlObject) +QML_DECLARE_TYPEINFO(MyQmlObject, QML_HAS_ATTACHED_PROPERTIES) + +class MyGroupedObject : public QObject +{ + Q_OBJECT + Q_PROPERTY(QDeclarativeScriptString script READ script WRITE setScript) + Q_PROPERTY(int value READ value WRITE setValue) +public: + QDeclarativeScriptString script() const { return m_script; } + void setScript(const QDeclarativeScriptString &s) { m_script = s; } + + int value() const { return m_value; } + void setValue(int v) { m_value = v; } + +private: + int m_value; + QDeclarativeScriptString m_script; +}; + + +class MyTypeObject : public QObject +{ + Q_OBJECT + Q_ENUMS(MyEnum) + Q_FLAGS(MyFlags) + + Q_PROPERTY(QString id READ id WRITE setId) + Q_PROPERTY(QObject *objectProperty READ objectProperty WRITE setObjectProperty) + Q_PROPERTY(QDeclarativeComponent *componentProperty READ componentProperty WRITE setComponentProperty) + Q_PROPERTY(MyFlags flagProperty READ flagProperty WRITE setFlagProperty) + Q_PROPERTY(MyEnum enumProperty READ enumProperty WRITE setEnumProperty) + Q_PROPERTY(MyEnum readOnlyEnumProperty READ readOnlyEnumProperty) + Q_PROPERTY(QString stringProperty READ stringProperty WRITE setStringProperty) + Q_PROPERTY(uint uintProperty READ uintProperty WRITE setUintProperty) + Q_PROPERTY(int intProperty READ intProperty WRITE setIntProperty) + Q_PROPERTY(qreal realProperty READ realProperty WRITE setRealProperty) + Q_PROPERTY(double doubleProperty READ doubleProperty WRITE setDoubleProperty) + Q_PROPERTY(float floatProperty READ floatProperty WRITE setFloatProperty) + Q_PROPERTY(QColor colorProperty READ colorProperty WRITE setColorProperty) + Q_PROPERTY(QDate dateProperty READ dateProperty WRITE setDateProperty) + Q_PROPERTY(QTime timeProperty READ timeProperty WRITE setTimeProperty) + Q_PROPERTY(QDateTime dateTimeProperty READ dateTimeProperty WRITE setDateTimeProperty) + Q_PROPERTY(QPoint pointProperty READ pointProperty WRITE setPointProperty) + Q_PROPERTY(QPointF pointFProperty READ pointFProperty WRITE setPointFProperty) + Q_PROPERTY(QSize sizeProperty READ sizeProperty WRITE setSizeProperty) + Q_PROPERTY(QSizeF sizeFProperty READ sizeFProperty WRITE setSizeFProperty) + Q_PROPERTY(QRect rectProperty READ rectProperty WRITE setRectProperty NOTIFY rectPropertyChanged) + Q_PROPERTY(QRect rectProperty2 READ rectProperty2 WRITE setRectProperty2) + Q_PROPERTY(QRectF rectFProperty READ rectFProperty WRITE setRectFProperty) + Q_PROPERTY(bool boolProperty READ boolProperty WRITE setBoolProperty) + Q_PROPERTY(QVariant variantProperty READ variantProperty WRITE setVariantProperty) + Q_PROPERTY(QVector3D vectorProperty READ vectorProperty WRITE setVectorProperty) + Q_PROPERTY(QUrl urlProperty READ urlProperty WRITE setUrlProperty) + + Q_PROPERTY(QDeclarativeScriptString scriptProperty READ scriptProperty WRITE setScriptProperty) + Q_PROPERTY(MyGroupedObject *grouped READ grouped CONSTANT) + Q_PROPERTY(MyGroupedObject *nullGrouped READ nullGrouped CONSTANT) + +public: + MyTypeObject() + : objectPropertyValue(0), componentPropertyValue(0) {} + + QString idValue; + QString id() const { + return idValue; + } + void setId(const QString &v) { + idValue = v; + } + + QObject *objectPropertyValue; + QObject *objectProperty() const { + return objectPropertyValue; + } + void setObjectProperty(QObject *v) { + objectPropertyValue = v; + } + + QDeclarativeComponent *componentPropertyValue; + QDeclarativeComponent *componentProperty() const { + return componentPropertyValue; + } + void setComponentProperty(QDeclarativeComponent *v) { + componentPropertyValue = v; + } + + enum MyFlag { FlagVal1 = 0x01, FlagVal2 = 0x02, FlagVal3 = 0x04 }; + Q_DECLARE_FLAGS(MyFlags, MyFlag) + MyFlags flagPropertyValue; + MyFlags flagProperty() const { + return flagPropertyValue; + } + void setFlagProperty(MyFlags v) { + flagPropertyValue = v; + } + + enum MyEnum { EnumVal1, EnumVal2 }; + MyEnum enumPropertyValue; + MyEnum enumProperty() const { + return enumPropertyValue; + } + void setEnumProperty(MyEnum v) { + enumPropertyValue = v; + } + + MyEnum readOnlyEnumProperty() const { + return EnumVal1; + } + + QString stringPropertyValue; + QString stringProperty() const { + return stringPropertyValue; + } + void setStringProperty(const QString &v) { + stringPropertyValue = v; + } + + uint uintPropertyValue; + uint uintProperty() const { + return uintPropertyValue; + } + void setUintProperty(const uint &v) { + uintPropertyValue = v; + } + + int intPropertyValue; + int intProperty() const { + return intPropertyValue; + } + void setIntProperty(const int &v) { + intPropertyValue = v; + } + + qreal realPropertyValue; + qreal realProperty() const { + return realPropertyValue; + } + void setRealProperty(const qreal &v) { + realPropertyValue = v; + } + + double doublePropertyValue; + double doubleProperty() const { + return doublePropertyValue; + } + void setDoubleProperty(const double &v) { + doublePropertyValue = v; + } + + float floatPropertyValue; + float floatProperty() const { + return floatPropertyValue; + } + void setFloatProperty(const float &v) { + floatPropertyValue = v; + } + + QColor colorPropertyValue; + QColor colorProperty() const { + return colorPropertyValue; + } + void setColorProperty(const QColor &v) { + colorPropertyValue = v; + } + + QDate datePropertyValue; + QDate dateProperty() const { + return datePropertyValue; + } + void setDateProperty(const QDate &v) { + datePropertyValue = v; + } + + QTime timePropertyValue; + QTime timeProperty() const { + return timePropertyValue; + } + void setTimeProperty(const QTime &v) { + timePropertyValue = v; + } + + QDateTime dateTimePropertyValue; + QDateTime dateTimeProperty() const { + return dateTimePropertyValue; + } + void setDateTimeProperty(const QDateTime &v) { + dateTimePropertyValue = v; + } + + QPoint pointPropertyValue; + QPoint pointProperty() const { + return pointPropertyValue; + } + void setPointProperty(const QPoint &v) { + pointPropertyValue = v; + } + + QPointF pointFPropertyValue; + QPointF pointFProperty() const { + return pointFPropertyValue; + } + void setPointFProperty(const QPointF &v) { + pointFPropertyValue = v; + } + + QSize sizePropertyValue; + QSize sizeProperty() const { + return sizePropertyValue; + } + void setSizeProperty(const QSize &v) { + sizePropertyValue = v; + } + + QSizeF sizeFPropertyValue; + QSizeF sizeFProperty() const { + return sizeFPropertyValue; + } + void setSizeFProperty(const QSizeF &v) { + sizeFPropertyValue = v; + } + + QRect rectPropertyValue; + QRect rectProperty() const { + return rectPropertyValue; + } + void setRectProperty(const QRect &v) { + rectPropertyValue = v; + emit rectPropertyChanged(); + } + + QRect rectPropertyValue2; + QRect rectProperty2() const { + return rectPropertyValue2; + } + void setRectProperty2(const QRect &v) { + rectPropertyValue2 = v; + } + + QRectF rectFPropertyValue; + QRectF rectFProperty() const { + return rectFPropertyValue; + } + void setRectFProperty(const QRectF &v) { + rectFPropertyValue = v; + } + + bool boolPropertyValue; + bool boolProperty() const { + return boolPropertyValue; + } + void setBoolProperty(const bool &v) { + boolPropertyValue = v; + } + + QVariant variantPropertyValue; + QVariant variantProperty() const { + return variantPropertyValue; + } + void setVariantProperty(const QVariant &v) { + variantPropertyValue = v; + } + + QVector3D vectorPropertyValue; + QVector3D vectorProperty() const { + return vectorPropertyValue; + } + void setVectorProperty(const QVector3D &v) { + vectorPropertyValue = v; + } + + QUrl urlPropertyValue; + QUrl urlProperty() const { + return urlPropertyValue; + } + void setUrlProperty(const QUrl &v) { + urlPropertyValue = v; + } + + QDeclarativeScriptString scriptPropertyValue; + QDeclarativeScriptString scriptProperty() const { + return scriptPropertyValue; + } + void setScriptProperty(const QDeclarativeScriptString &v) { + scriptPropertyValue = v; + } + + MyGroupedObject groupedValue; + MyGroupedObject *grouped() { return &groupedValue; } + + MyGroupedObject *nullGrouped() { return 0; } + + void doAction() { emit action(); } +signals: + void action(); + void rectPropertyChanged(); +}; +Q_DECLARE_OPERATORS_FOR_FLAGS(MyTypeObject::MyFlags) + + +class MyContainer : public QObject +{ + Q_OBJECT + Q_PROPERTY(QDeclarativeListProperty children READ children) + Q_PROPERTY(QDeclarativeListProperty containerChildren READ containerChildren) + Q_PROPERTY(QDeclarativeListProperty qlistInterfaces READ qlistInterfaces) + Q_CLASSINFO("DefaultProperty", "children") +public: + MyContainer() {} + + QDeclarativeListProperty children() { return QDeclarativeListProperty(this, m_children); } + QDeclarativeListProperty containerChildren() { return QDeclarativeListProperty(this, m_containerChildren); } + QList *getChildren() { return &m_children; } + QDeclarativeListProperty qlistInterfaces() { return QDeclarativeListProperty(this, m_interfaces); } + QList *getQListInterfaces() { return &m_interfaces; } + + QList m_containerChildren; + QList m_children; + QList m_interfaces; +}; + + +class MyPropertyValueSource : public QObject, public QDeclarativePropertyValueSource +{ + Q_OBJECT + Q_INTERFACES(QDeclarativePropertyValueSource) +public: + MyPropertyValueSource() + : QDeclarativePropertyValueSource() {} + + QDeclarativeProperty prop; + virtual void setTarget(const QDeclarativeProperty &p) + { + prop = p; + } +}; + +class UnavailableType : public QObject +{ + Q_OBJECT +public: + UnavailableType() {} +}; + +class MyDotPropertyObject : public QObject +{ + Q_OBJECT + Q_PROPERTY(MyQmlObject *obj READ obj) + Q_PROPERTY(MyQmlObject *readWriteObj READ readWriteObj WRITE setReadWriteObj) +public: + MyDotPropertyObject() : m_rwobj(0), m_ownRWObj(false) {} + ~MyDotPropertyObject() + { + if (m_ownRWObj) + delete m_rwobj; + } + + MyQmlObject *obj() { return 0; } + + MyQmlObject *readWriteObj() + { + if (!m_rwobj) { + m_rwobj = new MyQmlObject; + m_ownRWObj = true; + } + return m_rwobj; + } + + void setReadWriteObj(MyQmlObject *obj) + { + if (m_ownRWObj) { + delete m_rwobj; + m_ownRWObj = false; + } + + m_rwobj = obj; + } + +private: + MyQmlObject *m_rwobj; + bool m_ownRWObj; +}; + + +namespace MyNamespace { + class MyNamespacedType : public QObject + { + Q_OBJECT + }; + + class MySecondNamespacedType : public QObject + { + Q_OBJECT + Q_PROPERTY(QDeclarativeListProperty list READ list) + public: + QDeclarativeListProperty list() { return QDeclarativeListProperty(this, m_list); } + + private: + QList m_list; + }; +} + +class MyCustomParserType : public QObject +{ + Q_OBJECT +}; + +class MyCustomParserTypeParser : public QDeclarativeCustomParser +{ +public: + QByteArray compile(const QList &) { return QByteArray(); } + void setCustomData(QObject *, const QByteArray &) {} +}; + +class MyParserStatus : public QObject, public QDeclarativeParserStatus +{ + Q_OBJECT +public: + MyParserStatus() : m_cbc(0), m_ccc(0) {} + + int classBeginCount() const { return m_cbc; } + int componentCompleteCount() const { return m_ccc; } + + virtual void classBegin() { m_cbc++; } + virtual void componentComplete() { m_ccc++; } +private: + int m_cbc; + int m_ccc; +}; + +class MyRevisionedBaseClassRegistered : public QObject +{ + Q_OBJECT + Q_PROPERTY(qreal propA READ propA WRITE setPropA NOTIFY propAChanged) + Q_PROPERTY(qreal propB READ propB WRITE setPropB NOTIFY propBChanged REVISION 1) + +public: + MyRevisionedBaseClassRegistered() : m_pa(1), m_pb(2) {} + + qreal propA() const { return m_pa; } + void setPropA(qreal p) { + if (p != m_pa) { + m_pa = p; + emit propAChanged(); + } + } + qreal propB() const { return m_pb; } + void setPropB(qreal p) { + if (p != m_pb) { + m_pb = p; + emit propBChanged(); + } + } + + Q_INVOKABLE void methodA() { } + Q_INVOKABLE Q_REVISION(1) void methodB() { } + +signals: + void propAChanged(); + void propBChanged(); + + void signalA(); + Q_REVISION(1) void signalB(); + +protected: + qreal m_pa; + qreal m_pb; +}; + +class MyRevisionedIllegalOverload : public MyRevisionedBaseClassRegistered +{ + Q_OBJECT + Q_PROPERTY(qreal propA READ propA WRITE setPropA REVISION 1); +}; + +class MyRevisionedLegalOverload : public MyRevisionedBaseClassRegistered +{ + Q_OBJECT + Q_PROPERTY(qreal propB READ propB WRITE setPropB REVISION 1); +}; + +class MyRevisionedBaseClassUnregistered : public MyRevisionedBaseClassRegistered +{ + Q_OBJECT + Q_PROPERTY(qreal propC READ propC WRITE setPropC NOTIFY propCChanged) + Q_PROPERTY(qreal propD READ propD WRITE setPropD NOTIFY propDChanged REVISION 1) + +public: + MyRevisionedBaseClassUnregistered() : m_pc(1), m_pd(2) {} + + qreal propC() const { return m_pc; } + void setPropC(qreal p) { + if (p != m_pc) { + m_pc = p; + emit propCChanged(); + } + } + qreal propD() const { return m_pd; } + void setPropD(qreal p) { + if (p != m_pd) { + m_pd = p; + emit propDChanged(); + } + } + + Q_INVOKABLE void methodC() { } + Q_INVOKABLE Q_REVISION(1) void methodD() { } + +signals: + void propCChanged(); + void propDChanged(); + + void signalC(); + Q_REVISION(1) void signalD(); + +protected: + qreal m_pc; + qreal m_pd; +}; + +class MyRevisionedClass : public MyRevisionedBaseClassUnregistered +{ + Q_OBJECT + Q_PROPERTY(qreal prop1 READ prop1 WRITE setProp1 NOTIFY prop1Changed) + Q_PROPERTY(qreal prop2 READ prop2 WRITE setProp2 NOTIFY prop2Changed REVISION 1) + +public: + MyRevisionedClass() : m_p1(1), m_p2(2) {} + + qreal prop1() const { return m_p1; } + void setProp1(qreal p) { + if (p != m_p1) { + m_p1 = p; + emit prop1Changed(); + } + } + qreal prop2() const { return m_p2; } + void setProp2(qreal p) { + if (p != m_p2) { + m_p2 = p; + emit prop2Changed(); + } + } + + Q_INVOKABLE void method1() { } + Q_INVOKABLE Q_REVISION(1) void method2() { } + +signals: + void prop1Changed(); + void prop2Changed(); + + void signal1(); + Q_REVISION(1) void signal2(); + +protected: + qreal m_p1; + qreal m_p2; +}; + +class MyRevisionedSubclass : public MyRevisionedClass +{ + Q_OBJECT + Q_PROPERTY(qreal prop3 READ prop3 WRITE setProp3 NOTIFY prop3Changed) + Q_PROPERTY(qreal prop4 READ prop4 WRITE setProp4 NOTIFY prop4Changed REVISION 1) + +public: + MyRevisionedSubclass() : m_p3(3), m_p4(4) {} + + qreal prop3() const { return m_p3; } + void setProp3(qreal p) { + if (p != m_p3) { + m_p3 = p; + emit prop3Changed(); + } + } + qreal prop4() const { return m_p4; } + void setProp4(qreal p) { + if (p != m_p4) { + m_p4 = p; + emit prop4Changed(); + } + } + + Q_INVOKABLE void method3() { } + Q_INVOKABLE Q_REVISION(1) void method4() { } + +signals: + void prop3Changed(); + void prop4Changed(); + + void signal3(); + Q_REVISION(1) void signal4(); + +protected: + qreal m_p3; + qreal m_p4; +}; + +class MySubclass : public MyRevisionedClass +{ + Q_OBJECT + Q_PROPERTY(qreal prop5 READ prop5 WRITE setProp5 NOTIFY prop5Changed) + +public: + MySubclass() : m_p5(5) {} + + qreal prop5() const { return m_p5; } + void setProp5(qreal p) { + if (p != m_p5) { + m_p5 = p; + emit prop5Changed(); + } + } + + Q_INVOKABLE void method5() { } + +signals: + void prop5Changed(); + +protected: + qreal m_p5; +}; + +QML_DECLARE_TYPE(MyRevisionedBaseClassRegistered) +QML_DECLARE_TYPE(MyRevisionedBaseClassUnregistered) +QML_DECLARE_TYPE(MyRevisionedClass) +QML_DECLARE_TYPE(MyRevisionedSubclass) +QML_DECLARE_TYPE(MySubclass) + + + +void registerTypes(); + +#endif // TESTTYPES_H diff --git a/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp b/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp new file mode 100644 index 00000000..bfc0a5f1 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp @@ -0,0 +1,2028 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "testtypes.h" + +#include "../../../shared/util.h" +#include "testhttpserver.h" + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +DEFINE_BOOL_CONFIG_OPTION(qmlCheckTypes, QML_CHECK_TYPES) + + +/* +This test case covers QML language issues. This covers everything that does not +involve evaluating ECMAScript expressions and bindings. + +Evaluation of expressions and bindings is covered in qmlecmascript +*/ +class tst_qdeclarativelanguage : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativelanguage() { + QDeclarativeMetaType::registerCustomStringConverter(qMetaTypeId(), myCustomVariantTypeConverter); + QFileInfo fileInfo(__FILE__); + engine.addImportPath(fileInfo.absoluteDir().filePath(QLatin1String("data/lib"))); + } + +private slots: + void initTestCase(); + void cleanupTestCase(); + + void errors_data(); + void errors(); + + void insertedSemicolon_data(); + void insertedSemicolon(); + + void simpleObject(); + void simpleContainer(); + void interfaceProperty(); + void interfaceQList(); + void assignObjectToSignal(); + void assignObjectToVariant(); + void assignLiteralSignalProperty(); + void assignQmlComponent(); + void assignBasicTypes(); + void assignTypeExtremes(); + void assignCompositeToType(); + void assignLiteralToVariant(); + void customParserTypes(); + void rootAsQmlComponent(); + void inlineQmlComponents(); + void idProperty(); + void autoNotifyConnection(); + void assignSignal(); + void dynamicProperties(); + void dynamicPropertiesNested(); + void listProperties(); + void dynamicObjectProperties(); + void dynamicSignalsAndSlots(); + void simpleBindings(); + void autoComponentCreation(); + void propertyValueSource(); + void attachedProperties(); + void dynamicObjects(); + void customVariantTypes(); + void valueTypes(); + void cppnamespace(); + void aliasProperties(); + void aliasPropertiesAndSignals(); + void aliasPropertyChangeSignals(); + void componentCompositeType(); + void i18n(); + void i18n_data(); + void onCompleted(); + void onDestruction(); + void scriptString(); + void defaultPropertyListOrder(); + void declaredPropertyValues(); + void dontDoubleCallClassBegin(); + void reservedWords_data(); + void reservedWords(); + void inlineAssignmentsOverrideBindings(); + void nestedComponentRoots(); + + void basicRemote_data(); + void basicRemote(); + void importsBuiltin_data(); + void importsBuiltin(); + void importsLocal_data(); + void importsLocal(); + void importsRemote_data(); + void importsRemote(); + void importsInstalled_data(); + void importsInstalled(); + void importsOrder_data(); + void importsOrder(); + void importIncorrectCase(); + + void qmlAttachedPropertiesObjectMethod(); + void customOnProperty(); + void variantNotify(); + + void revisions(); + void revisionOverloads(); + + // regression tests for crashes + void crash1(); + void crash2(); + +private: + QDeclarativeEngine engine; + void testType(const QString& qml, const QString& type, const QString& error); +}; + +#define VERIFY_ERRORS(errorfile) \ + if (!errorfile) { \ + if (qgetenv("DEBUG") != "" && !component.errors().isEmpty()) \ + qWarning() << "Unexpected Errors:" << component.errors(); \ + QVERIFY(!component.isError()); \ + QVERIFY(component.errors().isEmpty()); \ + } else { \ + QFile file(QLatin1String(SRCDIR) + QLatin1String("/data/") + QLatin1String(errorfile)); \ + QVERIFY(file.open(QIODevice::ReadOnly | QIODevice::Text)); \ + QByteArray data = file.readAll(); \ + file.close(); \ + QList expected = data.split('\n'); \ + expected.removeAll(QByteArray("")); \ + QList errors = component.errors(); \ + QList actual; \ + for (int ii = 0; ii < errors.count(); ++ii) { \ + const QDeclarativeError &error = errors.at(ii); \ + QByteArray errorStr = QByteArray::number(error.line()) + ":" + \ + QByteArray::number(error.column()) + ":" + \ + error.description().toUtf8(); \ + actual << errorStr; \ + } \ + if (qgetenv("DEBUG") != "" && expected != actual) \ + qWarning() << "Expected:" << expected << "Actual:" << actual; \ + if (qgetenv("QDECLARATIVELANGUAGE_UPDATEERRORS") != "" && expected != actual) {\ + QFile file(QLatin1String("data/") + QLatin1String(errorfile)); \ + QVERIFY(file.open(QIODevice::WriteOnly)); \ + for (int ii = 0; ii < actual.count(); ++ii) { \ + file.write(actual.at(ii)); file.write("\n"); \ + } \ + file.close(); \ + } else { \ + QCOMPARE(expected, actual); \ + } \ + } + +inline QUrl TEST_FILE(const QString &filename) +{ + QFileInfo fileInfo(__FILE__); + return QUrl::fromLocalFile(fileInfo.absoluteDir().filePath(QLatin1String("data/") + filename)); +} + +inline QUrl TEST_FILE(const char *filename) +{ + return TEST_FILE(QLatin1String(filename)); +} + +void tst_qdeclarativelanguage::cleanupTestCase() +{ + QVERIFY(QFile::remove(TEST_FILE(QString::fromUtf8("I18nType\303\201\303\242\303\243\303\244\303\245.qml")).toLocalFile())); +} + +void tst_qdeclarativelanguage::insertedSemicolon_data() +{ + QTest::addColumn("file"); + QTest::addColumn("errorFile"); + QTest::addColumn("create"); + + QTest::newRow("insertedSemicolon.1") << "insertedSemicolon.1.qml" << "insertedSemicolon.1.errors.txt" << false; +} + +void tst_qdeclarativelanguage::insertedSemicolon() +{ + QFETCH(QString, file); + QFETCH(QString, errorFile); + QFETCH(bool, create); + + QDeclarativeComponent component(&engine, TEST_FILE(file)); + + if(create) { + QObject *object = component.create(); + QVERIFY(object == 0); + } + + VERIFY_ERRORS(errorFile.toLatin1().constData()); +} + +void tst_qdeclarativelanguage::errors_data() +{ + QTest::addColumn("file"); + QTest::addColumn("errorFile"); + QTest::addColumn("create"); + + QTest::newRow("nonexistantProperty.1") << "nonexistantProperty.1.qml" << "nonexistantProperty.1.errors.txt" << false; + QTest::newRow("nonexistantProperty.2") << "nonexistantProperty.2.qml" << "nonexistantProperty.2.errors.txt" << false; + QTest::newRow("nonexistantProperty.3") << "nonexistantProperty.3.qml" << "nonexistantProperty.3.errors.txt" << false; + QTest::newRow("nonexistantProperty.4") << "nonexistantProperty.4.qml" << "nonexistantProperty.4.errors.txt" << false; + QTest::newRow("nonexistantProperty.5") << "nonexistantProperty.5.qml" << "nonexistantProperty.5.errors.txt" << false; + QTest::newRow("nonexistantProperty.6") << "nonexistantProperty.6.qml" << "nonexistantProperty.6.errors.txt" << false; + + QTest::newRow("wrongType (string for int)") << "wrongType.1.qml" << "wrongType.1.errors.txt" << false; + QTest::newRow("wrongType (int for bool)") << "wrongType.2.qml" << "wrongType.2.errors.txt" << false; + QTest::newRow("wrongType (bad rect)") << "wrongType.3.qml" << "wrongType.3.errors.txt" << false; + + QTest::newRow("wrongType (invalid enum)") << "wrongType.4.qml" << "wrongType.4.errors.txt" << false; + QTest::newRow("wrongType (int for uint)") << "wrongType.5.qml" << "wrongType.5.errors.txt" << false; + QTest::newRow("wrongType (string for real)") << "wrongType.6.qml" << "wrongType.6.errors.txt" << false; + QTest::newRow("wrongType (int for color)") << "wrongType.7.qml" << "wrongType.7.errors.txt" << false; + QTest::newRow("wrongType (int for date)") << "wrongType.8.qml" << "wrongType.8.errors.txt" << false; + QTest::newRow("wrongType (int for time)") << "wrongType.9.qml" << "wrongType.9.errors.txt" << false; + QTest::newRow("wrongType (int for datetime)") << "wrongType.10.qml" << "wrongType.10.errors.txt" << false; + QTest::newRow("wrongType (string for point)") << "wrongType.11.qml" << "wrongType.11.errors.txt" << false; + QTest::newRow("wrongType (color for size)") << "wrongType.12.qml" << "wrongType.12.errors.txt" << false; + QTest::newRow("wrongType (number string for int)") << "wrongType.13.qml" << "wrongType.13.errors.txt" << false; + QTest::newRow("wrongType (int for string)") << "wrongType.14.qml" << "wrongType.14.errors.txt" << false; + QTest::newRow("wrongType (int for url)") << "wrongType.15.qml" << "wrongType.15.errors.txt" << false; + QTest::newRow("wrongType (invalid object)") << "wrongType.16.qml" << "wrongType.16.errors.txt" << false; + + QTest::newRow("readOnly.1") << "readOnly.1.qml" << "readOnly.1.errors.txt" << false; + QTest::newRow("readOnly.2") << "readOnly.2.qml" << "readOnly.2.errors.txt" << false; + QTest::newRow("readOnly.3") << "readOnly.3.qml" << "readOnly.3.errors.txt" << false; + QTest::newRow("readOnly.4") << "readOnly.4.qml" << "readOnly.4.errors.txt" << false; + QTest::newRow("readOnly.5") << "readOnly.5.qml" << "readOnly.5.errors.txt" << false; + + QTest::newRow("listAssignment.1") << "listAssignment.1.qml" << "listAssignment.1.errors.txt" << false; + QTest::newRow("listAssignment.2") << "listAssignment.2.qml" << "listAssignment.2.errors.txt" << false; + QTest::newRow("listAssignment.3") << "listAssignment.3.qml" << "listAssignment.3.errors.txt" << false; + + QTest::newRow("invalidID.1") << "invalidID.qml" << "invalidID.errors.txt" << false; + QTest::newRow("invalidID.2") << "invalidID.2.qml" << "invalidID.2.errors.txt" << false; + QTest::newRow("invalidID.3") << "invalidID.3.qml" << "invalidID.3.errors.txt" << false; + QTest::newRow("invalidID.4") << "invalidID.4.qml" << "invalidID.4.errors.txt" << false; + QTest::newRow("invalidID.5") << "invalidID.5.qml" << "invalidID.5.errors.txt" << false; + QTest::newRow("invalidID.6") << "invalidID.6.qml" << "invalidID.6.errors.txt" << false; + QTest::newRow("invalidID.7") << "invalidID.7.qml" << "invalidID.7.errors.txt" << false; + QTest::newRow("invalidID.8") << "invalidID.8.qml" << "invalidID.8.errors.txt" << false; + QTest::newRow("invalidID.9") << "invalidID.9.qml" << "invalidID.9.errors.txt" << false; + + QTest::newRow("scriptString.1") << "scriptString.1.qml" << "scriptString.1.errors.txt" << false; + QTest::newRow("scriptString.2") << "scriptString.2.qml" << "scriptString.2.errors.txt" << false; + + QTest::newRow("unsupportedProperty") << "unsupportedProperty.qml" << "unsupportedProperty.errors.txt" << false; + QTest::newRow("nullDotProperty") << "nullDotProperty.qml" << "nullDotProperty.errors.txt" << true; + QTest::newRow("fakeDotProperty") << "fakeDotProperty.qml" << "fakeDotProperty.errors.txt" << false; + QTest::newRow("duplicateIDs") << "duplicateIDs.qml" << "duplicateIDs.errors.txt" << false; + QTest::newRow("unregisteredObject") << "unregisteredObject.qml" << "unregisteredObject.errors.txt" << false; + QTest::newRow("empty") << "empty.qml" << "empty.errors.txt" << false; + QTest::newRow("missingObject") << "missingObject.qml" << "missingObject.errors.txt" << false; + QTest::newRow("failingComponent") << "failingComponentTest.qml" << "failingComponent.errors.txt" << false; + QTest::newRow("missingSignal") << "missingSignal.qml" << "missingSignal.errors.txt" << false; + QTest::newRow("finalOverride") << "finalOverride.qml" << "finalOverride.errors.txt" << false; + QTest::newRow("customParserIdNotAllowed") << "customParserIdNotAllowed.qml" << "customParserIdNotAllowed.errors.txt" << false; + + QTest::newRow("invalidGroupedProperty.1") << "invalidGroupedProperty.1.qml" << "invalidGroupedProperty.1.errors.txt" << false; + QTest::newRow("invalidGroupedProperty.2") << "invalidGroupedProperty.2.qml" << "invalidGroupedProperty.2.errors.txt" << false; + QTest::newRow("invalidGroupedProperty.3") << "invalidGroupedProperty.3.qml" << "invalidGroupedProperty.3.errors.txt" << false; + QTest::newRow("invalidGroupedProperty.4") << "invalidGroupedProperty.4.qml" << "invalidGroupedProperty.4.errors.txt" << false; + QTest::newRow("invalidGroupedProperty.5") << "invalidGroupedProperty.5.qml" << "invalidGroupedProperty.5.errors.txt" << false; + QTest::newRow("invalidGroupedProperty.6") << "invalidGroupedProperty.6.qml" << "invalidGroupedProperty.6.errors.txt" << false; + QTest::newRow("invalidGroupedProperty.7") << "invalidGroupedProperty.7.qml" << "invalidGroupedProperty.7.errors.txt" << true; + QTest::newRow("invalidGroupedProperty.8") << "invalidGroupedProperty.8.qml" << "invalidGroupedProperty.8.errors.txt" << false; + QTest::newRow("invalidGroupedProperty.9") << "invalidGroupedProperty.9.qml" << "invalidGroupedProperty.9.errors.txt" << false; + QTest::newRow("invalidGroupedProperty.10") << "invalidGroupedProperty.10.qml" << "invalidGroupedProperty.10.errors.txt" << false; + + QTest::newRow("importNamespaceConflict") << "importNamespaceConflict.qml" << "importNamespaceConflict.errors.txt" << false; + QTest::newRow("importVersionMissing (builtin)") << "importVersionMissingBuiltIn.qml" << "importVersionMissingBuiltIn.errors.txt" << false; + QTest::newRow("importVersionMissing (installed)") << "importVersionMissingInstalled.qml" << "importVersionMissingInstalled.errors.txt" << false; + QTest::newRow("importNonExist (installed)") << "importNonExist.qml" << "importNonExist.errors.txt" << false; + QTest::newRow("importNonExistOlder (installed)") << "importNonExistOlder.qml" << "importNonExistOlder.errors.txt" << false; + QTest::newRow("importNewerVersion (installed)") << "importNewerVersion.qml" << "importNewerVersion.errors.txt" << false; + QTest::newRow("invalidImportID") << "invalidImportID.qml" << "invalidImportID.errors.txt" << false; + QTest::newRow("importFile") << "importFile.qml" << "importFile.errors.txt" << false; + + QTest::newRow("signal.1") << "signal.1.qml" << "signal.1.errors.txt" << false; + QTest::newRow("signal.2") << "signal.2.qml" << "signal.2.errors.txt" << false; + QTest::newRow("signal.3") << "signal.3.qml" << "signal.3.errors.txt" << false; + QTest::newRow("signal.4") << "signal.4.qml" << "signal.4.errors.txt" << false; + + QTest::newRow("method.1") << "method.1.qml" << "method.1.errors.txt" << false; + + QTest::newRow("property.1") << "property.1.qml" << "property.1.errors.txt" << false; + QTest::newRow("property.2") << "property.2.qml" << "property.2.errors.txt" << false; + QTest::newRow("property.3") << "property.3.qml" << "property.3.errors.txt" << false; + QTest::newRow("property.4") << "property.4.qml" << "property.4.errors.txt" << false; + QTest::newRow("property.5") << "property.5.qml" << "property.5.errors.txt" << false; + QTest::newRow("property.6") << "property.6.qml" << "property.6.errors.txt" << false; + QTest::newRow("property.7") << "property.7.qml" << "property.7.errors.txt" << false; + + QTest::newRow("importScript.1") << "importscript.1.qml" << "importscript.1.errors.txt" << false; + + QTest::newRow("Component.1") << "component.1.qml" << "component.1.errors.txt" << false; + QTest::newRow("Component.2") << "component.2.qml" << "component.2.errors.txt" << false; + QTest::newRow("Component.3") << "component.3.qml" << "component.3.errors.txt" << false; + QTest::newRow("Component.4") << "component.4.qml" << "component.4.errors.txt" << false; + QTest::newRow("Component.5") << "component.5.qml" << "component.5.errors.txt" << false; + QTest::newRow("Component.6") << "component.6.qml" << "component.6.errors.txt" << false; + QTest::newRow("Component.7") << "component.7.qml" << "component.7.errors.txt" << false; + QTest::newRow("Component.8") << "component.8.qml" << "component.8.errors.txt" << false; + QTest::newRow("Component.9") << "component.9.qml" << "component.9.errors.txt" << false; + + QTest::newRow("MultiSet.1") << "multiSet.1.qml" << "multiSet.1.errors.txt" << false; + QTest::newRow("MultiSet.2") << "multiSet.2.qml" << "multiSet.2.errors.txt" << false; + QTest::newRow("MultiSet.3") << "multiSet.3.qml" << "multiSet.3.errors.txt" << false; + QTest::newRow("MultiSet.4") << "multiSet.4.qml" << "multiSet.4.errors.txt" << false; + QTest::newRow("MultiSet.5") << "multiSet.5.qml" << "multiSet.5.errors.txt" << false; + QTest::newRow("MultiSet.6") << "multiSet.6.qml" << "multiSet.6.errors.txt" << false; + QTest::newRow("MultiSet.7") << "multiSet.7.qml" << "multiSet.7.errors.txt" << false; + QTest::newRow("MultiSet.8") << "multiSet.8.qml" << "multiSet.8.errors.txt" << false; + QTest::newRow("MultiSet.9") << "multiSet.9.qml" << "multiSet.9.errors.txt" << false; + QTest::newRow("MultiSet.10") << "multiSet.10.qml" << "multiSet.10.errors.txt" << false; + QTest::newRow("MultiSet.11") << "multiSet.11.qml" << "multiSet.11.errors.txt" << false; + + QTest::newRow("dynamicMeta.1") << "dynamicMeta.1.qml" << "dynamicMeta.1.errors.txt" << false; + QTest::newRow("dynamicMeta.2") << "dynamicMeta.2.qml" << "dynamicMeta.2.errors.txt" << false; + QTest::newRow("dynamicMeta.3") << "dynamicMeta.3.qml" << "dynamicMeta.3.errors.txt" << false; + QTest::newRow("dynamicMeta.4") << "dynamicMeta.4.qml" << "dynamicMeta.4.errors.txt" << false; + QTest::newRow("dynamicMeta.5") << "dynamicMeta.5.qml" << "dynamicMeta.5.errors.txt" << false; + + QTest::newRow("invalidAlias.1") << "invalidAlias.1.qml" << "invalidAlias.1.errors.txt" << false; + QTest::newRow("invalidAlias.2") << "invalidAlias.2.qml" << "invalidAlias.2.errors.txt" << false; + QTest::newRow("invalidAlias.3") << "invalidAlias.3.qml" << "invalidAlias.3.errors.txt" << false; + QTest::newRow("invalidAlias.4") << "invalidAlias.4.qml" << "invalidAlias.4.errors.txt" << false; + QTest::newRow("invalidAlias.5") << "invalidAlias.5.qml" << "invalidAlias.5.errors.txt" << false; + QTest::newRow("invalidAlias.6") << "invalidAlias.6.qml" << "invalidAlias.6.errors.txt" << false; + QTest::newRow("invalidAlias.7") << "invalidAlias.7.qml" << "invalidAlias.7.errors.txt" << false; + QTest::newRow("invalidAlias.8") << "invalidAlias.8.qml" << "invalidAlias.8.errors.txt" << false; + QTest::newRow("invalidAlias.9") << "invalidAlias.9.qml" << "invalidAlias.9.errors.txt" << false; + QTest::newRow("invalidAlias.10") << "invalidAlias.10.qml" << "invalidAlias.10.errors.txt" << false; + + QTest::newRow("invalidAttachedProperty.1") << "invalidAttachedProperty.1.qml" << "invalidAttachedProperty.1.errors.txt" << false; + QTest::newRow("invalidAttachedProperty.2") << "invalidAttachedProperty.2.qml" << "invalidAttachedProperty.2.errors.txt" << false; + QTest::newRow("invalidAttachedProperty.3") << "invalidAttachedProperty.3.qml" << "invalidAttachedProperty.3.errors.txt" << false; + QTest::newRow("invalidAttachedProperty.4") << "invalidAttachedProperty.4.qml" << "invalidAttachedProperty.4.errors.txt" << false; + QTest::newRow("invalidAttachedProperty.5") << "invalidAttachedProperty.5.qml" << "invalidAttachedProperty.5.errors.txt" << false; + QTest::newRow("invalidAttachedProperty.6") << "invalidAttachedProperty.6.qml" << "invalidAttachedProperty.6.errors.txt" << false; + QTest::newRow("invalidAttachedProperty.7") << "invalidAttachedProperty.7.qml" << "invalidAttachedProperty.7.errors.txt" << false; + QTest::newRow("invalidAttachedProperty.8") << "invalidAttachedProperty.8.qml" << "invalidAttachedProperty.8.errors.txt" << false; + QTest::newRow("invalidAttachedProperty.9") << "invalidAttachedProperty.9.qml" << "invalidAttachedProperty.9.errors.txt" << false; + QTest::newRow("invalidAttachedProperty.10") << "invalidAttachedProperty.10.qml" << "invalidAttachedProperty.10.errors.txt" << false; + QTest::newRow("invalidAttachedProperty.11") << "invalidAttachedProperty.11.qml" << "invalidAttachedProperty.11.errors.txt" << false; + QTest::newRow("invalidAttachedProperty.12") << "invalidAttachedProperty.12.qml" << "invalidAttachedProperty.12.errors.txt" << false; + QTest::newRow("invalidAttachedProperty.13") << "invalidAttachedProperty.13.qml" << "invalidAttachedProperty.13.errors.txt" << false; + + QTest::newRow("assignValueToSignal") << "assignValueToSignal.qml" << "assignValueToSignal.errors.txt" << false; + QTest::newRow("emptySignal") << "emptySignal.qml" << "emptySignal.errors.txt" << false; + + QTest::newRow("nestedErrors") << "nestedErrors.qml" << "nestedErrors.errors.txt" << false; + QTest::newRow("defaultGrouped") << "defaultGrouped.qml" << "defaultGrouped.errors.txt" << false; + QTest::newRow("doubleSignal") << "doubleSignal.qml" << "doubleSignal.errors.txt" << false; + QTest::newRow("invalidRoot") << "invalidRoot.qml" << "invalidRoot.errors.txt" << false; + QTest::newRow("missingValueTypeProperty") << "missingValueTypeProperty.qml" << "missingValueTypeProperty.errors.txt" << false; + QTest::newRow("objectValueTypeProperty") << "objectValueTypeProperty.qml" << "objectValueTypeProperty.errors.txt" << false; + QTest::newRow("enumTypes") << "enumTypes.qml" << "enumTypes.errors.txt" << false; + QTest::newRow("noCreation") << "noCreation.qml" << "noCreation.errors.txt" << false; + QTest::newRow("destroyedSignal") << "destroyedSignal.qml" << "destroyedSignal.errors.txt" << false; + QTest::newRow("assignToNamespace") << "assignToNamespace.qml" << "assignToNamespace.errors.txt" << false; + QTest::newRow("invalidOn") << "invalidOn.qml" << "invalidOn.errors.txt" << false; + QTest::newRow("invalidProperty") << "invalidProperty.qml" << "invalidProperty.errors.txt" << false; + QTest::newRow("nonScriptableProperty") << "nonScriptableProperty.qml" << "nonScriptableProperty.errors.txt" << false; + QTest::newRow("notAvailable") << "notAvailable.qml" << "notAvailable.errors.txt" << false; + QTest::newRow("singularProperty") << "singularProperty.qml" << "singularProperty.errors.txt" << false; + QTest::newRow("singularProperty.2") << "singularProperty.2.qml" << "singularProperty.2.errors.txt" << false; + QTest::newRow("incorrectCase") << "incorrectCase.qml" +#if defined(Q_OS_MAC) || defined(Q_OS_WIN32) + << "incorrectCase.errors.insensitive.txt" +#else + << "incorrectCase.errors.sensitive.txt" +#endif + << false; + + QTest::newRow("metaobjectRevision.1") << "metaobjectRevision.1.qml" << "metaobjectRevision.1.errors.txt" << false; + QTest::newRow("metaobjectRevision.2") << "metaobjectRevision.2.qml" << "metaobjectRevision.2.errors.txt" << false; + QTest::newRow("metaobjectRevision.3") << "metaobjectRevision.3.qml" << "metaobjectRevision.3.errors.txt" << false; +} + + +void tst_qdeclarativelanguage::errors() +{ + QFETCH(QString, file); + QFETCH(QString, errorFile); + QFETCH(bool, create); + + QDeclarativeComponent component(&engine, TEST_FILE(file)); + + if(create) { + QObject *object = component.create(); + QVERIFY(object == 0); + } + + VERIFY_ERRORS(errorFile.toLatin1().constData()); +} + +void tst_qdeclarativelanguage::simpleObject() +{ + QDeclarativeComponent component(&engine, TEST_FILE("simpleObject.qml")); + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); +} + +void tst_qdeclarativelanguage::simpleContainer() +{ + QDeclarativeComponent component(&engine, TEST_FILE("simpleContainer.qml")); + VERIFY_ERRORS(0); + MyContainer *container= qobject_cast(component.create()); + QVERIFY(container != 0); + QCOMPARE(container->getChildren()->count(),2); +} + +void tst_qdeclarativelanguage::interfaceProperty() +{ + QDeclarativeComponent component(&engine, TEST_FILE("interfaceProperty.qml")); + VERIFY_ERRORS(0); + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QVERIFY(object->interface()); + QVERIFY(object->interface()->id == 913); +} + +void tst_qdeclarativelanguage::interfaceQList() +{ + QDeclarativeComponent component(&engine, TEST_FILE("interfaceQList.qml")); + VERIFY_ERRORS(0); + MyContainer *container= qobject_cast(component.create()); + QVERIFY(container != 0); + QVERIFY(container->getQListInterfaces()->count() == 2); + for(int ii = 0; ii < 2; ++ii) + QVERIFY(container->getQListInterfaces()->at(ii)->id == 913); +} + +void tst_qdeclarativelanguage::assignObjectToSignal() +{ + QDeclarativeComponent component(&engine, TEST_FILE("assignObjectToSignal.qml")); + VERIFY_ERRORS(0); + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QTest::ignoreMessage(QtWarningMsg, "MyQmlObject::basicSlot"); + emit object->basicSignal(); +} + +void tst_qdeclarativelanguage::assignObjectToVariant() +{ + QDeclarativeComponent component(&engine, TEST_FILE("assignObjectToVariant.qml")); + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + QVariant v = object->property("a"); + QVERIFY(v.userType() == qMetaTypeId()); +} + +void tst_qdeclarativelanguage::assignLiteralSignalProperty() +{ + QDeclarativeComponent component(&engine, TEST_FILE("assignLiteralSignalProperty.qml")); + VERIFY_ERRORS(0); + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QCOMPARE(object->onLiteralSignal(), 10); +} + +// Test is an external component can be loaded and assigned (to a qlist) +void tst_qdeclarativelanguage::assignQmlComponent() +{ + QDeclarativeComponent component(&engine, TEST_FILE("assignQmlComponent.qml")); + VERIFY_ERRORS(0); + MyContainer *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QVERIFY(object->getChildren()->count() == 1); + QObject *child = object->getChildren()->at(0); + QCOMPARE(child->property("x"), QVariant(10)); + QCOMPARE(child->property("y"), QVariant(11)); +} + +// Test literal assignment to all the basic types +void tst_qdeclarativelanguage::assignBasicTypes() +{ + QDeclarativeComponent component(&engine, TEST_FILE("assignBasicTypes.qml")); + VERIFY_ERRORS(0); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QCOMPARE(object->flagProperty(), MyTypeObject::FlagVal1 | MyTypeObject::FlagVal3); + QCOMPARE(object->enumProperty(), MyTypeObject::EnumVal2); + QCOMPARE(object->stringProperty(), QString("Hello World!")); + QCOMPARE(object->uintProperty(), uint(10)); + QCOMPARE(object->intProperty(), -19); + QCOMPARE((float)object->realProperty(), float(23.2)); + QCOMPARE((float)object->doubleProperty(), float(-19.7)); + QCOMPARE((float)object->floatProperty(), float(8.5)); + QCOMPARE(object->colorProperty(), QColor("red")); + QCOMPARE(object->dateProperty(), QDate(1982, 11, 25)); + QCOMPARE(object->timeProperty(), QTime(11, 11, 32)); + QCOMPARE(object->dateTimeProperty(), QDateTime(QDate(2009, 5, 12), QTime(13, 22, 1))); + QCOMPARE(object->pointProperty(), QPoint(99,13)); + QCOMPARE(object->pointFProperty(), QPointF((float)-10.1, (float)12.3)); + QCOMPARE(object->sizeProperty(), QSize(99, 13)); + QCOMPARE(object->sizeFProperty(), QSizeF((float)0.1, (float)0.2)); + QCOMPARE(object->rectProperty(), QRect(9, 7, 100, 200)); + QCOMPARE(object->rectFProperty(), QRectF((float)1000.1, (float)-10.9, (float)400, (float)90.99)); + QCOMPARE(object->boolProperty(), true); + QCOMPARE(object->variantProperty(), QVariant("Hello World!")); + QCOMPARE(object->vectorProperty(), QVector3D(10, 1, 2.2)); + QCOMPARE(object->urlProperty(), component.url().resolved(QUrl("main.qml"))); + QVERIFY(object->objectProperty() != 0); + MyTypeObject *child = qobject_cast(object->objectProperty()); + QVERIFY(child != 0); + QCOMPARE(child->intProperty(), 8); +} + +// Test edge case type assignments +void tst_qdeclarativelanguage::assignTypeExtremes() +{ + QDeclarativeComponent component(&engine, TEST_FILE("assignTypeExtremes.qml")); + VERIFY_ERRORS(0); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QCOMPARE(object->uintProperty(), 0xEE6B2800); + QCOMPARE(object->intProperty(), -0x77359400); +} + +// Test that a composite type can assign to a property of its base type +void tst_qdeclarativelanguage::assignCompositeToType() +{ + QDeclarativeComponent component(&engine, TEST_FILE("assignCompositeToType.qml")); + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); +} + +// Test that literals are stored correctly in variant properties +void tst_qdeclarativelanguage::assignLiteralToVariant() +{ + QDeclarativeComponent component(&engine, TEST_FILE("assignLiteralToVariant.qml")); + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("test1").userType(), (int)QVariant::Int); + QCOMPARE(object->property("test2").userType(), (int)QMetaType::Double); + QCOMPARE(object->property("test3").userType(), (int)QVariant::String); + QCOMPARE(object->property("test4").userType(), (int)QVariant::Color); + QCOMPARE(object->property("test5").userType(), (int)QVariant::RectF); + QCOMPARE(object->property("test6").userType(), (int)QVariant::PointF); + QCOMPARE(object->property("test7").userType(), (int)QVariant::SizeF); + QCOMPARE(object->property("test8").userType(), (int)QVariant::Vector3D); + QCOMPARE(object->property("test9").userType(), (int)QVariant::String); + QCOMPARE(object->property("test10").userType(), (int)QVariant::Bool); + QCOMPARE(object->property("test11").userType(), (int)QVariant::Bool); + + QVERIFY(object->property("test1") == QVariant(1)); + QVERIFY(object->property("test2") == QVariant((double)1.7)); + QVERIFY(object->property("test3") == QVariant(QString(QLatin1String("Hello world!")))); + QVERIFY(object->property("test4") == QVariant(QColor::fromRgb(0xFF008800))); + QVERIFY(object->property("test5") == QVariant(QRectF(10, 10, 10, 10))); + QVERIFY(object->property("test6") == QVariant(QPointF(10, 10))); + QVERIFY(object->property("test7") == QVariant(QSizeF(10, 10))); + QVERIFY(object->property("test8") == QVariant(QVector3D(100, 100, 100))); + QVERIFY(object->property("test9") == QVariant(QString(QLatin1String("#FF008800")))); + QVERIFY(object->property("test10") == QVariant(bool(true))); + QVERIFY(object->property("test11") == QVariant(bool(false))); + + delete object; +} + +// Tests that custom parser types can be instantiated +void tst_qdeclarativelanguage::customParserTypes() +{ + QDeclarativeComponent component(&engine, TEST_FILE("customParserTypes.qml")); + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + QVERIFY(object->property("count") == QVariant(2)); +} + +// Tests that the root item can be a custom component +void tst_qdeclarativelanguage::rootAsQmlComponent() +{ + QDeclarativeComponent component(&engine, TEST_FILE("rootAsQmlComponent.qml")); + VERIFY_ERRORS(0); + MyContainer *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QCOMPARE(object->property("x"), QVariant(11)); + QCOMPARE(object->getChildren()->count(), 2); +} + +// Tests that components can be specified inline +void tst_qdeclarativelanguage::inlineQmlComponents() +{ + QDeclarativeComponent component(&engine, TEST_FILE("inlineQmlComponents.qml")); + VERIFY_ERRORS(0); + MyContainer *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QCOMPARE(object->getChildren()->count(), 1); + QDeclarativeComponent *comp = qobject_cast(object->getChildren()->at(0)); + QVERIFY(comp != 0); + MyQmlObject *compObject = qobject_cast(comp->create()); + QVERIFY(compObject != 0); + QCOMPARE(compObject->value(), 11); +} + +// Tests that types that have an id property have it set +void tst_qdeclarativelanguage::idProperty() +{ + QDeclarativeComponent component(&engine, TEST_FILE("idProperty.qml")); + VERIFY_ERRORS(0); + MyContainer *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QCOMPARE(object->getChildren()->count(), 1); + MyTypeObject *child = + qobject_cast(object->getChildren()->at(0)); + QVERIFY(child != 0); + QCOMPARE(child->id(), QString("myObjectId")); + QCOMPARE(object->property("object"), QVariant::fromValue((QObject *)child)); +} + +// Tests automatic connection to notify signals if "onBlahChanged" syntax is used +// even if the notify signal for "blah" is not called "blahChanged" +void tst_qdeclarativelanguage::autoNotifyConnection() +{ + QDeclarativeComponent component(&engine, TEST_FILE("autoNotifyConnection.qml")); + VERIFY_ERRORS(0); + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QMetaProperty prop = object->metaObject()->property(object->metaObject()->indexOfProperty("receivedNotify")); + QVERIFY(prop.isValid()); + + QCOMPARE(prop.read(object), QVariant::fromValue(false)); + object->setPropertyWithNotify(1); + QCOMPARE(prop.read(object), QVariant::fromValue(true)); +} + +// Tests that signals can be assigned to +void tst_qdeclarativelanguage::assignSignal() +{ + QDeclarativeComponent component(&engine, TEST_FILE("assignSignal.qml")); + VERIFY_ERRORS(0); + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QTest::ignoreMessage(QtWarningMsg, "MyQmlObject::basicSlot"); + emit object->basicSignal(); + QTest::ignoreMessage(QtWarningMsg, "MyQmlObject::basicSlotWithArgs(9)"); + emit object->basicParameterizedSignal(9); +} + +// Tests the creation and assignment of dynamic properties +void tst_qdeclarativelanguage::dynamicProperties() +{ + QDeclarativeComponent component(&engine, TEST_FILE("dynamicProperties.qml")); + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + QCOMPARE(object->property("intProperty"), QVariant(10)); + QCOMPARE(object->property("boolProperty"), QVariant(false)); + QCOMPARE(object->property("doubleProperty"), QVariant(-10.1)); + QCOMPARE(object->property("realProperty"), QVariant((qreal)-19.9)); + QCOMPARE(object->property("stringProperty"), QVariant("Hello World!")); + QCOMPARE(object->property("urlProperty"), QVariant(TEST_FILE("main.qml"))); + QCOMPARE(object->property("colorProperty"), QVariant(QColor("red"))); + QCOMPARE(object->property("dateProperty"), QVariant(QDate(1945, 9, 2))); + QCOMPARE(object->property("varProperty"), QVariant("Hello World!")); +} + +// Test that nested types can use dynamic properties +void tst_qdeclarativelanguage::dynamicPropertiesNested() +{ + QDeclarativeComponent component(&engine, TEST_FILE("dynamicPropertiesNested.qml")); + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("super_a").toInt(), 11); // Overridden + QCOMPARE(object->property("super_c").toInt(), 14); // Inherited + QCOMPARE(object->property("a").toInt(), 13); // New + QCOMPARE(object->property("b").toInt(), 12); // New + + delete object; +} + +// Tests the creation and assignment to dynamic list properties +void tst_qdeclarativelanguage::listProperties() +{ + QDeclarativeComponent component(&engine, TEST_FILE("listProperties.qml")); + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("test").toInt(), 2); +} + +// Tests the creation and assignment of dynamic object properties +// ### Not complete +void tst_qdeclarativelanguage::dynamicObjectProperties() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("dynamicObjectProperties.qml")); + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + + QVERIFY(object->property("objectProperty") == qVariantFromValue((QObject*)0)); + QVERIFY(object->property("objectProperty2") != qVariantFromValue((QObject*)0)); + } + { + QDeclarativeComponent component(&engine, TEST_FILE("dynamicObjectProperties.2.qml")); + QEXPECT_FAIL("", "QTBUG-10822", Abort); + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + + QVERIFY(object->property("objectProperty") != qVariantFromValue((QObject*)0)); + } +} + +// Tests the declaration of dynamic signals and slots +void tst_qdeclarativelanguage::dynamicSignalsAndSlots() +{ + QTest::ignoreMessage(QtDebugMsg, "1921"); + + QDeclarativeComponent component(&engine, TEST_FILE("dynamicSignalsAndSlots.qml")); + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + QVERIFY(object->metaObject()->indexOfMethod("signal1()") != -1); + QVERIFY(object->metaObject()->indexOfMethod("signal2()") != -1); + QVERIFY(object->metaObject()->indexOfMethod("slot1()") != -1); + QVERIFY(object->metaObject()->indexOfMethod("slot2()") != -1); + + QCOMPARE(object->property("test").toInt(), 0); + QMetaObject::invokeMethod(object, "slot3", Qt::DirectConnection, Q_ARG(QVariant, QVariant(10))); + QCOMPARE(object->property("test").toInt(), 10); +} + +void tst_qdeclarativelanguage::simpleBindings() +{ + QDeclarativeComponent component(&engine, TEST_FILE("simpleBindings.qml")); + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + QCOMPARE(object->property("value1"), QVariant(10)); + QCOMPARE(object->property("value2"), QVariant(10)); + QCOMPARE(object->property("value3"), QVariant(21)); + QCOMPARE(object->property("value4"), QVariant(10)); + QCOMPARE(object->property("objectProperty"), QVariant::fromValue(object)); +} + +void tst_qdeclarativelanguage::autoComponentCreation() +{ + QDeclarativeComponent component(&engine, TEST_FILE("autoComponentCreation.qml")); + VERIFY_ERRORS(0); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QVERIFY(object->componentProperty() != 0); + MyTypeObject *child = qobject_cast(object->componentProperty()->create()); + QVERIFY(child != 0); + QCOMPARE(child->realProperty(), qreal(9)); +} + +void tst_qdeclarativelanguage::propertyValueSource() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("propertyValueSource.qml")); + VERIFY_ERRORS(0); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QList valueSources; + QObjectList allChildren = object->findChildren(); + foreach (QObject *child, allChildren) { + if (qobject_cast(child)) + valueSources.append(child); + } + + QCOMPARE(valueSources.count(), 1); + MyPropertyValueSource *valueSource = + qobject_cast(valueSources.at(0)); + QVERIFY(valueSource != 0); + QCOMPARE(valueSource->prop.object(), qobject_cast(object)); + QCOMPARE(valueSource->prop.name(), QString(QLatin1String("intProperty"))); + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("propertyValueSource.2.qml")); + VERIFY_ERRORS(0); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QList valueSources; + QObjectList allChildren = object->findChildren(); + foreach (QObject *child, allChildren) { + if (qobject_cast(child)) + valueSources.append(child); + } + + QCOMPARE(valueSources.count(), 1); + MyPropertyValueSource *valueSource = + qobject_cast(valueSources.at(0)); + QVERIFY(valueSource != 0); + QCOMPARE(valueSource->prop.object(), qobject_cast(object)); + QCOMPARE(valueSource->prop.name(), QString(QLatin1String("intProperty"))); + } +} + +void tst_qdeclarativelanguage::attachedProperties() +{ + QDeclarativeComponent component(&engine, TEST_FILE("attachedProperties.qml")); + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + QObject *attached = qmlAttachedPropertiesObject(object); + QVERIFY(attached != 0); + QCOMPARE(attached->property("value"), QVariant(10)); + QCOMPARE(attached->property("value2"), QVariant(13)); +} + +// Tests non-static object properties +void tst_qdeclarativelanguage::dynamicObjects() +{ + QDeclarativeComponent component(&engine, TEST_FILE("dynamicObject.1.qml")); + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); +} + +// Tests the registration of custom variant string converters +void tst_qdeclarativelanguage::customVariantTypes() +{ + QDeclarativeComponent component(&engine, TEST_FILE("customVariantTypes.qml")); + VERIFY_ERRORS(0); + MyQmlObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QCOMPARE(object->customType().a, 10); +} + +void tst_qdeclarativelanguage::valueTypes() +{ + QDeclarativeComponent component(&engine, TEST_FILE("valueTypes.qml")); + VERIFY_ERRORS(0); + + QString message = component.url().toString() + ":2:1: QML MyTypeObject: Binding loop detected for property \"rectProperty.width\""; + QTest::ignoreMessage(QtWarningMsg, qPrintable(message)); + QTest::ignoreMessage(QtWarningMsg, qPrintable(message)); + + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + + QCOMPARE(object->rectProperty(), QRect(10, 11, 12, 13)); + QCOMPARE(object->rectProperty2(), QRect(10, 11, 12, 13)); + QCOMPARE(object->intProperty(), 10); + object->doAction(); + QCOMPARE(object->rectProperty(), QRect(12, 11, 14, 13)); + QCOMPARE(object->rectProperty2(), QRect(12, 11, 14, 13)); + QCOMPARE(object->intProperty(), 12); + + // ### +#if 0 + QDeclarativeProperty p(object, "rectProperty.x"); + QCOMPARE(p.read(), QVariant(12)); + p.write(13); + QCOMPARE(p.read(), QVariant(13)); + + quint32 r = QDeclarativePropertyPrivate::saveValueType(p.coreIndex(), p.valueTypeCoreIndex()); + QDeclarativeProperty p2; + QDeclarativePropertyPrivate::restore(p2, r, object); + QCOMPARE(p2.read(), QVariant(13)); +#endif +} + +void tst_qdeclarativelanguage::cppnamespace() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("cppnamespace.qml")); + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + delete object; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("cppnamespace.2.qml")); + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + delete object; + } +} + +void tst_qdeclarativelanguage::aliasProperties() +{ + // Simple "int" alias + { + QDeclarativeComponent component(&engine, TEST_FILE("alias.1.qml")); + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + + // Read through alias + QCOMPARE(object->property("valueAlias").toInt(), 10); + object->setProperty("value", QVariant(13)); + QCOMPARE(object->property("valueAlias").toInt(), 13); + + // Write through alias + object->setProperty("valueAlias", QVariant(19)); + QCOMPARE(object->property("valueAlias").toInt(), 19); + QCOMPARE(object->property("value").toInt(), 19); + + delete object; + } + + // Complex object alias + { + QDeclarativeComponent component(&engine, TEST_FILE("alias.2.qml")); + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + + // Read through alias + MyQmlObject *v = + qvariant_cast(object->property("aliasObject")); + QVERIFY(v != 0); + QCOMPARE(v->value(), 10); + + // Write through alias + MyQmlObject *v2 = new MyQmlObject(); + v2->setParent(object); + object->setProperty("aliasObject", qVariantFromValue(v2)); + MyQmlObject *v3 = + qvariant_cast(object->property("aliasObject")); + QVERIFY(v3 != 0); + QCOMPARE(v3, v2); + + delete object; + } + + // Nested aliases + { + QDeclarativeComponent component(&engine, TEST_FILE("alias.3.qml")); + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("value").toInt(), 1892); + QCOMPARE(object->property("value2").toInt(), 1892); + + object->setProperty("value", QVariant(1313)); + QCOMPARE(object->property("value").toInt(), 1313); + QCOMPARE(object->property("value2").toInt(), 1313); + + object->setProperty("value2", QVariant(8080)); + QCOMPARE(object->property("value").toInt(), 8080); + QCOMPARE(object->property("value2").toInt(), 8080); + + delete object; + } + + // Enum aliases + { + QDeclarativeComponent component(&engine, TEST_FILE("alias.4.qml")); + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("enumAlias").toInt(), 1); + + delete object; + } + + // Id aliases + { + QDeclarativeComponent component(&engine, TEST_FILE("alias.5.qml")); + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + + QVariant v = object->property("otherAlias"); + QCOMPARE(v.userType(), qMetaTypeId()); + MyQmlObject *o = qvariant_cast(v); + QCOMPARE(o->value(), 10); + + delete o; + + v = object->property("otherAlias"); + QCOMPARE(v.userType(), qMetaTypeId()); + o = qvariant_cast(v); + QVERIFY(o == 0); + + delete object; + } + + // Nested aliases - this used to cause a crash + { + QDeclarativeComponent component(&engine, TEST_FILE("alias.6.qml")); + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("a").toInt(), 1923); + } + + // Ptr Alias Cleanup - check that aliases to ptr types return 0 + // if the object aliased to is removed + { + QDeclarativeComponent component(&engine, TEST_FILE("alias.7.qml")); + VERIFY_ERRORS(0); + + QObject *object = component.create(); + QVERIFY(object != 0); + + QObject *object1 = qvariant_cast(object->property("object")); + QVERIFY(object1 != 0); + QObject *object2 = qvariant_cast(object1->property("object")); + QVERIFY(object2 != 0); + + QObject *alias = qvariant_cast(object->property("aliasedObject")); + QVERIFY(alias == object2); + + delete object1; + + QObject *alias2 = object; // "Random" start value + int status = -1; + void *a[] = { &alias2, 0, &status }; + QMetaObject::metacall(object, QMetaObject::ReadProperty, + object->metaObject()->indexOfProperty("aliasedObject"), a); + QVERIFY(alias2 == 0); + } + + // Simple composite type + { + QDeclarativeComponent component(&engine, TEST_FILE("alias.8.qml")); + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("value").toInt(), 10); + + delete object; + } + + // Complex composite type + { + QDeclarativeComponent component(&engine, TEST_FILE("alias.9.qml")); + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("value").toInt(), 10); + + delete object; + } + + // Valuetype alias + // Simple "int" alias + { + QDeclarativeComponent component(&engine, TEST_FILE("alias.10.qml")); + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + + // Read through alias + QCOMPARE(object->property("valueAlias").toRect(), QRect(10, 11, 9, 8)); + object->setProperty("rectProperty", QVariant(QRect(33, 12, 99, 100))); + QCOMPARE(object->property("valueAlias").toRect(), QRect(33, 12, 99, 100)); + + // Write through alias + object->setProperty("valueAlias", QVariant(QRect(3, 3, 4, 9))); + QCOMPARE(object->property("valueAlias").toRect(), QRect(3, 3, 4, 9)); + QCOMPARE(object->property("rectProperty").toRect(), QRect(3, 3, 4, 9)); + + delete object; + } + + // Valuetype sub-alias + { + QDeclarativeComponent component(&engine, TEST_FILE("alias.11.qml")); + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + + // Read through alias + QCOMPARE(object->property("aliasProperty").toInt(), 19); + object->setProperty("rectProperty", QVariant(QRect(33, 8, 102, 111))); + QCOMPARE(object->property("aliasProperty").toInt(), 33); + + // Write through alias + object->setProperty("aliasProperty", QVariant(4)); + QCOMPARE(object->property("aliasProperty").toInt(), 4); + QCOMPARE(object->property("rectProperty").toRect(), QRect(4, 8, 102, 111)); + + delete object; + } +} + +// QTBUG-13374 Test that alias properties and signals can coexist +void tst_qdeclarativelanguage::aliasPropertiesAndSignals() +{ + QDeclarativeComponent component(&engine, TEST_FILE("aliasPropertiesAndSignals.qml")); + VERIFY_ERRORS(0); + QObject *o = component.create(); + QVERIFY(o); + QCOMPARE(o->property("test").toBool(), true); + delete o; +} + +// Test that the root element in a composite type can be a Component +void tst_qdeclarativelanguage::componentCompositeType() +{ + QDeclarativeComponent component(&engine, TEST_FILE("componentCompositeType.qml")); + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); +} + +class TestType : public QObject { + Q_OBJECT +public: + TestType(QObject *p=0) : QObject(p) {} +}; + +class TestType2 : public QObject { + Q_OBJECT +public: + TestType2(QObject *p=0) : QObject(p) {} +}; + +void tst_qdeclarativelanguage::i18n_data() +{ + QTest::addColumn("file"); + QTest::addColumn("stringProperty"); + QTest::newRow("i18nStrings") << "i18nStrings.qml" << QString::fromUtf8("Test \303\241\303\242\303\243\303\244\303\245 (5 accented 'a' letters)"); + QTest::newRow("i18nDeclaredPropertyNames") << "i18nDeclaredPropertyNames.qml" << QString::fromUtf8("Test \303\241\303\242\303\243\303\244\303\245: 10"); + QTest::newRow("i18nDeclaredPropertyUse") << "i18nDeclaredPropertyUse.qml" << QString::fromUtf8("Test \303\241\303\242\303\243\303\244\303\245: 15"); + QTest::newRow("i18nScript") << "i18nScript.qml" << QString::fromUtf8("Test \303\241\303\242\303\243\303\244\303\245: 20"); + QTest::newRow("i18nType") << "i18nType.qml" << QString::fromUtf8("Test \303\241\303\242\303\243\303\244\303\245: 30"); + QTest::newRow("i18nNameSpace") << "i18nNameSpace.qml" << QString::fromUtf8("Test \303\241\303\242\303\243\303\244\303\245: 40"); +} + +void tst_qdeclarativelanguage::i18n() +{ + QFETCH(QString, file); + QFETCH(QString, stringProperty); + QDeclarativeComponent component(&engine, TEST_FILE(file)); + VERIFY_ERRORS(0); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QCOMPARE(object->stringProperty(), stringProperty); + + delete object; +} + +// Check that the Component::onCompleted attached property works +void tst_qdeclarativelanguage::onCompleted() +{ + QDeclarativeComponent component(&engine, TEST_FILE("onCompleted.qml")); + VERIFY_ERRORS(0); + QTest::ignoreMessage(QtDebugMsg, "Completed 6 10"); + QTest::ignoreMessage(QtDebugMsg, "Completed 6 10"); + QTest::ignoreMessage(QtDebugMsg, "Completed 10 11"); + QObject *object = component.create(); + QVERIFY(object != 0); +} + +// Check that the Component::onDestruction attached property works +void tst_qdeclarativelanguage::onDestruction() +{ + QDeclarativeComponent component(&engine, TEST_FILE("onDestruction.qml")); + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + + QTest::ignoreMessage(QtDebugMsg, "Destruction 6 10"); + QTest::ignoreMessage(QtDebugMsg, "Destruction 6 10"); + QTest::ignoreMessage(QtDebugMsg, "Destruction 10 11"); + delete object; +} + +// Check that assignments to QDeclarativeScriptString properties work +void tst_qdeclarativelanguage::scriptString() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("scriptString.qml")); + VERIFY_ERRORS(0); + + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QCOMPARE(object->scriptProperty().script(), QString("foo + bar")); + QCOMPARE(object->scriptProperty().scopeObject(), qobject_cast(object)); + QCOMPARE(object->scriptProperty().context(), qmlContext(object)); + + QVERIFY(object->grouped() != 0); + QCOMPARE(object->grouped()->script().script(), QString("console.log(1921)")); + QCOMPARE(object->grouped()->script().scopeObject(), qobject_cast(object)); + QCOMPARE(object->grouped()->script().context(), qmlContext(object)); + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("scriptString2.qml")); + VERIFY_ERRORS(0); + + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QCOMPARE(object->scriptProperty().script(), QString("\"hello\\n\\\"world\\\"\"")); + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("scriptString3.qml")); + VERIFY_ERRORS(0); + + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QCOMPARE(object->scriptProperty().script(), QString("12.345")); + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("scriptString4.qml")); + VERIFY_ERRORS(0); + + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QCOMPARE(object->scriptProperty().script(), QString("true")); + } +} + +// Check that default property assignments are correctly spliced into explicit +// property assignments +void tst_qdeclarativelanguage::defaultPropertyListOrder() +{ + QDeclarativeComponent component(&engine, TEST_FILE("defaultPropertyListOrder.qml")); + VERIFY_ERRORS(0); + + MyContainer *container = qobject_cast(component.create()); + QVERIFY(container != 0); + + QCOMPARE(container->getChildren()->count(), 6); + QCOMPARE(container->getChildren()->at(0)->property("index"), QVariant(0)); + QCOMPARE(container->getChildren()->at(1)->property("index"), QVariant(1)); + QCOMPARE(container->getChildren()->at(2)->property("index"), QVariant(2)); + QCOMPARE(container->getChildren()->at(3)->property("index"), QVariant(3)); + QCOMPARE(container->getChildren()->at(4)->property("index"), QVariant(4)); + QCOMPARE(container->getChildren()->at(5)->property("index"), QVariant(5)); +} + +void tst_qdeclarativelanguage::declaredPropertyValues() +{ + QDeclarativeComponent component(&engine, TEST_FILE("declaredPropertyValues.qml")); + VERIFY_ERRORS(0); +} + +void tst_qdeclarativelanguage::dontDoubleCallClassBegin() +{ + QDeclarativeComponent component(&engine, TEST_FILE("dontDoubleCallClassBegin.qml")); + QObject *o = component.create(); + QVERIFY(o); + + MyParserStatus *o2 = qobject_cast(qvariant_cast(o->property("object"))); + QVERIFY(o2); + QCOMPARE(o2->classBeginCount(), 1); + QCOMPARE(o2->componentCompleteCount(), 1); + + delete o; +} + +void tst_qdeclarativelanguage::reservedWords_data() +{ + QTest::addColumn("word"); + + QTest::newRow("abstract") << QByteArray("abstract"); + QTest::newRow("as") << QByteArray("as"); + QTest::newRow("boolean") << QByteArray("boolean"); + QTest::newRow("break") << QByteArray("break"); + QTest::newRow("byte") << QByteArray("byte"); + QTest::newRow("case") << QByteArray("case"); + QTest::newRow("catch") << QByteArray("catch"); + QTest::newRow("char") << QByteArray("char"); + QTest::newRow("class") << QByteArray("class"); + QTest::newRow("continue") << QByteArray("continue"); + QTest::newRow("const") << QByteArray("const"); + QTest::newRow("debugger") << QByteArray("debugger"); + QTest::newRow("default") << QByteArray("default"); + QTest::newRow("delete") << QByteArray("delete"); + QTest::newRow("do") << QByteArray("do"); + QTest::newRow("double") << QByteArray("double"); + QTest::newRow("else") << QByteArray("else"); + QTest::newRow("enum") << QByteArray("enum"); + QTest::newRow("export") << QByteArray("export"); + QTest::newRow("extends") << QByteArray("extends"); + QTest::newRow("false") << QByteArray("false"); + QTest::newRow("final") << QByteArray("final"); + QTest::newRow("finally") << QByteArray("finally"); + QTest::newRow("float") << QByteArray("float"); + QTest::newRow("for") << QByteArray("for"); + QTest::newRow("function") << QByteArray("function"); + QTest::newRow("goto") << QByteArray("goto"); + QTest::newRow("if") << QByteArray("if"); + QTest::newRow("implements") << QByteArray("implements"); + QTest::newRow("import") << QByteArray("import"); + QTest::newRow("in") << QByteArray("in"); + QTest::newRow("instanceof") << QByteArray("instanceof"); + QTest::newRow("int") << QByteArray("int"); + QTest::newRow("interface") << QByteArray("interface"); + QTest::newRow("long") << QByteArray("long"); + QTest::newRow("native") << QByteArray("native"); + QTest::newRow("new") << QByteArray("new"); + QTest::newRow("null") << QByteArray("null"); + QTest::newRow("package") << QByteArray("package"); + QTest::newRow("private") << QByteArray("private"); + QTest::newRow("protected") << QByteArray("protected"); + QTest::newRow("public") << QByteArray("public"); + QTest::newRow("return") << QByteArray("return"); + QTest::newRow("short") << QByteArray("short"); + QTest::newRow("static") << QByteArray("static"); + QTest::newRow("super") << QByteArray("super"); + QTest::newRow("switch") << QByteArray("switch"); + QTest::newRow("synchronized") << QByteArray("synchronized"); + QTest::newRow("this") << QByteArray("this"); + QTest::newRow("throw") << QByteArray("throw"); + QTest::newRow("throws") << QByteArray("throws"); + QTest::newRow("transient") << QByteArray("transient"); + QTest::newRow("true") << QByteArray("true"); + QTest::newRow("try") << QByteArray("try"); + QTest::newRow("typeof") << QByteArray("typeof"); + QTest::newRow("var") << QByteArray("var"); + QTest::newRow("void") << QByteArray("void"); + QTest::newRow("volatile") << QByteArray("volatile"); + QTest::newRow("while") << QByteArray("while"); + QTest::newRow("with") << QByteArray("with"); +} + +void tst_qdeclarativelanguage::reservedWords() +{ + QFETCH(QByteArray, word); + QDeclarativeComponent component(&engine); + component.setData("import QtQuick 1.0\nQtObject { property string " + word + " }", QUrl()); + QCOMPARE(component.errorString(), QLatin1String(":2 Expected token `identifier'\n")); +} + +// Check that first child of qml is of given type. Empty type insists on error. +void tst_qdeclarativelanguage::testType(const QString& qml, const QString& type, const QString& expectederror) +{ + QDeclarativeComponent component(&engine); + component.setData(qml.toUtf8(), TEST_FILE("empty.qml")); // just a file for relative local imports + + QTRY_VERIFY(!component.isLoading()); + + if (type.isEmpty()) { + QVERIFY(component.isError()); + QString actualerror; + foreach (const QDeclarativeError e, component.errors()) { + if (!actualerror.isEmpty()) + actualerror.append("; "); + actualerror.append(e.description()); + } + QCOMPARE(actualerror,expectederror); + } else { + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + QCOMPARE(QString(object->metaObject()->className()), type); + } +} + +// QTBUG-17276 +void tst_qdeclarativelanguage::inlineAssignmentsOverrideBindings() +{ + QDeclarativeComponent component(&engine, TEST_FILE("inlineAssignmentsOverrideBindings.qml")); + + QObject *o = component.create(); + QVERIFY(o != 0); + QCOMPARE(o->property("test").toInt(), 11); + delete o; +} + +// QTBUG-19354 +void tst_qdeclarativelanguage::nestedComponentRoots() +{ + QDeclarativeComponent component(&engine, TEST_FILE("nestedComponentRoots.qml")); +} + +// Import tests (QT-558) +void tst_qdeclarativelanguage::importsBuiltin_data() +{ + // QT-610 + + QTest::addColumn("qml"); + QTest::addColumn("type"); + QTest::addColumn("error"); + + // import built-ins + QTest::newRow("missing import") + << "Test {}" + << "" + << "Test is not a type"; + QTest::newRow("not in version 0.0") + << "import com.nokia.Test 0.0\n" + "Test {}" + << "" + << "Test is not a type"; + QTest::newRow("version not installed") + << "import com.nokia.Test 99.0\n" + "Test {}" + << "" + << "module \"com.nokia.Test\" version 99.0 is not installed"; + QTest::newRow("in version 0.0") + << "import com.nokia.Test 0.0\n" + "TestTP {}" + << "TestType" + << ""; + QTest::newRow("qualified in version 0.0") + << "import com.nokia.Test 0.0 as T\n" + "T.TestTP {}" + << "TestType" + << ""; + QTest::newRow("in version 1.0") + << "import com.nokia.Test 1.0\n" + "Test {}" + << "TestType" + << ""; + QTest::newRow("qualified wrong") + << "import com.nokia.Test 1.0 as T\n" // QT-610 + "Test {}" + << "" + << "Test is not a type"; + QTest::newRow("qualified right") + << "import com.nokia.Test 1.0 as T\n" + "T.Test {}" + << "TestType" + << ""; + QTest::newRow("qualified right but not in version 0.0") + << "import com.nokia.Test 0.0 as T\n" + "T.Test {}" + << "" + << "T.Test is not a type"; + QTest::newRow("in version 1.1") + << "import com.nokia.Test 1.1\n" + "Test {}" + << "TestType" + << ""; + QTest::newRow("in version 1.3") + << "import com.nokia.Test 1.3\n" + "Test {}" + << "TestType" + << ""; + QTest::newRow("in version 1.5") + << "import com.nokia.Test 1.5\n" + "Test {}" + << "TestType" + << ""; + QTest::newRow("changed in version 1.8") + << "import com.nokia.Test 1.8\n" + "Test {}" + << "TestType2" + << ""; + QTest::newRow("in version 1.12") + << "import com.nokia.Test 1.12\n" + "Test {}" + << "TestType2" + << ""; + QTest::newRow("old in version 1.9") + << "import com.nokia.Test 1.9\n" + "OldTest {}" + << "TestType" + << ""; + QTest::newRow("old in version 1.11") + << "import com.nokia.Test 1.11\n" + "OldTest {}" + << "TestType" + << ""; + QTest::newRow("multiversion 1") + << "import com.nokia.Test 1.11\n" + "import com.nokia.Test 1.12\n" + "Test {}" + << (!qmlCheckTypes()?"TestType2":"") + << (!qmlCheckTypes()?"":"Test is ambiguous. Found in com/nokia/Test in version 1.12 and 1.11"); + QTest::newRow("multiversion 2") + << "import com.nokia.Test 1.11\n" + "import com.nokia.Test 1.12\n" + "OldTest {}" + << (!qmlCheckTypes()?"TestType":"") + << (!qmlCheckTypes()?"":"OldTest is ambiguous. Found in com/nokia/Test in version 1.12 and 1.11"); + QTest::newRow("qualified multiversion 3") + << "import com.nokia.Test 1.0 as T0\n" + "import com.nokia.Test 1.8 as T8\n" + "T0.Test {}" + << "TestType" + << ""; + QTest::newRow("qualified multiversion 4") + << "import com.nokia.Test 1.0 as T0\n" + "import com.nokia.Test 1.8 as T8\n" + "T8.Test {}" + << "TestType2" + << ""; +} + +void tst_qdeclarativelanguage::importsBuiltin() +{ + QFETCH(QString, qml); + QFETCH(QString, type); + QFETCH(QString, error); + testType(qml,type,error); +} + +void tst_qdeclarativelanguage::importsLocal_data() +{ + QTest::addColumn("qml"); + QTest::addColumn("type"); + QTest::addColumn("error"); + + // import locals + QTest::newRow("local import") + << "import \"subdir\"\n" // QT-613 + "Test {}" + << "QDeclarativeRectangle" + << ""; + QTest::newRow("local import second") + << "import QtQuick 1.0\nimport \"subdir\"\n" + "Test {}" + << "QDeclarativeRectangle" + << ""; + QTest::newRow("local import subsubdir") + << "import QtQuick 1.0\nimport \"subdir/subsubdir\"\n" + "SubTest {}" + << "QDeclarativeRectangle" + << ""; + QTest::newRow("local import QTBUG-7721 A") + << "subdir.Test {}" // no longer allowed (QTBUG-7721) + << "" + << "subdir.Test - subdir is not a namespace"; + QTest::newRow("local import QTBUG-7721 B") + << "import \"subdir\" as X\n" + "X.subsubdir.SubTest {}" // no longer allowed (QTBUG-7721) + << "" + << "X.subsubdir.SubTest - nested namespaces not allowed"; + QTest::newRow("local import as") + << "import \"subdir\" as T\n" + "T.Test {}" + << "QDeclarativeRectangle" + << ""; + QTest::newRow("wrong local import as") + << "import \"subdir\" as T\n" + "Test {}" + << "" + << "Test is not a type"; + QTest::newRow("library precedence over local import") + << "import \"subdir\"\n" + "import com.nokia.Test 1.0\n" + "Test {}" + << (!qmlCheckTypes()?"TestType":"") + << (!qmlCheckTypes()?"":"Test is ambiguous. Found in com/nokia/Test and in subdir"); +} + +void tst_qdeclarativelanguage::importsLocal() +{ + QFETCH(QString, qml); + QFETCH(QString, type); + QFETCH(QString, error); + testType(qml,type,error); +} + +void tst_qdeclarativelanguage::basicRemote_data() +{ + QTest::addColumn("url"); + QTest::addColumn("type"); + QTest::addColumn("error"); + + QString serverdir = "http://127.0.0.1:14447/qtest/declarative/qmllanguage/"; + + QTest::newRow("no need for qmldir") << QUrl(serverdir+"Test.qml") << "" << ""; + QTest::newRow("absent qmldir") << QUrl(serverdir+"/noqmldir/Test.qml") << "" << ""; + QTest::newRow("need qmldir") << QUrl(serverdir+"TestLocal.qml") << "" << ""; +} + +void tst_qdeclarativelanguage::basicRemote() +{ + QFETCH(QUrl, url); + QFETCH(QString, type); + QFETCH(QString, error); + + TestHTTPServer server(14447); + server.serveDirectory(SRCDIR); + + QDeclarativeComponent component(&engine, url); + + QTRY_VERIFY(!component.isLoading()); + + if (error.isEmpty()) { + if (component.isError()) + qDebug() << component.errors(); + QVERIFY(!component.isError()); + } else { + QVERIFY(component.isError()); + } +} + +void tst_qdeclarativelanguage::importsRemote_data() +{ + QTest::addColumn("qml"); + QTest::addColumn("type"); + QTest::addColumn("error"); + + QString serverdir = "http://127.0.0.1:14447/qtest/declarative/qmllanguage"; + + QTest::newRow("remote import") << "import \""+serverdir+"\"\nTest {}" << "QDeclarativeRectangle" + << ""; + QTest::newRow("remote import with subdir") << "import \""+serverdir+"\"\nTestSubDir {}" << "QDeclarativeText" + << ""; + QTest::newRow("remote import with local") << "import \""+serverdir+"\"\nTestLocal {}" << "QDeclarativeImage" + << ""; + QTest::newRow("wrong remote import with undeclared local") << "import \""+serverdir+"\"\nWrongTestLocal {}" << "" + << "WrongTestLocal is not a type"; + QTest::newRow("wrong remote import of internal local") << "import \""+serverdir+"\"\nLocalInternal {}" << "" + << "LocalInternal is not a type"; + QTest::newRow("wrong remote import of undeclared local") << "import \""+serverdir+"\"\nUndeclaredLocal {}" << "" + << "UndeclaredLocal is not a type"; +} + +void tst_qdeclarativelanguage::importsRemote() +{ + QFETCH(QString, qml); + QFETCH(QString, type); + QFETCH(QString, error); + + TestHTTPServer server(14447); + server.serveDirectory(SRCDIR); + + testType(qml,type,error); +} + +void tst_qdeclarativelanguage::importsInstalled_data() +{ + // QT-610 + + QTest::addColumn("qml"); + QTest::addColumn("type"); + QTest::addColumn("error"); + + // import installed + QTest::newRow("installed import 0") + << "import com.nokia.installedtest0 0.0\n" + "InstalledTestTP {}" + << "QDeclarativeRectangle" + << ""; + QTest::newRow("installed import 0 as TP") + << "import com.nokia.installedtest0 0.0 as TP\n" + "TP.InstalledTestTP {}" + << "QDeclarativeRectangle" + << ""; + QTest::newRow("installed import 1") + << "import com.nokia.installedtest 1.0\n" + "InstalledTest {}" + << "QDeclarativeRectangle" + << ""; + QTest::newRow("installed import 2") + << "import com.nokia.installedtest 1.3\n" + "InstalledTest {}" + << "QDeclarativeRectangle" + << ""; + QTest::newRow("installed import 3") + << "import com.nokia.installedtest 1.4\n" + "InstalledTest {}" + << "QDeclarativeText" + << ""; + QTest::newRow("installed import minor version not available") // QTBUG-11936 + << "import com.nokia.installedtest 0.1\n" + "InstalledTest {}" + << "" + << "module \"com.nokia.installedtest\" version 0.1 is not installed"; + QTest::newRow("installed import minor version not available") // QTBUG-9627 + << "import com.nokia.installedtest 1.10\n" + "InstalledTest {}" + << "" + << "module \"com.nokia.installedtest\" version 1.10 is not installed"; + QTest::newRow("installed import major version not available") // QTBUG-9627 + << "import com.nokia.installedtest 9.0\n" + "InstalledTest {}" + << "" + << "module \"com.nokia.installedtest\" version 9.0 is not installed"; + QTest::newRow("installed import visibility") // QT-614 + << "import com.nokia.installedtest 1.4\n" + "PrivateType {}" + << "" + << "PrivateType is not a type"; +} + +void tst_qdeclarativelanguage::importsInstalled() +{ + QFETCH(QString, qml); + QFETCH(QString, type); + QFETCH(QString, error); + testType(qml,type,error); +} + + +void tst_qdeclarativelanguage::importsOrder_data() +{ + QTest::addColumn("qml"); + QTest::addColumn("type"); + QTest::addColumn("error"); + + QTest::newRow("double import") << + "import com.nokia.installedtest 1.4\n" + "import com.nokia.installedtest 1.4\n" + "InstalledTest {}" + << (!qmlCheckTypes()?"QDeclarativeText":"") + << (!qmlCheckTypes()?"":"InstalledTest is ambiguous. Found in lib/com/nokia/installedtest in version 1.4 and 1.4"); + QTest::newRow("installed import overrides 1") << + "import com.nokia.installedtest 1.0\n" + "import com.nokia.installedtest 1.4\n" + "InstalledTest {}" + << (!qmlCheckTypes()?"QDeclarativeText":"") + << (!qmlCheckTypes()?"":"InstalledTest is ambiguous. Found in lib/com/nokia/installedtest in version 1.4 and 1.0"); + QTest::newRow("installed import overrides 2") << + "import com.nokia.installedtest 1.4\n" + "import com.nokia.installedtest 1.0\n" + "InstalledTest {}" + << (!qmlCheckTypes()?"QDeclarativeRectangle":"") + << (!qmlCheckTypes()?"":"InstalledTest is ambiguous. Found in lib/com/nokia/installedtest in version 1.0 and 1.4"); + QTest::newRow("installed import re-overrides 1") << + "import com.nokia.installedtest 1.4\n" + "import com.nokia.installedtest 1.0\n" + "import com.nokia.installedtest 1.4\n" + "InstalledTest {}" + << (!qmlCheckTypes()?"QDeclarativeText":"") + << (!qmlCheckTypes()?"":"InstalledTest is ambiguous. Found in lib/com/nokia/installedtest in version 1.4 and 1.0"); + QTest::newRow("installed import re-overrides 2") << + "import com.nokia.installedtest 1.4\n" + "import com.nokia.installedtest 1.0\n" + "import com.nokia.installedtest 1.4\n" + "import com.nokia.installedtest 1.0\n" + "InstalledTest {}" + << (!qmlCheckTypes()?"QDeclarativeRectangle":"") + << (!qmlCheckTypes()?"":"InstalledTest is ambiguous. Found in lib/com/nokia/installedtest in version 1.0 and 1.4"); + + QTest::newRow("installed import versus builtin 1") << + "import com.nokia.installedtest 1.5\n" + "import QtQuick 1.0\n" + "Rectangle {}" + << (!qmlCheckTypes()?"QDeclarativeRectangle":"") + << (!qmlCheckTypes()?"":"Rectangle is ambiguous. Found in Qt and in lib/com/nokia/installedtest"); + QTest::newRow("installed import versus builtin 2") << + "import QtQuick 1.0\n" + "import com.nokia.installedtest 1.5\n" + "Rectangle {}" + << (!qmlCheckTypes()?"QDeclarativeText":"") + << (!qmlCheckTypes()?"":"Rectangle is ambiguous. Found in lib/com/nokia/installedtest and in Qt"); + QTest::newRow("namespaces cannot be overridden by types 1") << + "import QtQuick 1.0 as Rectangle\n" + "import com.nokia.installedtest 1.5\n" + "Rectangle {}" + << "" + << "Namespace Rectangle cannot be used as a type"; + QTest::newRow("namespaces cannot be overridden by types 2") << + "import QtQuick 1.0 as Rectangle\n" + "import com.nokia.installedtest 1.5\n" + "Rectangle.Image {}" + << "QDeclarativeImage" + << ""; + QTest::newRow("local last 1") << + "LocalLast {}" + << "QDeclarativeText" + << ""; + QTest::newRow("local last 2") << + "import com.nokia.installedtest 1.0\n" + "LocalLast {}" + << (!qmlCheckTypes()?"QDeclarativeRectangle":"")// i.e. from com.nokia.installedtest, not data/LocalLast.qml + << (!qmlCheckTypes()?"":"LocalLast is ambiguous. Found in lib/com/nokia/installedtest and in local directory"); +} + +void tst_qdeclarativelanguage::importsOrder() +{ + QFETCH(QString, qml); + QFETCH(QString, type); + QFETCH(QString, error); + testType(qml,type,error); +} + +void tst_qdeclarativelanguage::importIncorrectCase() +{ + QDeclarativeComponent component(&engine, TEST_FILE("importIncorrectCase.qml")); + + QList errors = component.errors(); + QCOMPARE(errors.count(), 1); + +#if defined(Q_OS_MAC) || defined(Q_OS_WIN32) + QString expectedError = QLatin1String("cannot load module \"com.Nokia.installedtest\": File name case mismatch for \"") + QFileInfo(__FILE__).absoluteDir().filePath("data/lib/com/Nokia/installedtest/qmldir") + QLatin1String("\""); +#else + QString expectedError = QLatin1String("module \"com.Nokia.installedtest\" is not installed"); +#endif + + QCOMPARE(errors.at(0).description(), expectedError); +} + +void tst_qdeclarativelanguage::qmlAttachedPropertiesObjectMethod() +{ + QObject object; + + QCOMPARE(qmlAttachedPropertiesObject(&object, false), (QObject *)0); + QCOMPARE(qmlAttachedPropertiesObject(&object, true), (QObject *)0); + + { + QDeclarativeComponent component(&engine, TEST_FILE("qmlAttachedPropertiesObjectMethod.1.qml")); + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(qmlAttachedPropertiesObject(object, false), (QObject *)0); + QVERIFY(qmlAttachedPropertiesObject(object, true) != 0); + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("qmlAttachedPropertiesObjectMethod.2.qml")); + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + + QVERIFY(qmlAttachedPropertiesObject(object, false) != 0); + QVERIFY(qmlAttachedPropertiesObject(object, true) != 0); + } +} + +void tst_qdeclarativelanguage::crash1() +{ + QDeclarativeComponent component(&engine); + component.setData("import QtQuick 1.0\nComponent {}", QUrl()); +} + +void tst_qdeclarativelanguage::crash2() +{ + QDeclarativeComponent component(&engine, TEST_FILE("crash2.qml")); +} + +// QTBUG-8676 +void tst_qdeclarativelanguage::customOnProperty() +{ + QDeclarativeComponent component(&engine, TEST_FILE("customOnProperty.qml")); + + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("on").toInt(), 10); + + delete object; +} + +// QTBUG-12601 +void tst_qdeclarativelanguage::variantNotify() +{ + QDeclarativeComponent component(&engine, TEST_FILE("variantNotify.qml")); + + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("notifyCount").toInt(), 1); + + delete object; +} + +void tst_qdeclarativelanguage::revisions() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("revisions11.qml")); + + VERIFY_ERRORS(0); + MyRevisionedClass *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->prop2(), 10.0); + + delete object; + } + { + QDeclarativeEngine myEngine; + QDeclarativeComponent component(&myEngine, TEST_FILE("revisionssub11.qml")); + + VERIFY_ERRORS(0); + MyRevisionedSubclass *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->prop1(), 10.0); + QCOMPARE(object->prop2(), 10.0); + QCOMPARE(object->prop3(), 10.0); + QCOMPARE(object->prop4(), 10.0); + + delete object; + } + { + QDeclarativeComponent component(&engine, TEST_FILE("versionedbase.qml")); + VERIFY_ERRORS(0); + MySubclass *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->prop1(), 10.0); + QCOMPARE(object->prop2(), 10.0); + + delete object; + } +} + +void tst_qdeclarativelanguage::revisionOverloads() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("allowedRevisionOverloads.qml")); + VERIFY_ERRORS(0); + } + { + QDeclarativeComponent component(&engine, TEST_FILE("disallowedRevisionOverloads.qml")); + QEXPECT_FAIL("", "QTBUG-13849", Abort); + QVERIFY(0); + VERIFY_ERRORS("disallowedRevisionOverloads.errors.txt"); + } +} + +void tst_qdeclarativelanguage::initTestCase() +{ + registerTypes(); + + // Registering the TestType class in other modules should have no adverse effects + qmlRegisterType("com.nokia.TestPre", 1, 0, "Test"); + + qmlRegisterType("com.nokia.Test", 0, 0, "TestTP"); + qmlRegisterType("com.nokia.Test", 1, 0, "Test"); + qmlRegisterType("com.nokia.Test", 1, 5, "Test"); + qmlRegisterType("com.nokia.Test", 1, 8, "Test"); + qmlRegisterType("com.nokia.Test", 1, 9, "OldTest"); + qmlRegisterType("com.nokia.Test", 1, 12, "Test"); + + // Registering the TestType class in other modules should have no adverse effects + qmlRegisterType("com.nokia.TestPost", 1, 0, "Test"); + + // Create locale-specific file + // For POSIX, this will just be data/I18nType.qml, since POSIX is 7-bit + // For iso8859-1 locale, this will just be data/I18nType?????.qml where ????? is 5 8-bit characters + // For utf-8 locale, this will be data/I18nType??????????.qml where ?????????? is 5 8-bit characters, UTF-8 encoded + QFile in(TEST_FILE(QLatin1String("I18nType30.qml")).toLocalFile()); + QVERIFY(in.open(QIODevice::ReadOnly)); + QFile out(TEST_FILE(QString::fromUtf8("I18nType\303\201\303\242\303\243\303\244\303\245.qml")).toLocalFile()); + QVERIFY(out.open(QIODevice::WriteOnly)); + out.write(in.readAll()); +} + +void tst_qdeclarativelanguage::aliasPropertyChangeSignals() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("aliasPropertyChangeSignals.qml")); + + VERIFY_ERRORS(0); + QObject *o = component.create(); + QVERIFY(o != 0); + + QCOMPARE(o->property("test").toBool(), true); + + delete o; + } + + // QTCREATORBUG-2769 + { + QDeclarativeComponent component(&engine, TEST_FILE("aliasPropertyChangeSignals.2.qml")); + + VERIFY_ERRORS(0); + QObject *o = component.create(); + QVERIFY(o != 0); + + QCOMPARE(o->property("test").toBool(), true); + + delete o; + } +} + +QTEST_MAIN(tst_qdeclarativelanguage) + +#include "tst_qdeclarativelanguage.moc" diff --git a/tests/auto/declarative/qdeclarativelayoutitem/data/layoutItem.qml b/tests/auto/declarative/qdeclarativelayoutitem/data/layoutItem.qml new file mode 100644 index 00000000..34971339 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelayoutitem/data/layoutItem.qml @@ -0,0 +1,9 @@ +import QtQuick 1.0 + +LayoutItem {//Sized by the layout + id: resizable + objectName: "resizable" + minimumSize: "100x100" + maximumSize: "300x300" + preferredSize: "200x200" +} diff --git a/tests/auto/declarative/qdeclarativelayoutitem/qdeclarativelayoutitem.pro b/tests/auto/declarative/qdeclarativelayoutitem/qdeclarativelayoutitem.pro new file mode 100644 index 00000000..d89f16cd --- /dev/null +++ b/tests/auto/declarative/qdeclarativelayoutitem/qdeclarativelayoutitem.pro @@ -0,0 +1,13 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative gui +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativelayoutitem.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} diff --git a/tests/auto/declarative/qdeclarativelayoutitem/tst_qdeclarativelayoutitem.cpp b/tests/auto/declarative/qdeclarativelayoutitem/tst_qdeclarativelayoutitem.cpp new file mode 100644 index 00000000..83848b34 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelayoutitem/tst_qdeclarativelayoutitem.cpp @@ -0,0 +1,125 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../../../shared/util.h" + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_qdeclarativelayoutitem : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativelayoutitem(); + +private slots: + void test_resizing(); +}; + +tst_qdeclarativelayoutitem::tst_qdeclarativelayoutitem() +{ +} + +void tst_qdeclarativelayoutitem::test_resizing() +{ + //Create Layout (must be done in C++) + QGraphicsView view; + QGraphicsScene scene; + QGraphicsWidget *widget = new QGraphicsWidget(); + QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(); + widget->setLayout(layout); + scene.addItem(widget); + view.setScene(&scene); + //Add the QML snippet into the layout + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/layoutItem.qml")); + QDeclarativeLayoutItem* obj = static_cast(c.create()); + QVERIFY(obj); + QCOMPARE(obj->minimumSize(), QSizeF(100,100)); + QCOMPARE(obj->preferredSize(), QSizeF(200,200)); + QCOMPARE(obj->maximumSize(), QSizeF(300,300)); + + layout->addItem(obj); + layout->setContentsMargins(0,0,0,0); + widget->setContentsMargins(0,0,0,0); + view.show(); + + QVERIFY(obj!= 0); + + widget->setGeometry(QRectF(0,0, 400,400)); + QCOMPARE(obj->width(), 300.0); + QCOMPARE(obj->height(), 300.0); + + widget->setGeometry(QRectF(0,0, 300,300)); + QCOMPARE(obj->width(), 300.0); + QCOMPARE(obj->height(), 300.0); + + widget->setGeometry(QRectF(0,0, 200,200)); + QCOMPARE(obj->width(), 200.0); + QCOMPARE(obj->height(), 200.0); + + widget->setGeometry(QRectF(0,0, 100,100)); + QCOMPARE(obj->width(), 100.0); + QCOMPARE(obj->height(), 100.0); + + widget->setGeometry(QRectF(0,0, 40,40)); + QCOMPARE(obj->width(), 100.0); + QCOMPARE(obj->height(), 100.0); + + widget->setGeometry(QRectF(0,0, 412,112)); + QCOMPARE(obj->width(), 300.0); + QCOMPARE(obj->height(), 112.0); +} + + +QTEST_MAIN(tst_qdeclarativelayoutitem) + +#include "tst_qdeclarativelayoutitem.moc" diff --git a/tests/auto/declarative/qdeclarativelistmodel/data/enumerate.qml b/tests/auto/declarative/qdeclarativelistmodel/data/enumerate.qml new file mode 100644 index 00000000..93697f33 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistmodel/data/enumerate.qml @@ -0,0 +1,24 @@ +import QtQuick 1.0 + +Item { + property string result + + ListModel { + id: model + + ListElement { + val1: 1 + val2: 2 + val3: "str" + val4: false + val5: true + } + } + + Component.onCompleted: { + var element = model.get(0); + + for (var i in element) + result += i+"="+element[i]+(element[i] ? "Y" : "N")+":"; + } +} diff --git a/tests/auto/declarative/qdeclarativelistmodel/data/model.qml b/tests/auto/declarative/qdeclarativelistmodel/data/model.qml new file mode 100644 index 00000000..bfd547ed --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistmodel/data/model.qml @@ -0,0 +1,22 @@ +import QtQuick 1.0 + +Item { + id: item + property variant model + property bool done: false + property variant result + + function evalExpressionViaWorker(commands) { + done = false + worker.sendMessage({'commands': commands, 'model': model}) + } + + WorkerScript { + id: worker + source: "script.js" + onMessage: { + item.result = messageObject.result + item.done = true + } + } +} diff --git a/tests/auto/declarative/qdeclarativelistmodel/data/multipleroles.qml b/tests/auto/declarative/qdeclarativelistmodel/data/multipleroles.qml new file mode 100644 index 00000000..cc6d9de8 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistmodel/data/multipleroles.qml @@ -0,0 +1,25 @@ +import QtQuick 1.0 +ListView { + width: 100 + height: 250 + delegate: Rectangle { + width: 100 + height: 50 + color: black ? "black": "white" + } + model: ListModel { + objectName: "listModel" + ListElement { + black: false + rounded: false + } + ListElement { + black: true + rounded: false + } + ListElement { + black: true + rounded: false + } + } +} diff --git a/tests/auto/declarative/qdeclarativelistmodel/data/script.js b/tests/auto/declarative/qdeclarativelistmodel/data/script.js new file mode 100644 index 00000000..66a4acb8 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistmodel/data/script.js @@ -0,0 +1,13 @@ +WorkerScript.onMessage = function(msg) { + var result = null + try { + for (var i=0; i +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "../../../shared/util.h" + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +Q_DECLARE_METATYPE(QList) +Q_DECLARE_METATYPE(QList) + +class tst_qdeclarativelistmodel : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativelistmodel() {} + +private: + int roleFromName(const QDeclarativeListModel *model, const QString &roleName); + QScriptValue nestedListValue(QScriptEngine *eng) const; + QDeclarativeItem *createWorkerTest(QDeclarativeEngine *eng, QDeclarativeComponent *component, QDeclarativeListModel *model); + void waitForWorker(QDeclarativeItem *item); + +private slots: + void static_types(); + void static_types_data(); + void static_i18n(); + void static_nestedElements(); + void static_nestedElements_data(); + void dynamic_data(); + void dynamic(); + void dynamic_worker_data(); + void dynamic_worker(); + void dynamic_worker_sync_data(); + void dynamic_worker_sync(); + void convertNestedToFlat_fail(); + void convertNestedToFlat_fail_data(); + void convertNestedToFlat_ok(); + void convertNestedToFlat_ok_data(); + void enumerate(); + void error_data(); + void error(); + void syncError(); + void set(); + void get(); + void get_data(); + void get_worker(); + void get_worker_data(); + void get_nested(); + void get_nested_data(); + void crash_model_with_multiple_roles(); + void set_model_cache(); + void property_changes(); + void property_changes_data(); + void property_changes_worker(); + void property_changes_worker_data(); + void clear(); +}; +int tst_qdeclarativelistmodel::roleFromName(const QDeclarativeListModel *model, const QString &roleName) +{ + QList roles = model->roles(); + for (int i=0; itoString(roles[i]) == roleName) + return roles[i]; + } + return -1; +} + +QScriptValue tst_qdeclarativelistmodel::nestedListValue(QScriptEngine *eng) const +{ + QScriptValue list = eng->newArray(); + list.setProperty(0, eng->newObject()); + list.setProperty(1, eng->newObject()); + QScriptValue sv = eng->newObject(); + sv.setProperty("foo", list); + return sv; +} + +QDeclarativeItem *tst_qdeclarativelistmodel::createWorkerTest(QDeclarativeEngine *eng, QDeclarativeComponent *component, QDeclarativeListModel *model) +{ + QDeclarativeItem *item = qobject_cast(component->create()); + QDeclarativeEngine::setContextForObject(model, eng->rootContext()); + if (item) + item->setProperty("model", qVariantFromValue(model)); + return item; +} + +void tst_qdeclarativelistmodel::waitForWorker(QDeclarativeItem *item) +{ + QEventLoop loop; + QTimer timer; + timer.setSingleShot(true); + connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit())); + + QDeclarativeProperty prop(item, "done"); + QVERIFY(prop.isValid()); + QVERIFY(prop.connectNotifySignal(&loop, SLOT(quit()))); + timer.start(10000); + loop.exec(); + QVERIFY(timer.isActive()); +} + +void tst_qdeclarativelistmodel::static_i18n() +{ + QString expect = QString::fromUtf8("na\303\257ve"); + + QString componentStr = "import QtQuick 1.0\nListModel { ListElement { prop1: \""+expect+"\"; prop2: QT_TR_NOOP(\""+expect+"\") } }"; + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine); + component.setData(componentStr.toUtf8(), QUrl::fromLocalFile("")); + QDeclarativeListModel *obj = qobject_cast(component.create()); + QVERIFY(obj != 0); + QString prop1 = obj->get(0).property(QLatin1String("prop1")).toString(); + QCOMPARE(prop1,expect); + QString prop2 = obj->get(0).property(QLatin1String("prop2")).toString(); + QCOMPARE(prop2,expect); // (no, not translated, QT_TR_NOOP is a no-op) + delete obj; +} + +void tst_qdeclarativelistmodel::static_nestedElements() +{ + QFETCH(int, elementCount); + + QStringList elements; + for (int i=0; i(component.create()); + QVERIFY(obj != 0); + + QScriptValue prop = obj->get(0).property(QLatin1String("attributes")).property(QLatin1String("count")); + QVERIFY(prop.isNumber()); + QCOMPARE(prop.toInt32(), qint32(elementCount)); + + delete obj; +} + +void tst_qdeclarativelistmodel::static_nestedElements_data() +{ + QTest::addColumn("elementCount"); + + QTest::newRow("0 items") << 0; + QTest::newRow("1 item") << 1; + QTest::newRow("2 items") << 2; + QTest::newRow("many items") << 5; +} + +void tst_qdeclarativelistmodel::dynamic_data() +{ + QTest::addColumn("script"); + QTest::addColumn("result"); + QTest::addColumn("warning"); + + // Simple flat model + + QTest::newRow("count") << "count" << 0 << ""; + + QTest::newRow("get1") << "{get(0) === undefined}" << 1 << ""; + QTest::newRow("get2") << "{get(-1) === undefined}" << 1 << ""; + QTest::newRow("get3") << "{append({'foo':123});get(0) != undefined}" << 1 << ""; + QTest::newRow("get4") << "{append({'foo':123});get(0).foo}" << 123 << ""; + + QTest::newRow("get-modify1") << "{append({'foo':123,'bar':456});get(0).foo = 333;get(0).foo}" << 333 << ""; + QTest::newRow("get-modify2") << "{append({'z':1});append({'foo':123,'bar':456});get(1).bar = 999;get(1).bar}" << 999 << ""; + + 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("append4a") << "{append(123)}" << 0 << ": QML ListModel: append: value is not an object"; + QTest::newRow("append4b") << "{append([1,2,3])}" << 0 << ": QML ListModel: append: value is not an object"; + + QTest::newRow("clear1") << "{append({'foo':456});clear();count}" << 0 << ""; + QTest::newRow("clear2") << "{append({'foo':123});append({'foo':456});clear();count}" << 0 << ""; + QTest::newRow("clear3") << "{append({'foo':123});clear()}" << 0 << ""; + + 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)}" << 0 << ""; + QTest::newRow("remove3a") << "{append({'foo':123});remove(-1);count}" << 1 << ": QML ListModel: remove: index -1 out of range"; + QTest::newRow("remove4a") << "{remove(0)}" << 0 << ": QML ListModel: remove: index 0 out of range"; + QTest::newRow("remove4b") << "{append({'foo':123});remove(0);remove(0);count}" << 0 << ": QML ListModel: remove: index 0 out of range"; + QTest::newRow("remove4c") << "{append({'foo':123});remove(1);count}" << 1 << ": QML ListModel: remove: index 1 out of range"; + + QTest::newRow("insert1") << "{insert(0,{'foo':123});count}" << 1 << ""; + QTest::newRow("insert2") << "{insert(1,{'foo':123});count}" << 0 << ": QML ListModel: 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});count}" << 1 << ": QML ListModel: insert: index -1 out of range"; + QTest::newRow("insert5a") << "{insert(0,123)}" << 0 << ": QML ListModel: insert: value is not an object"; + QTest::newRow("insert5b") << "{insert(0,[1,2,3])}" << 0 << ": QML ListModel: insert: value is not an object"; + + 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("set4a") << "{set(0,{'foo':456});count}" << 1 << ""; + QTest::newRow("set4c") << "{set(-1,{'foo':456})}" << 0 << ": QML ListModel: set: index -1 out of range"; + QTest::newRow("set5a") << "{append({'foo':123,'bar':456});set(0,123);count}" << 1 << ": QML ListModel: set: value is not an object"; + QTest::newRow("set5b") << "{append({'foo':123,'bar':456});set(0,[1,2,3]);count}" << 1 << ": QML ListModel: set: value is not an object"; + QTest::newRow("set6") << "{append({'foo':123});set(1,{'foo':456});count}" << 2 << ""; + + QTest::newRow("setprop1") << "{append({'foo':123});setProperty(0,'foo',456);count}" << 1 << ""; + QTest::newRow("setprop2") << "{append({'foo':123});setProperty(0,'foo',456);get(0).foo}" << 456 << ""; + QTest::newRow("setprop3a") << "{append({'foo':123,'bar':456});setProperty(0,'foo',999);get(0).foo}" << 999 << ""; + QTest::newRow("setprop3b") << "{append({'foo':123,'bar':456});setProperty(0,'foo',999);get(0).bar}" << 456 << ""; + QTest::newRow("setprop4a") << "{setProperty(0,'foo',456)}" << 0 << ": QML ListModel: set: index 0 out of range"; + QTest::newRow("setprop4b") << "{setProperty(-1,'foo',456)}" << 0 << ": QML ListModel: set: index -1 out of range"; + QTest::newRow("setprop4c") << "{append({'foo':123,'bar':456});setProperty(1,'foo',456);count}" << 1 << ": QML ListModel: set: index 1 out of range"; + QTest::newRow("setprop5") << "{append({'foo':123,'bar':456});append({'foo':111});setProperty(1,'bar',222);get(1).bar}" << 222 << ""; + + 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 << ""; + QTest::newRow("move3a") << "{append({'foo':123});append({'foo':456});append({'foo':789});move(1,0,3);count}" << 3 << ": QML ListModel: move: out of range"; + QTest::newRow("move3b") << "{append({'foo':123});append({'foo':456});append({'foo':789});move(1,-1,1);count}" << 3 << ": QML ListModel: move: out of range"; + QTest::newRow("move3c") << "{append({'foo':123});append({'foo':456});append({'foo':789});move(1,0,-1);count}" << 3 << ": QML ListModel: move: out of range"; + QTest::newRow("move3d") << "{append({'foo':123});append({'foo':456});append({'foo':789});move(0,3,1);count}" << 3 << ": QML ListModel: move: out of range"; + + // Nested models + + QTest::newRow("nested-append1") << "{append({'foo':123,'bars':[{'a':1},{'a':2},{'a':3}]});count}" << 1 << ""; + QTest::newRow("nested-append2") << "{append({'foo':123,'bars':[{'a':1},{'a':2},{'a':3}]});get(0).bars.get(1).a}" << 2 << ""; + QTest::newRow("nested-append3") << "{append({'foo':123,'bars':[{'a':1},{'a':2},{'a':3}]});get(0).bars.append({'a':4});get(0).bars.get(3).a}" << 4 << ""; + + QTest::newRow("nested-insert") << "{append({'foo':123});insert(0,{'bars':[{'a':1},{'b':2},{'c':3}]});get(0).bars.get(0).a}" << 1 << ""; + QTest::newRow("nested-set") << "{append({'foo':[{'x':1}]});set(0,{'foo':[{'x':123}]});get(0).foo.get(0).x}" << 123 << ""; + + QTest::newRow("nested-count") << "{append({'foo':123,'bars':[{'a':1},{'a':2},{'a':3}]}); get(0).bars.count}" << 3 << ""; + QTest::newRow("nested-clear") << "{append({'foo':123,'bars':[{'a':1},{'a':2},{'a':3}]}); get(0).bars.clear(); get(0).bars.count}" << 0 << ""; +} + +void tst_qdeclarativelistmodel::dynamic() +{ + QFETCH(QString, script); + QFETCH(int, result); + QFETCH(QString, warning); + + QDeclarativeEngine engine; + QDeclarativeListModel model; + QDeclarativeEngine::setContextForObject(&model,engine.rootContext()); + engine.rootContext()->setContextObject(&model); + QDeclarativeExpression e(engine.rootContext(), &model, script); + if (!warning.isEmpty()) + QTest::ignoreMessage(QtWarningMsg, warning.toLatin1()); + + QSignalSpy spyCount(&model, SIGNAL(countChanged())); + + int actual = e.evaluate().toInt(); + if (e.hasError()) + qDebug() << e.error(); // errors not expected + + QCOMPARE(actual,result); + + if (model.count() > 0) + QVERIFY(spyCount.count() > 0); +} + +void tst_qdeclarativelistmodel::dynamic_worker_data() +{ + dynamic_data(); +} + +void tst_qdeclarativelistmodel::dynamic_worker() +{ + QFETCH(QString, script); + QFETCH(int, result); + QFETCH(QString, warning); + + if (QByteArray(QTest::currentDataTag()).startsWith("nested")) + return; + + // This is same as dynamic() except it applies the test to a ListModel called + // from a WorkerScript (i.e. testing the internal FlatListModel that is created + // by the WorkerListModelAgent) + + QDeclarativeListModel model; + QDeclarativeEngine eng; + QDeclarativeComponent component(&eng, QUrl::fromLocalFile(SRCDIR "/data/model.qml")); + QDeclarativeItem *item = createWorkerTest(&eng, &component, &model); + QVERIFY(item != 0); + + QSignalSpy spyCount(&model, SIGNAL(countChanged())); + + if (script[0] == QLatin1Char('{') && script[script.length()-1] == QLatin1Char('}')) + script = script.mid(1, script.length() - 2); + QVariantList operations; + foreach (const QString &s, script.split(';')) { + if (!s.isEmpty()) + operations << s; + } + + if (!warning.isEmpty()) + QTest::ignoreMessage(QtWarningMsg, warning.toLatin1()); + + QVERIFY(QMetaObject::invokeMethod(item, "evalExpressionViaWorker", + Q_ARG(QVariant, operations))); + waitForWorker(item); + QCOMPARE(QDeclarativeProperty(item, "result").read().toInt(), result); + + if (model.count() > 0) + QVERIFY(spyCount.count() > 0); + + delete item; + qApp->processEvents(); +} + + + +void tst_qdeclarativelistmodel::dynamic_worker_sync_data() +{ + dynamic_data(); +} + +void tst_qdeclarativelistmodel::dynamic_worker_sync() +{ + QFETCH(QString, script); + QFETCH(int, result); + QFETCH(QString, warning); + + // This is the same as dynamic_worker() except that it executes a set of list operations + // from the worker script, calls sync(), and tests the changes are reflected in the + // list in the main thread + + QDeclarativeListModel model; + QDeclarativeEngine eng; + QDeclarativeComponent component(&eng, QUrl::fromLocalFile(SRCDIR "/data/model.qml")); + QDeclarativeItem *item = createWorkerTest(&eng, &component, &model); + QVERIFY(item != 0); + + if (script[0] == QLatin1Char('{') && script[script.length()-1] == QLatin1Char('}')) + script = script.mid(1, script.length() - 2); + QVariantList operations; + foreach (const QString &s, script.split(';')) { + if (!s.isEmpty()) + operations << s; + } + + if (!warning.isEmpty()) + QTest::ignoreMessage(QtWarningMsg, warning.toLatin1()); + + // execute a set of commands on the worker list model, then check the + // changes are reflected in the list model in the main thread + if (QByteArray(QTest::currentDataTag()).startsWith("nested")) + QTest::ignoreMessage(QtWarningMsg, ": QML ListModel: Cannot add list-type data when modifying or after modification from a worker script"); + + if (QByteArray(QTest::currentDataTag()).startsWith("nested-set")) + QTest::ignoreMessage(QtWarningMsg, ": QML ListModel: Cannot add list-type data when modifying or after modification from a worker script"); + + QVERIFY(QMetaObject::invokeMethod(item, "evalExpressionViaWorker", + Q_ARG(QVariant, operations.mid(0, operations.length()-1)))); + waitForWorker(item); + + QDeclarativeExpression e(eng.rootContext(), &model, operations.last().toString()); + if (!QByteArray(QTest::currentDataTag()).startsWith("nested")) + QCOMPARE(e.evaluate().toInt(), result); + + delete item; + qApp->processEvents(); +} + +void tst_qdeclarativelistmodel::convertNestedToFlat_fail() +{ + // If a model has nested data, it cannot be used at all from a worker script + + QFETCH(QString, script); + + QDeclarativeListModel model; + QDeclarativeEngine eng; + QDeclarativeComponent component(&eng, QUrl::fromLocalFile(SRCDIR "/data/model.qml")); + QDeclarativeItem *item = createWorkerTest(&eng, &component, &model); + QVERIFY(item != 0); + + QScriptEngine s_eng; + QScriptValue plainData = s_eng.newObject(); + plainData.setProperty("foo", QScriptValue(123)); + model.append(plainData); + model.append(nestedListValue(&s_eng)); + QCOMPARE(model.count(), 2); + + QTest::ignoreMessage(QtWarningMsg, ": QML ListModel: List contains list-type data and cannot be used from a worker script"); + QVERIFY(QMetaObject::invokeMethod(item, "evalExpressionViaWorker", Q_ARG(QVariant, script))); + waitForWorker(item); + + QCOMPARE(model.count(), 2); + + delete item; + qApp->processEvents(); +} + +void tst_qdeclarativelistmodel::convertNestedToFlat_fail_data() +{ + QTest::addColumn("script"); + + QTest::newRow("clear") << "clear()"; + QTest::newRow("remove") << "remove(0)"; + QTest::newRow("append") << "append({'x':1})"; + QTest::newRow("insert") << "insert(0, {'x':1})"; + QTest::newRow("set") << "set(0, {'foo':1})"; + QTest::newRow("setProperty") << "setProperty(0, 'foo', 1})"; + QTest::newRow("move") << "move(0, 1, 1})"; + QTest::newRow("get") << "get(0)"; +} + +void tst_qdeclarativelistmodel::convertNestedToFlat_ok() +{ + // If a model only has plain data, it can be modified from a worker script. However, + // once the model is used from a worker script, it no longer accepts nested data + + QFETCH(QString, script); + + QDeclarativeListModel model; + QDeclarativeEngine eng; + QDeclarativeComponent component(&eng, QUrl::fromLocalFile(SRCDIR "/data/model.qml")); + QDeclarativeItem *item = createWorkerTest(&eng, &component, &model); + QVERIFY(item != 0); + + QScriptEngine s_eng; + QScriptValue plainData = s_eng.newObject(); + plainData.setProperty("foo", QScriptValue(123)); + model.append(plainData); + QCOMPARE(model.count(), 1); + + QVERIFY(QMetaObject::invokeMethod(item, "evalExpressionViaWorker", Q_ARG(QVariant, script))); + waitForWorker(item); + + // can still add plain data + int count = model.count(); + model.append(plainData); + QCOMPARE(model.count(), count+1); + + QScriptValue nested = nestedListValue(&s_eng); + const char *warning = ": QML ListModel: Cannot add list-type data when modifying or after modification from a worker script"; + + QTest::ignoreMessage(QtWarningMsg, warning); + model.append(nested); + + QTest::ignoreMessage(QtWarningMsg, warning); + model.insert(0, nested); + + QTest::ignoreMessage(QtWarningMsg, warning); + model.set(0, nested); + + QCOMPARE(model.count(), count+1); + + delete item; + qApp->processEvents(); +} + +void tst_qdeclarativelistmodel::convertNestedToFlat_ok_data() +{ + convertNestedToFlat_fail_data(); +} + +void tst_qdeclarativelistmodel::static_types_data() +{ + QTest::addColumn("qml"); + QTest::addColumn("value"); + + QTest::newRow("string") + << "ListElement { foo: \"bar\" }" + << QVariant(QString("bar")); + + QTest::newRow("real") + << "ListElement { foo: 10.5 }" + << QVariant(10.5); + + QTest::newRow("real0") + << "ListElement { foo: 0 }" + << QVariant(double(0)); + + QTest::newRow("bool") + << "ListElement { foo: false }" + << QVariant(false); + + QTest::newRow("bool") + << "ListElement { foo: true }" + << QVariant(true); + + QTest::newRow("enum") + << "ListElement { foo: Text.AlignHCenter }" + << QVariant(double(QDeclarativeText::AlignHCenter)); +} + +void tst_qdeclarativelistmodel::static_types() +{ + QFETCH(QString, qml); + QFETCH(QVariant, value); + + qml = "import QtQuick 1.0\nListModel { " + qml + " }"; + + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine); + component.setData(qml.toUtf8(), + QUrl::fromLocalFile(QString("dummy.qml"))); + + if (value.toString().startsWith("QTBUG-")) + QEXPECT_FAIL("",value.toString().toLatin1(),Abort); + + QVERIFY(!component.isError()); + + QDeclarativeListModel *obj = qobject_cast(component.create()); + QVERIFY(obj != 0); + + QScriptValue actual = obj->get(0).property(QLatin1String("foo")); + + QCOMPARE(actual.isString(), value.type() == QVariant::String); + QCOMPARE(actual.isBoolean(), value.type() == QVariant::Bool); + QCOMPARE(actual.isNumber(), value.type() == QVariant::Double); + + QCOMPARE(actual.toString(), value.toString()); + + delete obj; +} + +void tst_qdeclarativelistmodel::enumerate() +{ + QDeclarativeEngine eng; + QDeclarativeComponent component(&eng, QUrl::fromLocalFile(SRCDIR "/data/enumerate.qml")); + QVERIFY(!component.isError()); + QDeclarativeItem *item = qobject_cast(component.create()); + QVERIFY(item != 0); + QStringList r = item->property("result").toString().split(":"); + QCOMPARE(r[0],QLatin1String("val1=1Y")); + QCOMPARE(r[1],QLatin1String("val2=2Y")); + QCOMPARE(r[2],QLatin1String("val3=strY")); + QCOMPARE(r[3],QLatin1String("val4=falseN")); + QCOMPARE(r[4],QLatin1String("val5=trueY")); + delete item; +} + + +void tst_qdeclarativelistmodel::error_data() +{ + QTest::addColumn("qml"); + QTest::addColumn("error"); + + QTest::newRow("id not allowed in ListElement") + << "import QtQuick 1.0\nListModel { ListElement { id: fred } }" + << "ListElement: cannot use reserved \"id\" property"; + + QTest::newRow("id allowed in ListModel") + << "import QtQuick 1.0\nListModel { id:model }" + << ""; + + QTest::newRow("random properties not allowed in ListModel") + << "import QtQuick 1.0\nListModel { foo:123 }" + << "ListModel: undefined property 'foo'"; + + QTest::newRow("random properties allowed in ListElement") + << "import QtQuick 1.0\nListModel { ListElement { foo:123 } }" + << ""; + + QTest::newRow("bindings not allowed in ListElement") + << "import QtQuick 1.0\nRectangle { id: rect; ListModel { ListElement { foo: rect.color } } }" + << "ListElement: cannot use script for property value"; + + QTest::newRow("random object list properties allowed in ListElement") + << "import QtQuick 1.0\nListModel { ListElement { foo: [ ListElement { bar: 123 } ] } }" + << ""; + + QTest::newRow("default properties not allowed in ListElement") + << "import QtQuick 1.0\nListModel { ListElement { Item { } } }" + << "ListElement: cannot contain nested elements"; + + QTest::newRow("QML elements not allowed in ListElement") + << "import QtQuick 1.0\nListModel { ListElement { a: Item { } } }" + << "ListElement: cannot contain nested elements"; + + QTest::newRow("qualified ListElement supported") + << "import QtQuick 1.0 as Foo\nFoo.ListModel { Foo.ListElement { a: 123 } }" + << ""; + + QTest::newRow("qualified ListElement required") + << "import QtQuick 1.0 as Foo\nFoo.ListModel { ListElement { a: 123 } }" + << "ListElement is not a type"; + + QTest::newRow("unknown qualified ListElement not allowed") + << "import QtQuick 1.0\nListModel { Foo.ListElement { a: 123 } }" + << "Foo.ListElement - Foo is not a namespace"; +} + +void tst_qdeclarativelistmodel::error() +{ + QFETCH(QString, qml); + QFETCH(QString, error); + + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine); + component.setData(qml.toUtf8(), + QUrl::fromLocalFile(QString("dummy.qml"))); + if (error.isEmpty()) { + QVERIFY(!component.isError()); + } else { + QVERIFY(component.isError()); + QList errors = component.errors(); + QCOMPARE(errors.count(),1); + QCOMPARE(errors.at(0).description(),error); + } +} + +void tst_qdeclarativelistmodel::syncError() +{ + QString qml = "import QtQuick 1.0\nListModel { id: lm; Component.onCompleted: lm.sync() }"; + QString error = "file:dummy.qml:2:1: QML ListModel: List sync() can only be called from a WorkerScript"; + + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine); + component.setData(qml.toUtf8(), + QUrl::fromLocalFile(QString("dummy.qml"))); + QTest::ignoreMessage(QtWarningMsg,error.toUtf8()); + QObject *obj = component.create(); + QVERIFY(obj); + delete obj; +} + +/* + Test model changes from set() are available to the view +*/ +void tst_qdeclarativelistmodel::set() +{ + QDeclarativeEngine engine; + QDeclarativeListModel model; + QDeclarativeEngine::setContextForObject(&model,engine.rootContext()); + engine.rootContext()->setContextObject(&model); + QScriptEngine *seng = QDeclarativeEnginePrivate::getScriptEngine(&engine); + + QScriptValue sv = seng->newObject(); + sv.setProperty("test", QScriptValue(false)); + model.append(sv); + + sv.setProperty("test", QScriptValue(true)); + model.set(0, sv); + QCOMPARE(model.get(0).property("test").toBool(), true); // triggers creation of model cache + QCOMPARE(model.data(0, model.roles()[0]), qVariantFromValue(true)); + + sv.setProperty("test", QScriptValue(false)); + model.set(0, sv); + QCOMPARE(model.get(0).property("test").toBool(), false); // tests model cache is updated + QCOMPARE(model.data(0, model.roles()[0]), qVariantFromValue(false)); +} + +/* + Test model changes on values returned by get() are available to the view +*/ +void tst_qdeclarativelistmodel::get() +{ + QFETCH(QString, expression); + QFETCH(int, index); + QFETCH(QString, roleName); + QFETCH(QVariant, roleValue); + + QDeclarativeEngine eng; + QDeclarativeComponent component(&eng); + component.setData( + "import QtQuick 1.0\n" + "ListModel { \n" + "ListElement { roleA: 100 }\n" + "ListElement { roleA: 200; roleB: 400 } \n" + "ListElement { roleA: 200; roleB: 400 } \n" + "}", QUrl()); + QDeclarativeListModel *model = qobject_cast(component.create()); + int role = roleFromName(model, roleName); + QVERIFY(role >= 0); + + QSignalSpy spy(model, SIGNAL(itemsChanged(int, int, QList))); + QDeclarativeExpression expr(eng.rootContext(), model, expression); + expr.evaluate(); + QVERIFY(!expr.hasError()); + + QCOMPARE(model->data(index, role), roleValue); + QCOMPARE(spy.count(), 1); + + QList spyResult = spy.takeFirst(); + QCOMPARE(spyResult.at(0).toInt(), index); + QCOMPARE(spyResult.at(1).toInt(), 1); // only 1 item is modified at a time + QCOMPARE(spyResult.at(2).value >(), (QList() << role)); +} + +void tst_qdeclarativelistmodel::get_data() +{ + QTest::addColumn("expression"); + QTest::addColumn("index"); + QTest::addColumn("roleName"); + QTest::addColumn("roleValue"); + + QTest::newRow("simple value") << "get(0).roleA = 500" << 0 << "roleA" << QVariant(500); + QTest::newRow("simple value 2") << "get(1).roleB = 500" << 1 << "roleB" << QVariant(500); + + QVariantMap map; + map["zzz"] = 123; + QTest::newRow("object value") << "get(1).roleB = {'zzz':123}" << 1 << "roleB" << QVariant::fromValue(map); + + QVariantList list; + map.clear(); map["a"] = 50; map["b"] = 500; + list << map; + map.clear(); map["c"] = 1000; + list << map; + QTest::newRow("list of objects") << "get(2).roleB = [{'a': 50, 'b': 500}, {'c': 1000}]" << 2 << "roleB" << QVariant::fromValue(list); +} + +void tst_qdeclarativelistmodel::get_worker() +{ + QFETCH(QString, expression); + QFETCH(int, index); + QFETCH(QString, roleName); + QFETCH(QVariant, roleValue); + + QDeclarativeListModel model; + QDeclarativeEngine eng; + QDeclarativeComponent component(&eng, QUrl::fromLocalFile(SRCDIR "/data/model.qml")); + QDeclarativeItem *item = createWorkerTest(&eng, &component, &model); + QVERIFY(item != 0); + QScriptEngine *seng = QDeclarativeEnginePrivate::getScriptEngine(&eng); + + // Add some values like get() test + QScriptValue sv = seng->newObject(); + sv.setProperty(QLatin1String("roleA"), seng->newVariant(QVariant::fromValue(100))); + model.append(sv); + sv = seng->newObject(); + sv.setProperty(QLatin1String("roleA"), seng->newVariant(QVariant::fromValue(200))); + sv.setProperty(QLatin1String("roleB"), seng->newVariant(QVariant::fromValue(400))); + model.append(sv); + model.append(sv); + int role = roleFromName(&model, roleName); + QVERIFY(role >= 0); + + const char *warning = ": QML ListModel: Cannot add list-type data when modifying or after modification from a worker script"; + if (roleValue.type() == QVariant::List || roleValue.type() == QVariant::Map) + QTest::ignoreMessage(QtWarningMsg, warning); + QSignalSpy spy(&model, SIGNAL(itemsChanged(int, int, QList))); + + // in the worker thread, change the model data and call sync() + QVERIFY(QMetaObject::invokeMethod(item, "evalExpressionViaWorker", + Q_ARG(QVariant, QStringList(expression)))); + waitForWorker(item); + + // see if we receive the model changes in the main thread's model + if (roleValue.type() == QVariant::List || roleValue.type() == QVariant::Map) { + QVERIFY(model.data(index, role) != roleValue); + QCOMPARE(spy.count(), 0); + } else { + QCOMPARE(model.data(index, role), roleValue); + QCOMPARE(spy.count(), 1); + + QList spyResult = spy.takeFirst(); + QCOMPARE(spyResult.at(0).toInt(), index); + QCOMPARE(spyResult.at(1).toInt(), 1); // only 1 item is modified at a time + QVERIFY(spyResult.at(2).value >().contains(role)); + } +} + +void tst_qdeclarativelistmodel::get_worker_data() +{ + get_data(); +} + +/* + Test that the tests run in get() also work for nested list data +*/ +void tst_qdeclarativelistmodel::get_nested() +{ + QFETCH(QString, expression); + QFETCH(int, index); + QFETCH(QString, roleName); + QFETCH(QVariant, roleValue); + + QDeclarativeEngine eng; + QDeclarativeComponent component(&eng); + component.setData( + "import QtQuick 1.0\n" + "ListModel { \n" + "ListElement {\n" + "listRoleA: [\n" + "ListElement { roleA: 100 },\n" + "ListElement { roleA: 200; roleB: 400 },\n" + "ListElement { roleA: 200; roleB: 400 } \n" + "]\n" + "}\n" + "ListElement {\n" + "listRoleA: [\n" + "ListElement { roleA: 100 },\n" + "ListElement { roleA: 200; roleB: 400 },\n" + "ListElement { roleA: 200; roleB: 400 } \n" + "]\n" + "listRoleB: [\n" + "ListElement { roleA: 100 },\n" + "ListElement { roleA: 200; roleB: 400 },\n" + "ListElement { roleA: 200; roleB: 400 } \n" + "]\n" + "listRoleC: [\n" + "ListElement { roleA: 100 },\n" + "ListElement { roleA: 200; roleB: 400 },\n" + "ListElement { roleA: 200; roleB: 400 } \n" + "]\n" + "}\n" + "}", QUrl()); + QDeclarativeListModel *model = qobject_cast(component.create()); + QVERIFY(component.errorString().isEmpty()); + QDeclarativeListModel *childModel; + + // Test setting the inner list data for: + // get(0).listRoleA + // get(1).listRoleA + // get(1).listRoleB + // get(1).listRoleC + + QList > testData; + testData << qMakePair(0, QString("listRoleA")); + testData << qMakePair(1, QString("listRoleA")); + testData << qMakePair(1, QString("listRoleB")); + testData << qMakePair(1, QString("listRoleC")); + + for (int i=0; i= 0); + + childModel = qobject_cast(model->data(outerListIndex, outerListRole).value()); + QVERIFY(childModel); + + QString extendedExpression = QString("get(%1).%2.%3").arg(outerListIndex).arg(outerListRoleName).arg(expression); + QDeclarativeExpression expr(eng.rootContext(), model, extendedExpression); + + QSignalSpy spy(childModel, SIGNAL(itemsChanged(int, int, QList))); + expr.evaluate(); + QVERIFY(!expr.hasError()); + + int role = roleFromName(childModel, roleName); + QVERIFY(role >= 0); + QCOMPARE(childModel->data(index, role), roleValue); + QCOMPARE(spy.count(), 1); + + QList spyResult = spy.takeFirst(); + QCOMPARE(spyResult.at(0).toInt(), index); + QCOMPARE(spyResult.at(1).toInt(), 1); // only 1 item is modified at a time + QCOMPARE(spyResult.at(2).value >(), (QList() << role)); + } +} + +void tst_qdeclarativelistmodel::get_nested_data() +{ + get_data(); +} + +//QTBUG-13754 +void tst_qdeclarativelistmodel::crash_model_with_multiple_roles() +{ + QDeclarativeEngine eng; + QDeclarativeComponent component(&eng, QUrl::fromLocalFile(SRCDIR "/data/multipleroles.qml")); + QObject *rootItem = component.create(); + QVERIFY(component.errorString().isEmpty()); + QVERIFY(rootItem != 0); + QDeclarativeListModel *model = rootItem->findChild("listModel"); + QVERIFY(model != 0); + + // used to cause a crash in QDeclarativeVisualDataModel + model->setProperty(0, "black", true); +} + +//QTBUG-15190 +void tst_qdeclarativelistmodel::set_model_cache() +{ + QDeclarativeEngine eng; + QDeclarativeComponent component(&eng, QUrl::fromLocalFile(SRCDIR "/data/setmodelcachelist.qml")); + QObject *model = component.create(); + QVERIFY2(component.errorString().isEmpty(), QTest::toString(component.errorString())); + QVERIFY(model != 0); + QVERIFY(model->property("ok").toBool()); +} + +void tst_qdeclarativelistmodel::property_changes() +{ + QFETCH(QString, script_setup); + QFETCH(QString, script_change); + QFETCH(QString, roleName); + QFETCH(int, listIndex); + QFETCH(bool, itemsChanged); + QFETCH(QString, testExpression); + + QDeclarativeEngine engine; + QDeclarativeListModel model; + QDeclarativeEngine::setContextForObject(&model, engine.rootContext()); + engine.rootContext()->setContextObject(&model); + + QDeclarativeExpression expr(engine.rootContext(), &model, script_setup); + expr.evaluate(); + QVERIFY2(!expr.hasError(), QTest::toString(expr.error().toString())); + + QString signalHandler = "on" + QString(roleName[0].toUpper()) + roleName.mid(1, roleName.length()) + "Changed:"; + QString qml = "import QtQuick 1.0\n" + "Connections {\n" + "property bool gotSignal: false\n" + "target: model.get(0)\n" + + signalHandler + " gotSignal = true\n" + "}\n"; + QDeclarativeComponent component(&engine); + component.setData(qml.toUtf8(), QUrl::fromLocalFile("")); + engine.rootContext()->setContextProperty("model", &model); + QObject *connectionsObject = component.create(); + QVERIFY2(component.errorString().isEmpty(), QTest::toString(component.errorString())); + + QSignalSpy spyItemsChanged(&model, SIGNAL(itemsChanged(int, int, QList))); + + expr.setExpression(script_change); + expr.evaluate(); + QVERIFY2(!expr.hasError(), QTest::toString(expr.error())); + + // test the object returned by get() emits the correct signals + QCOMPARE(connectionsObject->property("gotSignal").toBool(), itemsChanged); + + // test itemsChanged() is emitted correctly + if (itemsChanged) { + QCOMPARE(spyItemsChanged.count(), 1); + QCOMPARE(spyItemsChanged.at(0).at(0).toInt(), listIndex); + QCOMPARE(spyItemsChanged.at(0).at(1).toInt(), 1); + } else { + QCOMPARE(spyItemsChanged.count(), 0); + } + + expr.setExpression(testExpression); + QCOMPARE(expr.evaluate().toBool(), true); + + delete connectionsObject; +} + +void tst_qdeclarativelistmodel::property_changes_data() +{ + QTest::addColumn("script_setup"); + QTest::addColumn("script_change"); + QTest::addColumn("roleName"); + QTest::addColumn("listIndex"); + QTest::addColumn("itemsChanged"); + QTest::addColumn("testExpression"); + + QTest::newRow("set: plain") << "append({'a':123, 'b':456, 'c':789});" << "set(0,{'b':123});" + << "b" << 0 << true << "get(0).b == 123"; + QTest::newRow("setProperty: plain") << "append({'a':123, 'b':456, 'c':789});" << "setProperty(0, 'b', 123);" + << "b" << 0 << true << "get(0).b == 123"; + + QTest::newRow("set: plain, no changes") << "append({'a':123, 'b':456, 'c':789});" << "set(0,{'b':456});" + << "b" << 0 << false << "get(0).b == 456"; + QTest::newRow("setProperty: plain, no changes") << "append({'a':123, 'b':456, 'c':789});" << "setProperty(0, 'b', 456);" + << "b" << 0 << false << "get(0).b == 456"; + + // Following tests only call set() since setProperty() only allows plain + // values, not lists, as the argument. + // Note that when a list is changed, itemsChanged() is currently always + // emitted regardless of whether it actually changed or not. + + QTest::newRow("nested-set: list, new size") << "append({'a':123, 'b':[{'a':1},{'a':2},{'a':3}], 'c':789});" << "set(0,{'b':[{'a':1},{'a':2}]});" + << "b" << 0 << true << "get(0).b.get(0).a == 1 && get(0).b.get(1).a == 2"; + + QTest::newRow("nested-set: list, empty -> non-empty") << "append({'a':123, 'b':[], 'c':789});" << "set(0,{'b':[{'a':1},{'a':2},{'a':3}]});" + << "b" << 0 << true << "get(0).b.get(0).a == 1 && get(0).b.get(1).a == 2 && get(0).b.get(2).a == 3"; + + QTest::newRow("nested-set: list, non-empty -> empty") << "append({'a':123, 'b':[{'a':1},{'a':2},{'a':3}], 'c':789});" << "set(0,{'b':[]});" + << "b" << 0 << true << "get(0).b.count == 0"; + + QTest::newRow("nested-set: list, same size, different values") << "append({'a':123, 'b':[{'a':1},{'a':2},{'a':3}], 'c':789});" << "set(0,{'b':[{'a':1},{'a':222},{'a':3}]});" + << "b" << 0 << true << "get(0).b.get(0).a == 1 && get(0).b.get(1).a == 222 && get(0).b.get(2).a == 3"; + + QTest::newRow("nested-set: list, no changes") << "append({'a':123, 'b':[{'a':1},{'a':2},{'a':3}], 'c':789});" << "set(0,{'b':[{'a':1},{'a':2},{'a':3}]});" + << "b" << 0 << true << "get(0).b.get(0).a == 1 && get(0).b.get(1).a == 2 && get(0).b.get(2).a == 3"; + + QTest::newRow("nested-set: list, no changes, empty") << "append({'a':123, 'b':[], 'c':789});" << "set(0,{'b':[]});" + << "b" << 0 << true << "get(0).b.count == 0"; +} + + +void tst_qdeclarativelistmodel::property_changes_worker() +{ + // nested models are not supported when WorkerScript is involved + if (QByteArray(QTest::currentDataTag()).startsWith("nested-")) + return; + + QFETCH(QString, script_setup); + QFETCH(QString, script_change); + QFETCH(QString, roleName); + QFETCH(int, listIndex); + QFETCH(bool, itemsChanged); + + QDeclarativeListModel model; + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/model.qml")); + QVERIFY2(component.errorString().isEmpty(), component.errorString().toUtf8()); + QDeclarativeItem *item = createWorkerTest(&engine, &component, &model); + QVERIFY(item != 0); + + QDeclarativeExpression expr(engine.rootContext(), &model, script_setup); + expr.evaluate(); + QVERIFY2(!expr.hasError(), QTest::toString(expr.error().toString())); + + QSignalSpy spyItemsChanged(&model, SIGNAL(itemsChanged(int, int, QList))); + + QVERIFY(QMetaObject::invokeMethod(item, "evalExpressionViaWorker", + Q_ARG(QVariant, QStringList(script_change)))); + waitForWorker(item); + + // test itemsChanged() is emitted correctly + if (itemsChanged) { + QCOMPARE(spyItemsChanged.count(), 1); + QCOMPARE(spyItemsChanged.at(0).at(0).toInt(), listIndex); + QCOMPARE(spyItemsChanged.at(0).at(1).toInt(), 1); + } else { + QCOMPARE(spyItemsChanged.count(), 0); + } + + delete item; + qApp->processEvents(); +} + +void tst_qdeclarativelistmodel::property_changes_worker_data() +{ + property_changes_data(); +} + +void tst_qdeclarativelistmodel::clear() +{ + QDeclarativeEngine engine; + QDeclarativeListModel model; + QDeclarativeEngine::setContextForObject(&model, engine.rootContext()); + engine.rootContext()->setContextObject(&model); + + QScriptEngine *seng = QDeclarativeEnginePrivate::getScriptEngine(&engine); + QScriptValue sv = seng->newObject(); + QVariant result; + + model.clear(); + QCOMPARE(model.count(), 0); + + sv.setProperty("propertyA", "value a"); + sv.setProperty("propertyB", "value b"); + model.append(sv); + QCOMPARE(model.count(), 1); + + model.clear(); + QCOMPARE(model.count(), 0); + + model.append(sv); + model.append(sv); + QCOMPARE(model.count(), 2); + + model.clear(); + QCOMPARE(model.count(), 0); + + // clearing does not remove the roles + sv.setProperty("propertyC", "value c"); + model.append(sv); + QList roles = model.roles(); + model.clear(); + QCOMPARE(model.count(), 0); + QCOMPARE(model.roles(), roles); + QCOMPARE(model.toString(roles[0]), QString("propertyA")); + QCOMPARE(model.toString(roles[1]), QString("propertyB")); + QCOMPARE(model.toString(roles[2]), QString("propertyC")); +} + +QTEST_MAIN(tst_qdeclarativelistmodel) + +#include "tst_qdeclarativelistmodel.moc" diff --git a/tests/auto/declarative/qdeclarativelistreference/data/MyType.qml b/tests/auto/declarative/qdeclarativelistreference/data/MyType.qml new file mode 100644 index 00000000..0687ce39 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistreference/data/MyType.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +QtObject { + property int a +} diff --git a/tests/auto/declarative/qdeclarativelistreference/data/engineTypes.qml b/tests/auto/declarative/qdeclarativelistreference/data/engineTypes.qml new file mode 100644 index 00000000..9ddc7633 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistreference/data/engineTypes.qml @@ -0,0 +1,9 @@ +import QtQuick 1.0 + +QtObject { + property list myList + + myList: [ MyType { a: 1 }, + MyType { a: 9 } ] + +} diff --git a/tests/auto/declarative/qdeclarativelistreference/data/variantToList.qml b/tests/auto/declarative/qdeclarativelistreference/data/variantToList.qml new file mode 100644 index 00000000..39a49e81 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistreference/data/variantToList.qml @@ -0,0 +1,10 @@ +import QtQuick 1.0 + +QtObject { + property list myList; + myList: QtObject {} + + property variant value: myList + property int test: value.length +} + diff --git a/tests/auto/declarative/qdeclarativelistreference/qdeclarativelistreference.pro b/tests/auto/declarative/qdeclarativelistreference/qdeclarativelistreference.pro new file mode 100644 index 00000000..f3e6f529 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistreference/qdeclarativelistreference.pro @@ -0,0 +1,8 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativelistreference.cpp + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativelistreference/tst_qdeclarativelistreference.cpp b/tests/auto/declarative/qdeclarativelistreference/tst_qdeclarativelistreference.cpp new file mode 100644 index 00000000..4d3a0576 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistreference/tst_qdeclarativelistreference.cpp @@ -0,0 +1,579 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +inline QUrl TEST_FILE(const QString &filename) +{ + QFileInfo fileInfo(__FILE__); + return QUrl::fromLocalFile(fileInfo.absoluteDir().filePath("data/" + filename)); +} + +inline QUrl TEST_FILE(const char *filename) +{ + return TEST_FILE(QLatin1String(filename)); +} + +class tst_qdeclarativelistreference : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativelistreference() {} + +private slots: + void initTestCase(); + void qmllistreference(); + void qmllistreference_invalid(); + void isValid(); + void object(); + void listElementType(); + void canAppend(); + void canAt(); + void canClear(); + void canCount(); + void append(); + void at(); + void clear(); + void count(); + void copy(); + void qmlmetaproperty(); + void engineTypes(); + void variantToList(); +}; + +class TestType : public QObject +{ + Q_OBJECT + Q_PROPERTY(QDeclarativeListProperty data READ dataProperty) + Q_PROPERTY(int intProperty READ intProperty) + +public: + TestType() : property(this, data) {} + QDeclarativeListProperty dataProperty() { return property; } + int intProperty() const { return 10; } + + QList data; + QDeclarativeListProperty property; +}; + +void tst_qdeclarativelistreference::initTestCase() +{ + qmlRegisterType(); +} + +void tst_qdeclarativelistreference::qmllistreference() +{ + TestType tt; + + QDeclarativeListReference r(&tt, "data"); + QVERIFY(r.isValid() == true); + QCOMPARE(r.count(), 0); + + tt.data.append(&tt); + QCOMPARE(r.count(), 1); +} + +void tst_qdeclarativelistreference::qmllistreference_invalid() +{ + TestType tt; + + // Invalid + { + QDeclarativeListReference r; + QVERIFY(r.isValid() == false); + QVERIFY(r.object() == 0); + QVERIFY(r.listElementType() == 0); + QVERIFY(r.canAt() == false); + QVERIFY(r.canClear() == false); + QVERIFY(r.canCount() == false); + QVERIFY(r.append(0) == false); + QVERIFY(r.at(10) == 0); + QVERIFY(r.clear() == false); + QVERIFY(r.count() == 0); + } + + // Non-property + { + QDeclarativeListReference r(&tt, "blah"); + QVERIFY(r.isValid() == false); + QVERIFY(r.object() == 0); + QVERIFY(r.listElementType() == 0); + QVERIFY(r.canAt() == false); + QVERIFY(r.canClear() == false); + QVERIFY(r.canCount() == false); + QVERIFY(r.append(0) == false); + QVERIFY(r.at(10) == 0); + QVERIFY(r.clear() == false); + QVERIFY(r.count() == 0); + } + + // Non-list property + { + QDeclarativeListReference r(&tt, "intProperty"); + QVERIFY(r.isValid() == false); + QVERIFY(r.object() == 0); + QVERIFY(r.listElementType() == 0); + QVERIFY(r.canAt() == false); + QVERIFY(r.canClear() == false); + QVERIFY(r.canCount() == false); + QVERIFY(r.append(0) == false); + QVERIFY(r.at(10) == 0); + QVERIFY(r.clear() == false); + QVERIFY(r.count() == 0); + } +} + +void tst_qdeclarativelistreference::isValid() +{ + TestType *tt = new TestType; + + { + QDeclarativeListReference ref; + QVERIFY(ref.isValid() == false); + } + + { + QDeclarativeListReference ref(tt, "blah"); + QVERIFY(ref.isValid() == false); + } + + { + QDeclarativeListReference ref(tt, "data"); + QVERIFY(ref.isValid() == true); + delete tt; + QVERIFY(ref.isValid() == false); + } +} + +void tst_qdeclarativelistreference::object() +{ + TestType *tt = new TestType; + + { + QDeclarativeListReference ref; + QVERIFY(ref.object() == 0); + } + + { + QDeclarativeListReference ref(tt, "blah"); + QVERIFY(ref.object() == 0); + } + + { + QDeclarativeListReference ref(tt, "data"); + QVERIFY(ref.object() == tt); + delete tt; + QVERIFY(ref.object() == 0); + } +} + +void tst_qdeclarativelistreference::listElementType() +{ + TestType *tt = new TestType; + + { + QDeclarativeListReference ref; + QVERIFY(ref.listElementType() == 0); + } + + { + QDeclarativeListReference ref(tt, "blah"); + QVERIFY(ref.listElementType() == 0); + } + + { + QDeclarativeListReference ref(tt, "data"); + QVERIFY(ref.listElementType() == &TestType::staticMetaObject); + delete tt; + QVERIFY(ref.listElementType() == 0); + } +} + +void tst_qdeclarativelistreference::canAppend() +{ + TestType *tt = new TestType; + + { + QDeclarativeListReference ref; + QVERIFY(ref.canAppend() == false); + } + + { + QDeclarativeListReference ref(tt, "blah"); + QVERIFY(ref.canAppend() == false); + } + + { + QDeclarativeListReference ref(tt, "data"); + QVERIFY(ref.canAppend() == true); + delete tt; + QVERIFY(ref.canAppend() == false); + } + + { + TestType tt; + tt.property.append = 0; + QDeclarativeListReference ref(&tt, "data"); + QVERIFY(ref.canAppend() == false); + } +} + +void tst_qdeclarativelistreference::canAt() +{ + TestType *tt = new TestType; + + { + QDeclarativeListReference ref; + QVERIFY(ref.canAt() == false); + } + + { + QDeclarativeListReference ref(tt, "blah"); + QVERIFY(ref.canAt() == false); + } + + { + QDeclarativeListReference ref(tt, "data"); + QVERIFY(ref.canAt() == true); + delete tt; + QVERIFY(ref.canAt() == false); + } + + { + TestType tt; + tt.property.at = 0; + QDeclarativeListReference ref(&tt, "data"); + QVERIFY(ref.canAt() == false); + } +} + +void tst_qdeclarativelistreference::canClear() +{ + TestType *tt = new TestType; + + { + QDeclarativeListReference ref; + QVERIFY(ref.canClear() == false); + } + + { + QDeclarativeListReference ref(tt, "blah"); + QVERIFY(ref.canClear() == false); + } + + { + QDeclarativeListReference ref(tt, "data"); + QVERIFY(ref.canClear() == true); + delete tt; + QVERIFY(ref.canClear() == false); + } + + { + TestType tt; + tt.property.clear = 0; + QDeclarativeListReference ref(&tt, "data"); + QVERIFY(ref.canClear() == false); + } +} + +void tst_qdeclarativelistreference::canCount() +{ + TestType *tt = new TestType; + + { + QDeclarativeListReference ref; + QVERIFY(ref.canCount() == false); + } + + { + QDeclarativeListReference ref(tt, "blah"); + QVERIFY(ref.canCount() == false); + } + + { + QDeclarativeListReference ref(tt, "data"); + QVERIFY(ref.canCount() == true); + delete tt; + QVERIFY(ref.canCount() == false); + } + + { + TestType tt; + tt.property.count = 0; + QDeclarativeListReference ref(&tt, "data"); + QVERIFY(ref.canCount() == false); + } +} + +void tst_qdeclarativelistreference::append() +{ + TestType *tt = new TestType; + QObject object; + + { + QDeclarativeListReference ref; + QVERIFY(ref.append(tt) == false); + } + + { + QDeclarativeListReference ref(tt, "blah"); + QVERIFY(ref.append(tt) == false); + } + + { + QDeclarativeListReference ref(tt, "data"); + QVERIFY(ref.append(tt) == true); + QVERIFY(tt->data.count() == 1); + QVERIFY(tt->data.at(0) == tt); + QVERIFY(ref.append(&object) == false); + QVERIFY(tt->data.count() == 1); + QVERIFY(tt->data.at(0) == tt); + QVERIFY(ref.append(0) == true); + QVERIFY(tt->data.count() == 2); + QVERIFY(tt->data.at(0) == tt); + QVERIFY(tt->data.at(1) == 0); + delete tt; + QVERIFY(ref.append(0) == false); + } + + { + TestType tt; + tt.property.append = 0; + QDeclarativeListReference ref(&tt, "data"); + QVERIFY(ref.append(&tt) == false); + } +} + +void tst_qdeclarativelistreference::at() +{ + TestType *tt = new TestType; + tt->data.append(tt); + tt->data.append(0); + tt->data.append(tt); + + { + QDeclarativeListReference ref; + QVERIFY(ref.at(0) == 0); + } + + { + QDeclarativeListReference ref(tt, "blah"); + QVERIFY(ref.at(0) == 0); + } + + { + QDeclarativeListReference ref(tt, "data"); + QVERIFY(ref.at(0) == tt); + QVERIFY(ref.at(1) == 0); + QVERIFY(ref.at(2) == tt); + delete tt; + QVERIFY(ref.at(0) == 0); + } + + { + TestType tt; + tt.data.append(&tt); + tt.property.at = 0; + QDeclarativeListReference ref(&tt, "data"); + QVERIFY(ref.at(0) == 0); + } +} + +void tst_qdeclarativelistreference::clear() +{ + TestType *tt = new TestType; + tt->data.append(tt); + tt->data.append(0); + tt->data.append(tt); + + { + QDeclarativeListReference ref; + QVERIFY(ref.clear() == false); + } + + { + QDeclarativeListReference ref(tt, "blah"); + QVERIFY(ref.clear() == false); + } + + { + QDeclarativeListReference ref(tt, "data"); + QVERIFY(ref.clear() == true); + QVERIFY(tt->data.count() == 0); + delete tt; + QVERIFY(ref.clear() == false); + } + + { + TestType tt; + tt.property.clear = 0; + QDeclarativeListReference ref(&tt, "data"); + QVERIFY(ref.clear() == false); + } +} + +void tst_qdeclarativelistreference::count() +{ + TestType *tt = new TestType; + tt->data.append(tt); + tt->data.append(0); + tt->data.append(tt); + + { + QDeclarativeListReference ref; + QVERIFY(ref.count() == 0); + } + + { + QDeclarativeListReference ref(tt, "blah"); + QVERIFY(ref.count() == 0); + } + + { + QDeclarativeListReference ref(tt, "data"); + QVERIFY(ref.count() == 3); + tt->data.removeAt(1); + QVERIFY(ref.count() == 2); + delete tt; + QVERIFY(ref.count() == 0); + } + + { + TestType tt; + tt.data.append(&tt); + tt.property.count = 0; + QDeclarativeListReference ref(&tt, "data"); + QVERIFY(ref.count() == 0); + } +} + +void tst_qdeclarativelistreference::copy() +{ + TestType tt; + tt.data.append(&tt); + tt.data.append(0); + tt.data.append(&tt); + + QDeclarativeListReference *r1 = new QDeclarativeListReference(&tt, "data"); + QVERIFY(r1->count() == 3); + + QDeclarativeListReference r2(*r1); + QDeclarativeListReference r3; + r3 = *r1; + + QVERIFY(r2.count() == 3); + QVERIFY(r3.count() == 3); + + delete r1; + + QVERIFY(r2.count() == 3); + QVERIFY(r3.count() == 3); + + tt.data.removeAt(2); + + QVERIFY(r2.count() == 2); + QVERIFY(r3.count() == 2); +} + +void tst_qdeclarativelistreference::qmlmetaproperty() +{ + TestType tt; + tt.data.append(&tt); + tt.data.append(0); + tt.data.append(&tt); + + QDeclarativeProperty prop(&tt, QLatin1String("data")); + QVariant v = prop.read(); + QVERIFY(v.userType() == qMetaTypeId()); + QDeclarativeListReference ref = qvariant_cast(v); + QVERIFY(ref.count() == 3); + QVERIFY(ref.listElementType() == &TestType::staticMetaObject); +} + +void tst_qdeclarativelistreference::engineTypes() +{ + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine, TEST_FILE("engineTypes.qml")); + + QObject *o = component.create(); + QVERIFY(o); + + QDeclarativeProperty p1(o, QLatin1String("myList")); + QVERIFY(p1.propertyTypeCategory() == QDeclarativeProperty::Normal); + + QDeclarativeProperty p2(o, QLatin1String("myList"), engine.rootContext()); + QVERIFY(p2.propertyTypeCategory() == QDeclarativeProperty::List); + QVariant v = p2.read(); + QVERIFY(v.userType() == qMetaTypeId()); + QDeclarativeListReference ref = qvariant_cast(v); + QVERIFY(ref.count() == 2); + QVERIFY(ref.listElementType()); + QVERIFY(ref.listElementType() != &QObject::staticMetaObject); + + delete o; +} + +void tst_qdeclarativelistreference::variantToList() +{ + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine, TEST_FILE("variantToList.qml")); + + QObject *o = component.create(); + QVERIFY(o); + + QVERIFY(o->property("value").userType() == qMetaTypeId()); + QCOMPARE(o->property("test").toInt(), 1); + + delete o; +} + +QTEST_MAIN(tst_qdeclarativelistreference) + +#include "tst_qdeclarativelistreference.moc" diff --git a/tests/auto/declarative/qdeclarativelistview/data/attachedSignals.qml b/tests/auto/declarative/qdeclarativelistview/data/attachedSignals.qml new file mode 100644 index 00000000..5ca1a458 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistview/data/attachedSignals.qml @@ -0,0 +1,24 @@ +import QtQuick 1.0 + +ListView { + id: view + width: 240; height: 320 + + property variant addedDelegates: [] + property int removedDelegateCount + + model: testModel + + delegate: Rectangle { + width: 200; height: delegateHeight + border.width: 1 + ListView.onAdd: { + var obj = ListView.view.addedDelegates + obj.push(model.name) + ListView.view.addedDelegates = obj + } + ListView.onRemove: { + view.removedDelegateCount += 1 + } + } +} diff --git a/tests/auto/declarative/qdeclarativelistview/data/displaylist.qml b/tests/auto/declarative/qdeclarativelistview/data/displaylist.qml new file mode 100644 index 00000000..9d585302 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistview/data/displaylist.qml @@ -0,0 +1,50 @@ +import QtQuick 1.0 + +Rectangle { + id: root + property real delegateHeight: 20 + width: 240 + height: 320 + color: "#ffffff" + resources: [ + Component { + id: myDelegate + Rectangle { + id: wrapper + objectName: "wrapper" + height: root.delegateHeight + Behavior on height { NumberAnimation {} } + width: 240 + Text { + text: index + } + Text { + x: 30 + objectName: "displayText" + text: display + } + Text { + x: 200 + text: wrapper.y + } + color: ListView.isCurrentItem ? "lightsteelblue" : "white" + } + }, + Component { + id: myHighlight + Rectangle { color: "green" } + } + ] + ListView { + id: list + objectName: "list" + focus: true + width: 240 + height: 320 + model: testModel + delegate: myDelegate + highlight: myHighlight + highlightMoveSpeed: 1000 + highlightResizeSpeed: 1000 + } +} diff --git a/tests/auto/declarative/qdeclarativelistview/data/footer.qml b/tests/auto/declarative/qdeclarativelistview/data/footer.qml new file mode 100644 index 00000000..33e04f1b --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistview/data/footer.qml @@ -0,0 +1,38 @@ +import QtQuick 1.0 + +Rectangle { + function changeFooter() { + list.footer = footer2 + } + width: 240 + height: 320 + color: "#ffffff" + Component { + id: myDelegate + Rectangle { + id: wrapper + objectName: "wrapper" + height: 20 + width: 240 + Text { + text: index + } + color: ListView.isCurrentItem ? "lightsteelblue" : "white" + } + } + ListView { + id: list + objectName: "list" + focus: true + width: 240 + height: 320 + model: testModel + delegate: myDelegate + footer: Text { objectName: "footer"; text: "Footer"; height: 30 } + } + + Component { + id: footer2 + Text { objectName: "footer2"; text: "Footer 2"; height: 20 } + } +} diff --git a/tests/auto/declarative/qdeclarativelistview/data/header.qml b/tests/auto/declarative/qdeclarativelistview/data/header.qml new file mode 100644 index 00000000..38cdd6e0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistview/data/header.qml @@ -0,0 +1,38 @@ +import QtQuick 1.0 + +Rectangle { + function changeHeader() { + list.header = header2 + } + width: 240 + height: 320 + color: "#ffffff" + Component { + id: myDelegate + Rectangle { + id: wrapper + objectName: "wrapper" + height: 30 + width: 240 + Text { + text: index + } + color: ListView.isCurrentItem ? "lightsteelblue" : "white" + } + } + ListView { + id: list + objectName: "list" + focus: true + width: 240 + height: 320 + snapMode: ListView.SnapToItem + model: testModel + delegate: myDelegate + header: Text { objectName: "header"; text: "Header"; height: 20 } + } + Component { + id: header2 + Text { objectName: "header2"; text: "Header 2"; height: 10 } + } +} diff --git a/tests/auto/declarative/qdeclarativelistview/data/header1.qml b/tests/auto/declarative/qdeclarativelistview/data/header1.qml new file mode 100644 index 00000000..f2ab4c12 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistview/data/header1.qml @@ -0,0 +1,33 @@ +import QtQuick 1.0 + +Rectangle { + width: 240 + height: 320 + color: "#ffffff" + + ListModel { id: testModel } + + ListView { + id: list + objectName: "list" + width: parent.width + anchors.top: parent.top + anchors.bottom: parent.bottom + model: testModel + delegate: Text { + objectName: "wrapper" + font.pointSize: 20 + text: index + } + footer: Rectangle { + width: parent.width + height: 40 + color: "green" + } + header: Text { objectName: "header"; text: "Header" } + } + + Component.onCompleted: { + for (var i=0; i<30; i++) testModel.append({"name" : i, "val": i}) + } +} diff --git a/tests/auto/declarative/qdeclarativelistview/data/headerfooter.qml b/tests/auto/declarative/qdeclarativelistview/data/headerfooter.qml new file mode 100644 index 00000000..56338319 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistview/data/headerfooter.qml @@ -0,0 +1,26 @@ +import QtQuick 1.1 + +ListView { + id: view + property bool horizontal: false + property bool rtl: false + width: 240 + height: 320 + + orientation: horizontal ? ListView.Horizontal : ListView.Vertical + header: Rectangle { + objectName: "header" + width: horizontal ? 20 : view.width + height: horizontal ? view.height : 20 + color: "red" + } + footer: Rectangle { + objectName: "footer" + width: horizontal ? 30 : view.width + height: horizontal ? view.height : 30 + color: "blue" + } +// model: testModel + delegate: Text { width: 30; height: 30; text: index + "(" + x + ")" } + layoutDirection: rtl ? Qt.RightToLeft : Qt.LeftToRight +} diff --git a/tests/auto/declarative/qdeclarativelistview/data/itemlist.qml b/tests/auto/declarative/qdeclarativelistview/data/itemlist.qml new file mode 100644 index 00000000..fca2901e --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistview/data/itemlist.qml @@ -0,0 +1,43 @@ +// This example demonstrates placing items in a view using +// a VisualItemModel + +import QtQuick 1.0 + +Rectangle { + color: "lightgray" + width: 240 + height: 320 + + VisualItemModel { + id: itemModel + objectName: "itemModel" + Rectangle { + objectName: "item1" + height: ListView.view.height; width: view.width; color: "#FFFEF0" + Text { objectName: "text1"; text: "index: " + parent.VisualItemModel.index; font.bold: true; anchors.centerIn: parent } + } + Rectangle { + objectName: "item2" + height: ListView.view.height; width: view.width; color: "#F0FFF7" + Text { objectName: "text2"; text: "index: " + parent.VisualItemModel.index; font.bold: true; anchors.centerIn: parent } + } + Rectangle { + objectName: "item3" + height: ListView.view.height; width: view.width; color: "#F4F0FF" + Text { objectName: "text3"; text: "index: " + parent.VisualItemModel.index; 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/qdeclarativelistview/data/listview-enforcerange.qml b/tests/auto/declarative/qdeclarativelistview/data/listview-enforcerange.qml new file mode 100644 index 00000000..49dbcb38 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistview/data/listview-enforcerange.qml @@ -0,0 +1,55 @@ +import QtQuick 1.0 + +Rectangle { + width: 240 + height: 320 + color: "#ffffff" + Component { + id: myDelegate + Item { + id: wrapper + objectName: "wrapper" + height: 20 + width: 240 + Text { + text: index + } + Text { + x: 30 + id: textName + objectName: "textName" + text: name + } + Text { + x: 120 + id: textNumber + objectName: "textNumber" + text: number + } + Text { + x: 200 + text: wrapper.y + } + } + } + + Component { + id: myHighlight + Rectangle { + color: "lightsteelblue" + } + } + + ListView { + id: list + objectName: "list" + width: 240 + height: 320 + model: testModel + delegate: myDelegate + highlight: myHighlight + preferredHighlightBegin: 100 + preferredHighlightEnd: 100 + highlightRangeMode: "StrictlyEnforceRange" + } +} diff --git a/tests/auto/declarative/qdeclarativelistview/data/listview-initCurrent.qml b/tests/auto/declarative/qdeclarativelistview/data/listview-initCurrent.qml new file mode 100644 index 00000000..2c4cfab2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistview/data/listview-initCurrent.qml @@ -0,0 +1,51 @@ +import QtQuick 1.0 + +Rectangle { + property int current: list.currentIndex + width: 240 + height: 320 + color: "#ffffff" + resources: [ + Component { + id: myDelegate + Rectangle { + id: wrapper + objectName: "wrapper" + height: 20 + width: 240 + Text { + text: index + } + Text { + x: 30 + id: textName + objectName: "textName" + text: name + } + Text { + x: 120 + id: textNumber + objectName: "textNumber" + text: number + } + Text { + x: 200 + text: wrapper.y + } + color: ListView.isCurrentItem ? "lightsteelblue" : "white" + } + } + ] + ListView { + id: list + objectName: "list" + focus: true + currentIndex: 20 + width: 240 + height: 320 + keyNavigationWraps: testWrap + delegate: myDelegate + highlightMoveSpeed: 1000 + model: testModel + } +} diff --git a/tests/auto/declarative/qdeclarativelistview/data/listview-noCurrent.qml b/tests/auto/declarative/qdeclarativelistview/data/listview-noCurrent.qml new file mode 100644 index 00000000..19970100 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistview/data/listview-noCurrent.qml @@ -0,0 +1,50 @@ +import QtQuick 1.0 + +Rectangle { + property int current: list.currentIndex + width: 240 + height: 320 + color: "#ffffff" + resources: [ + Component { + id: myDelegate + Rectangle { + id: wrapper + objectName: "wrapper" + height: 20 + width: 240 + Text { + text: index + } + Text { + x: 30 + id: textName + objectName: "textName" + text: name + } + Text { + x: 120 + id: textNumber + objectName: "textNumber" + text: number + } + Text { + x: 200 + text: wrapper.y + } + color: ListView.isCurrentItem ? "lightsteelblue" : "white" + } + } + ] + ListView { + id: list + objectName: "list" + focus: true + currentIndex: -1 + width: 240 + height: 320 + delegate: myDelegate + highlightMoveSpeed: 1000 + model: testModel + } +} diff --git a/tests/auto/declarative/qdeclarativelistview/data/listview-sections.qml b/tests/auto/declarative/qdeclarativelistview/data/listview-sections.qml new file mode 100644 index 00000000..283678b6 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistview/data/listview-sections.qml @@ -0,0 +1,64 @@ +import QtQuick 1.0 + +Rectangle { + width: 240 + height: 320 + color: "#ffffff" + resources: [ + Component { + id: myDelegate + Item { + id: wrapper + objectName: "wrapper" + height: ListView.previousSection != ListView.section ? 40 : 20; + width: 240 + Rectangle { + y: wrapper.ListView.previousSection != wrapper.ListView.section ? 20 : 0 + height: 20 + width: parent.width + color: wrapper.ListView.isCurrentItem ? "lightsteelblue" : "white" + Text { + text: index + } + Text { + x: 30 + id: textName + objectName: "textName" + text: name + } + Text { + x: 100 + id: textNumber + objectName: "textNumber" + text: number + } + Text { + objectName: "nextSection" + x: 150 + text: wrapper.ListView.nextSection + } + Text { + x: 200 + text: wrapper.y + } + } + Rectangle { + color: "#99bb99" + height: wrapper.ListView.previousSection != wrapper.ListView.section ? 20 : 0 + width: parent.width + visible: wrapper.ListView.previousSection != wrapper.ListView.section ? true : false + Text { text: wrapper.ListView.section } + } + } + } + ] + ListView { + id: list + objectName: "list" + width: 240 + height: 320 + model: testModel + delegate: myDelegate + section.property: "number" + } +} diff --git a/tests/auto/declarative/qdeclarativelistview/data/listview-sections_delegate.qml b/tests/auto/declarative/qdeclarativelistview/data/listview-sections_delegate.qml new file mode 100644 index 00000000..b2d9213c --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistview/data/listview-sections_delegate.qml @@ -0,0 +1,69 @@ +import QtQuick 1.0 + +Rectangle { + property string sectionProperty: "number" + width: 240 + height: 320 + color: "#ffffff" + resources: [ + Component { + id: myDelegate + Item { + id: wrapper + objectName: "wrapper" + height: 20; + width: 240 + Rectangle { + height: 20 + width: parent.width + color: wrapper.ListView.isCurrentItem ? "lightsteelblue" : "white" + Text { + text: index + } + Text { + x: 30 + id: textName + objectName: "textName" + text: name + } + Text { + x: 100 + id: textNumber + objectName: "textNumber" + text: number + } + Text { + objectName: "nextSection" + x: 150 + text: wrapper.ListView.nextSection + } + Text { + x: 200 + text: wrapper.y + } + } + ListView.onRemove: SequentialAnimation { + PropertyAction { target: wrapper; property: "ListView.delayRemove"; value: true } + NumberAnimation { target: wrapper; property: "height"; to: 0; duration: 100; easing.type: Easing.InOutQuad } + PropertyAction { target: wrapper; property: "ListView.delayRemove"; value: false } + } + } + } + ] + ListView { + id: list + objectName: "list" + width: 240 + height: 320 + model: testModel + delegate: myDelegate + section.property: sectionProperty + section.delegate: Rectangle { + objectName: "sect_" + section + color: "#99bb99" + height: 20 + width: list.width + Text { text: section } + } + } +} diff --git a/tests/auto/declarative/qdeclarativelistview/data/listviewtest.qml b/tests/auto/declarative/qdeclarativelistview/data/listviewtest.qml new file mode 100644 index 00000000..75ddabbb --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistview/data/listviewtest.qml @@ -0,0 +1,133 @@ +import QtQuick 1.0 + +Rectangle { + id: root + width: 240 + height: 320 + color: "#ffffff" + + property int count: list.count + property bool showHeader: false + property bool showFooter: false + property real hr: list.visibleArea.heightRatio + function heightRatio() { + return list.visibleArea.heightRatio + } + + function checkProperties() { + testObject.error = false; + if (list.model != testModel) { + console.log("model property incorrect"); + testObject.error = true; + } + if (!testObject.animate && list.delegate != myDelegate) { + console.log("delegate property incorrect - expected myDelegate"); + testObject.error = true; + } + if (testObject.animate && list.delegate != animatedDelegate) { + console.log("delegate property incorrect - expected animatedDelegate"); + testObject.error = true; + } + if (testObject.invalidHighlight && list.highlight != invalidHl) { + console.log("highlight property incorrect - expected invalidHl"); + testObject.error = true; + } + if (!testObject.invalidHighlight && list.highlight != myHighlight) { + console.log("highlight property incorrect - expected myHighlight"); + testObject.error = true; + } + } + resources: [ + Component { + id: myDelegate + Rectangle { + id: wrapper + objectName: "wrapper" + height: 20 + width: 240 + Text { + text: index + } + Text { + x: 30 + id: textName + objectName: "textName" + text: name + } + Text { + x: 120 + id: textNumber + objectName: "textNumber" + text: number + } + Text { + x: 200 + text: wrapper.y + } + color: ListView.isCurrentItem ? "lightsteelblue" : "white" + } + }, + Component { + id: animatedDelegate + Rectangle { + id: wrapper + objectName: "wrapper" + height: 20 + width: 240 + Text { + text: index + } + Text { + x: 30 + id: textName + objectName: "textName" + text: name + } + Text { + x: 120 + id: textNumber + objectName: "textNumber" + text: number + } + Text { + x: 200 + text: wrapper.y + } + color: ListView.isCurrentItem ? "lightsteelblue" : "white" + ListView.onRemove: SequentialAnimation { + PropertyAction { target: wrapper; property: "ListView.delayRemove"; value: true } + NumberAnimation { target: wrapper; property: "scale"; to: 0; duration: 250; easing.type: "InOutQuad" } + PropertyAction { target: wrapper; property: "ListView.delayRemove"; value: false } + + } + } + }, + Component { + id: myHighlight + Rectangle { color: "green" } + }, + Component { + id: invalidHl + SmoothedAnimation {} + }, + Component { + id: headerFooter + Rectangle { height: 30; width: 240; color: "blue" } + } + ] + ListView { + id: list + objectName: "list" + focus: true + width: 240 + height: 320 + model: testModel + delegate: testObject.animate ? animatedDelegate : myDelegate + highlight: testObject.invalidHighlight ? invalidHl : myHighlight + highlightMoveSpeed: 1000 + highlightResizeSpeed: 1000 + cacheBuffer: testObject.cacheBuffer + header: root.showHeader ? headerFooter : null + footer: root.showFooter ? headerFooter : null + } +} diff --git a/tests/auto/declarative/qdeclarativelistview/data/manual-highlight.qml b/tests/auto/declarative/qdeclarativelistview/data/manual-highlight.qml new file mode 100644 index 00000000..a32a1949 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistview/data/manual-highlight.qml @@ -0,0 +1,47 @@ +import QtQuick 1.0 + +Item { + + ListModel { + id: model + ListElement { + name: "Bill Smith" + number: "555 3264" + } + ListElement { + name: "John Brown" + number: "555 8426" + } + ListElement { + name: "Sam Wise" + number: "555 0473" + } + ListElement { + name: "Bob Brown" + number: "555 5845" + } + } + + Component { + id: highlight + Rectangle { + objectName: "highlight" + width: 180; height: 20 + color: "lightsteelblue"; radius: 5 + y: list.currentItem.y+5 + } + } + + ListView { + id: list + objectName: "list" + anchors.fill: parent + model: model + delegate: Text { objectName: "wrapper"; text: name } + + highlight: highlight + highlightFollowsCurrentItem: false + focus: true + } + +} diff --git a/tests/auto/declarative/qdeclarativelistview/data/orientchange.qml b/tests/auto/declarative/qdeclarativelistview/data/orientchange.qml new file mode 100644 index 00000000..c7aa0cd1 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistview/data/orientchange.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +ListView { + width: 240; height: 320 + delegate: Rectangle { objectName: "wrapper"; width: 80; height: 80 } + model: 100 +} diff --git a/tests/auto/declarative/qdeclarativelistview/data/propertychangestest.qml b/tests/auto/declarative/qdeclarativelistview/data/propertychangestest.qml new file mode 100644 index 00000000..04bec59a --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistview/data/propertychangestest.qml @@ -0,0 +1,71 @@ +import QtQuick 1.0 + +Rectangle { + width: 180; height: 120; color: "white" + Component { + id: delegate + Item { + id: wrapper + width: 180; height: 40; + Column { + x: 5; y: 5 + Text { text: 'Name: ' + name } + Text { text: 'Number: ' + number } + } + } + } + Component { + id: highlightRed + Rectangle { + color: "red" + radius: 10 + opacity: 0.5 + } + } + ListView { + objectName: "listView" + anchors.fill: parent + model: listModel + delegate: delegate + highlight: highlightRed + focus: true + highlightFollowsCurrentItem: true + preferredHighlightBegin: 0.0 + preferredHighlightEnd: 0.0 + highlightRangeMode: ListView.ApplyRange + keyNavigationWraps: true + cacheBuffer: 10 + snapMode: ListView.SnapToItem + } + + data:[ + ListModel { + id: listModel + ListElement { + name: "Bill Smith" + number: "555 3264" + } + ListElement { + name: "John Brown" + number: "555 8426" + } + ListElement { + name: "Sam Wise" + number: "555 0473" + } + }, + ListModel { + objectName: "alternateModel" + ListElement { + name: "Jack" + number: "555 8426" + } + ListElement { + name: "Mary" + number: "555 3264" + } + } + ] +} + + diff --git a/tests/auto/declarative/qdeclarativelistview/data/qtbug14821.qml b/tests/auto/declarative/qdeclarativelistview/data/qtbug14821.qml new file mode 100644 index 00000000..e0303eca --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistview/data/qtbug14821.qml @@ -0,0 +1,31 @@ +import QtQuick 1.0 + +ListView { + id: view + width: 300; height: 200 + focus: true + keyNavigationWraps: true + + model: 100 + + preferredHighlightBegin: 90 + preferredHighlightEnd: 110 + + highlightRangeMode: ListView.StrictlyEnforceRange + highlight: Component { + Rectangle { + border.color: "blue" + border.width: 3 + color: "transparent" + width: 300; height: 15 + } + } + + delegate: Component { + Item { + height: 15 + (view.currentIndex == index ? 20 : 0) + width: 200 + Text { text: 'Index: ' + index; anchors.verticalCenter: parent.verticalCenter } + } + } +} diff --git a/tests/auto/declarative/qdeclarativelistview/data/qtbug16037.qml b/tests/auto/declarative/qdeclarativelistview/data/qtbug16037.qml new file mode 100644 index 00000000..0756618a --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistview/data/qtbug16037.qml @@ -0,0 +1,37 @@ +import QtQuick 1.0 + +Item { + width: 640 + height: 480 + + function setModel() { + listView.model = listModel1 + } + + ListModel { + id: listModel1 + ListElement { text: "Apple" } + ListElement { text: "Banana" } + ListElement { text: "Orange" } + ListElement { text: "Coconut" } + } + + Rectangle { + width: 200 + height: listView.contentHeight + color: "yellow" + anchors.centerIn: parent + + ListView { + id: listView + objectName: "listview" + anchors.fill: parent + + delegate: Item { + width: 200 + height: 20 + Text { text: model.text; anchors.centerIn: parent } + } + } + } +} diff --git a/tests/auto/declarative/qdeclarativelistview/data/rightToLeft.qml b/tests/auto/declarative/qdeclarativelistview/data/rightToLeft.qml new file mode 100644 index 00000000..1e92bb3c --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistview/data/rightToLeft.qml @@ -0,0 +1,42 @@ +// This example demonstrates how item positioning +// changes in right-to-left layout direction + +import QtQuick 1.1 + +Rectangle { + color: "lightgray" + width: 640 + height: 320 + + VisualItemModel { + id: itemModel + objectName: "itemModel" + Rectangle { + objectName: "item1" + height: view.height; width: 100; color: "#FFFEF0" + Text { objectName: "text1"; text: "index: " + parent.VisualItemModel.index; font.bold: true; anchors.centerIn: parent } + } + Rectangle { + objectName: "item2" + height: view.height; width: 200; color: "#F0FFF7" + Text { objectName: "text2"; text: "index: " + parent.VisualItemModel.index; font.bold: true; anchors.centerIn: parent } + } + Rectangle { + objectName: "item3" + height: view.height; width: 240; color: "#F4F0FF" + Text { objectName: "text3"; text: "index: " + parent.VisualItemModel.index; font.bold: true; anchors.centerIn: parent } + } + } + + ListView { + id: view + objectName: "view" + anchors.fill: parent + anchors.bottomMargin: 30 + model: itemModel + highlightRangeMode: "StrictlyEnforceRange" + orientation: ListView.Horizontal + flickDeceleration: 2000 + layoutDirection: Qt.RightToLeft + } +} diff --git a/tests/auto/declarative/qdeclarativelistview/data/sizelessthan1.qml b/tests/auto/declarative/qdeclarativelistview/data/sizelessthan1.qml new file mode 100644 index 00000000..77bfef8e --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistview/data/sizelessthan1.qml @@ -0,0 +1,26 @@ +import QtQuick 1.0 + +Rectangle { + width: 240 + height: 320 + color: "#ffffff" + Component { + id: myDelegate + Rectangle { + id: wrapper + objectName: "wrapper" + height: 0.5 + width: 240 + color: ((index % 2) == 1 ? "red" : "blue") + } + } + ListView { + id: list + objectName: "list" + focus: true + width: 240 + height: 320 + model: testModel + delegate: myDelegate + } +} diff --git a/tests/auto/declarative/qdeclarativelistview/data/strictlyenforcerange.qml b/tests/auto/declarative/qdeclarativelistview/data/strictlyenforcerange.qml new file mode 100644 index 00000000..bb77a77c --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistview/data/strictlyenforcerange.qml @@ -0,0 +1,29 @@ +import QtQuick 1.0 + +ListView { + id: list + objectName: "list" + width: 320 + height: 480 + + function fillModel() { + list.model.append({"col": "red"}); + list.currentIndex = list.count-1 + list.model.append({"col": "blue"}); + list.currentIndex = list.count-1 + list.model.append({"col": "green"}); + list.currentIndex = list.count-1 + } + + model: ListModel { id: listModel } // empty model + delegate: Rectangle { id: wrapper; objectName: "wrapper"; color: col; width: 300; height: 400 } + orientation: "Horizontal" + snapMode: "SnapToItem" + cacheBuffer: 1000 + + preferredHighlightBegin: 10 + preferredHighlightEnd: 10 + + highlightRangeMode: "StrictlyEnforceRange" + focus: true +} diff --git a/tests/auto/declarative/qdeclarativelistview/incrementalmodel.cpp b/tests/auto/declarative/qdeclarativelistview/incrementalmodel.cpp new file mode 100644 index 00000000..1ebb4dc5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistview/incrementalmodel.cpp @@ -0,0 +1,89 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "incrementalmodel.h" +#include +#include + +IncrementalModel::IncrementalModel(QObject *parent) + : QAbstractListModel(parent), count(0) +{ + for (int i = 0; i < 100; ++i) + list.append("Item " + QString::number(i)); +} + +int IncrementalModel::rowCount(const QModelIndex & /* parent */) const +{ + return count; +} + +QVariant IncrementalModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid()) + return QVariant(); + + if (index.row() >= list.size() || index.row() < 0) + return QVariant(); + + if (role == Qt::DisplayRole) + return list.at(index.row()); + return QVariant(); +} + +bool IncrementalModel::canFetchMore(const QModelIndex & /* index */) const +{ + if (count < list.size()) + return true; + else + return false; +} + +void IncrementalModel::fetchMore(const QModelIndex & /* index */) +{ + int remainder = list.size() - count; + int itemsToFetch = qMin(5, remainder); + + beginInsertRows(QModelIndex(), count, count+itemsToFetch-1); + + count += itemsToFetch; + + endInsertRows(); +} diff --git a/tests/auto/declarative/qdeclarativelistview/incrementalmodel.h b/tests/auto/declarative/qdeclarativelistview/incrementalmodel.h new file mode 100644 index 00000000..09a2bbd1 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistview/incrementalmodel.h @@ -0,0 +1,68 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef IncrementalModel_H +#define IncrementalModel_H + +#include +#include +#include + +class IncrementalModel : public QAbstractListModel +{ + Q_OBJECT + +public: + IncrementalModel(QObject *parent = 0); + + int rowCount(const QModelIndex &parent = QModelIndex()) const; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; + +protected: + bool canFetchMore(const QModelIndex &parent) const; + void fetchMore(const QModelIndex &parent); + +private: + QStringList list; + int count; +}; + +#endif diff --git a/tests/auto/declarative/qdeclarativelistview/qdeclarativelistview.pro b/tests/auto/declarative/qdeclarativelistview/qdeclarativelistview.pro new file mode 100644 index 00000000..1633ffca --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistview/qdeclarativelistview.pro @@ -0,0 +1,16 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +macx:CONFIG -= app_bundle + +HEADERS += incrementalmodel.h +SOURCES += tst_qdeclarativelistview.cpp incrementalmodel.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test diff --git a/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp b/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp new file mode 100644 index 00000000..31a8e2d9 --- /dev/null +++ b/tests/auto/declarative/qdeclarativelistview/tst_qdeclarativelistview.cpp @@ -0,0 +1,2837 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../../../shared/util.h" +#include "incrementalmodel.h" + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_QDeclarativeListView : public QObject +{ + Q_OBJECT +public: + tst_QDeclarativeListView(); + +private slots: + // Test both QListModelInterface and QAbstractItemModel model types + void qListModelInterface_items(); + void qAbstractItemModel_items(); + + void qListModelInterface_changed(); + void qAbstractItemModel_changed(); + + void qListModelInterface_inserted(); + void qAbstractItemModel_inserted(); + + void qListModelInterface_removed(); + void qAbstractItemModel_removed(); + + void qListModelInterface_moved(); + void qAbstractItemModel_moved(); + + void qListModelInterface_clear(); + void qAbstractItemModel_clear(); + + void itemList(); + void currentIndex(); + void noCurrentIndex(); + void enforceRange(); + void spacing(); + void sections(); + void sectionsDelegate(); + void cacheBuffer(); + void positionViewAtIndex(); + void resetModel(); + void propertyChanges(); + void componentChanges(); + void modelChanges(); + void QTBUG_9791(); + void manualHighlight(); + void QTBUG_11105(); + void header(); + void footer(); + void headerFooter(); + void resizeView(); + void sizeLessThan1(); + void QTBUG_14821(); + void resizeDelegate(); + void QTBUG_16037(); + void indexAt(); + void incrementalModel(); + void onAdd(); + void onAdd_data(); + void onRemove(); + void onRemove_data(); + void testQtQuick11Attributes(); + void testQtQuick11Attributes_data(); + void rightToLeft(); + void test_mirroring(); + void orientationChange(); + void contentPosJump(); + +private: + template void items(); + template void changed(); + template void inserted(); + template void removed(bool animated); + template void moved(); + template void clear(); + QDeclarativeView *createView(); + template + T *findItem(QGraphicsObject *parent, const QString &id, int index=-1); + template + QList findItems(QGraphicsObject *parent, const QString &objectName); + void dumpTree(QDeclarativeItem *parent, int depth = 0); +}; + +class TestObject : public QObject +{ + Q_OBJECT + + Q_PROPERTY(bool error READ error WRITE setError NOTIFY changedError) + Q_PROPERTY(bool animate READ animate NOTIFY changedAnim) + Q_PROPERTY(bool invalidHighlight READ invalidHighlight NOTIFY changedHl) + Q_PROPERTY(int cacheBuffer READ cacheBuffer NOTIFY changedCacheBuffer) + +public: + TestObject(QObject *parent = 0) + : QObject(parent), mError(true), mAnimate(false), mInvalidHighlight(false) + , mCacheBuffer(0) {} + + bool error() const { return mError; } + void setError(bool err) { mError = err; emit changedError(); } + + bool animate() const { return mAnimate; } + void setAnimate(bool anim) { mAnimate = anim; emit changedAnim(); } + + bool invalidHighlight() const { return mInvalidHighlight; } + void setInvalidHighlight(bool invalid) { mInvalidHighlight = invalid; emit changedHl(); } + + int cacheBuffer() const { return mCacheBuffer; } + void setCacheBuffer(int buffer) { mCacheBuffer = buffer; emit changedCacheBuffer(); } + +signals: + void changedError(); + void changedAnim(); + void changedHl(); + void changedCacheBuffer(); + +public: + bool mError; + bool mAnimate; + bool mInvalidHighlight; + int mCacheBuffer; +}; + +class TestModel : public QListModelInterface +{ + Q_OBJECT +public: + TestModel(QObject *parent = 0) : QListModelInterface(parent) {} + ~TestModel() {} + + enum Roles { Name, Number }; + + QString name(int index) const { return list.at(index).first; } + QString number(int index) const { return list.at(index).second; } + + int count() const { return list.count(); } + + QList roles() const { return QList() << Name << Number; } + QString toString(int role) const { + switch(role) { + case Name: + return "name"; + case Number: + return "number"; + default: + return ""; + } + } + + QVariant data(int index, int role) const + { + if (role==0) + return list.at(index).first; + if (role==1) + return list.at(index).second; + return QVariant(); + } + QHash data(int index, const QList &roles) const { + QHash returnHash; + + for (int i = 0; i < roles.size(); ++i) { + int role = roles.at(i); + QVariant info; + switch(role) { + case Name: + info = list.at(index).first; + break; + case Number: + info = list.at(index).second; + break; + default: + break; + } + returnHash.insert(role, info); + } + return returnHash; + } + + void addItem(const QString &name, const QString &number) { + list.append(QPair(name, number)); + emit itemsInserted(list.count()-1, 1); + } + + void insertItem(int index, const QString &name, const QString &number) { + list.insert(index, QPair(name, number)); + emit itemsInserted(index, 1); + } + + void removeItem(int index) { + list.removeAt(index); + emit itemsRemoved(index, 1); + } + + void removeItems(int index, int count) { + int c = count; + while (c--) + list.removeAt(index); + emit itemsRemoved(index, count); + } + + void moveItem(int from, int to) { + list.move(from, to); + emit itemsMoved(from, to, 1); + } + + void modifyItem(int index, const QString &name, const QString &number) { + list[index] = QPair(name, number); + emit itemsChanged(index, 1, roles()); + } + + void clear() { + int count = list.count(); + list.clear(); + emit itemsRemoved(0, count); + } + +private: + QList > list; +}; + + +class TestModel2 : public QAbstractListModel +{ +public: + enum Roles { Name = Qt::UserRole+1, Number = Qt::UserRole+2 }; + + TestModel2(QObject *parent=0) : QAbstractListModel(parent) { + QHash roles; + roles[Name] = "name"; + roles[Number] = "number"; + setRoleNames(roles); + } + + int rowCount(const QModelIndex &parent=QModelIndex()) const { Q_UNUSED(parent); return list.count(); } + QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const { + QVariant rv; + if (role == Name) + rv = list.at(index.row()).first; + else if (role == Number) + rv = list.at(index.row()).second; + + return rv; + } + + int count() const { return rowCount(); } + QString name(int index) const { return list.at(index).first; } + QString number(int index) const { return list.at(index).second; } + + void addItem(const QString &name, const QString &number) { + emit beginInsertRows(QModelIndex(), list.count(), list.count()); + list.append(QPair(name, number)); + emit endInsertRows(); + } + + void addItems(const QList > &items) { + emit beginInsertRows(QModelIndex(), list.count(), list.count()+items.count()-1); + for (int i=0; i(items[i].first, items[i].second)); + emit endInsertRows(); + } + + void insertItem(int index, const QString &name, const QString &number) { + emit beginInsertRows(QModelIndex(), index, index); + list.insert(index, QPair(name, number)); + emit endInsertRows(); + } + + void removeItem(int index) { + emit beginRemoveRows(QModelIndex(), index, index); + list.removeAt(index); + emit endRemoveRows(); + } + + void removeItems(int index, int count) { + emit beginRemoveRows(QModelIndex(), index, index+count-1); + while (count--) + list.removeAt(index); + emit endRemoveRows(); + } + + void moveItem(int from, int to) { + emit beginMoveRows(QModelIndex(), from, from, QModelIndex(), to); + list.move(from, to); + emit endMoveRows(); + } + + void modifyItem(int idx, const QString &name, const QString &number) { + list[idx] = QPair(name, number); + emit dataChanged(index(idx,0), index(idx,0)); + } + + void clear() { + int count = list.count(); + emit beginRemoveRows(QModelIndex(), 0, count-1); + list.clear(); + emit endRemoveRows(); + } + +private: + QList > list; +}; + +tst_QDeclarativeListView::tst_QDeclarativeListView() +{ +} + +template +void tst_QDeclarativeListView::items() +{ + QDeclarativeView *canvas = createView(); + + T model; + model.addItem("Fred", "12345"); + model.addItem("John", "2345"); + model.addItem("Bob", "54321"); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + TestObject *testObject = new TestObject; + ctxt->setContextProperty("testObject", testObject); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listviewtest.qml")); + qApp->processEvents(); + + QDeclarativeListView *listview = findItem(canvas->rootObject(), "list"); + QTRY_VERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + QMetaObject::invokeMethod(canvas->rootObject(), "checkProperties"); + QTRY_VERIFY(testObject->error() == false); + + QTRY_VERIFY(listview->highlightItem() != 0); + QTRY_COMPARE(listview->count(), model.count()); + QTRY_COMPARE(canvas->rootObject()->property("count").toInt(), model.count()); + QTRY_COMPARE(contentItem->childItems().count(), model.count()+1); // assumes all are visible, +1 for the (default) highlight item + + // current item should be first item + QTRY_COMPARE(listview->currentItem(), findItem(contentItem, "wrapper", 0)); + + for (int i = 0; i < model.count(); ++i) { + QDeclarativeText *name = findItem(contentItem, "textName", i); + QTRY_VERIFY(name != 0); + QTRY_COMPARE(name->text(), model.name(i)); + QDeclarativeText *number = findItem(contentItem, "textNumber", i); + QTRY_VERIFY(number != 0); + QTRY_COMPARE(number->text(), model.number(i)); + } + + // switch to other delegate + testObject->setAnimate(true); + QMetaObject::invokeMethod(canvas->rootObject(), "checkProperties"); + QTRY_VERIFY(testObject->error() == false); + QTRY_VERIFY(listview->currentItem()); + + // set invalid highlight + testObject->setInvalidHighlight(true); + QMetaObject::invokeMethod(canvas->rootObject(), "checkProperties"); + QTRY_VERIFY(testObject->error() == false); + QTRY_VERIFY(listview->currentItem()); + QTRY_VERIFY(listview->highlightItem() == 0); + + // back to normal highlight + testObject->setInvalidHighlight(false); + QMetaObject::invokeMethod(canvas->rootObject(), "checkProperties"); + QTRY_VERIFY(testObject->error() == false); + QTRY_VERIFY(listview->currentItem()); + QTRY_VERIFY(listview->highlightItem() != 0); + + // set an empty model and confirm that items are destroyed + T model2; + ctxt->setContextProperty("testModel", &model2); + + int itemCount = findItems(contentItem, "wrapper").count(); + QTRY_VERIFY(itemCount == 0); + + QTRY_COMPARE(listview->highlightResizeSpeed(), 1000.0); + QTRY_COMPARE(listview->highlightMoveSpeed(), 1000.0); + + delete canvas; +} + + +template +void tst_QDeclarativeListView::changed() +{ + QDeclarativeView *canvas = createView(); + + T model; + model.addItem("Fred", "12345"); + model.addItem("John", "2345"); + model.addItem("Bob", "54321"); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + TestObject *testObject = new TestObject; + ctxt->setContextProperty("testObject", testObject); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listviewtest.qml")); + qApp->processEvents(); + + QDeclarativeFlickable *listview = findItem(canvas->rootObject(), "list"); + QTRY_VERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + model.modifyItem(1, "Will", "9876"); + QDeclarativeText *name = findItem(contentItem, "textName", 1); + QTRY_VERIFY(name != 0); + QTRY_COMPARE(name->text(), model.name(1)); + QDeclarativeText *number = findItem(contentItem, "textNumber", 1); + QTRY_VERIFY(number != 0); + QTRY_COMPARE(number->text(), model.number(1)); + + delete canvas; +} + +template +void tst_QDeclarativeListView::inserted() +{ + QDeclarativeView *canvas = createView(); + + T model; + model.addItem("Fred", "12345"); + model.addItem("John", "2345"); + model.addItem("Bob", "54321"); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + TestObject *testObject = new TestObject; + ctxt->setContextProperty("testObject", testObject); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listviewtest.qml")); + qApp->processEvents(); + + QDeclarativeListView *listview = findItem(canvas->rootObject(), "list"); + QTRY_VERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + model.insertItem(1, "Will", "9876"); + + QTRY_COMPARE(contentItem->childItems().count(), model.count()+1); // assumes all are visible, +1 for the (default) highlight item + + QDeclarativeText *name = findItem(contentItem, "textName", 1); + QTRY_VERIFY(name != 0); + QTRY_COMPARE(name->text(), model.name(1)); + QDeclarativeText *number = findItem(contentItem, "textNumber", 1); + QTRY_VERIFY(number != 0); + QTRY_COMPARE(number->text(), model.number(1)); + + // Confirm items positioned correctly + for (int i = 0; i < model.count(); ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + QTRY_COMPARE(item->y(), i*20.0); + } + + model.insertItem(0, "Foo", "1111"); // zero index, and current item + + QCOMPARE(canvas->rootObject()->property("count").toInt(), model.count()); + QTRY_COMPARE(contentItem->childItems().count(), model.count()+1); // assumes all are visible, +1 for the (default) highlight item + + name = findItem(contentItem, "textName", 0); + QTRY_VERIFY(name != 0); + QTRY_COMPARE(name->text(), model.name(0)); + number = findItem(contentItem, "textNumber", 0); + QTRY_VERIFY(number != 0); + QTRY_COMPARE(number->text(), model.number(0)); + + QTRY_COMPARE(listview->currentIndex(), 1); + + // Confirm items positioned correctly + for (int i = 0; i < model.count(); ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + QTRY_COMPARE(item->y(), i*20.0); + } + + for (int i = model.count(); i < 30; ++i) + model.insertItem(i, "Hello", QString::number(i)); + + listview->setContentY(80); + + // Insert item outside visible area + model.insertItem(1, "Hello", "1324"); + + QTRY_VERIFY(listview->contentY() == 80); + + // Confirm items positioned correctly + for (int i = 5; i < 5+15; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->y(), i*20.0 - 20.0); + } + +// QTRY_COMPARE(listview->contentItemHeight(), model.count() * 20.0); + + delete canvas; +} + +template +void tst_QDeclarativeListView::removed(bool animated) +{ + QDeclarativeView *canvas = createView(); + + T model; + for (int i = 0; i < 50; i++) + model.addItem("Item" + QString::number(i), ""); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + TestObject *testObject = new TestObject; + testObject->setAnimate(animated); + ctxt->setContextProperty("testObject", testObject); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listviewtest.qml")); + qApp->processEvents(); + + QDeclarativeListView *listview = findItem(canvas->rootObject(), "list"); + QTRY_VERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + model.removeItem(1); + QCOMPARE(canvas->rootObject()->property("count").toInt(), model.count()); + + QDeclarativeText *name = findItem(contentItem, "textName", 1); + QTRY_VERIFY(name != 0); + QTRY_COMPARE(name->text(), model.name(1)); + QDeclarativeText *number = findItem(contentItem, "textNumber", 1); + QTRY_VERIFY(number != 0); + QTRY_COMPARE(number->text(), model.number(1)); + + // Confirm items positioned correctly + int itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 0; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_VERIFY(item->y() == i*20); + } + + // Remove first item (which is the current item); + model.removeItem(0); // post: top item starts at 20 + + QTest::qWait(300); + + name = findItem(contentItem, "textName", 0); + QTRY_VERIFY(name != 0); + QTRY_COMPARE(name->text(), model.name(0)); + number = findItem(contentItem, "textNumber", 0); + QTRY_VERIFY(number != 0); + QTRY_COMPARE(number->text(), model.number(0)); + + // Confirm items positioned correctly + itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 0; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->y(),i*20.0 + 20.0); + } + + // Remove items not visible + model.removeItem(18); + qApp->processEvents(); + + // Confirm items positioned correctly + itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 0; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->y(),i*20.0+20.0); + } + + // Remove items before visible + listview->setContentY(80); + listview->setCurrentIndex(10); + + model.removeItem(1); // post: top item will be at 40 + qApp->processEvents(); + + // Confirm items positioned correctly + for (int i = 2; i < 18; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->y(),40+i*20.0); + } + + // Remove current index + QTRY_VERIFY(listview->currentIndex() == 9); + QDeclarativeItem *oldCurrent = listview->currentItem(); + model.removeItem(9); + + QTRY_COMPARE(listview->currentIndex(), 9); + QTRY_VERIFY(listview->currentItem() != oldCurrent); + + listview->setContentY(40); // That's the top now + // let transitions settle. + QTest::qWait(300); + + // Confirm items positioned correctly + itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 0; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->y(),40+i*20.0); + } + + // remove current item beyond visible items. + listview->setCurrentIndex(20); + listview->setContentY(40); + model.removeItem(20); + + QTRY_COMPARE(listview->currentIndex(), 20); + QTRY_VERIFY(listview->currentItem() != 0); + + // remove item before current, but visible + listview->setCurrentIndex(8); + oldCurrent = listview->currentItem(); + model.removeItem(6); + + QTRY_COMPARE(listview->currentIndex(), 7); + QTRY_VERIFY(listview->currentItem() == oldCurrent); + + listview->setContentY(80); + QTest::qWait(300); + + // remove all visible items + model.removeItems(1, 18); + QTest::qWait(300); + + // Confirm items positioned correctly + itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 0; i < model.count() && i < itemCount-1; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i+2); + if (!item) qWarning() << "Item" << i+2 << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->y(),80+i*20.0); + } + + model.removeItems(1, 17); +// QTest::qWait(300); + + model.removeItems(2, 1); + model.addItem("New", "1"); + + QTRY_VERIFY(name = findItem(contentItem, "textName", model.count()-1)); + QCOMPARE(name->text(), QString("New")); + + // Add some more items so that we don't run out + for (int i = 50; i < 100; i++) + model.addItem("Item" + QString::number(i), ""); + + // QTBUG-19198 move to end and remove all visible items one at a time. + listview->positionViewAtEnd(); + for (int i = 0; i < 18; ++i) + model.removeItems(model.count() - 1, 1); + QTRY_VERIFY(findItems(contentItem, "wrapper").count() > 16); + + delete canvas; +} + +template +void tst_QDeclarativeListView::clear() +{ + QDeclarativeView *canvas = createView(); + + T model; + for (int i = 0; i < 30; i++) + model.addItem("Item" + QString::number(i), ""); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + TestObject *testObject = new TestObject; + ctxt->setContextProperty("testObject", testObject); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listviewtest.qml")); + qApp->processEvents(); + + QDeclarativeListView *listview = findItem(canvas->rootObject(), "list"); + QTRY_VERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + model.clear(); + + QTRY_VERIFY(listview->count() == 0); + QTRY_VERIFY(listview->currentItem() == 0); + QTRY_VERIFY(listview->contentY() == 0); + QVERIFY(listview->currentIndex() == -1); + + // confirm sanity when adding an item to cleared list + model.addItem("New", "1"); + QTRY_VERIFY(listview->count() == 1); + QVERIFY(listview->currentItem() != 0); + QVERIFY(listview->currentIndex() == 0); + + delete canvas; +} + + +template +void tst_QDeclarativeListView::moved() +{ + QDeclarativeView *canvas = createView(); + + T model; + for (int i = 0; i < 30; i++) + model.addItem("Item" + QString::number(i), ""); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + TestObject *testObject = new TestObject; + ctxt->setContextProperty("testObject", testObject); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listviewtest.qml")); + qApp->processEvents(); + + QDeclarativeListView *listview = findItem(canvas->rootObject(), "list"); + QTRY_VERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + model.moveItem(1, 4); + + QDeclarativeText *name = findItem(contentItem, "textName", 1); + QTRY_VERIFY(name != 0); + QTRY_COMPARE(name->text(), model.name(1)); + QDeclarativeText *number = findItem(contentItem, "textNumber", 1); + QTRY_VERIFY(number != 0); + QTRY_COMPARE(number->text(), model.number(1)); + + name = findItem(contentItem, "textName", 4); + QTRY_VERIFY(name != 0); + QTRY_COMPARE(name->text(), model.name(4)); + number = findItem(contentItem, "textNumber", 4); + QTRY_VERIFY(number != 0); + QTRY_COMPARE(number->text(), model.number(4)); + + // Confirm items positioned correctly + int itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 0; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_VERIFY(item->y() == i*20); + } + + listview->setContentY(80); + + // move outside visible area + model.moveItem(1, 18); + + // Confirm items positioned correctly and indexes correct + for (int i = 3; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->y(), i*20.0 + 20); + name = findItem(contentItem, "textName", i); + QTRY_VERIFY(name != 0); + QTRY_COMPARE(name->text(), model.name(i)); + number = findItem(contentItem, "textNumber", i); + QTRY_VERIFY(number != 0); + QTRY_COMPARE(number->text(), model.number(i)); + } + + // move from outside visible into visible + model.moveItem(20, 4); + + // Confirm items positioned correctly and indexes correct + for (int i = 3; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->y(), i*20.0 + 20); + name = findItem(contentItem, "textName", i); + QTRY_VERIFY(name != 0); + QTRY_COMPARE(name->text(), model.name(i)); + number = findItem(contentItem, "textNumber", i); + QTRY_VERIFY(number != 0); + QTRY_COMPARE(number->text(), model.number(i)); + } + + delete canvas; +} + +void tst_QDeclarativeListView::enforceRange() +{ + QDeclarativeView *canvas = createView(); + + TestModel model; + for (int i = 0; i < 30; i++) + model.addItem("Item" + QString::number(i), ""); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listview-enforcerange.qml")); + qApp->processEvents(); + + QDeclarativeListView *listview = findItem(canvas->rootObject(), "list"); + QTRY_VERIFY(listview != 0); + + QTRY_COMPARE(listview->preferredHighlightBegin(), 100.0); + QTRY_COMPARE(listview->preferredHighlightEnd(), 100.0); + QTRY_COMPARE(listview->highlightRangeMode(), QDeclarativeListView::StrictlyEnforceRange); + + QDeclarativeItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + // view should be positioned at the top of the range. + QDeclarativeItem *item = findItem(contentItem, "wrapper", 0); + QTRY_VERIFY(item); + QTRY_COMPARE(listview->contentY(), -100.0); + + QDeclarativeText *name = findItem(contentItem, "textName", 0); + QTRY_VERIFY(name != 0); + QTRY_COMPARE(name->text(), model.name(0)); + QDeclarativeText *number = findItem(contentItem, "textNumber", 0); + QTRY_VERIFY(number != 0); + QTRY_COMPARE(number->text(), model.number(0)); + + // Check currentIndex is updated when contentItem moves + listview->setContentY(20); + + QTRY_COMPARE(listview->currentIndex(), 6); + + // change model + TestModel model2; + for (int i = 0; i < 5; i++) + model2.addItem("Item" + QString::number(i), ""); + + ctxt->setContextProperty("testModel", &model2); + QCOMPARE(listview->count(), 5); + + delete canvas; +} + +void tst_QDeclarativeListView::spacing() +{ + QDeclarativeView *canvas = createView(); + + TestModel model; + for (int i = 0; i < 30; i++) + model.addItem("Item" + QString::number(i), ""); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + TestObject *testObject = new TestObject; + ctxt->setContextProperty("testObject", testObject); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listviewtest.qml")); + qApp->processEvents(); + + QDeclarativeListView *listview = findItem(canvas->rootObject(), "list"); + QTRY_VERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + // Confirm items positioned correctly + int itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 0; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_VERIFY(item->y() == i*20); + } + + listview->setSpacing(10); + QTRY_VERIFY(listview->spacing() == 10); + + // Confirm items positioned correctly + itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 0; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_VERIFY(item->y() == i*30); + } + + listview->setSpacing(0); + + // Confirm items positioned correctly + itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 0; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->y(), i*20.0); + } + + delete canvas; +} + +void tst_QDeclarativeListView::sections() +{ + QDeclarativeView *canvas = createView(); + + TestModel model; + for (int i = 0; i < 30; i++) + model.addItem("Item" + QString::number(i), QString::number(i/5)); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listview-sections.qml")); + qApp->processEvents(); + + QDeclarativeListView *listview = findItem(canvas->rootObject(), "list"); + QTRY_VERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + // Confirm items positioned correctly + int itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 0; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + QTRY_VERIFY(item); + QTRY_COMPARE(item->y(), qreal(i*20 + ((i+4)/5) * 20)); + QDeclarativeText *next = findItem(item, "nextSection"); + QCOMPARE(next->text().toInt(), (i+1)/5); + } + + QSignalSpy currentSectionChangedSpy(listview, SIGNAL(currentSectionChanged())); + + // Remove section boundary + model.removeItem(5); + + // New section header created + QDeclarativeItem *item = findItem(contentItem, "wrapper", 5); + QTRY_VERIFY(item); + QTRY_COMPARE(item->height(), 40.0); + + model.insertItem(3, "New Item", "0"); + + // Section header moved + item = findItem(contentItem, "wrapper", 5); + QTRY_VERIFY(item); + QTRY_COMPARE(item->height(), 20.0); + + item = findItem(contentItem, "wrapper", 6); + QTRY_VERIFY(item); + QTRY_COMPARE(item->height(), 40.0); + + // insert item which will become a section header + model.insertItem(6, "Replace header", "1"); + + item = findItem(contentItem, "wrapper", 6); + QTRY_VERIFY(item); + QTRY_COMPARE(item->height(), 40.0); + + item = findItem(contentItem, "wrapper", 7); + QTRY_VERIFY(item); + QTRY_COMPARE(item->height(), 20.0); + + QTRY_COMPARE(listview->currentSection(), QString("0")); + + listview->setContentY(140); + QTRY_COMPARE(listview->currentSection(), QString("1")); + + QTRY_COMPARE(currentSectionChangedSpy.count(), 1); + + listview->setContentY(20); + QTRY_COMPARE(listview->currentSection(), QString("0")); + + QTRY_COMPARE(currentSectionChangedSpy.count(), 2); + + item = findItem(contentItem, "wrapper", 1); + QTRY_VERIFY(item); + QTRY_COMPARE(item->height(), 20.0); + + // check that headers change when item changes + listview->setContentY(0); + model.modifyItem(0, "changed", "2"); + + item = findItem(contentItem, "wrapper", 1); + QTRY_VERIFY(item); + QTRY_COMPARE(item->height(), 40.0); + + delete canvas; +} + +void tst_QDeclarativeListView::sectionsDelegate() +{ + QDeclarativeView *canvas = createView(); + + TestModel model; + for (int i = 0; i < 30; i++) + model.addItem("Item" + QString::number(i), QString::number(i/5)); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listview-sections_delegate.qml")); + qApp->processEvents(); + + QDeclarativeListView *listview = findItem(canvas->rootObject(), "list"); + QTRY_VERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + // Confirm items positioned correctly + int itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 0; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + QTRY_VERIFY(item); + QTRY_COMPARE(item->y(), qreal(i*20 + ((i+5)/5) * 20)); + QDeclarativeText *next = findItem(item, "nextSection"); + QCOMPARE(next->text().toInt(), (i+1)/5); + } + + for (int i = 0; i < 3; ++i) { + QDeclarativeItem *item = findItem(contentItem, "sect_" + QString::number(i)); + QVERIFY(item); + QTRY_COMPARE(item->y(), qreal(i*20*6)); + } + + model.modifyItem(0, "One", "aaa"); + model.modifyItem(1, "Two", "aaa"); + model.modifyItem(2, "Three", "aaa"); + model.modifyItem(3, "Four", "aaa"); + model.modifyItem(4, "Five", "aaa"); + + for (int i = 0; i < 3; ++i) { + QDeclarativeItem *item = findItem(contentItem, + "sect_" + (i == 0 ? QString("aaa") : QString::number(i))); + QVERIFY(item); + QTRY_COMPARE(item->y(), qreal(i*20*6)); + } + + // remove section boundary + model.removeItem(5); + qApp->processEvents(); + for (int i = 0; i < 3; ++i) { + QDeclarativeItem *item = findItem(contentItem, + "sect_" + (i == 0 ? QString("aaa") : QString::number(i))); + QVERIFY(item); + } + + // QTBUG-17606 + QList items = findItems(contentItem, "sect_1"); + QCOMPARE(items.count(), 1); + + // QTBUG-17759 + model.modifyItem(0, "One", "aaa"); + model.modifyItem(1, "One", "aaa"); + model.modifyItem(2, "One", "aaa"); + model.modifyItem(3, "Four", "aaa"); + model.modifyItem(4, "Four", "aaa"); + model.modifyItem(5, "Four", "aaa"); + model.modifyItem(6, "Five", "aaa"); + model.modifyItem(7, "Five", "aaa"); + model.modifyItem(8, "Five", "aaa"); + model.modifyItem(9, "Two", "aaa"); + model.modifyItem(10, "Two", "aaa"); + model.modifyItem(11, "Two", "aaa"); + QTRY_COMPARE(findItems(contentItem, "sect_aaa").count(), 1); + canvas->rootObject()->setProperty("sectionProperty", "name"); + // ensure view has settled. + QTRY_COMPARE(findItems(contentItem, "sect_Four").count(), 1); + for (int i = 0; i < 4; ++i) { + QDeclarativeItem *item = findItem(contentItem, + "sect_" + model.name(i*3)); + QVERIFY(item); + QTRY_COMPARE(item->y(), qreal(i*20*4)); + } + + // QTBUG-17769 + model.removeItems(10, 20); + // ensure view has settled. + QTRY_COMPARE(findItems(contentItem, "wrapper").count(), 10); + // Drag view up beyond bounds + QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(20,20))); + { + QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(QPoint(20,0)), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(canvas->viewport(), &mv); + } + { + QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(QPoint(20,-50)), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(canvas->viewport(), &mv); + } + { + QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(QPoint(20,-200)), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(canvas->viewport(), &mv); + } + QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(20,-200))); + // view should settle back at 0 + QTRY_COMPARE(listview->contentY(), 0.0); + + delete canvas; +} + +void tst_QDeclarativeListView::currentIndex() +{ + TestModel model; + for (int i = 0; i < 30; i++) + model.addItem("Item" + QString::number(i), QString::number(i)); + + QDeclarativeView *canvas = new QDeclarativeView(0); + canvas->setFixedSize(240,320); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + ctxt->setContextProperty("testWrap", QVariant(false)); + + QString filename(SRCDIR "/data/listview-initCurrent.qml"); + canvas->setSource(QUrl::fromLocalFile(filename)); + + qApp->processEvents(); + + QDeclarativeListView *listview = findItem(canvas->rootObject(), "list"); + QTRY_VERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + // current item should be 20th item at startup + // and current item should be in view + QCOMPARE(listview->currentIndex(), 20); + QCOMPARE(listview->contentY(), 100.0); + QCOMPARE(listview->currentItem(), findItem(contentItem, "wrapper", 20)); + QCOMPARE(listview->highlightItem()->y(), listview->currentItem()->y()); + + // no wrap + listview->setCurrentIndex(0); + QCOMPARE(listview->currentIndex(), 0); + // confirm that the velocity is updated + QTRY_VERIFY(listview->verticalVelocity() != 0.0); + + listview->incrementCurrentIndex(); + QCOMPARE(listview->currentIndex(), 1); + listview->decrementCurrentIndex(); + QCOMPARE(listview->currentIndex(), 0); + + listview->decrementCurrentIndex(); + QCOMPARE(listview->currentIndex(), 0); + + // with wrap + ctxt->setContextProperty("testWrap", QVariant(true)); + QVERIFY(listview->isWrapEnabled()); + + listview->decrementCurrentIndex(); + QCOMPARE(listview->currentIndex(), model.count()-1); + + QTRY_COMPARE(listview->contentY(), 280.0); + + listview->incrementCurrentIndex(); + QCOMPARE(listview->currentIndex(), 0); + + QTRY_COMPARE(listview->contentY(), 0.0); + + // Test keys + canvas->show(); + qApp->setActiveWindow(canvas); +#ifdef Q_WS_X11 + // to be safe and avoid failing setFocus with window managers + qt_x11_wait_for_window_manager(canvas); +#endif + QTRY_VERIFY(canvas->hasFocus()); + QTRY_VERIFY(canvas->scene()->hasFocus()); + qApp->processEvents(); + + QTest::keyClick(canvas, Qt::Key_Down); + QCOMPARE(listview->currentIndex(), 1); + + QTest::keyClick(canvas, Qt::Key_Up); + QCOMPARE(listview->currentIndex(), 0); + + // turn off auto highlight + listview->setHighlightFollowsCurrentItem(false); + QVERIFY(listview->highlightFollowsCurrentItem() == false); + + QVERIFY(listview->highlightItem()); + qreal hlPos = listview->highlightItem()->y(); + + listview->setCurrentIndex(4); + QTRY_COMPARE(listview->highlightItem()->y(), hlPos); + + // insert item before currentIndex + listview->setCurrentIndex(28); + model.insertItem(0, "Foo", "1111"); + QTRY_COMPARE(canvas->rootObject()->property("current").toInt(), 29); + + // check removing highlight by setting currentIndex to -1; + listview->setCurrentIndex(-1); + + QCOMPARE(listview->currentIndex(), -1); + QVERIFY(!listview->highlightItem()); + QVERIFY(!listview->currentItem()); + + delete canvas; +} + +void tst_QDeclarativeListView::noCurrentIndex() +{ + TestModel model; + for (int i = 0; i < 30; i++) + model.addItem("Item" + QString::number(i), QString::number(i)); + + QDeclarativeView *canvas = new QDeclarativeView(0); + canvas->setFixedSize(240,320); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + QString filename(SRCDIR "/data/listview-noCurrent.qml"); + canvas->setSource(QUrl::fromLocalFile(filename)); + + qApp->processEvents(); + + QDeclarativeListView *listview = findItem(canvas->rootObject(), "list"); + QTRY_VERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + // current index should be -1 at startup + // and we should not have a currentItem or highlightItem + QCOMPARE(listview->currentIndex(), -1); + QCOMPARE(listview->contentY(), 0.0); + QVERIFY(!listview->highlightItem()); + QVERIFY(!listview->currentItem()); + + listview->setCurrentIndex(2); + QCOMPARE(listview->currentIndex(), 2); + QVERIFY(listview->highlightItem()); + QVERIFY(listview->currentItem()); +} + +void tst_QDeclarativeListView::itemList() +{ + QDeclarativeView *canvas = createView(); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/itemlist.qml")); + qApp->processEvents(); + + QDeclarativeListView *listview = findItem(canvas->rootObject(), "view"); + QTRY_VERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + QDeclarativeVisualItemModel *model = canvas->rootObject()->findChild("itemModel"); + QTRY_VERIFY(model != 0); + + QTRY_VERIFY(model->count() == 3); + QTRY_COMPARE(listview->currentIndex(), 0); + + QDeclarativeItem *item = findItem(contentItem, "item1"); + QTRY_VERIFY(item); + QTRY_COMPARE(item->x(), 0.0); + QCOMPARE(item->height(), listview->height()); + + QDeclarativeText *text = findItem(contentItem, "text1"); + QTRY_VERIFY(text); + QTRY_COMPARE(text->text(), QLatin1String("index: 0")); + + listview->setCurrentIndex(2); + + item = findItem(contentItem, "item3"); + QTRY_VERIFY(item); + QTRY_COMPARE(item->x(), 480.0); + + text = findItem(contentItem, "text3"); + QTRY_VERIFY(text); + QTRY_COMPARE(text->text(), QLatin1String("index: 2")); + + delete canvas; +} + +void tst_QDeclarativeListView::cacheBuffer() +{ + QDeclarativeView *canvas = createView(); + + TestModel model; + for (int i = 0; i < 30; i++) + model.addItem("Item" + QString::number(i), ""); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + TestObject *testObject = new TestObject; + ctxt->setContextProperty("testObject", testObject); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listviewtest.qml")); + qApp->processEvents(); + + QDeclarativeListView *listview = findItem(canvas->rootObject(), "list"); + QTRY_VERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + QTRY_VERIFY(listview->delegate() != 0); + QTRY_VERIFY(listview->model() != 0); + QTRY_VERIFY(listview->highlight() != 0); + + // Confirm items positioned correctly + int itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 0; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_VERIFY(item->y() == i*20); + } + + testObject->setCacheBuffer(400); + QTRY_VERIFY(listview->cacheBuffer() == 400); + + int newItemCount = findItems(contentItem, "wrapper").count(); + QTRY_VERIFY(newItemCount > itemCount); + + // Confirm items positioned correctly + for (int i = 0; i < model.count() && i < newItemCount; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_VERIFY(item->y() == i*20); + } + + delete canvas; +} + +void tst_QDeclarativeListView::positionViewAtIndex() +{ + QDeclarativeView *canvas = createView(); + + TestModel model; + for (int i = 0; i < 40; i++) + model.addItem("Item" + QString::number(i), ""); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + TestObject *testObject = new TestObject; + ctxt->setContextProperty("testObject", testObject); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listviewtest.qml")); + qApp->processEvents(); + + QDeclarativeListView *listview = findItem(canvas->rootObject(), "list"); + QTRY_VERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + // Confirm items positioned correctly + int itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 0; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->y(), i*20.); + } + + // Position on a currently visible item + listview->positionViewAtIndex(3, QDeclarativeListView::Beginning); + QTRY_COMPARE(listview->contentY(), 60.); + + // Confirm items positioned correctly + itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 3; i < model.count() && i < itemCount-3-1; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->y(), i*20.); + } + + // Position on an item beyond the visible items + listview->positionViewAtIndex(22, QDeclarativeListView::Beginning); + QTRY_COMPARE(listview->contentY(), 440.); + + // Confirm items positioned correctly + itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 22; i < model.count() && i < itemCount-22-1; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->y(), i*20.); + } + + // Position on an item that would leave empty space if positioned at the top + listview->positionViewAtIndex(28, QDeclarativeListView::Beginning); + QTRY_COMPARE(listview->contentY(), 480.); + + // Confirm items positioned correctly + itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 24; i < model.count() && i < itemCount-24-1; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->y(), i*20.); + } + + // Position at the beginning again + listview->positionViewAtIndex(0, QDeclarativeListView::Beginning); + QTRY_COMPARE(listview->contentY(), 0.); + + // Confirm items positioned correctly + itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 0; i < model.count() && i < itemCount-1; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->y(), i*20.); + } + + // Position at End using last index + listview->positionViewAtIndex(model.count()-1, QDeclarativeListView::End); + QTRY_COMPARE(listview->contentY(), 480.); + + // Confirm items positioned correctly + itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 24; i < model.count(); ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->y(), i*20.); + } + + // Position at End + listview->positionViewAtIndex(20, QDeclarativeListView::End); + QTRY_COMPARE(listview->contentY(), 100.); + + // Position in Center + listview->positionViewAtIndex(15, QDeclarativeListView::Center); + QTRY_COMPARE(listview->contentY(), 150.); + + // Ensure at least partially visible + listview->positionViewAtIndex(15, QDeclarativeListView::Visible); + QTRY_COMPARE(listview->contentY(), 150.); + + listview->setContentY(302); + listview->positionViewAtIndex(15, QDeclarativeListView::Visible); + QTRY_COMPARE(listview->contentY(), 302.); + + listview->setContentY(320); + listview->positionViewAtIndex(15, QDeclarativeListView::Visible); + QTRY_COMPARE(listview->contentY(), 300.); + + listview->setContentY(85); + listview->positionViewAtIndex(20, QDeclarativeListView::Visible); + QTRY_COMPARE(listview->contentY(), 85.); + + listview->setContentY(75); + listview->positionViewAtIndex(20, QDeclarativeListView::Visible); + QTRY_COMPARE(listview->contentY(), 100.); + + // Ensure completely visible + listview->setContentY(120); + listview->positionViewAtIndex(20, QDeclarativeListView::Contain); + QTRY_COMPARE(listview->contentY(), 120.); + + listview->setContentY(302); + listview->positionViewAtIndex(15, QDeclarativeListView::Contain); + QTRY_COMPARE(listview->contentY(), 300.); + + listview->setContentY(85); + listview->positionViewAtIndex(20, QDeclarativeListView::Contain); + QTRY_COMPARE(listview->contentY(), 100.); + + // positionAtBeginnging + listview->positionViewAtBeginning(); + QTRY_COMPARE(listview->contentY(), 0.); + + listview->setContentY(80); + canvas->rootObject()->setProperty("showHeader", true); + listview->positionViewAtBeginning(); + QTRY_COMPARE(listview->contentY(), -30.); + + // positionAtEnd + listview->positionViewAtEnd(); + QTRY_COMPARE(listview->contentY(), 480.); // 40*20 - 320 + + listview->setContentY(80); + canvas->rootObject()->setProperty("showFooter", true); + listview->positionViewAtEnd(); + QTRY_COMPARE(listview->contentY(), 510.); + + delete canvas; +} + +void tst_QDeclarativeListView::resetModel() +{ + QDeclarativeView *canvas = createView(); + + QStringList strings; + strings << "one" << "two" << "three"; + QStringListModel model(strings); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/displaylist.qml")); + qApp->processEvents(); + + QDeclarativeListView *listview = findItem(canvas->rootObject(), "list"); + QTRY_VERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + QTRY_COMPARE(listview->count(), model.rowCount()); + + for (int i = 0; i < model.rowCount(); ++i) { + QDeclarativeText *display = findItem(contentItem, "displayText", i); + QTRY_VERIFY(display != 0); + QTRY_COMPARE(display->text(), strings.at(i)); + } + + strings.clear(); + strings << "four" << "five" << "six" << "seven"; + model.setStringList(strings); + + QTRY_COMPARE(listview->count(), model.rowCount()); + + for (int i = 0; i < model.rowCount(); ++i) { + QDeclarativeText *display = findItem(contentItem, "displayText", i); + QTRY_VERIFY(display != 0); + QTRY_COMPARE(display->text(), strings.at(i)); + } + + delete canvas; +} + +void tst_QDeclarativeListView::propertyChanges() +{ + QDeclarativeView *canvas = createView(); + QTRY_VERIFY(canvas); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/propertychangestest.qml")); + + QDeclarativeListView *listView = canvas->rootObject()->findChild("listView"); + QTRY_VERIFY(listView); + + QSignalSpy highlightFollowsCurrentItemSpy(listView, SIGNAL(highlightFollowsCurrentItemChanged())); + QSignalSpy preferredHighlightBeginSpy(listView, SIGNAL(preferredHighlightBeginChanged())); + QSignalSpy preferredHighlightEndSpy(listView, SIGNAL(preferredHighlightEndChanged())); + QSignalSpy highlightRangeModeSpy(listView, SIGNAL(highlightRangeModeChanged())); + QSignalSpy keyNavigationWrapsSpy(listView, SIGNAL(keyNavigationWrapsChanged())); + QSignalSpy cacheBufferSpy(listView, SIGNAL(cacheBufferChanged())); + QSignalSpy snapModeSpy(listView, SIGNAL(snapModeChanged())); + + QTRY_COMPARE(listView->highlightFollowsCurrentItem(), true); + QTRY_COMPARE(listView->preferredHighlightBegin(), 0.0); + QTRY_COMPARE(listView->preferredHighlightEnd(), 0.0); + QTRY_COMPARE(listView->highlightRangeMode(), QDeclarativeListView::ApplyRange); + QTRY_COMPARE(listView->isWrapEnabled(), true); + QTRY_COMPARE(listView->cacheBuffer(), 10); + QTRY_COMPARE(listView->snapMode(), QDeclarativeListView::SnapToItem); + + listView->setHighlightFollowsCurrentItem(false); + listView->setPreferredHighlightBegin(1.0); + listView->setPreferredHighlightEnd(1.0); + listView->setHighlightRangeMode(QDeclarativeListView::StrictlyEnforceRange); + listView->setWrapEnabled(false); + listView->setCacheBuffer(3); + listView->setSnapMode(QDeclarativeListView::SnapOneItem); + + QTRY_COMPARE(listView->highlightFollowsCurrentItem(), false); + QTRY_COMPARE(listView->preferredHighlightBegin(), 1.0); + QTRY_COMPARE(listView->preferredHighlightEnd(), 1.0); + QTRY_COMPARE(listView->highlightRangeMode(), QDeclarativeListView::StrictlyEnforceRange); + QTRY_COMPARE(listView->isWrapEnabled(), false); + QTRY_COMPARE(listView->cacheBuffer(), 3); + QTRY_COMPARE(listView->snapMode(), QDeclarativeListView::SnapOneItem); + + QTRY_COMPARE(highlightFollowsCurrentItemSpy.count(),1); + QTRY_COMPARE(preferredHighlightBeginSpy.count(),1); + QTRY_COMPARE(preferredHighlightEndSpy.count(),1); + QTRY_COMPARE(highlightRangeModeSpy.count(),1); + QTRY_COMPARE(keyNavigationWrapsSpy.count(),1); + QTRY_COMPARE(cacheBufferSpy.count(),1); + QTRY_COMPARE(snapModeSpy.count(),1); + + listView->setHighlightFollowsCurrentItem(false); + listView->setPreferredHighlightBegin(1.0); + listView->setPreferredHighlightEnd(1.0); + listView->setHighlightRangeMode(QDeclarativeListView::StrictlyEnforceRange); + listView->setWrapEnabled(false); + listView->setCacheBuffer(3); + listView->setSnapMode(QDeclarativeListView::SnapOneItem); + + QTRY_COMPARE(highlightFollowsCurrentItemSpy.count(),1); + QTRY_COMPARE(preferredHighlightBeginSpy.count(),1); + QTRY_COMPARE(preferredHighlightEndSpy.count(),1); + QTRY_COMPARE(highlightRangeModeSpy.count(),1); + QTRY_COMPARE(keyNavigationWrapsSpy.count(),1); + QTRY_COMPARE(cacheBufferSpy.count(),1); + QTRY_COMPARE(snapModeSpy.count(),1); + + delete canvas; +} + +void tst_QDeclarativeListView::componentChanges() +{ + QDeclarativeView *canvas = createView(); + QTRY_VERIFY(canvas); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/propertychangestest.qml")); + + QDeclarativeListView *listView = canvas->rootObject()->findChild("listView"); + QTRY_VERIFY(listView); + + QDeclarativeComponent component(canvas->engine()); + component.setData("import QtQuick 1.0; Rectangle { color: \"blue\"; }", QUrl::fromLocalFile("")); + + QDeclarativeComponent delegateComponent(canvas->engine()); + delegateComponent.setData("import QtQuick 1.0; Text { text: 'Name: ' + name }", QUrl::fromLocalFile("")); + + QSignalSpy highlightSpy(listView, SIGNAL(highlightChanged())); + QSignalSpy delegateSpy(listView, SIGNAL(delegateChanged())); + QSignalSpy headerSpy(listView, SIGNAL(headerChanged())); + QSignalSpy footerSpy(listView, SIGNAL(footerChanged())); + + listView->setHighlight(&component); + listView->setHeader(&component); + listView->setFooter(&component); + listView->setDelegate(&delegateComponent); + + QTRY_COMPARE(listView->highlight(), &component); + QTRY_COMPARE(listView->header(), &component); + QTRY_COMPARE(listView->footer(), &component); + QTRY_COMPARE(listView->delegate(), &delegateComponent); + + QTRY_COMPARE(highlightSpy.count(),1); + QTRY_COMPARE(delegateSpy.count(),1); + QTRY_COMPARE(headerSpy.count(),1); + QTRY_COMPARE(footerSpy.count(),1); + + listView->setHighlight(&component); + listView->setHeader(&component); + listView->setFooter(&component); + listView->setDelegate(&delegateComponent); + + QTRY_COMPARE(highlightSpy.count(),1); + QTRY_COMPARE(delegateSpy.count(),1); + QTRY_COMPARE(headerSpy.count(),1); + QTRY_COMPARE(footerSpy.count(),1); + + delete canvas; +} + +void tst_QDeclarativeListView::modelChanges() +{ + QDeclarativeView *canvas = createView(); + QTRY_VERIFY(canvas); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/propertychangestest.qml")); + + QDeclarativeListView *listView = canvas->rootObject()->findChild("listView"); + QTRY_VERIFY(listView); + + QDeclarativeListModel *alternateModel = canvas->rootObject()->findChild("alternateModel"); + QTRY_VERIFY(alternateModel); + QVariant modelVariant = QVariant::fromValue(alternateModel); + QSignalSpy modelSpy(listView, SIGNAL(modelChanged())); + + listView->setModel(modelVariant); + QTRY_COMPARE(listView->model(), modelVariant); + QTRY_COMPARE(modelSpy.count(),1); + + listView->setModel(modelVariant); + QTRY_COMPARE(modelSpy.count(),1); + + listView->setModel(QVariant()); + QTRY_COMPARE(modelSpy.count(),2); + + delete canvas; +} + +void tst_QDeclarativeListView::QTBUG_9791() +{ + QDeclarativeView *canvas = createView(); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/strictlyenforcerange.qml")); + qApp->processEvents(); + + QDeclarativeListView *listview = qobject_cast(canvas->rootObject()); + QTRY_VERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + QTRY_VERIFY(listview->delegate() != 0); + QTRY_VERIFY(listview->model() != 0); + + QMetaObject::invokeMethod(listview, "fillModel"); + qApp->processEvents(); + + // Confirm items positioned correctly + int itemCount = findItems(contentItem, "wrapper").count(); + QCOMPARE(itemCount, 3); + + for (int i = 0; i < itemCount; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->x(), i*300.0); + } + + // check that view is positioned correctly + QTRY_COMPARE(listview->contentX(), 590.0); + + delete canvas; +} + +void tst_QDeclarativeListView::manualHighlight() +{ + QDeclarativeView *canvas = new QDeclarativeView(0); + canvas->setFixedSize(240,320); + + QString filename(SRCDIR "/data/manual-highlight.qml"); + canvas->setSource(QUrl::fromLocalFile(filename)); + + qApp->processEvents(); + + QDeclarativeListView *listview = findItem(canvas->rootObject(), "list"); + QTRY_VERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + QTRY_COMPARE(listview->currentIndex(), 0); + QTRY_COMPARE(listview->currentItem(), findItem(contentItem, "wrapper", 0)); + QTRY_COMPARE(listview->highlightItem()->y() - 5, listview->currentItem()->y()); + + listview->setCurrentIndex(2); + + QTRY_COMPARE(listview->currentIndex(), 2); + QTRY_COMPARE(listview->currentItem(), findItem(contentItem, "wrapper", 2)); + QTRY_COMPARE(listview->highlightItem()->y() - 5, listview->currentItem()->y()); + + // QTBUG-15972 + listview->positionViewAtIndex(3, QDeclarativeListView::Contain); + + QTRY_COMPARE(listview->currentIndex(), 2); + QTRY_COMPARE(listview->currentItem(), findItem(contentItem, "wrapper", 2)); + QTRY_COMPARE(listview->highlightItem()->y() - 5, listview->currentItem()->y()); + + delete canvas; +} + +void tst_QDeclarativeListView::QTBUG_11105() +{ + QDeclarativeView *canvas = createView(); + + TestModel model; + for (int i = 0; i < 30; i++) + model.addItem("Item" + QString::number(i), ""); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + TestObject *testObject = new TestObject; + ctxt->setContextProperty("testObject", testObject); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listviewtest.qml")); + qApp->processEvents(); + + QDeclarativeListView *listview = findItem(canvas->rootObject(), "list"); + QTRY_VERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + // Confirm items positioned correctly + int itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 0; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_VERIFY(item->y() == i*20); + } + + listview->positionViewAtIndex(20, QDeclarativeListView::Beginning); + QCOMPARE(listview->contentY(), 280.); + + TestModel model2; + for (int i = 0; i < 5; i++) + model2.addItem("Item" + QString::number(i), ""); + + ctxt->setContextProperty("testModel", &model2); + + itemCount = findItems(contentItem, "wrapper").count(); + QCOMPARE(itemCount, 5); + + delete canvas; +} + +void tst_QDeclarativeListView::header() +{ + { + QDeclarativeView *canvas = createView(); + + TestModel model; + for (int i = 0; i < 30; i++) + model.addItem("Item" + QString::number(i), ""); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/header.qml")); + qApp->processEvents(); + + QDeclarativeListView *listview = findItem(canvas->rootObject(), "list"); + QTRY_VERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + QDeclarativeText *header = findItem(contentItem, "header"); + QVERIFY(header); + QCOMPARE(header->y(), 0.0); + QCOMPARE(header->height(), 20.0); + + QCOMPARE(listview->contentY(), 0.0); + + model.clear(); + QTRY_COMPARE(header->y(), 0.0); + + for (int i = 0; i < 30; i++) + model.addItem("Item" + QString::number(i), ""); + + QMetaObject::invokeMethod(canvas->rootObject(), "changeHeader"); + + header = findItem(contentItem, "header"); + QVERIFY(!header); + header = findItem(contentItem, "header2"); + QVERIFY(header); + + QCOMPARE(header->y(), 10.0); + QCOMPARE(header->height(), 10.0); + QCOMPARE(listview->contentY(), 10.0); + + delete canvas; + } + { + QDeclarativeView *canvas = createView(); + + TestModel model; + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/header1.qml")); + qApp->processEvents(); + + QDeclarativeListView *listview = findItem(canvas->rootObject(), "list"); + QTRY_VERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + QDeclarativeText *header = findItem(contentItem, "header"); + QVERIFY(header); + QCOMPARE(header->y(), 0.0); + + QCOMPARE(listview->contentY(), 0.0); + + model.clear(); + QTRY_COMPARE(header->y(), 0.0); + + delete canvas; + } +} + +void tst_QDeclarativeListView::footer() +{ + QDeclarativeView *canvas = createView(); + + TestModel model; + for (int i = 0; i < 3; i++) + model.addItem("Item" + QString::number(i), ""); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/footer.qml")); + qApp->processEvents(); + + QDeclarativeListView *listview = findItem(canvas->rootObject(), "list"); + QTRY_VERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + QDeclarativeText *footer = findItem(contentItem, "footer"); + QVERIFY(footer); + QCOMPARE(footer->y(), 60.0); + QCOMPARE(footer->height(), 30.0); + + model.removeItem(1); + QTRY_COMPARE(footer->y(), 40.0); + + model.clear(); + QTRY_COMPARE(footer->y(), 0.0); + + for (int i = 0; i < 30; i++) + model.addItem("Item" + QString::number(i), ""); + + QMetaObject::invokeMethod(canvas->rootObject(), "changeFooter"); + + footer = findItem(contentItem, "footer"); + QVERIFY(!footer); + footer = findItem(contentItem, "footer2"); + QVERIFY(footer); + + QCOMPARE(footer->y(), 600.0); + QCOMPARE(footer->height(), 20.0); + QCOMPARE(listview->contentY(), 0.0); + + delete canvas; +} + +class LVAccessor : public QDeclarativeListView +{ +public: + qreal minY() const { return minYExtent(); } + qreal maxY() const { return maxYExtent(); } + qreal minX() const { return minXExtent(); } + qreal maxX() const { return maxXExtent(); } +}; + +void tst_QDeclarativeListView::headerFooter() +{ + { + // Vertical + QDeclarativeView *canvas = createView(); + + TestModel model; + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/headerfooter.qml")); + qApp->processEvents(); + + QDeclarativeListView *listview = qobject_cast(canvas->rootObject()); + QTRY_VERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + QDeclarativeItem *header = findItem(contentItem, "header"); + QVERIFY(header); + QCOMPARE(header->y(), 0.0); + + QDeclarativeItem *footer = findItem(contentItem, "footer"); + QVERIFY(footer); + QCOMPARE(footer->y(), 20.0); + + QVERIFY(static_cast(listview)->minY() == 0); + QVERIFY(static_cast(listview)->maxY() == 0); + + delete canvas; + } + { + // Horizontal + QDeclarativeView *canvas = createView(); + + TestModel model; + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/headerfooter.qml")); + canvas->rootObject()->setProperty("horizontal", true); + qApp->processEvents(); + + QDeclarativeListView *listview = qobject_cast(canvas->rootObject()); + QTRY_VERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + QDeclarativeItem *header = findItem(contentItem, "header"); + QVERIFY(header); + QCOMPARE(header->x(), 0.0); + + QDeclarativeItem *footer = findItem(contentItem, "footer"); + QVERIFY(footer); + QCOMPARE(footer->x(), 20.0); + + QVERIFY(static_cast(listview)->minX() == 0); + QVERIFY(static_cast(listview)->maxX() == 0); + + delete canvas; + } + { + // Horizontal RTL + QDeclarativeView *canvas = createView(); + + TestModel model; + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/headerfooter.qml")); + canvas->rootObject()->setProperty("horizontal", true); + canvas->rootObject()->setProperty("rtl", true); + qApp->processEvents(); + + QDeclarativeListView *listview = qobject_cast(canvas->rootObject()); + QTRY_VERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + QDeclarativeItem *header = findItem(contentItem, "header"); + QVERIFY(header); + QCOMPARE(header->x(), -20.0); + + QDeclarativeItem *footer = findItem(contentItem, "footer"); + QVERIFY(footer); + QCOMPARE(footer->x(), -50.0); + + QCOMPARE(static_cast(listview)->minX(), 240.); + QCOMPARE(static_cast(listview)->maxX(), 240.); + + delete canvas; + } +} + +void tst_QDeclarativeListView::resizeView() +{ + QDeclarativeView *canvas = createView(); + + TestModel model; + for (int i = 0; i < 40; i++) + model.addItem("Item" + QString::number(i), ""); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + TestObject *testObject = new TestObject; + ctxt->setContextProperty("testObject", testObject); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listviewtest.qml")); + qApp->processEvents(); + + QDeclarativeListView *listview = findItem(canvas->rootObject(), "list"); + QTRY_VERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + // Confirm items positioned correctly + int itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 0; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->y(), i*20.); + } + + QVariant heightRatio; + QMetaObject::invokeMethod(canvas->rootObject(), "heightRatio", Q_RETURN_ARG(QVariant, heightRatio)); + QCOMPARE(heightRatio.toReal(), 0.4); + + listview->setHeight(200); + + QMetaObject::invokeMethod(canvas->rootObject(), "heightRatio", Q_RETURN_ARG(QVariant, heightRatio)); + QCOMPARE(heightRatio.toReal(), 0.25); + + delete canvas; +} + +void tst_QDeclarativeListView::sizeLessThan1() +{ + QDeclarativeView *canvas = createView(); + + TestModel model; + for (int i = 0; i < 30; i++) + model.addItem("Item" + QString::number(i), ""); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + TestObject *testObject = new TestObject; + ctxt->setContextProperty("testObject", testObject); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/sizelessthan1.qml")); + qApp->processEvents(); + + QDeclarativeListView *listview = findItem(canvas->rootObject(), "list"); + QTRY_VERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + // Confirm items positioned correctly + int itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 0; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_COMPARE(item->y(), i*0.5); + } + + delete canvas; +} + +void tst_QDeclarativeListView::QTBUG_14821() +{ + QDeclarativeView *canvas = createView(); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/qtbug14821.qml")); + qApp->processEvents(); + + QDeclarativeListView *listview = qobject_cast(canvas->rootObject()); + QVERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QVERIFY(contentItem != 0); + + listview->decrementCurrentIndex(); + QCOMPARE(listview->currentIndex(), 99); + + listview->incrementCurrentIndex(); + QCOMPARE(listview->currentIndex(), 0); + + delete canvas; +} + +void tst_QDeclarativeListView::resizeDelegate() +{ + QDeclarativeView *canvas = createView(); + + QStringList strings; + for (int i = 0; i < 30; ++i) + strings << QString::number(i); + QStringListModel model(strings); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/displaylist.qml")); + qApp->processEvents(); + + QDeclarativeListView *listview = findItem(canvas->rootObject(), "list"); + QTRY_VERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + QTRY_COMPARE(listview->count(), model.rowCount()); + + listview->setCurrentIndex(25); + listview->setContentY(0); + + for (int i = 0; i < 16; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + QVERIFY(item != 0); + QCOMPARE(item->y(), i*20.0); + } + + QCOMPARE(listview->currentItem()->y(), 500.0); + QTRY_COMPARE(listview->highlightItem()->y(), 500.0); + + canvas->rootObject()->setProperty("delegateHeight", 30); + qApp->processEvents(); + + for (int i = 0; i < 11; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + QVERIFY(item != 0); + QTRY_COMPARE(item->y(), i*30.0); + } + + QTRY_COMPARE(listview->currentItem()->y(), 750.0); + QTRY_COMPARE(listview->highlightItem()->y(), 750.0); + + listview->setCurrentIndex(1); + listview->positionViewAtIndex(25, QDeclarativeListView::Beginning); + listview->positionViewAtIndex(5, QDeclarativeListView::Beginning); + + for (int i = 5; i < 16; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + QVERIFY(item != 0); + QCOMPARE(item->y(), i*30.0); + } + + QTRY_COMPARE(listview->currentItem()->y(), 30.0); + QTRY_COMPARE(listview->highlightItem()->y(), 30.0); + + canvas->rootObject()->setProperty("delegateHeight", 20); + qApp->processEvents(); + + for (int i = 5; i < 11; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + QVERIFY(item != 0); + QTRY_COMPARE(item->y(), 150 + (i-5)*20.0); + } + + QTRY_COMPARE(listview->currentItem()->y(), 70.0); + QTRY_COMPARE(listview->highlightItem()->y(), 70.0); + + delete canvas; +} + +void tst_QDeclarativeListView::QTBUG_16037() +{ + QDeclarativeView *canvas = createView(); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/qtbug16037.qml")); + qApp->processEvents(); + + QDeclarativeListView *listview = findItem(canvas->rootObject(), "listview"); + QTRY_VERIFY(listview != 0); + + QVERIFY(listview->contentHeight() <= 0.0); + + QMetaObject::invokeMethod(canvas->rootObject(), "setModel"); + + QTRY_COMPARE(listview->contentHeight(), 80.0); + + delete canvas; +} + +void tst_QDeclarativeListView::indexAt() +{ + QDeclarativeView *canvas = createView(); + + TestModel model; + for (int i = 0; i < 30; i++) + model.addItem("Item" + QString::number(i), ""); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + TestObject *testObject = new TestObject; + ctxt->setContextProperty("testObject", testObject); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listviewtest.qml")); + qApp->processEvents(); + + QDeclarativeListView *listview = findItem(canvas->rootObject(), "list"); + QTRY_VERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + QCOMPARE(listview->indexAt(0,0), 0); + QCOMPARE(listview->indexAt(0,19), 0); + QCOMPARE(listview->indexAt(239,19), 0); + QCOMPARE(listview->indexAt(0,20), 1); + QCOMPARE(listview->indexAt(240,20), -1); + + delete canvas; +} + +void tst_QDeclarativeListView::incrementalModel() +{ + QDeclarativeView *canvas = createView(); + + IncrementalModel model; + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/displaylist.qml")); + qApp->processEvents(); + + QDeclarativeListView *listview = findItem(canvas->rootObject(), "list"); + QTRY_VERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + QTRY_COMPARE(listview->count(), 20); + + listview->positionViewAtIndex(10, QDeclarativeListView::Beginning); + + QTRY_COMPARE(listview->count(), 25); + + delete canvas; +} + +void tst_QDeclarativeListView::onAdd() +{ + QFETCH(int, initialItemCount); + QFETCH(int, itemsToAdd); + + const int delegateHeight = 10; + TestModel2 model; + + // these initial items should not trigger ListView.onAdd + for (int i=0; isetFixedSize(200, delegateHeight * (initialItemCount + itemsToAdd)); + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + ctxt->setContextProperty("delegateHeight", delegateHeight); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/attachedSignals.qml")); + + QObject *object = canvas->rootObject(); + object->setProperty("width", canvas->width()); + object->setProperty("height", canvas->height()); + qApp->processEvents(); + + QList > items; + for (int i=0; iprocessEvents(); + + QVariantList result = object->property("addedDelegates").toList(); + QCOMPARE(result.count(), items.count()); + for (int i=0; i("initialItemCount"); + QTest::addColumn("itemsToAdd"); + + QTest::newRow("0, add 1") << 0 << 1; + QTest::newRow("0, add 2") << 0 << 2; + QTest::newRow("0, add 10") << 0 << 10; + + QTest::newRow("1, add 1") << 1 << 1; + QTest::newRow("1, add 2") << 1 << 2; + QTest::newRow("1, add 10") << 1 << 10; + + QTest::newRow("5, add 1") << 5 << 1; + QTest::newRow("5, add 2") << 5 << 2; + QTest::newRow("5, add 10") << 5 << 10; +} + +void tst_QDeclarativeListView::onRemove() +{ + QFETCH(int, initialItemCount); + QFETCH(int, indexToRemove); + QFETCH(int, removeCount); + + const int delegateHeight = 10; + TestModel2 model; + for (int i=0; irootContext(); + ctxt->setContextProperty("testModel", &model); + ctxt->setContextProperty("delegateHeight", delegateHeight); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/attachedSignals.qml")); + QObject *object = canvas->rootObject(); + + qApp->processEvents(); + + model.removeItems(indexToRemove, removeCount); + qApp->processEvents(); + QCOMPARE(object->property("removedDelegateCount"), QVariant(removeCount)); + + delete canvas; +} + +void tst_QDeclarativeListView::onRemove_data() +{ + QTest::addColumn("initialItemCount"); + QTest::addColumn("indexToRemove"); + QTest::addColumn("removeCount"); + + QTest::newRow("remove first") << 1 << 0 << 1; + QTest::newRow("two items, remove first") << 2 << 0 << 1; + QTest::newRow("two items, remove last") << 2 << 1 << 1; + QTest::newRow("two items, remove all") << 2 << 0 << 2; + + QTest::newRow("four items, remove first") << 4 << 0 << 1; + QTest::newRow("four items, remove 0-2") << 4 << 0 << 2; + QTest::newRow("four items, remove 1-3") << 4 << 1 << 2; + QTest::newRow("four items, remove 2-4") << 4 << 2 << 2; + QTest::newRow("four items, remove last") << 4 << 3 << 1; + QTest::newRow("four items, remove all") << 4 << 0 << 4; + + QTest::newRow("ten items, remove 1-8") << 10 << 0 << 8; + QTest::newRow("ten items, remove 2-7") << 10 << 2 << 5; + QTest::newRow("ten items, remove 4-10") << 10 << 4 << 6; +} + +void tst_QDeclarativeListView::testQtQuick11Attributes() +{ + QFETCH(QString, code); + QFETCH(QString, warning); + QFETCH(QString, error); + + QDeclarativeEngine engine; + QObject *obj; + + QDeclarativeComponent valid(&engine); + valid.setData("import QtQuick 1.1; ListView { " + code.toUtf8() + " }", QUrl("")); + obj = valid.create(); + QVERIFY(obj); + QVERIFY(valid.errorString().isEmpty()); + delete obj; + + QDeclarativeComponent invalid(&engine); + invalid.setData("import QtQuick 1.0; ListView { " + code.toUtf8() + " }", QUrl("")); + QTest::ignoreMessage(QtWarningMsg, warning.toUtf8()); + obj = invalid.create(); + QCOMPARE(invalid.errorString(), error); + delete obj; +} + +void tst_QDeclarativeListView::testQtQuick11Attributes_data() +{ + QTest::addColumn("code"); + QTest::addColumn("warning"); + QTest::addColumn("error"); + + QTest::newRow("positionViewAtBeginning") << "Component.onCompleted: positionViewAtBeginning()" + << ":1: ReferenceError: Can't find variable: positionViewAtBeginning" + << ""; + + QTest::newRow("positionViewAtEnd") << "Component.onCompleted: positionViewAtEnd()" + << ":1: ReferenceError: Can't find variable: positionViewAtEnd" + << ""; +} + +void tst_QDeclarativeListView::rightToLeft() +{ + QDeclarativeView *canvas = createView(); + canvas->setFixedSize(640,320); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/rightToLeft.qml")); + qApp->processEvents(); + + QVERIFY(canvas->rootObject() != 0); + QDeclarativeListView *listview = findItem(canvas->rootObject(), "view"); + QTRY_VERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + QDeclarativeVisualItemModel *model = canvas->rootObject()->findChild("itemModel"); + QTRY_VERIFY(model != 0); + + QTRY_VERIFY(model->count() == 3); + QTRY_COMPARE(listview->currentIndex(), 0); + + // initial position at first item, right edge aligned + QCOMPARE(listview->contentX(), -640.); + + QDeclarativeItem *item = findItem(contentItem, "item1"); + QTRY_VERIFY(item); + QTRY_COMPARE(item->x(), -100.0); + QCOMPARE(item->height(), listview->height()); + + QDeclarativeText *text = findItem(contentItem, "text1"); + QTRY_VERIFY(text); + QTRY_COMPARE(text->text(), QLatin1String("index: 0")); + + listview->setCurrentIndex(2); + + item = findItem(contentItem, "item3"); + QTRY_VERIFY(item); + QTRY_COMPARE(item->x(), -540.0); + + text = findItem(contentItem, "text3"); + QTRY_VERIFY(text); + QTRY_COMPARE(text->text(), QLatin1String("index: 2")); + + QCOMPARE(listview->contentX(), -640.); + + // Ensure resizing maintains position relative to right edge + qobject_cast(canvas->rootObject())->setWidth(600); + QTRY_COMPARE(listview->contentX(), -600.); + + delete canvas; +} + +void tst_QDeclarativeListView::test_mirroring() +{ + QDeclarativeView *canvasA = createView(); + canvasA->setSource(QUrl::fromLocalFile(SRCDIR "/data/rightToLeft.qml")); + QDeclarativeListView *listviewA = findItem(canvasA->rootObject(), "view"); + QTRY_VERIFY(listviewA != 0); + + QDeclarativeView *canvasB = createView(); + canvasB->setSource(QUrl::fromLocalFile(SRCDIR "/data/rightToLeft.qml")); + QDeclarativeListView *listviewB = findItem(canvasB->rootObject(), "view"); + QTRY_VERIFY(listviewA != 0); + qApp->processEvents(); + + QList objectNames; + objectNames << "item1" << "item2"; // << "item3" + + listviewA->setProperty("layoutDirection", Qt::LeftToRight); + listviewB->setProperty("layoutDirection", Qt::RightToLeft); + QCOMPARE(listviewA->layoutDirection(), listviewA->effectiveLayoutDirection()); + + // LTR != RTL + foreach(const QString objectName, objectNames) + QVERIFY(findItem(listviewA, objectName)->x() != findItem(listviewB, objectName)->x()); + + listviewA->setProperty("layoutDirection", Qt::LeftToRight); + listviewB->setProperty("layoutDirection", Qt::LeftToRight); + + // LTR == LTR + foreach(const QString objectName, objectNames) + QCOMPARE(findItem(listviewA, objectName)->x(), findItem(listviewB, objectName)->x()); + + QVERIFY(listviewB->layoutDirection() == listviewB->effectiveLayoutDirection()); + QDeclarativeItemPrivate::get(listviewB)->setLayoutMirror(true); + QVERIFY(listviewB->layoutDirection() != listviewB->effectiveLayoutDirection()); + + // LTR != LTR+mirror + foreach(const QString objectName, objectNames) + QVERIFY(findItem(listviewA, objectName)->x() != findItem(listviewB, objectName)->x()); + + listviewA->setProperty("layoutDirection", Qt::RightToLeft); + + // RTL == LTR+mirror + foreach(const QString objectName, objectNames) + QCOMPARE(findItem(listviewA, objectName)->x(), findItem(listviewB, objectName)->x()); + + listviewB->setProperty("layoutDirection", Qt::RightToLeft); + + // RTL != RTL+mirror + foreach(const QString objectName, objectNames) + QVERIFY(findItem(listviewA, objectName)->x() != findItem(listviewB, objectName)->x()); + + listviewA->setProperty("layoutDirection", Qt::LeftToRight); + + // LTR == RTL+mirror + foreach(const QString objectName, objectNames) + QCOMPARE(findItem(listviewA, objectName)->x(), findItem(listviewB, objectName)->x()); + + delete canvasA; + delete canvasB; +} + +void tst_QDeclarativeListView::orientationChange() +{ + QDeclarativeView *canvas = createView(); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/orientchange.qml")); + qApp->processEvents(); + + QDeclarativeListView *listview = qobject_cast(canvas->rootObject()); + QVERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QVERIFY(contentItem != 0); + + listview->positionViewAtIndex(50, QDeclarativeListView::Beginning); + + // Confirm items positioned correctly + for (int i = 50; i < 54; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + QVERIFY(item); + QCOMPARE(item->y(), i*80.0); + } + + listview->setOrientation(QDeclarativeListView::Horizontal); + QCOMPARE(listview->contentY(), 0.); + + // Confirm items positioned correctly + for (int i = 0; i < 3; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + QVERIFY(item); + QCOMPARE(item->x(), i*80.0); + } + + listview->positionViewAtIndex(50, QDeclarativeListView::Beginning); + listview->setOrientation(QDeclarativeListView::Vertical); + QCOMPARE(listview->contentX(), 0.); + // + // Confirm items positioned correctly + for (int i = 0; i < 4; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + QVERIFY(item); + QCOMPARE(item->y(), i*80.0); + } + + delete canvas; +} + +void tst_QDeclarativeListView::contentPosJump() +{ + QDeclarativeView *canvas = createView(); + + TestModel model; + for (int i = 0; i < 50; i++) + model.addItem("Item" + QString::number(i), ""); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + TestObject *testObject = new TestObject; + ctxt->setContextProperty("testObject", testObject); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listviewtest.qml")); + qApp->processEvents(); + + QDeclarativeListView *listview = findItem(canvas->rootObject(), "list"); + QTRY_VERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + + // Confirm items positioned correctly + int itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 0; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_VERIFY(item->y() == i*20); + } + + // Test jumping more than a page of items. + listview->setContentY(500); + itemCount = findItems(contentItem, "wrapper").count(); + for (int i = 25; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_VERIFY(item->y() == i*20); + } + + listview->setContentY(-100); + itemCount = findItems(contentItem, "wrapper").count(); + QVERIFY(itemCount < 20); + for (int i = 0; i < model.count() && i < itemCount; ++i) { + QDeclarativeItem *item = findItem(contentItem, "wrapper", i); + if (!item) qWarning() << "Item" << i << "not found"; + QTRY_VERIFY(item); + QTRY_VERIFY(item->y() == i*20); + } + + delete canvas; +} + +void tst_QDeclarativeListView::qListModelInterface_items() +{ + items(); +} + +void tst_QDeclarativeListView::qAbstractItemModel_items() +{ + items(); +} + +void tst_QDeclarativeListView::qListModelInterface_changed() +{ + changed(); +} + +void tst_QDeclarativeListView::qAbstractItemModel_changed() +{ + changed(); +} + +void tst_QDeclarativeListView::qListModelInterface_inserted() +{ + inserted(); +} + +void tst_QDeclarativeListView::qAbstractItemModel_inserted() +{ + inserted(); +} + +void tst_QDeclarativeListView::qListModelInterface_removed() +{ + removed(false); + removed(true); +} + +void tst_QDeclarativeListView::qAbstractItemModel_removed() +{ + removed(false); + removed(true); +} + +void tst_QDeclarativeListView::qListModelInterface_moved() +{ + moved(); +} + +void tst_QDeclarativeListView::qAbstractItemModel_moved() +{ + moved(); +} + +void tst_QDeclarativeListView::qListModelInterface_clear() +{ + clear(); +} + +void tst_QDeclarativeListView::qAbstractItemModel_clear() +{ + clear(); +} + +QDeclarativeView *tst_QDeclarativeListView::createView() +{ + QDeclarativeView *canvas = new QDeclarativeView(0); + canvas->setFixedSize(240,320); + + return canvas; +} + +/* + Find an item with the specified objectName. If index is supplied then the + item must also evaluate the {index} expression equal to index +*/ +template +T *tst_QDeclarativeListView::findItem(QGraphicsObject *parent, const QString &objectName, int index) +{ + const QMetaObject &mo = T::staticMetaObject; + //qDebug() << parent->childItems().count() << "children"; + for (int i = 0; i < parent->childItems().count(); ++i) { + QDeclarativeItem *item = qobject_cast(parent->childItems().at(i)); + if(!item) + continue; + //qDebug() << "try" << item; + if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName)) { + if (index != -1) { + QDeclarativeExpression e(qmlContext(item), item, "index"); + if (e.evaluate().toInt() == index) + return static_cast(item); + } else { + return static_cast(item); + } + } + item = findItem(item, objectName, index); + if (item) + return static_cast(item); + } + + return 0; +} + +template +QList tst_QDeclarativeListView::findItems(QGraphicsObject *parent, const QString &objectName) +{ + QList items; + const QMetaObject &mo = T::staticMetaObject; + //qDebug() << parent->childItems().count() << "children"; + for (int i = 0; i < parent->childItems().count(); ++i) { + QDeclarativeItem *item = qobject_cast(parent->childItems().at(i)); + if(!item || !item->isVisible()) + continue; + //qDebug() << "try" << item; + if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName)) + items.append(static_cast(item)); + items += findItems(item, objectName); + } + + return items; +} + +void tst_QDeclarativeListView::dumpTree(QDeclarativeItem *parent, int depth) +{ + static QString padding(" "); + for (int i = 0; i < parent->childItems().count(); ++i) { + QDeclarativeItem *item = qobject_cast(parent->childItems().at(i)); + if(!item) + continue; + qDebug() << padding.left(depth*2) << item; + dumpTree(item, depth+1); + } +} + + +QTEST_MAIN(tst_QDeclarativeListView) + +#include "tst_qdeclarativelistview.moc" diff --git a/tests/auto/declarative/qdeclarativeloader/data/AnchoredLoader.qml b/tests/auto/declarative/qdeclarativeloader/data/AnchoredLoader.qml new file mode 100644 index 00000000..7654c074 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeloader/data/AnchoredLoader.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 + +Rectangle { + width: 300 + height: 200 + color: "blue" + Loader { + objectName: "loader" + anchors.fill: parent + sourceComponent: Component { + Rectangle { color: "red"; objectName: "sourceElement" } + } + } +} diff --git a/tests/auto/declarative/qdeclarativeloader/data/BlueRect.qml b/tests/auto/declarative/qdeclarativeloader/data/BlueRect.qml new file mode 100644 index 00000000..d2da64d2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeloader/data/BlueRect.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 + +Rectangle { + objectName: "blue" + width: 100 + height: 100 + color: "blue" +} diff --git a/tests/auto/declarative/qdeclarativeloader/data/CreationContextLoader.qml b/tests/auto/declarative/qdeclarativeloader/data/CreationContextLoader.qml new file mode 100644 index 00000000..bfc9a8dd --- /dev/null +++ b/tests/auto/declarative/qdeclarativeloader/data/CreationContextLoader.qml @@ -0,0 +1,15 @@ +import QtQuick 1.0 + +Loader { + id: myLoader + property int testProperty: 1912 + sourceComponent: loaderComponent + Component { + id: loaderComponent + Item { + Component.onCompleted: { + test = (myLoader.testProperty == 1912); + } + } + } +} diff --git a/tests/auto/declarative/qdeclarativeloader/data/GraphicsWidget250x250.qml b/tests/auto/declarative/qdeclarativeloader/data/GraphicsWidget250x250.qml new file mode 100644 index 00000000..139657bf --- /dev/null +++ b/tests/auto/declarative/qdeclarativeloader/data/GraphicsWidget250x250.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +QGraphicsWidget { + size: "250x250" +} diff --git a/tests/auto/declarative/qdeclarativeloader/data/GreenRect.qml b/tests/auto/declarative/qdeclarativeloader/data/GreenRect.qml new file mode 100644 index 00000000..5aeb81e9 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeloader/data/GreenRect.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +Rectangle { + width: 100; height: 100 + color: "green" + Component.onCompleted: myLoader.source = "BlueRect.qml" +} diff --git a/tests/auto/declarative/qdeclarativeloader/data/NoResize.qml b/tests/auto/declarative/qdeclarativeloader/data/NoResize.qml new file mode 100644 index 00000000..bb1030ef --- /dev/null +++ b/tests/auto/declarative/qdeclarativeloader/data/NoResize.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 + +Item { + width: 200; height: 80 + Loader { + source: "Rect120x60.qml" + } +} diff --git a/tests/auto/declarative/qdeclarativeloader/data/NoResizeGraphicsWidget.qml b/tests/auto/declarative/qdeclarativeloader/data/NoResizeGraphicsWidget.qml new file mode 100644 index 00000000..5a31eff5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeloader/data/NoResizeGraphicsWidget.qml @@ -0,0 +1,9 @@ +import QtQuick 1.0 + +Item { + width: 200 + height: 80 + Loader { + source: "GraphicsWidget250x250.qml" + } +} diff --git a/tests/auto/declarative/qdeclarativeloader/data/QTBUG_16928.qml b/tests/auto/declarative/qdeclarativeloader/data/QTBUG_16928.qml new file mode 100644 index 00000000..9949e346 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeloader/data/QTBUG_16928.qml @@ -0,0 +1,23 @@ +import QtQuick 1.1 + +Rectangle { + color: "green" + width: loader.implicitWidth+50 + height: loader.implicitHeight+50 + + Loader { + id: loader + sourceComponent: Item { + anchors.centerIn: parent + + implicitWidth: 200 + implicitHeight: 200 + Rectangle { + color: "red" + anchors.fill: parent + } + } + anchors.fill: parent + anchors.margins: 15 + } +} diff --git a/tests/auto/declarative/qdeclarativeloader/data/QTBUG_17114.qml b/tests/auto/declarative/qdeclarativeloader/data/QTBUG_17114.qml new file mode 100644 index 00000000..8a49733a --- /dev/null +++ b/tests/auto/declarative/qdeclarativeloader/data/QTBUG_17114.qml @@ -0,0 +1,18 @@ +import QtQuick 1.1 + +Rectangle { + property real loaderWidth: loader.width + property real loaderHeight: loader.height + width: 200 + height: 200 + + Loader { + id: loader + sourceComponent: Item { + property real iwidth: 32 + property real iheight: 32 + width: iwidth + height: iheight + } + } +} diff --git a/tests/auto/declarative/qdeclarativeloader/data/Rect120x60.qml b/tests/auto/declarative/qdeclarativeloader/data/Rect120x60.qml new file mode 100644 index 00000000..5a352844 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeloader/data/Rect120x60.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +Rectangle { + width: 120 + height:60 +} diff --git a/tests/auto/declarative/qdeclarativeloader/data/SetSourceComponent.qml b/tests/auto/declarative/qdeclarativeloader/data/SetSourceComponent.qml new file mode 100644 index 00000000..fa2d3cb3 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeloader/data/SetSourceComponent.qml @@ -0,0 +1,9 @@ +import QtQuick 1.0 + +Item { + function clear() { + loader.sourceComponent = undefined + } + Component { id: comp; Rectangle { width: 100; height: 50 } } + Loader { id: loader; sourceComponent: comp } +} diff --git a/tests/auto/declarative/qdeclarativeloader/data/SizeGraphicsWidgetToLoader.qml b/tests/auto/declarative/qdeclarativeloader/data/SizeGraphicsWidgetToLoader.qml new file mode 100644 index 00000000..a855947c --- /dev/null +++ b/tests/auto/declarative/qdeclarativeloader/data/SizeGraphicsWidgetToLoader.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +Loader { + width: 200 + height: 80 + source: "GraphicsWidget250x250.qml" +} diff --git a/tests/auto/declarative/qdeclarativeloader/data/SizeLoaderToGraphicsWidget.qml b/tests/auto/declarative/qdeclarativeloader/data/SizeLoaderToGraphicsWidget.qml new file mode 100644 index 00000000..b6fd57f5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeloader/data/SizeLoaderToGraphicsWidget.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +Loader { + source: "GraphicsWidget250x250.qml" +} diff --git a/tests/auto/declarative/qdeclarativeloader/data/SizeToItem.qml b/tests/auto/declarative/qdeclarativeloader/data/SizeToItem.qml new file mode 100644 index 00000000..36ce9912 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeloader/data/SizeToItem.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +Loader { + source: "Rect120x60.qml" +} diff --git a/tests/auto/declarative/qdeclarativeloader/data/SizeToLoader.qml b/tests/auto/declarative/qdeclarativeloader/data/SizeToLoader.qml new file mode 100644 index 00000000..4fa945b3 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeloader/data/SizeToLoader.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +Loader { + width: 200; height: 80 + source: "Rect120x60.qml" +} diff --git a/tests/auto/declarative/qdeclarativeloader/data/VmeError.qml b/tests/auto/declarative/qdeclarativeloader/data/VmeError.qml new file mode 100644 index 00000000..a36c2462 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeloader/data/VmeError.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +Rectangle { + width: 100; height: 100; color: "red" + signal somethingHappened + onSomethingHappened: QtObject {} +} diff --git a/tests/auto/declarative/qdeclarativeloader/data/crash.qml b/tests/auto/declarative/qdeclarativeloader/data/crash.qml new file mode 100644 index 00000000..c7a4407a --- /dev/null +++ b/tests/auto/declarative/qdeclarativeloader/data/crash.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 + +Rectangle { + width: 400 + height: 400 + + function setLoaderSource() { + myLoader.source = "GreenRect.qml" + } + + Loader { + id: myLoader + } +} diff --git a/tests/auto/declarative/qdeclarativeloader/data/creationContext.qml b/tests/auto/declarative/qdeclarativeloader/data/creationContext.qml new file mode 100644 index 00000000..52979786 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeloader/data/creationContext.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 + +Item { + property bool test: false + + CreationContextLoader { + } +} diff --git a/tests/auto/declarative/qdeclarativeloader/data/differentorigin.qml b/tests/auto/declarative/qdeclarativeloader/data/differentorigin.qml new file mode 100644 index 00000000..043ce555 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeloader/data/differentorigin.qml @@ -0,0 +1,3 @@ +import QtQuick 1.0 + +Loader { source: "http://evil.place/evil.qml" } diff --git a/tests/auto/declarative/qdeclarativeloader/data/implicitSize.qml b/tests/auto/declarative/qdeclarativeloader/data/implicitSize.qml new file mode 100644 index 00000000..53aad97a --- /dev/null +++ b/tests/auto/declarative/qdeclarativeloader/data/implicitSize.qml @@ -0,0 +1,28 @@ +import QtQuick 1.1 + +Rectangle { + property real implWidth: 0 + property real implHeight: 0 + color: "green" + width: loader.implicitWidth+50 + height: loader.implicitHeight+50 + + Loader { + id: loader + sourceComponent: Item { + anchors.centerIn: parent + + implicitWidth: 100 + implicitHeight: 100 + Rectangle { + color: "red" + anchors.fill: parent + } + } + + anchors.fill: parent + anchors.margins: 50 + onImplicitWidthChanged: implWidth = implicitWidth + onImplicitHeightChanged: implHeight = loader.implicitHeight + } +} diff --git a/tests/auto/declarative/qdeclarativeloader/data/nonItem.qml b/tests/auto/declarative/qdeclarativeloader/data/nonItem.qml new file mode 100644 index 00000000..1d0ab5c1 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeloader/data/nonItem.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +Loader { + sourceComponent: QtObject {} +} diff --git a/tests/auto/declarative/qdeclarativeloader/data/qmldir b/tests/auto/declarative/qdeclarativeloader/data/qmldir new file mode 100644 index 00000000..bf42b507 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeloader/data/qmldir @@ -0,0 +1 @@ +# For tst_QDeclarativeLoader::networkRequestUrl; no types needed though. diff --git a/tests/auto/declarative/qdeclarativeloader/data/sameorigin-load.qml b/tests/auto/declarative/qdeclarativeloader/data/sameorigin-load.qml new file mode 100644 index 00000000..dbea9693 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeloader/data/sameorigin-load.qml @@ -0,0 +1,3 @@ +import QtQuick 1.0 + +Item { } diff --git a/tests/auto/declarative/qdeclarativeloader/data/sameorigin.qml b/tests/auto/declarative/qdeclarativeloader/data/sameorigin.qml new file mode 100644 index 00000000..8ba13a04 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeloader/data/sameorigin.qml @@ -0,0 +1,3 @@ +import QtQuick 1.0 + +Loader { source: "sameorigin-load.qml" } diff --git a/tests/auto/declarative/qdeclarativeloader/data/vmeErrors.qml b/tests/auto/declarative/qdeclarativeloader/data/vmeErrors.qml new file mode 100644 index 00000000..cfced31d --- /dev/null +++ b/tests/auto/declarative/qdeclarativeloader/data/vmeErrors.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +Loader { + source: "VmeError.qml" +} + diff --git a/tests/auto/declarative/qdeclarativeloader/qdeclarativeloader.pro b/tests/auto/declarative/qdeclarativeloader/qdeclarativeloader.pro new file mode 100644 index 00000000..1ede5096 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeloader/qdeclarativeloader.pro @@ -0,0 +1,19 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative gui network +macx:CONFIG -= app_bundle + +INCLUDEPATH += ../shared/ +HEADERS += ../shared/testhttpserver.h +SOURCES += tst_qdeclarativeloader.cpp \ + ../shared/testhttpserver.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativeloader/tst_qdeclarativeloader.cpp b/tests/auto/declarative/qdeclarativeloader/tst_qdeclarativeloader.cpp new file mode 100644 index 00000000..186926e3 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeloader/tst_qdeclarativeloader.cpp @@ -0,0 +1,637 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include + +#include +#include +#include +#include +#include "testhttpserver.h" +#include "../../../shared/util.h" + +#define SERVER_PORT 14450 + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +inline QUrl TEST_FILE(const QString &filename) +{ + return QUrl::fromLocalFile(QLatin1String(SRCDIR) + QLatin1String("/data/") + filename); +} + +class tst_QDeclarativeLoader : public QObject + +{ + Q_OBJECT +public: + tst_QDeclarativeLoader(); + +private slots: + void sourceOrComponent(); + void sourceOrComponent_data(); + void clear(); + void urlToComponent(); + void componentToUrl(); + void anchoredLoader(); + void sizeLoaderToItem(); + void sizeItemToLoader(); + void noResize(); + void sizeLoaderToGraphicsWidget(); + void sizeGraphicsWidgetToLoader(); + void noResizeGraphicsWidget(); + void networkRequestUrl(); + void failNetworkRequest(); +// void networkComponent(); + + void deleteComponentCrash(); + void nonItem(); + void vmeErrors(); + void creationContext(); + void QTBUG_16928(); + void implicitSize(); + void QTBUG_17114(); + +private: + QDeclarativeEngine engine; +}; + + +tst_QDeclarativeLoader::tst_QDeclarativeLoader() +{ +} + +void tst_QDeclarativeLoader::sourceOrComponent() +{ + QFETCH(QString, sourceDefinition); + QFETCH(QUrl, sourceUrl); + QFETCH(QString, errorString); + + bool error = !errorString.isEmpty(); + if (error) + QTest::ignoreMessage(QtWarningMsg, errorString.toUtf8().constData()); + + QDeclarativeComponent component(&engine); + component.setData(QByteArray( + "import QtQuick 1.0\n" + "Loader {\n" + " property int onItemChangedCount: 0\n" + " property int onSourceChangedCount: 0\n" + " property int onStatusChangedCount: 0\n" + " property int onProgressChangedCount: 0\n" + " property int onLoadedCount: 0\n") + + sourceDefinition.toUtf8() + + QByteArray( + " onItemChanged: onItemChangedCount += 1\n" + " onSourceChanged: onSourceChangedCount += 1\n" + " onStatusChanged: onStatusChangedCount += 1\n" + " onProgressChanged: onProgressChangedCount += 1\n" + " onLoaded: onLoadedCount += 1\n" + "}") + , TEST_FILE("")); + + QDeclarativeLoader *loader = qobject_cast(component.create()); + QVERIFY(loader != 0); + QCOMPARE(loader->item() == 0, error); + QCOMPARE(loader->source(), sourceUrl); + QCOMPARE(loader->progress(), 1.0); + + QCOMPARE(loader->status(), error ? QDeclarativeLoader::Error : QDeclarativeLoader::Ready); + QCOMPARE(static_cast(loader)->children().count(), error ? 0: 1); + + if (!error) { + QDeclarativeComponent *c = qobject_cast(loader->QGraphicsObject::children().at(0)); + QVERIFY(c); + QCOMPARE(loader->sourceComponent(), c); + } + + QCOMPARE(loader->property("onSourceChangedCount").toInt(), 1); + QCOMPARE(loader->property("onStatusChangedCount").toInt(), 1); + QCOMPARE(loader->property("onProgressChangedCount").toInt(), 1); + + QCOMPARE(loader->property("onItemChangedCount").toInt(), error ? 0 : 1); + QCOMPARE(loader->property("onLoadedCount").toInt(), error ? 0 : 1); + + delete loader; +} + +void tst_QDeclarativeLoader::sourceOrComponent_data() +{ + QTest::addColumn("sourceDefinition"); + QTest::addColumn("sourceUrl"); + QTest::addColumn("errorString"); + + QTest::newRow("source") << "source: 'Rect120x60.qml'\n" << QUrl::fromLocalFile(SRCDIR "/data/Rect120x60.qml") << ""; + QTest::newRow("sourceComponent") << "Component { id: comp; Rectangle { width: 100; height: 50 } }\n sourceComponent: comp\n" << QUrl() << ""; + + QTest::newRow("invalid source") << "source: 'IDontExist.qml'\n" << QUrl::fromLocalFile(SRCDIR "/data/IDontExist.qml") + << QString(QUrl::fromLocalFile(SRCDIR "/data/IDontExist.qml").toString() + ": File not found"); +} + +void tst_QDeclarativeLoader::clear() +{ + { + QDeclarativeComponent component(&engine); + component.setData(QByteArray( + "import QtQuick 1.0\n" + " Loader { id: loader\n" + " source: 'Rect120x60.qml'\n" + " Timer { interval: 200; running: true; onTriggered: loader.source = '' }\n" + " }") + , TEST_FILE("")); + QDeclarativeLoader *loader = qobject_cast(component.create()); + QVERIFY(loader != 0); + QVERIFY(loader->item()); + QCOMPARE(loader->progress(), 1.0); + QCOMPARE(static_cast(loader)->children().count(), 1); + + QTRY_VERIFY(loader->item() == 0); + QCOMPARE(loader->progress(), 0.0); + QCOMPARE(loader->status(), QDeclarativeLoader::Null); + QCOMPARE(static_cast(loader)->children().count(), 0); + + delete loader; + } + { + QDeclarativeComponent component(&engine, TEST_FILE("/SetSourceComponent.qml")); + QDeclarativeItem *item = qobject_cast(component.create()); + QVERIFY(item); + + QDeclarativeLoader *loader = qobject_cast(item->QGraphicsObject::children().at(1)); + QVERIFY(loader); + QVERIFY(loader->item()); + QCOMPARE(loader->progress(), 1.0); + QCOMPARE(static_cast(loader)->children().count(), 1); + + loader->setSourceComponent(0); + + QVERIFY(loader->item() == 0); + QCOMPARE(loader->progress(), 0.0); + QCOMPARE(loader->status(), QDeclarativeLoader::Null); + QCOMPARE(static_cast(loader)->children().count(), 0); + + delete item; + } + { + QDeclarativeComponent component(&engine, TEST_FILE("/SetSourceComponent.qml")); + QDeclarativeItem *item = qobject_cast(component.create()); + QVERIFY(item); + + QDeclarativeLoader *loader = qobject_cast(item->QGraphicsObject::children().at(1)); + QVERIFY(loader); + QVERIFY(loader->item()); + QCOMPARE(loader->progress(), 1.0); + QCOMPARE(static_cast(loader)->children().count(), 1); + + QMetaObject::invokeMethod(item, "clear"); + + QVERIFY(loader->item() == 0); + QCOMPARE(loader->progress(), 0.0); + QCOMPARE(loader->status(), QDeclarativeLoader::Null); + QCOMPARE(static_cast(loader)->children().count(), 0); + + delete item; + } +} + +void tst_QDeclarativeLoader::urlToComponent() +{ + QDeclarativeComponent component(&engine); + component.setData(QByteArray("import QtQuick 1.0\n" + "Loader {\n" + " id: loader\n" + " Component { id: myComp; Rectangle { width: 10; height: 10 } }\n" + " source: \"Rect120x60.qml\"\n" + " Timer { interval: 100; running: true; onTriggered: loader.sourceComponent = myComp }\n" + "}" ) + , TEST_FILE("")); + QDeclarativeLoader *loader = qobject_cast(component.create()); + QTest::qWait(200); + QTRY_VERIFY(loader != 0); + QVERIFY(loader->item()); + QCOMPARE(loader->progress(), 1.0); + QCOMPARE(static_cast(loader)->children().count(), 1); + QCOMPARE(loader->width(), 10.0); + QCOMPARE(loader->height(), 10.0); + + delete loader; +} + +void tst_QDeclarativeLoader::componentToUrl() +{ + QDeclarativeComponent component(&engine, TEST_FILE("/SetSourceComponent.qml")); + QDeclarativeItem *item = qobject_cast(component.create()); + QVERIFY(item); + + QDeclarativeLoader *loader = qobject_cast(item->QGraphicsObject::children().at(1)); + QVERIFY(loader); + QVERIFY(loader->item()); + QCOMPARE(loader->progress(), 1.0); + QCOMPARE(static_cast(loader)->children().count(), 1); + + loader->setSource(TEST_FILE("/Rect120x60.qml")); + QVERIFY(loader->item()); + QCOMPARE(loader->progress(), 1.0); + QCOMPARE(static_cast(loader)->children().count(), 1); + QCOMPARE(loader->width(), 120.0); + QCOMPARE(loader->height(), 60.0); + + delete item; +} + +void tst_QDeclarativeLoader::anchoredLoader() +{ + QDeclarativeComponent component(&engine, TEST_FILE("/AnchoredLoader.qml")); + QDeclarativeItem *rootItem = qobject_cast(component.create()); + QVERIFY(rootItem != 0); + QDeclarativeItem *loader = rootItem->findChild("loader"); + QDeclarativeItem *sourceElement = rootItem->findChild("sourceElement"); + + QVERIFY(loader != 0); + QVERIFY(sourceElement != 0); + + QCOMPARE(rootItem->width(), 300.0); + QCOMPARE(rootItem->height(), 200.0); + + QCOMPARE(loader->width(), 300.0); + QCOMPARE(loader->height(), 200.0); + + QCOMPARE(sourceElement->width(), 300.0); + QCOMPARE(sourceElement->height(), 200.0); +} + +void tst_QDeclarativeLoader::sizeLoaderToItem() +{ + QDeclarativeComponent component(&engine, TEST_FILE("/SizeToItem.qml")); + QDeclarativeLoader *loader = qobject_cast(component.create()); + QVERIFY(loader != 0); + QCOMPARE(loader->width(), 120.0); + QCOMPARE(loader->height(), 60.0); + + // Check resize + QDeclarativeItem *rect = qobject_cast(loader->item()); + QVERIFY(rect); + rect->setWidth(150); + rect->setHeight(45); + QCOMPARE(loader->width(), 150.0); + QCOMPARE(loader->height(), 45.0); + + // Check explicit width + loader->setWidth(200.0); + QCOMPARE(loader->width(), 200.0); + QCOMPARE(rect->width(), 200.0); + rect->setWidth(100.0); // when rect changes ... + QCOMPARE(rect->width(), 100.0); // ... it changes + QCOMPARE(loader->width(), 200.0); // ... but loader stays the same + + // Check explicit height + loader->setHeight(200.0); + QCOMPARE(loader->height(), 200.0); + QCOMPARE(rect->height(), 200.0); + rect->setHeight(100.0); // when rect changes ... + QCOMPARE(rect->height(), 100.0); // ... it changes + QCOMPARE(loader->height(), 200.0); // ... but loader stays the same + + // Switch mode + loader->setWidth(180); + loader->setHeight(30); + QCOMPARE(rect->width(), 180.0); + QCOMPARE(rect->height(), 30.0); + + delete loader; +} + +void tst_QDeclarativeLoader::sizeItemToLoader() +{ + QDeclarativeComponent component(&engine, TEST_FILE("/SizeToLoader.qml")); + QDeclarativeLoader *loader = qobject_cast(component.create()); + QVERIFY(loader != 0); + QCOMPARE(loader->width(), 200.0); + QCOMPARE(loader->height(), 80.0); + + QDeclarativeItem *rect = qobject_cast(loader->item()); + QVERIFY(rect); + QCOMPARE(rect->width(), 200.0); + QCOMPARE(rect->height(), 80.0); + + // Check resize + loader->setWidth(180); + loader->setHeight(30); + QCOMPARE(rect->width(), 180.0); + QCOMPARE(rect->height(), 30.0); + + // Switch mode + loader->resetWidth(); // reset explicit size + loader->resetHeight(); + rect->setWidth(160); + rect->setHeight(45); + QCOMPARE(loader->width(), 160.0); + QCOMPARE(loader->height(), 45.0); + + delete loader; +} + +void tst_QDeclarativeLoader::noResize() +{ + QDeclarativeComponent component(&engine, TEST_FILE("/NoResize.qml")); + QDeclarativeItem* item = qobject_cast(component.create()); + QVERIFY(item != 0); + QCOMPARE(item->width(), 200.0); + QCOMPARE(item->height(), 80.0); + + delete item; +} + +void tst_QDeclarativeLoader::sizeLoaderToGraphicsWidget() +{ + QDeclarativeComponent component(&engine, TEST_FILE("/SizeLoaderToGraphicsWidget.qml")); + QDeclarativeLoader *loader = qobject_cast(component.create()); + QGraphicsScene scene; + scene.addItem(loader); + + QVERIFY(loader != 0); + QCOMPARE(loader->width(), 250.0); + QCOMPARE(loader->height(), 250.0); + + // Check resize + QGraphicsWidget *widget = qobject_cast(loader->item()); + QVERIFY(widget); + widget->resize(QSizeF(150,45)); + QCOMPARE(loader->width(), 150.0); + QCOMPARE(loader->height(), 45.0); + + // Switch mode + loader->setWidth(180); + loader->setHeight(30); + QCOMPARE(widget->size().width(), 180.0); + QCOMPARE(widget->size().height(), 30.0); + + delete loader; +} + +void tst_QDeclarativeLoader::sizeGraphicsWidgetToLoader() +{ + QDeclarativeComponent component(&engine, TEST_FILE("/SizeGraphicsWidgetToLoader.qml")); + QDeclarativeLoader *loader = qobject_cast(component.create()); + QGraphicsScene scene; + scene.addItem(loader); + + QVERIFY(loader != 0); + QCOMPARE(loader->width(), 200.0); + QCOMPARE(loader->height(), 80.0); + + QGraphicsWidget *widget = qobject_cast(loader->item()); + QVERIFY(widget); + QCOMPARE(widget->size().width(), 200.0); + QCOMPARE(widget->size().height(), 80.0); + + // Check resize + loader->setWidth(180); + loader->setHeight(30); + QCOMPARE(widget->size().width(), 180.0); + QCOMPARE(widget->size().height(), 30.0); + + // Switch mode + loader->resetWidth(); // reset explicit size + loader->resetHeight(); + widget->resize(QSizeF(160,45)); + QCOMPARE(loader->width(), 160.0); + QCOMPARE(loader->height(), 45.0); + + delete loader; +} + +void tst_QDeclarativeLoader::noResizeGraphicsWidget() +{ + QDeclarativeComponent component(&engine, TEST_FILE("/NoResizeGraphicsWidget.qml")); + QDeclarativeItem *item = qobject_cast(component.create()); + QGraphicsScene scene; + scene.addItem(item); + + QVERIFY(item != 0); + QCOMPARE(item->width(), 200.0); + QCOMPARE(item->height(), 80.0); + + delete item; +} + +void tst_QDeclarativeLoader::networkRequestUrl() +{ + TestHTTPServer server(SERVER_PORT); + QVERIFY(server.isValid()); + server.serveDirectory(SRCDIR "/data"); + + QDeclarativeComponent component(&engine); + component.setData(QByteArray("import QtQuick 1.0\nLoader { property int signalCount : 0; source: \"http://127.0.0.1:14450/Rect120x60.qml\"; onLoaded: signalCount += 1 }"), QUrl::fromLocalFile(SRCDIR "/dummy.qml")); + if (component.isError()) + qDebug() << component.errors(); + QDeclarativeLoader *loader = qobject_cast(component.create()); + QVERIFY(loader != 0); + + QTRY_VERIFY(loader->status() == QDeclarativeLoader::Ready); + + QVERIFY(loader->item()); + QCOMPARE(loader->progress(), 1.0); + QCOMPARE(loader->property("signalCount").toInt(), 1); + QCOMPARE(static_cast(loader)->children().count(), 1); + + delete loader; +} + +/* XXX Component waits until all dependencies are loaded. Is this actually possible? +void tst_QDeclarativeLoader::networkComponent() +{ + TestHTTPServer server(SERVER_PORT); + QVERIFY(server.isValid()); + server.serveDirectory("slowdata", TestHTTPServer::Delay); + + QDeclarativeComponent component(&engine); + component.setData(QByteArray( + "import QtQuick 1.0\n" + "import \"http://127.0.0.1:14450/\" as NW\n" + "Item {\n" + " Component { id: comp; NW.SlowRect {} }\n" + " Loader { sourceComponent: comp } }") + , TEST_FILE("")); + + QDeclarativeItem *item = qobject_cast(component.create()); + QVERIFY(item); + + QDeclarativeLoader *loader = qobject_cast(item->QGraphicsObject::children().at(1)); + QVERIFY(loader); + QTRY_VERIFY(loader->status() == QDeclarativeLoader::Ready); + + QVERIFY(loader->item()); + QCOMPARE(loader->progress(), 1.0); + QCOMPARE(loader->status(), QDeclarativeLoader::Ready); + QCOMPARE(static_cast(loader)->children().count(), 1); + + delete loader; +} +*/ + +void tst_QDeclarativeLoader::failNetworkRequest() +{ + TestHTTPServer server(SERVER_PORT); + QVERIFY(server.isValid()); + server.serveDirectory(SRCDIR "/data"); + + QTest::ignoreMessage(QtWarningMsg, "http://127.0.0.1:14450/IDontExist.qml: File not found"); + + QDeclarativeComponent component(&engine); + component.setData(QByteArray("import QtQuick 1.0\nLoader { property int did_load: 123; source: \"http://127.0.0.1:14450/IDontExist.qml\"; onLoaded: did_load=456 }"), QUrl::fromLocalFile("http://127.0.0.1:14450/dummy.qml")); + QDeclarativeLoader *loader = qobject_cast(component.create()); + QVERIFY(loader != 0); + + QTRY_VERIFY(loader->status() == QDeclarativeLoader::Error); + + QVERIFY(loader->item() == 0); + QCOMPARE(loader->progress(), 0.0); + QCOMPARE(loader->property("did_load").toInt(), 123); + QCOMPARE(static_cast(loader)->children().count(), 0); + + delete loader; +} + +// QTBUG-9241 +void tst_QDeclarativeLoader::deleteComponentCrash() +{ + QDeclarativeComponent component(&engine, TEST_FILE("crash.qml")); + QDeclarativeItem *item = qobject_cast(component.create()); + QVERIFY(item); + + item->metaObject()->invokeMethod(item, "setLoaderSource"); + + QDeclarativeLoader *loader = qobject_cast(item->QGraphicsObject::children().at(0)); + QVERIFY(loader); + QVERIFY(loader->item()); + QCOMPARE(loader->item()->objectName(), QLatin1String("blue")); + QCOMPARE(loader->progress(), 1.0); + QCOMPARE(loader->status(), QDeclarativeLoader::Ready); + QCOMPARE(static_cast(loader)->children().count(), 1); + QVERIFY(loader->source() == QUrl::fromLocalFile(SRCDIR "/data/BlueRect.qml")); + + delete item; +} + +void tst_QDeclarativeLoader::nonItem() +{ + QDeclarativeComponent component(&engine, TEST_FILE("nonItem.qml")); + QString err = QUrl::fromLocalFile(SRCDIR).toString() + "/data/nonItem.qml:3:1: QML Loader: Loader does not support loading non-visual elements."; + + QTest::ignoreMessage(QtWarningMsg, err.toLatin1().constData()); + QDeclarativeLoader *loader = qobject_cast(component.create()); + QVERIFY(loader); + QVERIFY(loader->item() == 0); + + delete loader; +} + +void tst_QDeclarativeLoader::vmeErrors() +{ + QDeclarativeComponent component(&engine, TEST_FILE("vmeErrors.qml")); + QString err = QUrl::fromLocalFile(SRCDIR).toString() + "/data/VmeError.qml:6: Cannot assign object type QObject with no default method"; + QTest::ignoreMessage(QtWarningMsg, err.toLatin1().constData()); + QDeclarativeLoader *loader = qobject_cast(component.create()); + QVERIFY(loader); + QVERIFY(loader->item() == 0); + + delete loader; +} + +// QTBUG-13481 +void tst_QDeclarativeLoader::creationContext() +{ + QDeclarativeComponent component(&engine, TEST_FILE("creationContext.qml")); + + QObject *o = component.create(); + QVERIFY(o != 0); + + QCOMPARE(o->property("test").toBool(), true); + + delete o; +} + +void tst_QDeclarativeLoader::QTBUG_16928() +{ + QDeclarativeComponent component(&engine, TEST_FILE("QTBUG_16928.qml")); + QDeclarativeItem *item = qobject_cast(component.create()); + QVERIFY(item); + + QCOMPARE(item->width(), 250.); + QCOMPARE(item->height(), 250.); + + delete item; +} + +void tst_QDeclarativeLoader::implicitSize() +{ + QDeclarativeComponent component(&engine, TEST_FILE("implicitSize.qml")); + QDeclarativeItem *item = qobject_cast(component.create()); + QVERIFY(item); + + QCOMPARE(item->width(), 150.); + QCOMPARE(item->height(), 150.); + + QCOMPARE(item->property("implHeight").toReal(), 100.); + QCOMPARE(item->property("implWidth").toReal(), 100.); + + delete item; +} + +void tst_QDeclarativeLoader::QTBUG_17114() +{ + QDeclarativeComponent component(&engine, TEST_FILE("QTBUG_17114.qml")); + QDeclarativeItem *item = qobject_cast(component.create()); + QVERIFY(item); + + QCOMPARE(item->property("loaderWidth").toReal(), 32.); + QCOMPARE(item->property("loaderHeight").toReal(), 32.); + + delete item; +} + +QTEST_MAIN(tst_QDeclarativeLoader) + +#include "tst_qdeclarativeloader.moc" diff --git a/tests/auto/declarative/qdeclarativemetatype/qdeclarativemetatype.pro b/tests/auto/declarative/qdeclarativemetatype/qdeclarativemetatype.pro new file mode 100644 index 00000000..f13250e2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemetatype/qdeclarativemetatype.pro @@ -0,0 +1,11 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +SOURCES += tst_qdeclarativemetatype.cpp +macx:CONFIG -= app_bundle + +!symbian: { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativemetatype/tst_qdeclarativemetatype.cpp b/tests/auto/declarative/qdeclarativemetatype/tst_qdeclarativemetatype.cpp new file mode 100644 index 00000000..e8ca4444 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemetatype/tst_qdeclarativemetatype.cpp @@ -0,0 +1,387 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_qdeclarativemetatype : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativemetatype() {} + +private slots: + void initTestCase(); + + void copy(); + + void qmlParserStatusCast(); + void qmlPropertyValueSourceCast(); + void qmlPropertyValueInterceptorCast(); + + void isList(); + + void defaultObject(); +}; + +class TestType : public QObject +{ + Q_OBJECT + Q_PROPERTY(int foo READ foo) + + Q_CLASSINFO("DefaultProperty", "foo") +public: + int foo() { return 0; } +}; +QML_DECLARE_TYPE(TestType); + +class ParserStatusTestType : public QObject, public QDeclarativeParserStatus +{ + Q_OBJECT + void classBegin(){} + void componentComplete(){} + Q_CLASSINFO("DefaultProperty", "foo") // Missing default property + Q_INTERFACES(QDeclarativeParserStatus) +}; +QML_DECLARE_TYPE(ParserStatusTestType); + +class ValueSourceTestType : public QObject, public QDeclarativePropertyValueSource +{ + Q_OBJECT + Q_INTERFACES(QDeclarativePropertyValueSource) +public: + virtual void setTarget(const QDeclarativeProperty &) {} +}; +QML_DECLARE_TYPE(ValueSourceTestType); + +class ValueInterceptorTestType : public QObject, public QDeclarativePropertyValueInterceptor +{ + Q_OBJECT + Q_INTERFACES(QDeclarativePropertyValueInterceptor) +public: + virtual void setTarget(const QDeclarativeProperty &) {} + virtual void write(const QVariant &) {} +}; +QML_DECLARE_TYPE(ValueInterceptorTestType); + + +#define COPY_TEST(cpptype, metatype, value, defaultvalue) \ +{ \ + cpptype v = (value); cpptype v2 = (value); \ + QVERIFY(QDeclarativeMetaType::copy(QMetaType:: metatype, &v, 0)); \ + QCOMPARE((cpptype)(v),(cpptype)(defaultvalue)); \ + QVERIFY(v == (defaultvalue)); \ + QVERIFY(QDeclarativeMetaType::copy(QMetaType:: metatype, &v, &v2)); \ + QVERIFY(v == (value)); \ +} + +#define QT_COPY_TEST(type, value) \ +{ \ + type v = (value); type v2 = (value); \ + QVERIFY(QDeclarativeMetaType::copy(QMetaType:: type, &v, 0)); \ + QVERIFY(v == (type ())); \ + QVERIFY(QDeclarativeMetaType::copy(QMetaType:: type, &v, &v2)); \ + QVERIFY(v == (value)); \ +} + +void tst_qdeclarativemetatype::initTestCase() +{ + qmlRegisterType("Test", 1, 0, "TestType"); + qmlRegisterType("Test", 1, 0, "ParserStatusTestType"); + qmlRegisterType("Test", 1, 0, "ValueSourceTestType"); + qmlRegisterType("Test", 1, 0, "ValueInterceptorTestType"); +} + +void tst_qdeclarativemetatype::copy() +{ + QVERIFY(QDeclarativeMetaType::copy(QMetaType::Void, 0, 0)); + + COPY_TEST(bool, Bool, true, false); + COPY_TEST(int, Int, 10, 0); + COPY_TEST(unsigned int, UInt, 10, 0); + COPY_TEST(long long, LongLong, 10, 0); + COPY_TEST(unsigned long long, ULongLong, 10, 0); + COPY_TEST(double, Double, 19.2, 0); + + QT_COPY_TEST(QChar, QChar('a')); + + QVariantMap variantMap; + variantMap.insert("Hello World!", QVariant(10)); + QT_COPY_TEST(QVariantMap, variantMap); + + QT_COPY_TEST(QVariantList, QVariantList() << QVariant(19.2)); + QT_COPY_TEST(QString, QString("QML Rocks!")); + QT_COPY_TEST(QStringList, QStringList() << "QML" << "Rocks"); + QT_COPY_TEST(QByteArray, QByteArray("0x1102DDD")); + QT_COPY_TEST(QBitArray, QBitArray(102, true)); + QDate cd = QDate::currentDate(); + QT_COPY_TEST(QDate, cd); + QTime ct = QTime::currentTime(); + QT_COPY_TEST(QTime, ct); + QDateTime cdt = QDateTime::currentDateTime(); + QT_COPY_TEST(QDateTime, cdt); + QT_COPY_TEST(QUrl, QUrl("http://www.nokia.com")); + QT_COPY_TEST(QLocale, QLocale(QLocale::English, QLocale::Australia)); + QT_COPY_TEST(QRect, QRect(-10, 10, 102, 99)); + QT_COPY_TEST(QRectF, QRectF(-10.2, 1.2, 102, 99.6)); + QT_COPY_TEST(QSize, QSize(100, 2)); + QT_COPY_TEST(QSizeF, QSizeF(20.2, -100234.2)); + QT_COPY_TEST(QLine, QLine(0, 0, 100, 100)); + QT_COPY_TEST(QLineF, QLineF(-10.2, 0, 103, 1)); + QT_COPY_TEST(QPoint, QPoint(-1912, 1613)); + QT_COPY_TEST(QPointF, QPointF(-908.1, 1612)); + QT_COPY_TEST(QRegExp, QRegExp("(\\d+)(?:\\s*)(cm|inch)")); + + QVariantHash variantHash; + variantHash.insert("Hello World!", QVariant(19)); + QT_COPY_TEST(QVariantHash, variantHash); + +#ifdef QT3_SUPPORT + QT_COPY_TEST(QColorGroup, QColorGroup(Qt::red, Qt::red, Qt::red, Qt::red, Qt::red, Qt::red, Qt::red)); +#endif + + QT_COPY_TEST(QFont, QFont("Helvetica", 1024)); + + { + QPixmap v = QPixmap(100, 100); QPixmap v2 = QPixmap(100, 100); + QVERIFY(QDeclarativeMetaType::copy(QMetaType::QPixmap, &v, 0)); + QVERIFY(v.size() == QPixmap().size()); + QVERIFY(QDeclarativeMetaType::copy(QMetaType::QPixmap , &v, &v2)); + QVERIFY(v.size() == QPixmap(100,100).size()); + } + + QT_COPY_TEST(QBrush, QBrush(Qt::blue)); + QT_COPY_TEST(QColor, QColor("lightsteelblue")); + QT_COPY_TEST(QPalette, QPalette(Qt::green)); + + { + QPixmap icon(100, 100); + + QIcon v = QIcon(icon); QIcon v2 = QIcon(icon); + QVERIFY(QDeclarativeMetaType::copy(QMetaType::QIcon, &v, 0)); + QVERIFY(v.isNull() == QIcon().isNull()); + QVERIFY(QDeclarativeMetaType::copy(QMetaType::QIcon , &v, &v2)); + QVERIFY(v.isNull() == QIcon(icon).isNull()); + } + + { + QImage v = QImage(100, 100, QImage::Format_RGB32); + QImage v2 = QImage(100, 100, QImage::Format_RGB32); + QVERIFY(QDeclarativeMetaType::copy(QMetaType::QImage, &v, 0)); + QVERIFY(v.size() == QImage().size()); + QVERIFY(QDeclarativeMetaType::copy(QMetaType::QImage , &v, &v2)); + QVERIFY(v.size() == QImage(100,100, QImage::Format_RGB32).size()); + } + + QT_COPY_TEST(QPolygon, QPolygon(QRect(100, 100, 200, 103))); + QT_COPY_TEST(QRegion, QRegion(QRect(0, 10, 99, 87))); + + { + QBitmap v = QBitmap(100, 100); QBitmap v2 = QBitmap(100, 100); + QVERIFY(QDeclarativeMetaType::copy(QMetaType::QBitmap, &v, 0)); + QVERIFY(v.size() == QBitmap().size()); + QVERIFY(QDeclarativeMetaType::copy(QMetaType::QBitmap , &v, &v2)); + QVERIFY(v.size() == QBitmap(100,100).size()); + } + + { + QCursor v = QCursor(Qt::SizeFDiagCursor); QCursor v2 = QCursor(Qt::SizeFDiagCursor); + QVERIFY(QDeclarativeMetaType::copy(QMetaType::QCursor, &v, 0)); + QVERIFY(v.shape() == QCursor().shape()); + QVERIFY(QDeclarativeMetaType::copy(QMetaType::QCursor , &v, &v2)); + QVERIFY(v.shape() == QCursor(Qt::SizeFDiagCursor).shape()); + } + + QT_COPY_TEST(QSizePolicy, QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Maximum)); + QT_COPY_TEST(QKeySequence, QKeySequence("Ctrl+O")); + QT_COPY_TEST(QPen, QPen(Qt::red)); + QT_COPY_TEST(QTextLength, QTextLength(QTextLength::FixedLength, 10.2)); + QT_COPY_TEST(QTextFormat, QTextFormat(QTextFormat::ListFormat)); + QT_COPY_TEST(QMatrix, QMatrix().translate(10, 10)); + QT_COPY_TEST(QTransform, QTransform().translate(10, 10)); + QT_COPY_TEST(QMatrix4x4, QMatrix4x4(1,0,2,3,0,1,0,0,9,0,1,0,0,0,10,1)); + QT_COPY_TEST(QVector2D, QVector2D(10.2, 1)); + QT_COPY_TEST(QVector3D, QVector3D(10.2, 1, -2)); + QT_COPY_TEST(QVector4D, QVector4D(10.2, 1, -2, 1.2)); + QT_COPY_TEST(QQuaternion, QQuaternion(1.0, 10.2, 1, -2)); + + int voidValue; + COPY_TEST(void *, VoidStar, (void *)&voidValue, (void *)0); + COPY_TEST(long, Long, 10, 0); + COPY_TEST(short, Short, 10, 0); + COPY_TEST(char, Char, 'a', 0); + COPY_TEST(unsigned long, ULong, 10, 0); + COPY_TEST(unsigned short, UShort, 10, 0); + COPY_TEST(unsigned char, UChar, 'a', 0); + COPY_TEST(float, Float, 10.5, 0); + + QObject objectValue; + QWidget widgetValue; + COPY_TEST(QObject *, QObjectStar, &objectValue, 0); + COPY_TEST(QWidget *, QWidgetStar, &widgetValue, 0); + COPY_TEST(qreal, QReal, 10.5, 0); + + { + QVariant tv = QVariant::fromValue(QVariant(10)); + QVariant v(tv); QVariant v2(tv); + QVERIFY(QDeclarativeMetaType::copy(qMetaTypeId(), &v, 0)); + QVERIFY(v == QVariant()); + QVERIFY(QDeclarativeMetaType::copy(qMetaTypeId(), &v, &v2)); + QVERIFY(v == tv); + } + + { + TestType t; QVariant tv = QVariant::fromValue(&t); + + QVariant v(tv); QVariant v2(tv); + QVERIFY(QDeclarativeMetaType::copy(qMetaTypeId(), &v, 0)); + QVERIFY(v == QVariant::fromValue((TestType *)0)); + QVERIFY(QDeclarativeMetaType::copy(qMetaTypeId(), &v, &v2)); + QVERIFY(v == tv); + } +} + +void tst_qdeclarativemetatype::qmlParserStatusCast() +{ + QVERIFY(QDeclarativeMetaType::qmlType(QVariant::Int) == 0); + QVERIFY(QDeclarativeMetaType::qmlType(qMetaTypeId()) != 0); + QCOMPARE(QDeclarativeMetaType::qmlType(qMetaTypeId())->parserStatusCast(), -1); + QVERIFY(QDeclarativeMetaType::qmlType(qMetaTypeId()) != 0); + QCOMPARE(QDeclarativeMetaType::qmlType(qMetaTypeId())->parserStatusCast(), -1); + + QVERIFY(QDeclarativeMetaType::qmlType(qMetaTypeId()) != 0); + int cast = QDeclarativeMetaType::qmlType(qMetaTypeId())->parserStatusCast(); + QVERIFY(cast != -1); + QVERIFY(cast != 0); + + ParserStatusTestType t; + QVERIFY(reinterpret_cast((QObject *)&t) != reinterpret_cast((QDeclarativeParserStatus *)&t)); + + QDeclarativeParserStatus *status = reinterpret_cast(reinterpret_cast((QObject *)&t) + cast); + QCOMPARE(status, (QDeclarativeParserStatus*)&t); +} + +void tst_qdeclarativemetatype::qmlPropertyValueSourceCast() +{ + QVERIFY(QDeclarativeMetaType::qmlType(QVariant::Int) == 0); + QVERIFY(QDeclarativeMetaType::qmlType(qMetaTypeId()) != 0); + QCOMPARE(QDeclarativeMetaType::qmlType(qMetaTypeId())->propertyValueSourceCast(), -1); + QVERIFY(QDeclarativeMetaType::qmlType(qMetaTypeId()) != 0); + QCOMPARE(QDeclarativeMetaType::qmlType(qMetaTypeId())->propertyValueSourceCast(), -1); + + QVERIFY(QDeclarativeMetaType::qmlType(qMetaTypeId()) != 0); + int cast = QDeclarativeMetaType::qmlType(qMetaTypeId())->propertyValueSourceCast(); + QVERIFY(cast != -1); + QVERIFY(cast != 0); + + ValueSourceTestType t; + QVERIFY(reinterpret_cast((QObject *)&t) != reinterpret_cast((QDeclarativePropertyValueSource *)&t)); + + QDeclarativePropertyValueSource *source = reinterpret_cast(reinterpret_cast((QObject *)&t) + cast); + QCOMPARE(source, (QDeclarativePropertyValueSource*)&t); +} + +void tst_qdeclarativemetatype::qmlPropertyValueInterceptorCast() +{ + QVERIFY(QDeclarativeMetaType::qmlType(QVariant::Int) == 0); + QVERIFY(QDeclarativeMetaType::qmlType(qMetaTypeId()) != 0); + QCOMPARE(QDeclarativeMetaType::qmlType(qMetaTypeId())->propertyValueInterceptorCast(), -1); + QVERIFY(QDeclarativeMetaType::qmlType(qMetaTypeId()) != 0); + QCOMPARE(QDeclarativeMetaType::qmlType(qMetaTypeId())->propertyValueInterceptorCast(), -1); + + QVERIFY(QDeclarativeMetaType::qmlType(qMetaTypeId()) != 0); + int cast = QDeclarativeMetaType::qmlType(qMetaTypeId())->propertyValueInterceptorCast(); + QVERIFY(cast != -1); + QVERIFY(cast != 0); + + ValueInterceptorTestType t; + QVERIFY(reinterpret_cast((QObject *)&t) != reinterpret_cast((QDeclarativePropertyValueInterceptor *)&t)); + + QDeclarativePropertyValueInterceptor *interceptor = reinterpret_cast(reinterpret_cast((QObject *)&t) + cast); + QCOMPARE(interceptor, (QDeclarativePropertyValueInterceptor*)&t); +} + +void tst_qdeclarativemetatype::isList() +{ + QCOMPARE(QDeclarativeMetaType::isList(QVariant::Invalid), false); + QCOMPARE(QDeclarativeMetaType::isList(QVariant::Int), false); + + QDeclarativeListProperty list; + + QCOMPARE(QDeclarativeMetaType::isList(qMetaTypeId >()), true); +} + +void tst_qdeclarativemetatype::defaultObject() +{ + QVERIFY(QDeclarativeMetaType::defaultProperty(&QObject::staticMetaObject).name() == 0); + QVERIFY(QDeclarativeMetaType::defaultProperty(&ParserStatusTestType::staticMetaObject).name() == 0); + QCOMPARE(QString(QDeclarativeMetaType::defaultProperty(&TestType::staticMetaObject).name()), QString("foo")); + + QObject o; + TestType t; + ParserStatusTestType p; + + QVERIFY(QDeclarativeMetaType::defaultProperty((QObject *)0).name() == 0); + QVERIFY(QDeclarativeMetaType::defaultProperty(&o).name() == 0); + QVERIFY(QDeclarativeMetaType::defaultProperty(&p).name() == 0); + QCOMPARE(QString(QDeclarativeMetaType::defaultProperty(&t).name()), QString("foo")); +} + +QTEST_MAIN(tst_qdeclarativemetatype) + +#include "tst_qdeclarativemetatype.moc" diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/data/importsMixedQmlCppPlugin.2.qml b/tests/auto/declarative/qdeclarativemoduleplugin/data/importsMixedQmlCppPlugin.2.qml new file mode 100644 index 00000000..70b2bfd8 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/importsMixedQmlCppPlugin.2.qml @@ -0,0 +1,21 @@ +import com.nokia.AutoTestQmlMixedPluginType 1.5 +import QtQuick 1.0 + +Item { + property bool test: false + property bool test2: false + + Bar { + id: bar + } + + Foo { + id: foo + } + + Component.onCompleted: { + test = (bar.value == 16); + test2 = (foo.value == 89); + } +} + diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/data/importsMixedQmlCppPlugin.qml b/tests/auto/declarative/qdeclarativemoduleplugin/data/importsMixedQmlCppPlugin.qml new file mode 100644 index 00000000..da6ff465 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/importsMixedQmlCppPlugin.qml @@ -0,0 +1,13 @@ +import com.nokia.AutoTestQmlMixedPluginType 1.0 +import QtQuick 1.0 + +Item { + property bool test: false + Bar { + id: bar + } + + Component.onCompleted: { + test = (bar.value == 16); + } +} diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/data/incorrectCase.qml b/tests/auto/declarative/qdeclarativemoduleplugin/data/incorrectCase.qml new file mode 100644 index 00000000..a21ece70 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/incorrectCase.qml @@ -0,0 +1,4 @@ +import com.nokia.WrongCase 1.0 + +MyPluginType { value: 123 } + diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/data/pluginWithQmlFile.qml b/tests/auto/declarative/qdeclarativemoduleplugin/data/pluginWithQmlFile.qml new file mode 100644 index 00000000..a9e28e5d --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/pluginWithQmlFile.qml @@ -0,0 +1,3 @@ +import com.nokia.AutoTestPluginWithQmlFile 1.0 + +MyQmlFile {} diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.2.errors.txt b/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.2.errors.txt new file mode 100644 index 00000000..a40c1c82 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.2.errors.txt @@ -0,0 +1 @@ +1:1:module "com.nokia.AutoTestQmlVersionPluginType" version 1.9 is not installed diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.2.qml b/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.2.qml new file mode 100644 index 00000000..59fd084a --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.2.qml @@ -0,0 +1,5 @@ +import com.nokia.AutoTestQmlVersionPluginType 1.9 +import QtQuick 1.0 + +QtObject { +} diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.errors.txt b/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.errors.txt new file mode 100644 index 00000000..2634223d --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.errors.txt @@ -0,0 +1 @@ +1:1:module "com.nokia.AutoTestQmlVersionPluginType" version 1.1 is not installed diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.qml b/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.qml new file mode 100644 index 00000000..2065c071 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/versionNotInstalled.qml @@ -0,0 +1,6 @@ +import com.nokia.AutoTestQmlVersionPluginType 1.1 +import QtQuick 1.0 + +QtObject { +} + diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/data/works.qml b/tests/auto/declarative/qdeclarativemoduleplugin/data/works.qml new file mode 100644 index 00000000..f29ae24e --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/works.qml @@ -0,0 +1,3 @@ +import com.nokia.AutoTestQmlPluginType 1.0 + +MyPluginType { value: 123 } diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/data/works2.qml b/tests/auto/declarative/qdeclarativemoduleplugin/data/works2.qml new file mode 100644 index 00000000..cc322bf2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/works2.qml @@ -0,0 +1,3 @@ +import com.nokia.AutoTestQmlPluginType 2.0 + +MyPluginType { valueOnlyIn2: 123 } diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/data/works21.qml b/tests/auto/declarative/qdeclarativemoduleplugin/data/works21.qml new file mode 100644 index 00000000..c08160ac --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/data/works21.qml @@ -0,0 +1,3 @@ +import com.nokia.AutoTestQmlPluginType 2.1 + +MyPluginType { valueOnlyIn2: 123 } diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestPluginWithQmlFile/MyQmlFile.qml b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestPluginWithQmlFile/MyQmlFile.qml new file mode 100644 index 00000000..18dcd26f --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestPluginWithQmlFile/MyQmlFile.qml @@ -0,0 +1,3 @@ +import QtQuick 1.0 + +Item {} \ No newline at end of file diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestPluginWithQmlFile/qmldir b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestPluginWithQmlFile/qmldir new file mode 100644 index 00000000..858ba145 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestPluginWithQmlFile/qmldir @@ -0,0 +1,3 @@ +MyQmlFile 1.0 MyQmlFile.qml +plugin pluginWithQmlFile + diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlMixedPluginType/Foo.qml b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlMixedPluginType/Foo.qml new file mode 100644 index 00000000..ce51cbd2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlMixedPluginType/Foo.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +Item { + property int value: 89 +} diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlMixedPluginType/qmldir b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlMixedPluginType/qmldir new file mode 100644 index 00000000..065dc3b2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlMixedPluginType/qmldir @@ -0,0 +1,2 @@ +plugin pluginMixed +Foo 1.5 Foo.qml diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlPluginType.2.1/qmldir b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlPluginType.2.1/qmldir new file mode 100644 index 00000000..0a8b5d46 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlPluginType.2.1/qmldir @@ -0,0 +1 @@ +plugin plugin diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlPluginType.2/qmldir b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlPluginType.2/qmldir new file mode 100644 index 00000000..0a8b5d46 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlPluginType.2/qmldir @@ -0,0 +1 @@ +plugin plugin diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlPluginType/qmldir b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlPluginType/qmldir new file mode 100644 index 00000000..0a8b5d46 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlPluginType/qmldir @@ -0,0 +1 @@ +plugin plugin diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlVersionPluginType/qmldir b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlVersionPluginType/qmldir new file mode 100644 index 00000000..640967fe --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/AutoTestQmlVersionPluginType/qmldir @@ -0,0 +1 @@ +plugin pluginVersion diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/PureQmlModule/ComponentA.qml b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/PureQmlModule/ComponentA.qml new file mode 100644 index 00000000..49613aab --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/PureQmlModule/ComponentA.qml @@ -0,0 +1,3 @@ +import QtQuick 1.0 + +Item {} diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/PureQmlModule/ComponentB.qml b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/PureQmlModule/ComponentB.qml new file mode 100644 index 00000000..f19a336d --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/PureQmlModule/ComponentB.qml @@ -0,0 +1,4 @@ +import QtQuick 1.0 + +Item {} + diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/PureQmlModule/qmldir b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/PureQmlModule/qmldir new file mode 100644 index 00000000..167bb10c --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/PureQmlModule/qmldir @@ -0,0 +1,3 @@ +ComponentA 1.0 ComponentA.qml +ComponentB 1.0 ComponentB.qml + diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/WrongCase/qmldir b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/WrongCase/qmldir new file mode 100644 index 00000000..6c878749 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/imports/com/nokia/WrongCase/qmldir @@ -0,0 +1 @@ +plugin PluGin diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2.1/plugin.2.1.pro b/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2.1/plugin.2.1.pro new file mode 100644 index 00000000..661675ae --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2.1/plugin.2.1.pro @@ -0,0 +1,9 @@ +TEMPLATE = lib +CONFIG += plugin +SOURCES = plugin.cpp +QT = core declarative +DESTDIR = ../imports/com/nokia/AutoTestQmlPluginType.2.1 + +symbian: { + TARGET.EPOCALLOWDLLDATA=1 +} diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2.1/plugin.cpp b/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2.1/plugin.cpp new file mode 100644 index 00000000..4774c329 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2.1/plugin.cpp @@ -0,0 +1,84 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include + +class MyPluginType : public QObject +{ + Q_OBJECT + Q_PROPERTY(int value READ value WRITE setValue) + Q_PROPERTY(int valueOnlyIn2 READ value WRITE setValue) + +public: + MyPluginType(QObject *parent=0) : QObject(parent) + { + qWarning("import2.1 worked"); + } + + int value() const { return v; } + void setValue(int i) { v = i; } + +private: + int v; +}; + + +class MyPlugin : public QDeclarativeExtensionPlugin +{ + Q_OBJECT +public: + MyPlugin() + { + qWarning("plugin2.1 created"); + } + + void registerTypes(const char *uri) + { + Q_ASSERT(QLatin1String(uri) == "com.nokia.AutoTestQmlPluginType"); + qmlRegisterType(uri, 2, 1, "MyPluginType"); + } +}; + +#include "plugin.moc" + +Q_EXPORT_PLUGIN2(plugin, MyPlugin); diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2/plugin.2.pro b/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2/plugin.2.pro new file mode 100644 index 00000000..d2546429 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2/plugin.2.pro @@ -0,0 +1,9 @@ +TEMPLATE = lib +CONFIG += plugin +SOURCES = plugin.cpp +QT = core declarative +DESTDIR = ../imports/com/nokia/AutoTestQmlPluginType.2 + +symbian: { + TARGET.EPOCALLOWDLLDATA=1 +} diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2/plugin.cpp b/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2/plugin.cpp new file mode 100644 index 00000000..271c59e5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/plugin.2/plugin.cpp @@ -0,0 +1,84 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include + +class MyPluginType : public QObject +{ + Q_OBJECT + Q_PROPERTY(int value READ value WRITE setValue) + Q_PROPERTY(int valueOnlyIn2 READ value WRITE setValue) + +public: + MyPluginType(QObject *parent=0) : QObject(parent) + { + qWarning("import2 worked"); + } + + int value() const { return v; } + void setValue(int i) { v = i; } + +private: + int v; +}; + + +class MyPlugin : public QDeclarativeExtensionPlugin +{ + Q_OBJECT +public: + MyPlugin() + { + qWarning("plugin2 created"); + } + + void registerTypes(const char *uri) + { + Q_ASSERT(QLatin1String(uri) == "com.nokia.AutoTestQmlPluginType"); + qmlRegisterType(uri, 2, 0, "MyPluginType"); + } +}; + +#include "plugin.moc" + +Q_EXPORT_PLUGIN2(plugin, MyPlugin); diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/plugin/plugin.cpp b/tests/auto/declarative/qdeclarativemoduleplugin/plugin/plugin.cpp new file mode 100644 index 00000000..f023963b --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/plugin/plugin.cpp @@ -0,0 +1,83 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include + +class MyPluginType : public QObject +{ + Q_OBJECT + Q_PROPERTY(int value READ value WRITE setValue) + +public: + MyPluginType(QObject *parent=0) : QObject(parent) + { + qWarning("import worked"); + } + + int value() const { return v; } + void setValue(int i) { v = i; } + +private: + int v; +}; + + +class MyPlugin : public QDeclarativeExtensionPlugin +{ + Q_OBJECT +public: + MyPlugin() + { + qWarning("plugin created"); + } + + void registerTypes(const char *uri) + { + Q_ASSERT(QLatin1String(uri) == "com.nokia.AutoTestQmlPluginType"); + qmlRegisterType(uri, 1, 0, "MyPluginType"); + } +}; + +#include "plugin.moc" + +Q_EXPORT_PLUGIN2(plugin, MyPlugin); diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/plugin/plugin.pro b/tests/auto/declarative/qdeclarativemoduleplugin/plugin/plugin.pro new file mode 100644 index 00000000..173a3026 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/plugin/plugin.pro @@ -0,0 +1,9 @@ +TEMPLATE = lib +CONFIG += plugin +SOURCES = plugin.cpp +QT = core declarative +DESTDIR = ../imports/com/nokia/AutoTestQmlPluginType + +symbian: { + TARGET.EPOCALLOWDLLDATA=1 +} diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/pluginMixed/plugin.cpp b/tests/auto/declarative/qdeclarativemoduleplugin/pluginMixed/plugin.cpp new file mode 100644 index 00000000..460bcf87 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/pluginMixed/plugin.cpp @@ -0,0 +1,73 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include + +class BarPluginType : public QObject +{ + Q_OBJECT + Q_PROPERTY(int value READ value); + +public: + int value() const { return 16; } +}; + + +class MyMixedPlugin : public QDeclarativeExtensionPlugin +{ + Q_OBJECT +public: + MyMixedPlugin() + { + } + + void registerTypes(const char *uri) + { + Q_ASSERT(QLatin1String(uri) == "com.nokia.AutoTestQmlMixedPluginType"); + qmlRegisterType(uri, 1, 0, "Bar"); + } +}; + +#include "plugin.moc" + +Q_EXPORT_PLUGIN2(plugin, MyMixedPlugin); diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/pluginMixed/pluginMixed.pro b/tests/auto/declarative/qdeclarativemoduleplugin/pluginMixed/pluginMixed.pro new file mode 100644 index 00000000..9766003e --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/pluginMixed/pluginMixed.pro @@ -0,0 +1,9 @@ +TEMPLATE = lib +CONFIG += plugin +SOURCES = plugin.cpp +QT = core declarative +DESTDIR = ../imports/com/nokia/AutoTestQmlMixedPluginType + +symbian: { + TARGET.EPOCALLOWDLLDATA=1 +} diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/pluginVersion/plugin.cpp b/tests/auto/declarative/qdeclarativemoduleplugin/pluginVersion/plugin.cpp new file mode 100644 index 00000000..427bf648 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/pluginVersion/plugin.cpp @@ -0,0 +1,73 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include + +class FloorPluginType : public QObject +{ + Q_OBJECT + Q_PROPERTY(int value READ value); + +public: + int value() const { return 16; } +}; + + +class MyMixedPlugin : public QDeclarativeExtensionPlugin +{ + Q_OBJECT +public: + MyMixedPlugin() + { + } + + void registerTypes(const char *uri) + { + Q_ASSERT(QLatin1String(uri) == "com.nokia.AutoTestQmlVersionPluginType"); + qmlRegisterType(uri, 1, 4, "Floor"); + } +}; + +#include "plugin.moc" + +Q_EXPORT_PLUGIN2(plugin, MyMixedPlugin); diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/pluginVersion/pluginVersion.pro b/tests/auto/declarative/qdeclarativemoduleplugin/pluginVersion/pluginVersion.pro new file mode 100644 index 00000000..70a38b9a --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/pluginVersion/pluginVersion.pro @@ -0,0 +1,9 @@ +TEMPLATE = lib +CONFIG += plugin +SOURCES = plugin.cpp +QT = core declarative +DESTDIR = ../imports/com/nokia/AutoTestQmlVersionPluginType + +symbian: { + TARGET.EPOCALLOWDLLDATA=1 +} diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/pluginWithQmlFile/plugin.cpp b/tests/auto/declarative/qdeclarativemoduleplugin/pluginWithQmlFile/plugin.cpp new file mode 100644 index 00000000..1b5a9d85 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/pluginWithQmlFile/plugin.cpp @@ -0,0 +1,58 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include + +class MyPlugin : public QDeclarativeExtensionPlugin +{ + Q_OBJECT +public: + void registerTypes(const char *uri) + { + Q_ASSERT(QLatin1String(uri) == "com.nokia.AutoTestPluginWithQmlFile"); + } +}; + +#include "plugin.moc" + +Q_EXPORT_PLUGIN2(plugin, MyPlugin); diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/pluginWithQmlFile/pluginWithQmlFile.pro b/tests/auto/declarative/qdeclarativemoduleplugin/pluginWithQmlFile/pluginWithQmlFile.pro new file mode 100644 index 00000000..aa9c95c4 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/pluginWithQmlFile/pluginWithQmlFile.pro @@ -0,0 +1,9 @@ +TEMPLATE = lib +CONFIG += plugin +SOURCES = plugin.cpp +QT = core declarative +DESTDIR = ../imports/com/nokia/AutoTestPluginWithQmlFile + +symbian: { + TARGET.EPOCALLOWDLLDATA=1 +} diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/pluginWrongCase/plugin.cpp b/tests/auto/declarative/qdeclarativemoduleplugin/pluginWrongCase/plugin.cpp new file mode 100644 index 00000000..8397dbf3 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/pluginWrongCase/plugin.cpp @@ -0,0 +1,83 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include + +class MyPluginType : public QObject +{ + Q_OBJECT + Q_PROPERTY(int value READ value WRITE setValue) + +public: + MyPluginType(QObject *parent=0) : QObject(parent) + { + qWarning("import worked"); + } + + int value() const { return v; } + void setValue(int i) { v = i; } + +private: + int v; +}; + + +class MyPlugin : public QDeclarativeExtensionPlugin +{ + Q_OBJECT +public: + MyPlugin() + { + qWarning("plugin created"); + } + + void registerTypes(const char *uri) + { + Q_ASSERT(QLatin1String(uri) == "com.nokia.WrongCase"); + qmlRegisterType(uri, 1, 0, "MyPluginType"); + } +}; + +#include "plugin.moc" + +Q_EXPORT_PLUGIN2(plugin, MyPlugin); diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/pluginWrongCase/pluginWrongCase.pro b/tests/auto/declarative/qdeclarativemoduleplugin/pluginWrongCase/pluginWrongCase.pro new file mode 100644 index 00000000..c7337ca0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/pluginWrongCase/pluginWrongCase.pro @@ -0,0 +1,10 @@ +TEMPLATE = lib +CONFIG += plugin +SOURCES = plugin.cpp +QT = core declarative +TARGET = Plugin +DESTDIR = ../imports/com/nokia/WrongCase + +symbian: { + TARGET.EPOCALLOWDLLDATA=1 +} diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/qdeclarativemoduleplugin.pro b/tests/auto/declarative/qdeclarativemoduleplugin/qdeclarativemoduleplugin.pro new file mode 100644 index 00000000..6e72d983 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/qdeclarativemoduleplugin.pro @@ -0,0 +1,8 @@ +QT = core +TEMPLATE = subdirs +SUBDIRS = plugin plugin.2 plugin.2.1 pluginWrongCase pluginWithQmlFile pluginMixed pluginVersion +tst_qdeclarativemoduleplugin_pro.depends += plugin +SUBDIRS += tst_qdeclarativemoduleplugin.pro + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.cpp b/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.cpp new file mode 100644 index 00000000..cc22da45 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.cpp @@ -0,0 +1,338 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include + +#include "../shared/testhttpserver.h" +#include "../../../shared/util.h" + +#define SERVER_ADDR "http://127.0.0.1:14450" +#define SERVER_PORT 14450 + + +class tst_qdeclarativemoduleplugin : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativemoduleplugin() + { + } + +private slots: + void importsPlugin(); + void importsPlugin2(); + void importsPlugin21(); + void importsMixedQmlCppPlugin(); + void incorrectPluginCase(); + void importPluginWithQmlFile(); + void remoteImportWithQuotedUrl(); + void remoteImportWithUnquotedUri(); + void versionNotInstalled(); + void versionNotInstalled_data(); + void importPath(); +}; + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +#define VERIFY_ERRORS(errorfile) \ + if (!errorfile) { \ + if (qgetenv("DEBUG") != "" && !component.errors().isEmpty()) \ + qWarning() << "Unexpected Errors:" << component.errors(); \ + QVERIFY(!component.isError()); \ + QVERIFY(component.errors().isEmpty()); \ + } else { \ + QFile file(QLatin1String("data/") + QLatin1String(errorfile)); \ + QVERIFY(file.open(QIODevice::ReadOnly | QIODevice::Text)); \ + QByteArray data = file.readAll(); \ + file.close(); \ + QList expected = data.split('\n'); \ + expected.removeAll(QByteArray("")); \ + QList errors = component.errors(); \ + QList actual; \ + for (int ii = 0; ii < errors.count(); ++ii) { \ + const QDeclarativeError &error = errors.at(ii); \ + QByteArray errorStr = QByteArray::number(error.line()) + ":" + \ + QByteArray::number(error.column()) + ":" + \ + error.description().toUtf8(); \ + actual << errorStr; \ + } \ + if (qgetenv("DEBUG") != "" && expected != actual) \ + qWarning() << "Expected:" << expected << "Actual:" << actual; \ + if (qgetenv("QDECLARATIVELANGUAGE_UPDATEERRORS") != "" && expected != actual) {\ + QFile file(QLatin1String("data/") + QLatin1String(errorfile)); \ + QVERIFY(file.open(QIODevice::WriteOnly)); \ + for (int ii = 0; ii < actual.count(); ++ii) { \ + file.write(actual.at(ii)); file.write("\n"); \ + } \ + file.close(); \ + } else { \ + QCOMPARE(expected, actual); \ + } \ + } + +inline QUrl TEST_FILE(const QString &filename) +{ + QFileInfo fileInfo(__FILE__); + return QUrl::fromLocalFile(fileInfo.absoluteDir().filePath(filename)); +} + + +void tst_qdeclarativemoduleplugin::importsPlugin() +{ + QDeclarativeEngine engine; + engine.addImportPath(QLatin1String(SRCDIR) + QDir::separator() + QLatin1String("imports")); + QTest::ignoreMessage(QtWarningMsg, "plugin created"); + QTest::ignoreMessage(QtWarningMsg, "import worked"); + QDeclarativeComponent component(&engine, TEST_FILE("data/works.qml")); + foreach (QDeclarativeError err, component.errors()) + qWarning() << err; + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + QCOMPARE(object->property("value").toInt(),123); + delete object; +} + +void tst_qdeclarativemoduleplugin::importsPlugin2() +{ + QDeclarativeEngine engine; + engine.addImportPath(QLatin1String(SRCDIR) + QDir::separator() + QLatin1String("imports")); + QTest::ignoreMessage(QtWarningMsg, "plugin2 created"); + QTest::ignoreMessage(QtWarningMsg, "import2 worked"); + QDeclarativeComponent component(&engine, TEST_FILE("data/works2.qml")); + foreach (QDeclarativeError err, component.errors()) + qWarning() << err; + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + QCOMPARE(object->property("value").toInt(),123); + delete object; +} + +void tst_qdeclarativemoduleplugin::importsPlugin21() +{ + QDeclarativeEngine engine; + engine.addImportPath(QLatin1String(SRCDIR) + QDir::separator() + QLatin1String("imports")); + QTest::ignoreMessage(QtWarningMsg, "plugin2.1 created"); + QTest::ignoreMessage(QtWarningMsg, "import2.1 worked"); + QDeclarativeComponent component(&engine, TEST_FILE("data/works21.qml")); + foreach (QDeclarativeError err, component.errors()) + qWarning() << err; + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + QCOMPARE(object->property("value").toInt(),123); + delete object; +} + +void tst_qdeclarativemoduleplugin::incorrectPluginCase() +{ + QDeclarativeEngine engine; + engine.addImportPath(QLatin1String(SRCDIR) + QDir::separator() + QLatin1String("imports")); + + QDeclarativeComponent component(&engine, TEST_FILE("data/incorrectCase.qml")); + + QList errors = component.errors(); + QCOMPARE(errors.count(), 1); + +#if defined(Q_OS_MAC) || defined(Q_OS_WIN32) +#if defined(Q_OS_MAC) + QString libname = "libPluGin.dylib"; +#elif defined(Q_OS_WIN32) + QString libname = "PluGin.dll"; +#endif + QString expectedError = QLatin1String("plugin cannot be loaded for module \"com.nokia.WrongCase\": File name case mismatch for \"") + QFileInfo(__FILE__).absoluteDir().filePath("imports/com/nokia/WrongCase/" + libname) + QLatin1String("\""); +#else + QString expectedError = QLatin1String("module \"com.nokia.WrongCase\" plugin \"PluGin\" not found"); +#endif + + QCOMPARE(errors.at(0).description(), expectedError); +} + +void tst_qdeclarativemoduleplugin::importPluginWithQmlFile() +{ + QString path = QLatin1String(SRCDIR) + QDir::separator() + QLatin1String("imports"); + + // QTBUG-16885: adding an import path with a lower-case "c:" causes assert failure + // (this only happens if the plugin includes pure QML files) + #ifdef Q_OS_WIN + QVERIFY(path.at(0).isUpper() && path.at(1) == QLatin1Char(':')); + path = path.at(0).toLower() + path.mid(1); + #endif + + QDeclarativeEngine engine; + engine.addImportPath(path); + + QDeclarativeComponent component(&engine, TEST_FILE("data/pluginWithQmlFile.qml")); + foreach (QDeclarativeError err, component.errors()) + qWarning() << err; + VERIFY_ERRORS(0); + QObject *object = component.create(); + QVERIFY(object != 0); + delete object; +} + +void tst_qdeclarativemoduleplugin::remoteImportWithQuotedUrl() +{ + TestHTTPServer server(SERVER_PORT); + QVERIFY(server.isValid()); + server.serveDirectory(SRCDIR "/imports"); + + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine); + component.setData("import \"http://127.0.0.1:14450/com/nokia/PureQmlModule\" \nComponentA { width: 300; ComponentB{} }", QUrl()); + + QTRY_COMPARE(component.status(), QDeclarativeComponent::Ready); + QObject *object = component.create(); + QCOMPARE(object->property("width").toInt(), 300); + QVERIFY(object != 0); + delete object; + + foreach (QDeclarativeError err, component.errors()) + qWarning() << err; + VERIFY_ERRORS(0); +} + +void tst_qdeclarativemoduleplugin::remoteImportWithUnquotedUri() +{ + TestHTTPServer server(SERVER_PORT); + QVERIFY(server.isValid()); + server.serveDirectory(SRCDIR "/imports"); + + QDeclarativeEngine engine; + engine.addImportPath(QLatin1String(SRCDIR) + QDir::separator() + QLatin1String("imports")); + QDeclarativeComponent component(&engine); + component.setData("import com.nokia.PureQmlModule 1.0 \nComponentA { width: 300; ComponentB{} }", QUrl()); + + + QTRY_COMPARE(component.status(), QDeclarativeComponent::Ready); + QObject *object = component.create(); + QVERIFY(object != 0); + QCOMPARE(object->property("width").toInt(), 300); + delete object; + + foreach (QDeclarativeError err, component.errors()) + qWarning() << err; + VERIFY_ERRORS(0); +} + +// QTBUG-17324 +void tst_qdeclarativemoduleplugin::importsMixedQmlCppPlugin() +{ + QDeclarativeEngine engine; + engine.addImportPath(QLatin1String(SRCDIR) + QDir::separator() + QLatin1String("imports")); + + { + QDeclarativeComponent component(&engine, TEST_FILE("data/importsMixedQmlCppPlugin.qml")); + + QObject *o = component.create(); + QVERIFY(o != 0); + QCOMPARE(o->property("test").toBool(), true); + delete o; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("data/importsMixedQmlCppPlugin.2.qml")); + + QObject *o = component.create(); + QVERIFY(o != 0); + QCOMPARE(o->property("test").toBool(), true); + QCOMPARE(o->property("test2").toBool(), true); + delete o; + } + + +} + +void tst_qdeclarativemoduleplugin::versionNotInstalled_data() +{ + QTest::addColumn("file"); + QTest::addColumn("errorFile"); + + QTest::newRow("versionNotInstalled") << "data/versionNotInstalled.qml" << "versionNotInstalled.errors.txt"; + QTest::newRow("versionNotInstalled") << "data/versionNotInstalled.2.qml" << "versionNotInstalled.2.errors.txt"; +} + +void tst_qdeclarativemoduleplugin::versionNotInstalled() +{ + QFETCH(QString, file); + QFETCH(QString, errorFile); + + QDeclarativeEngine engine; + engine.addImportPath(QLatin1String(SRCDIR) + QDir::separator() + QLatin1String("imports")); + + QDeclarativeComponent component(&engine, TEST_FILE(file)); + VERIFY_ERRORS(errorFile.toLatin1().constData()); +} + +void tst_qdeclarativemoduleplugin::importPath() +{ +#ifndef Q_OS_SYMBIAN + QSKIP("Import path order testing for Symbian only", SkipAll); +#else + QDeclarativeEngine engine; + QStringList imports = engine.importPathList(); + QString installImportsPath = QDir::cleanPath(QLibraryInfo::location(QLibraryInfo::ImportsPath)); + QString driveOrder(QLatin1String("ZABCDEFGHIJKLMNOPQRSTUVWXY")); + int lastOrder = 30; + foreach(QString import, imports) + { + if (import.endsWith(installImportsPath)) + { + int order = driveOrder.indexOf(import[0]); + QVERIFY(order < lastOrder); + lastOrder = order; + } + } + QVERIFY(lastOrder != 30); +#endif +} + +QTEST_MAIN(tst_qdeclarativemoduleplugin) + +#include "tst_qdeclarativemoduleplugin.moc" diff --git a/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.pro b/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.pro new file mode 100644 index 00000000..98cd4729 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemoduleplugin/tst_qdeclarativemoduleplugin.pro @@ -0,0 +1,15 @@ +load(qttest_p4) + +HEADERS = ../shared/testhttpserver.h +SOURCES = tst_qdeclarativemoduleplugin.cpp \ + ../shared/testhttpserver.cpp +QT += declarative network +CONFIG -= app_bundle + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} diff --git a/tests/auto/declarative/qdeclarativemousearea/data/clickandhold.qml b/tests/auto/declarative/qdeclarativemousearea/data/clickandhold.qml new file mode 100644 index 00000000..a6409e2e --- /dev/null +++ b/tests/auto/declarative/qdeclarativemousearea/data/clickandhold.qml @@ -0,0 +1,13 @@ +import QtQuick 1.0 + +Item { + id: root + property bool clicked: false + property bool held: false + + MouseArea { + width: 200; height: 200 + onClicked: { root.clicked = true } + onPressAndHold: { root.held = true } + } +} diff --git a/tests/auto/declarative/qdeclarativemousearea/data/clicktwice.qml b/tests/auto/declarative/qdeclarativemousearea/data/clicktwice.qml new file mode 100644 index 00000000..c6b1f899 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemousearea/data/clicktwice.qml @@ -0,0 +1,16 @@ +import QtQuick 1.0 + +Item { + id: root + property int clicked: 0 + property int pressed: 0 + property int released: 0 + + MouseArea { + width: 200; height: 200 + onPressed: { root.pressed++ } + onClicked: { root.clicked++ } + onReleased: { root.released++ } + } +} + diff --git a/tests/auto/declarative/qdeclarativemousearea/data/doubleclick.qml b/tests/auto/declarative/qdeclarativemousearea/data/doubleclick.qml new file mode 100644 index 00000000..55b0812e --- /dev/null +++ b/tests/auto/declarative/qdeclarativemousearea/data/doubleclick.qml @@ -0,0 +1,16 @@ +import QtQuick 1.0 + +Item { + id: root + property int clicked: 0 + property int doubleClicked: 0 + property int released: 0 + + MouseArea { + width: 200; height: 200 + onClicked: { root.clicked++ } + onDoubleClicked: { root.doubleClicked++ } + onReleased: { root.released++ } + } +} + diff --git a/tests/auto/declarative/qdeclarativemousearea/data/dragging.qml b/tests/auto/declarative/qdeclarativemousearea/data/dragging.qml new file mode 100644 index 00000000..dd89efb5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemousearea/data/dragging.qml @@ -0,0 +1,28 @@ +import QtQuick 1.0 +Rectangle { + id: whiteRect + width: 200 + height: 200 + color: "white" + Rectangle { + id: blackRect + objectName: "blackrect" + color: "black" + y: 50 + x: 50 + width: 100 + height: 100 + opacity: (whiteRect.width-blackRect.x+whiteRect.height-blackRect.y-199)/200 + Text { text: blackRect.opacity} + MouseArea { + objectName: "mouseregion" + anchors.fill: parent + drag.target: blackRect + drag.axis: Drag.XandYAxis + drag.minimumX: 0 + drag.maximumX: whiteRect.width-blackRect.width + drag.minimumY: 0 + drag.maximumY: whiteRect.height-blackRect.height + } + } + } diff --git a/tests/auto/declarative/qdeclarativemousearea/data/dragproperties.qml b/tests/auto/declarative/qdeclarativemousearea/data/dragproperties.qml new file mode 100644 index 00000000..7baefd5d --- /dev/null +++ b/tests/auto/declarative/qdeclarativemousearea/data/dragproperties.qml @@ -0,0 +1,28 @@ +import QtQuick 1.0 +Rectangle { + id: whiteRect + width: 200 + height: 200 + color: "white" + Rectangle { + id: blackRect + objectName: "blackrect" + color: "black" + y: 50 + x: 50 + width: 100 + height: 100 + opacity: (whiteRect.width-blackRect.x+whiteRect.height-blackRect.y-199)/200 + Text { text: blackRect.opacity} + MouseArea { + objectName: "mouseregion" + anchors.fill: parent + drag.target: blackRect + drag.axis: Drag.XandYAxis + drag.minimumX: 0 + drag.maximumX: whiteRect.width-blackRect.width + drag.minimumY: 0 + drag.maximumY: whiteRect.height-blackRect.height + } + } + } diff --git a/tests/auto/declarative/qdeclarativemousearea/data/dragreset.qml b/tests/auto/declarative/qdeclarativemousearea/data/dragreset.qml new file mode 100644 index 00000000..c6d2e204 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemousearea/data/dragreset.qml @@ -0,0 +1,28 @@ +import QtQuick 1.0 +Rectangle { + id: whiteRect + width: 200 + height: 200 + color: "white" + Rectangle { + id: blackRect + objectName: "blackrect" + color: "black" + y: 50 + x: 50 + width: 100 + height: 100 + opacity: (whiteRect.width-blackRect.x+whiteRect.height-blackRect.y-199)/200 + Text { text: blackRect.opacity} + MouseArea { + objectName: "mouseregion" + anchors.fill: parent + drag.target: haveTarget ? blackRect : undefined + drag.axis: Drag.XandYAxis + drag.minimumX: 0 + drag.maximumX: whiteRect.width-blackRect.width + drag.minimumY: 0 + drag.maximumY: whiteRect.height-blackRect.height + } + } + } diff --git a/tests/auto/declarative/qdeclarativemousearea/data/pressedOrdering.qml b/tests/auto/declarative/qdeclarativemousearea/data/pressedOrdering.qml new file mode 100644 index 00000000..4a80e834 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemousearea/data/pressedOrdering.qml @@ -0,0 +1,28 @@ +import QtQuick 1.0 + +Item { + id: root + property string value: "base" + + MouseArea { + id: mouseArea + width: 200; height: 200 + onClicked: toggleState.state = "toggled" + } + + StateGroup { + states: State { + name: "pressed" + when: mouseArea.pressed + PropertyChanges { target: root; value: "pressed" } + } + } + + StateGroup { + id: toggleState + states: State { + name: "toggled" + PropertyChanges { target: root; value: "toggled" } + } + } +} diff --git a/tests/auto/declarative/qdeclarativemousearea/data/preventContextMenu.qml b/tests/auto/declarative/qdeclarativemousearea/data/preventContextMenu.qml new file mode 100644 index 00000000..dcbb5d76 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemousearea/data/preventContextMenu.qml @@ -0,0 +1,22 @@ +import QtQuick 1.1 +import Test 1.0 + +Item { + width: 200 + height: 200 + + property alias mouseAreaEnabled: mouseArea.enabled + property alias eventsReceived: receiver.eventCount + + ContextMenuEventReceiver { + id: receiver + anchors.fill: parent + } + + MouseArea { + id: mouseArea + anchors.fill: parent + acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton + enabled: true + } +} diff --git a/tests/auto/declarative/qdeclarativemousearea/data/preventstealing.qml b/tests/auto/declarative/qdeclarativemousearea/data/preventstealing.qml new file mode 100644 index 00000000..11553fad --- /dev/null +++ b/tests/auto/declarative/qdeclarativemousearea/data/preventstealing.qml @@ -0,0 +1,24 @@ +import QtQuick 1.1 + +Flickable { + property bool stealing: true + width: 200 + height: 200 + contentWidth: 400 + contentHeight: 400 + Rectangle { + color: "black" + width: 400 + height: 400 + Rectangle { + x: 50; y: 50 + width: 100; height: 100 + color: "steelblue" + MouseArea { + objectName: "mousearea" + anchors.fill: parent + preventStealing: stealing + } + } + } +} diff --git a/tests/auto/declarative/qdeclarativemousearea/data/rejectEvent.qml b/tests/auto/declarative/qdeclarativemousearea/data/rejectEvent.qml new file mode 100644 index 00000000..fc8292d7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemousearea/data/rejectEvent.qml @@ -0,0 +1,28 @@ +import QtQuick 1.0 + +Rectangle { + id: root + color: "#ffffff" + width: 320; height: 240 + property bool mr1_pressed: false + property bool mr1_released: false + property bool mr1_canceled: false + property bool mr2_pressed: false + property bool mr2_released: false + property bool mr2_canceled: false + + MouseArea { + id: mouseRegion1 + anchors.fill: parent + onPressed: { root.mr1_pressed = true } + onReleased: { root.mr1_released = true } + onCanceled: { root.mr1_canceled = true } + } + MouseArea { + id: mouseRegion2 + width: 120; height: 120 + onPressed: { root.mr2_pressed = true; mouse.accepted = false } + onReleased: { root.mr2_released = true } + onCanceled: { root.mr2_canceled = true } + } +} diff --git a/tests/auto/declarative/qdeclarativemousearea/data/updateMousePosOnClick.qml b/tests/auto/declarative/qdeclarativemousearea/data/updateMousePosOnClick.qml new file mode 100644 index 00000000..b77f7431 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemousearea/data/updateMousePosOnClick.qml @@ -0,0 +1,20 @@ +import QtQuick 1.0 + +Rectangle { + color: "#ffffff" + width: 320; height: 240 + MouseArea { + id: mouseRegion + objectName: "mouseregion" + anchors.fill: parent + Rectangle { + id: ball + objectName: "ball" + width: 20; height: 20 + radius: 10 + color: "#0000ff" + x: { mouseRegion.mouseX } + y: mouseRegion.mouseY + } + } +} diff --git a/tests/auto/declarative/qdeclarativemousearea/data/updateMousePosOnResize.qml b/tests/auto/declarative/qdeclarativemousearea/data/updateMousePosOnResize.qml new file mode 100644 index 00000000..6571d8b1 --- /dev/null +++ b/tests/auto/declarative/qdeclarativemousearea/data/updateMousePosOnResize.qml @@ -0,0 +1,38 @@ +import QtQuick 1.0 + +Rectangle { + color: "#ffffff" + width: 320; height: 240 + Rectangle { + id: brother + objectName: "brother" + color: "lightgreen" + x: 200; y: 100 + width: 120; height: 120 + } + MouseArea { + id: mouseRegion + objectName: "mouseregion" + + property int x1 + property int y1 + property int x2 + property int y2 + property bool emitPositionChanged: false + property bool mouseMatchesPos: true + + anchors.fill: brother + onPressed: { + if (mouse.x != mouseX || mouse.y != mouseY) + mouseMatchesPos = false + x1 = mouseX; y1 = mouseY + anchors.fill = parent + } + onPositionChanged: { emitPositionChanged = true } + onMousePositionChanged: { + if (mouse.x != mouseX || mouse.y != mouseY) + mouseMatchesPos = false + x2 = mouseX; y2 = mouseY + } + } +} diff --git a/tests/auto/declarative/qdeclarativemousearea/qdeclarativemousearea.pro b/tests/auto/declarative/qdeclarativemousearea/qdeclarativemousearea.pro new file mode 100644 index 00000000..ed9313fe --- /dev/null +++ b/tests/auto/declarative/qdeclarativemousearea/qdeclarativemousearea.pro @@ -0,0 +1,17 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative gui network +macx:CONFIG -= app_bundle + +HEADERS += ../shared/testhttpserver.h +SOURCES += tst_qdeclarativemousearea.cpp ../shared/testhttpserver.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativemousearea/tst_qdeclarativemousearea.cpp b/tests/auto/declarative/qdeclarativemousearea/tst_qdeclarativemousearea.cpp new file mode 100644 index 00000000..078fa12c --- /dev/null +++ b/tests/auto/declarative/qdeclarativemousearea/tst_qdeclarativemousearea.cpp @@ -0,0 +1,705 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_QDeclarativeMouseArea: public QObject +{ + Q_OBJECT +private slots: + void dragProperties(); + void resetDrag(); + void dragging(); + void updateMouseAreaPosOnClick(); + void updateMouseAreaPosOnResize(); + void noOnClickedWithPressAndHold(); + void onMousePressRejected(); + void doubleClick(); + void clickTwice(); + void pressedOrdering(); + void preventStealing(); + void testQtQuick11Attributes(); + void testQtQuick11Attributes_data(); +#ifndef QT_NO_CONTEXTMENU + void preventContextMenu(); +#endif // QT_NO_CONTEXTMENU + +private: + QDeclarativeView *createView(); +}; + +void tst_QDeclarativeMouseArea::dragProperties() +{ + QDeclarativeView *canvas = createView(); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/dragproperties.qml")); + canvas->show(); + canvas->setFocus(); + QVERIFY(canvas->rootObject() != 0); + + QDeclarativeMouseArea *mouseRegion = canvas->rootObject()->findChild("mouseregion"); + QDeclarativeDrag *drag = mouseRegion->drag(); + QVERIFY(mouseRegion != 0); + QVERIFY(drag != 0); + + // target + QDeclarativeItem *blackRect = canvas->rootObject()->findChild("blackrect"); + QVERIFY(blackRect != 0); + QVERIFY(blackRect == drag->target()); + QDeclarativeItem *rootItem = qobject_cast(canvas->rootObject()); + QVERIFY(rootItem != 0); + QSignalSpy targetSpy(drag, SIGNAL(targetChanged())); + drag->setTarget(rootItem); + QCOMPARE(targetSpy.count(),1); + drag->setTarget(rootItem); + QCOMPARE(targetSpy.count(),1); + + // axis + QCOMPARE(drag->axis(), QDeclarativeDrag::XandYAxis); + QSignalSpy axisSpy(drag, SIGNAL(axisChanged())); + drag->setAxis(QDeclarativeDrag::XAxis); + QCOMPARE(drag->axis(), QDeclarativeDrag::XAxis); + QCOMPARE(axisSpy.count(),1); + drag->setAxis(QDeclarativeDrag::XAxis); + QCOMPARE(axisSpy.count(),1); + + // minimum and maximum properties + QSignalSpy xminSpy(drag, SIGNAL(minimumXChanged())); + QSignalSpy xmaxSpy(drag, SIGNAL(maximumXChanged())); + QSignalSpy yminSpy(drag, SIGNAL(minimumYChanged())); + QSignalSpy ymaxSpy(drag, SIGNAL(maximumYChanged())); + + QCOMPARE(drag->xmin(), 0.0); + QCOMPARE(drag->xmax(), rootItem->width()-blackRect->width()); + QCOMPARE(drag->ymin(), 0.0); + QCOMPARE(drag->ymax(), rootItem->height()-blackRect->height()); + + drag->setXmin(10); + drag->setXmax(10); + drag->setYmin(10); + drag->setYmax(10); + + QCOMPARE(drag->xmin(), 10.0); + QCOMPARE(drag->xmax(), 10.0); + QCOMPARE(drag->ymin(), 10.0); + QCOMPARE(drag->ymax(), 10.0); + + QCOMPARE(xminSpy.count(),1); + QCOMPARE(xmaxSpy.count(),1); + QCOMPARE(yminSpy.count(),1); + QCOMPARE(ymaxSpy.count(),1); + + drag->setXmin(10); + drag->setXmax(10); + drag->setYmin(10); + drag->setYmax(10); + + QCOMPARE(xminSpy.count(),1); + QCOMPARE(xmaxSpy.count(),1); + QCOMPARE(yminSpy.count(),1); + QCOMPARE(ymaxSpy.count(),1); + + // filterChildren + QSignalSpy filterChildrenSpy(drag, SIGNAL(filterChildrenChanged())); + + drag->setFilterChildren(true); + + QVERIFY(drag->filterChildren()); + QCOMPARE(filterChildrenSpy.count(), 1); + + drag->setFilterChildren(true); + QCOMPARE(filterChildrenSpy.count(), 1); + + delete canvas; +} + +void tst_QDeclarativeMouseArea::resetDrag() +{ + QDeclarativeView *canvas = createView(); + + canvas->rootContext()->setContextProperty("haveTarget", QVariant(true)); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/dragreset.qml")); + canvas->show(); + canvas->setFocus(); + QVERIFY(canvas->rootObject() != 0); + + QDeclarativeMouseArea *mouseRegion = canvas->rootObject()->findChild("mouseregion"); + QDeclarativeDrag *drag = mouseRegion->drag(); + QVERIFY(mouseRegion != 0); + QVERIFY(drag != 0); + + // target + QDeclarativeItem *blackRect = canvas->rootObject()->findChild("blackrect"); + QVERIFY(blackRect != 0); + QVERIFY(blackRect == drag->target()); + QDeclarativeItem *rootItem = qobject_cast(canvas->rootObject()); + QVERIFY(rootItem != 0); + QSignalSpy targetSpy(drag, SIGNAL(targetChanged())); + QVERIFY(drag->target() != 0); + canvas->rootContext()->setContextProperty("haveTarget", QVariant(false)); + QCOMPARE(targetSpy.count(),1); + QVERIFY(drag->target() == 0); + + delete canvas; +} + + +void tst_QDeclarativeMouseArea::dragging() +{ + QDeclarativeView *canvas = createView(); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/dragging.qml")); + canvas->show(); + canvas->setFocus(); + QVERIFY(canvas->rootObject() != 0); + + QDeclarativeMouseArea *mouseRegion = canvas->rootObject()->findChild("mouseregion"); + QDeclarativeDrag *drag = mouseRegion->drag(); + QVERIFY(mouseRegion != 0); + QVERIFY(drag != 0); + + // target + QDeclarativeItem *blackRect = canvas->rootObject()->findChild("blackrect"); + QVERIFY(blackRect != 0); + QVERIFY(blackRect == drag->target()); + + QVERIFY(!drag->active()); + + QGraphicsScene *scene = canvas->scene(); + QGraphicsSceneMouseEvent pressEvent(QEvent::GraphicsSceneMousePress); + pressEvent.setScenePos(QPointF(100, 100)); + pressEvent.setButton(Qt::LeftButton); + pressEvent.setButtons(Qt::LeftButton); + QApplication::sendEvent(scene, &pressEvent); + + QVERIFY(!drag->active()); + QCOMPARE(blackRect->x(), 50.0); + QCOMPARE(blackRect->y(), 50.0); + + // First move event triggers drag, second is acted upon. + // This is due to possibility of higher stacked area taking precedence. + QGraphicsSceneMouseEvent moveEvent(QEvent::GraphicsSceneMouseMove); + moveEvent.setScenePos(QPointF(106, 106)); + moveEvent.setButton(Qt::LeftButton); + moveEvent.setButtons(Qt::LeftButton); + QApplication::sendEvent(scene, &moveEvent); + + moveEvent.setScenePos(QPointF(110, 110)); + moveEvent.setButton(Qt::LeftButton); + moveEvent.setButtons(Qt::LeftButton); + QApplication::sendEvent(scene, &moveEvent); + + QVERIFY(drag->active()); + QCOMPARE(blackRect->x(), 60.0); + QCOMPARE(blackRect->y(), 60.0); + + QGraphicsSceneMouseEvent releaseEvent(QEvent::GraphicsSceneMouseRelease); + releaseEvent.setScenePos(QPointF(110, 110)); + releaseEvent.setButton(Qt::LeftButton); + releaseEvent.setButtons(Qt::LeftButton); + QApplication::sendEvent(scene, &releaseEvent); + + QVERIFY(!drag->active()); + QCOMPARE(blackRect->x(), 60.0); + QCOMPARE(blackRect->y(), 60.0); + + delete canvas; +} + +QDeclarativeView *tst_QDeclarativeMouseArea::createView() +{ + QDeclarativeView *canvas = new QDeclarativeView(0); + canvas->setFixedSize(240,320); + + return canvas; +} + +void tst_QDeclarativeMouseArea::updateMouseAreaPosOnClick() +{ + QDeclarativeView *canvas = createView(); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/updateMousePosOnClick.qml")); + canvas->show(); + canvas->setFocus(); + QVERIFY(canvas->rootObject() != 0); + + QDeclarativeMouseArea *mouseRegion = canvas->rootObject()->findChild("mouseregion"); + QVERIFY(mouseRegion != 0); + + QDeclarativeRectangle *rect = canvas->rootObject()->findChild("ball"); + QVERIFY(rect != 0); + + QCOMPARE(mouseRegion->mouseX(), rect->x()); + QCOMPARE(mouseRegion->mouseY(), rect->y()); + + QGraphicsScene *scene = canvas->scene(); + QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMousePress); + event.setScenePos(QPointF(100, 100)); + event.setButton(Qt::LeftButton); + event.setButtons(Qt::LeftButton); + QApplication::sendEvent(scene, &event); + + QCOMPARE(mouseRegion->mouseX(), 100.0); + QCOMPARE(mouseRegion->mouseY(), 100.0); + + QCOMPARE(mouseRegion->mouseX(), rect->x()); + QCOMPARE(mouseRegion->mouseY(), rect->y()); + + delete canvas; +} + +void tst_QDeclarativeMouseArea::updateMouseAreaPosOnResize() +{ + QDeclarativeView *canvas = createView(); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/updateMousePosOnResize.qml")); + canvas->show(); + canvas->setFocus(); + QVERIFY(canvas->rootObject() != 0); + + QDeclarativeMouseArea *mouseRegion = canvas->rootObject()->findChild("mouseregion"); + QVERIFY(mouseRegion != 0); + + QDeclarativeRectangle *rect = canvas->rootObject()->findChild("brother"); + QVERIFY(rect != 0); + + QCOMPARE(mouseRegion->mouseX(), 0.0); + QCOMPARE(mouseRegion->mouseY(), 0.0); + + QGraphicsScene *scene = canvas->scene(); + QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMousePress); + event.setScenePos(rect->pos()); + event.setButton(Qt::LeftButton); + event.setButtons(Qt::LeftButton); + QApplication::sendEvent(scene, &event); + + QVERIFY(!mouseRegion->property("emitPositionChanged").toBool()); + QVERIFY(mouseRegion->property("mouseMatchesPos").toBool()); + + QCOMPARE(mouseRegion->property("x1").toInt(), 0); + QCOMPARE(mouseRegion->property("y1").toInt(), 0); + + // XXX: is it on purpose that mouseX is real and mouse.x is int? + QCOMPARE(mouseRegion->property("x2").toInt(), (int) rect->x()); + QCOMPARE(mouseRegion->property("y2").toInt(), (int) rect->y()); + + QCOMPARE(mouseRegion->mouseX(), rect->x()); + QCOMPARE(mouseRegion->mouseY(), rect->y()); + + delete canvas; +} + +void tst_QDeclarativeMouseArea::noOnClickedWithPressAndHold() +{ + QDeclarativeView *canvas = createView(); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/clickandhold.qml")); + canvas->show(); + canvas->setFocus(); + QVERIFY(canvas->rootObject() != 0); + + QGraphicsScene *scene = canvas->scene(); + QGraphicsSceneMouseEvent pressEvent(QEvent::GraphicsSceneMousePress); + pressEvent.setScenePos(QPointF(100, 100)); + pressEvent.setButton(Qt::LeftButton); + pressEvent.setButtons(Qt::LeftButton); + QApplication::sendEvent(scene, &pressEvent); + + QVERIFY(!canvas->rootObject()->property("clicked").toBool()); + QVERIFY(!canvas->rootObject()->property("held").toBool()); + + QTest::qWait(1000); + + QGraphicsSceneMouseEvent releaseEvent(QEvent::GraphicsSceneMouseRelease); + releaseEvent.setScenePos(QPointF(100, 100)); + releaseEvent.setButton(Qt::LeftButton); + releaseEvent.setButtons(Qt::LeftButton); + QApplication::sendEvent(scene, &releaseEvent); + + QVERIFY(!canvas->rootObject()->property("clicked").toBool()); + QVERIFY(canvas->rootObject()->property("held").toBool()); + + delete canvas; +} + +void tst_QDeclarativeMouseArea::onMousePressRejected() +{ + QDeclarativeView *canvas = createView(); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/rejectEvent.qml")); + canvas->show(); + canvas->setFocus(); + QVERIFY(canvas->rootObject() != 0); + QVERIFY(canvas->rootObject()->property("enabled").toBool()); + + QVERIFY(!canvas->rootObject()->property("mr1_pressed").toBool()); + QVERIFY(!canvas->rootObject()->property("mr1_released").toBool()); + QVERIFY(!canvas->rootObject()->property("mr1_canceled").toBool()); + QVERIFY(!canvas->rootObject()->property("mr2_pressed").toBool()); + QVERIFY(!canvas->rootObject()->property("mr2_released").toBool()); + QVERIFY(!canvas->rootObject()->property("mr2_canceled").toBool()); + + QGraphicsScene *scene = canvas->scene(); + QGraphicsSceneMouseEvent pressEvent(QEvent::GraphicsSceneMousePress); + pressEvent.setScenePos(QPointF(100, 100)); + pressEvent.setButton(Qt::LeftButton); + pressEvent.setButtons(Qt::LeftButton); + QApplication::sendEvent(scene, &pressEvent); + + QVERIFY(canvas->rootObject()->property("mr1_pressed").toBool()); + QVERIFY(!canvas->rootObject()->property("mr1_released").toBool()); + QVERIFY(!canvas->rootObject()->property("mr1_canceled").toBool()); + QVERIFY(canvas->rootObject()->property("mr2_pressed").toBool()); + QVERIFY(!canvas->rootObject()->property("mr2_released").toBool()); + QVERIFY(canvas->rootObject()->property("mr2_canceled").toBool()); + + QTest::qWait(200); + + QGraphicsSceneMouseEvent releaseEvent(QEvent::GraphicsSceneMouseRelease); + releaseEvent.setScenePos(QPointF(100, 100)); + releaseEvent.setButton(Qt::LeftButton); + releaseEvent.setButtons(Qt::LeftButton); + QApplication::sendEvent(scene, &releaseEvent); + + QVERIFY(canvas->rootObject()->property("mr1_released").toBool()); + QVERIFY(!canvas->rootObject()->property("mr1_canceled").toBool()); + QVERIFY(!canvas->rootObject()->property("mr2_released").toBool()); + + delete canvas; +} + +void tst_QDeclarativeMouseArea::doubleClick() +{ + QDeclarativeView *canvas = createView(); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/doubleclick.qml")); + canvas->show(); + canvas->setFocus(); + QVERIFY(canvas->rootObject() != 0); + + QGraphicsScene *scene = canvas->scene(); + QGraphicsSceneMouseEvent pressEvent(QEvent::GraphicsSceneMousePress); + pressEvent.setScenePos(QPointF(100, 100)); + pressEvent.setButton(Qt::LeftButton); + pressEvent.setButtons(Qt::LeftButton); + QApplication::sendEvent(scene, &pressEvent); + + QGraphicsSceneMouseEvent releaseEvent(QEvent::GraphicsSceneMouseRelease); + releaseEvent.setScenePos(QPointF(100, 100)); + releaseEvent.setButton(Qt::LeftButton); + releaseEvent.setButtons(Qt::LeftButton); + QApplication::sendEvent(scene, &releaseEvent); + + QCOMPARE(canvas->rootObject()->property("released").toInt(), 1); + + QGraphicsSceneMouseEvent dblClickEvent(QEvent::GraphicsSceneMouseDoubleClick); + dblClickEvent.setScenePos(QPointF(100, 100)); + dblClickEvent.setButton(Qt::LeftButton); + dblClickEvent.setButtons(Qt::LeftButton); + QApplication::sendEvent(scene, &dblClickEvent); + + QApplication::sendEvent(scene, &releaseEvent); + + QCOMPARE(canvas->rootObject()->property("clicked").toInt(), 1); + QCOMPARE(canvas->rootObject()->property("doubleClicked").toInt(), 1); + QCOMPARE(canvas->rootObject()->property("released").toInt(), 2); + + delete canvas; +} + +// QTBUG-14832 +void tst_QDeclarativeMouseArea::clickTwice() +{ + QDeclarativeView *canvas = createView(); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/clicktwice.qml")); + canvas->show(); + canvas->setFocus(); + QVERIFY(canvas->rootObject() != 0); + + QGraphicsScene *scene = canvas->scene(); + QGraphicsSceneMouseEvent pressEvent(QEvent::GraphicsSceneMousePress); + pressEvent.setScenePos(QPointF(100, 100)); + pressEvent.setButton(Qt::LeftButton); + pressEvent.setButtons(Qt::LeftButton); + QApplication::sendEvent(scene, &pressEvent); + + QGraphicsSceneMouseEvent releaseEvent(QEvent::GraphicsSceneMouseRelease); + releaseEvent.setScenePos(QPointF(100, 100)); + releaseEvent.setButton(Qt::LeftButton); + releaseEvent.setButtons(Qt::LeftButton); + QApplication::sendEvent(scene, &releaseEvent); + + QCOMPARE(canvas->rootObject()->property("pressed").toInt(), 1); + QCOMPARE(canvas->rootObject()->property("released").toInt(), 1); + QCOMPARE(canvas->rootObject()->property("clicked").toInt(), 1); + + QGraphicsSceneMouseEvent dblClickEvent(QEvent::GraphicsSceneMouseDoubleClick); + dblClickEvent.setScenePos(QPointF(100, 100)); + dblClickEvent.setButton(Qt::LeftButton); + dblClickEvent.setButtons(Qt::LeftButton); + QApplication::sendEvent(scene, &dblClickEvent); + + QApplication::sendEvent(scene, &pressEvent); + QApplication::sendEvent(scene, &releaseEvent); + + QCOMPARE(canvas->rootObject()->property("pressed").toInt(), 2); + QCOMPARE(canvas->rootObject()->property("released").toInt(), 2); + QCOMPARE(canvas->rootObject()->property("clicked").toInt(), 2); + + delete canvas; +} + +void tst_QDeclarativeMouseArea::pressedOrdering() +{ + QDeclarativeView *canvas = createView(); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/pressedOrdering.qml")); + canvas->show(); + canvas->setFocus(); + QVERIFY(canvas->rootObject() != 0); + + QCOMPARE(canvas->rootObject()->property("value").toString(), QLatin1String("base")); + + QGraphicsScene *scene = canvas->scene(); + QGraphicsSceneMouseEvent pressEvent(QEvent::GraphicsSceneMousePress); + pressEvent.setScenePos(QPointF(100, 100)); + pressEvent.setButton(Qt::LeftButton); + pressEvent.setButtons(Qt::LeftButton); + QApplication::sendEvent(scene, &pressEvent); + + QCOMPARE(canvas->rootObject()->property("value").toString(), QLatin1String("pressed")); + + QGraphicsSceneMouseEvent releaseEvent(QEvent::GraphicsSceneMouseRelease); + releaseEvent.setScenePos(QPointF(100, 100)); + releaseEvent.setButton(Qt::LeftButton); + releaseEvent.setButtons(Qt::LeftButton); + QApplication::sendEvent(scene, &releaseEvent); + + QCOMPARE(canvas->rootObject()->property("value").toString(), QLatin1String("toggled")); + + QApplication::sendEvent(scene, &pressEvent); + + QCOMPARE(canvas->rootObject()->property("value").toString(), QLatin1String("pressed")); + + delete canvas; +} + +void tst_QDeclarativeMouseArea::preventStealing() +{ + QDeclarativeView *canvas = createView(); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/preventstealing.qml")); + canvas->show(); + canvas->setFocus(); + QVERIFY(canvas->rootObject() != 0); + + QDeclarativeFlickable *flickable = qobject_cast(canvas->rootObject()); + QVERIFY(flickable != 0); + + QDeclarativeMouseArea *mouseArea = canvas->rootObject()->findChild("mousearea"); + QVERIFY(mouseArea != 0); + + QSignalSpy mousePositionSpy(mouseArea, SIGNAL(positionChanged(QDeclarativeMouseEvent*))); + + QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(80, 80))); + + // Without preventStealing, mouse movement over MouseArea would + // cause the Flickable to steal mouse and trigger content movement. + QGraphicsScene *scene = canvas->scene(); + QGraphicsSceneMouseEvent moveEvent(QEvent::GraphicsSceneMouseMove); + moveEvent.setScenePos(QPointF(70, 70)); + moveEvent.setButton(Qt::LeftButton); + moveEvent.setButtons(Qt::LeftButton); + QApplication::sendEvent(scene, &moveEvent); + + moveEvent.setScenePos(QPointF(60, 60)); + moveEvent.setButton(Qt::LeftButton); + moveEvent.setButtons(Qt::LeftButton); + QApplication::sendEvent(scene, &moveEvent); + + moveEvent.setScenePos(QPointF(50, 50)); + moveEvent.setButton(Qt::LeftButton); + moveEvent.setButtons(Qt::LeftButton); + QApplication::sendEvent(scene, &moveEvent); + + // We should have received all three move events + QCOMPARE(mousePositionSpy.count(), 3); + QVERIFY(mouseArea->pressed()); + + // Flickable content should not have moved. + QCOMPARE(flickable->contentX(), 0.); + QCOMPARE(flickable->contentY(), 0.); + + QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(50, 50))); + + // Now allow stealing and confirm Flickable does its thing. + canvas->rootObject()->setProperty("stealing", false); + + QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(80, 80))); + + // Without preventStealing, mouse movement over MouseArea would + // cause the Flickable to steal mouse and trigger content movement. + moveEvent.setScenePos(QPointF(70, 70)); + QApplication::sendEvent(scene, &moveEvent); + + moveEvent.setScenePos(QPointF(60, 60)); + QApplication::sendEvent(scene, &moveEvent); + + moveEvent.setScenePos(QPointF(50, 50)); + QApplication::sendEvent(scene, &moveEvent); + + // We should only have received the first move event + QCOMPARE(mousePositionSpy.count(), 4); + // Our press should be taken away + QVERIFY(!mouseArea->pressed()); + + // Flickable content should have moved. + QCOMPARE(flickable->contentX(), 10.); + QCOMPARE(flickable->contentY(), 10.); + + QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(50, 50))); + + delete canvas; +} + +void tst_QDeclarativeMouseArea::testQtQuick11Attributes() +{ + QFETCH(QString, code); + QFETCH(QString, warning); + QFETCH(QString, error); + + QDeclarativeEngine engine; + QObject *obj; + + QDeclarativeComponent valid(&engine); + valid.setData("import QtQuick 1.1; MouseArea { " + code.toUtf8() + " }", QUrl("")); + obj = valid.create(); + QVERIFY(obj); + QVERIFY(valid.errorString().isEmpty()); + delete obj; + + QDeclarativeComponent invalid(&engine); + invalid.setData("import QtQuick 1.0; MouseArea { " + code.toUtf8() + " }", QUrl("")); + QTest::ignoreMessage(QtWarningMsg, warning.toUtf8()); + obj = invalid.create(); + QCOMPARE(invalid.errorString(), error); + delete obj; +} + +void tst_QDeclarativeMouseArea::testQtQuick11Attributes_data() +{ + QTest::addColumn("code"); + QTest::addColumn("warning"); + QTest::addColumn("error"); + + QTest::newRow("preventStealing") << "preventStealing: true" + << "QDeclarativeComponent: Component is not ready" + << ":1 \"MouseArea.preventStealing\" is not available in QtQuick 1.0.\n"; +} + +#ifndef QT_NO_CONTEXTMENU +class ContextMenuEventReceiver : public QDeclarativeItem +{ + Q_OBJECT + Q_PROPERTY(int eventCount READ eventCount NOTIFY eventCountChanged); +public: + ContextMenuEventReceiver(QDeclarativeItem *parent = 0) : QDeclarativeItem(parent), m_eventCount(0) { } + int eventCount() const { return m_eventCount; } +signals: + void eventCountChanged(int); +protected: + void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) { + if (event->reason() == QGraphicsSceneContextMenuEvent::Mouse) { + m_eventCount++; + emit eventCountChanged(m_eventCount); + } + } +private: + int m_eventCount; +}; + +void tst_QDeclarativeMouseArea::preventContextMenu() +{ + // A MouseArea accepting Left, Middle and Right buttons should prevent context menu + // events with "Mouse" reason to hit the Item below. + + qmlRegisterType("Test", 1, 0, "ContextMenuEventReceiver"); + + QDeclarativeView *view = createView(); + view->setSource(QUrl::fromLocalFile(SRCDIR "/data/preventContextMenu.qml")); + view->show(); + QVERIFY(view->rootObject() != 0); + + QDeclarativeProperty mouseAreaEnabled(view->rootObject(), "mouseAreaEnabled"); + QVERIFY(mouseAreaEnabled.read().toBool()); + + QDeclarativeProperty eventsReceived(view->rootObject(), "eventsReceived"); + QCOMPARE(eventsReceived.read().toInt(), 0); + + QPoint targetPoint = view->mapFromScene(QPoint(80, 80)); + + QContextMenuEvent fakeEvent1(QContextMenuEvent::Mouse, targetPoint); + QApplication::sendEvent(view->viewport(), &fakeEvent1); + QCOMPARE(eventsReceived.read().toInt(), 0); + + mouseAreaEnabled.write(false); + QVERIFY(!mouseAreaEnabled.read().toBool()); + QContextMenuEvent fakeEvent2(QContextMenuEvent::Mouse, targetPoint); + QApplication::sendEvent(view->viewport(), &fakeEvent2); + QCOMPARE(eventsReceived.read().toInt(), 1); + + mouseAreaEnabled.write(true); + QVERIFY(mouseAreaEnabled.read().toBool()); + QContextMenuEvent fakeEvent3(QContextMenuEvent::Mouse, targetPoint); + QApplication::sendEvent(view->viewport(), &fakeEvent3); + QCOMPARE(eventsReceived.read().toInt(), 1); +} +#endif // QT_NO_CONTEXTMENU + +QTEST_MAIN(tst_QDeclarativeMouseArea) + +#include "tst_qdeclarativemousearea.moc" diff --git a/tests/auto/declarative/qdeclarativeparticles/data/particle.png b/tests/auto/declarative/qdeclarativeparticles/data/particle.png new file mode 100644 index 00000000..defbde53 Binary files /dev/null and b/tests/auto/declarative/qdeclarativeparticles/data/particle.png differ diff --git a/tests/auto/declarative/qdeclarativeparticles/data/particlemotiontest.qml b/tests/auto/declarative/qdeclarativeparticles/data/particlemotiontest.qml new file mode 100644 index 00000000..dad97465 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeparticles/data/particlemotiontest.qml @@ -0,0 +1,35 @@ +import QtQuick 1.0 +import Qt.labs.particles 1.0 + +Rectangle { + width: 240 + height: 320 + color: "black" + Particles { + objectName: "particles" + anchors.fill: parent + width: 1 + height: 1 + source: "particle.png" + lifeSpan: 5000 + count: 200 + angle: 270 + angleDeviation: 45 + velocity: 50 + velocityDeviation: 30 + ParticleMotionGravity { + objectName: "motionGravity" + yattractor: 1000 + xattractor: 0 + acceleration: 25 + } + } + resources: [ + ParticleMotionWander { + objectName: "motionWander" + xvariance: 30 + yvariance: 30 + pace: 100 + } + ] +} diff --git a/tests/auto/declarative/qdeclarativeparticles/data/particlestest.qml b/tests/auto/declarative/qdeclarativeparticles/data/particlestest.qml new file mode 100644 index 00000000..c76fe9b8 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeparticles/data/particlestest.qml @@ -0,0 +1,17 @@ +import QtQuick 1.0 +import Qt.labs.particles 1.0 + +Rectangle{ + width: 100 + height: 100 + color: "black" + objectName: "rect" + Particles { id: particles + objectName: "particles" + width:1; height:1; anchors.centerIn: parent; opacity: 1 + lifeSpan: 100; lifeSpanDeviation: 20; count:1000; + fadeInDuration: 20; fadeOutDuration: 20; emissionRate: 1000 + angle: 0; angleDeviation: 360; velocity: 500; velocityDeviation:30 + source: "particle.png" + } +} diff --git a/tests/auto/declarative/qdeclarativeparticles/qdeclarativeparticles.pro b/tests/auto/declarative/qdeclarativeparticles/qdeclarativeparticles.pro new file mode 100644 index 00000000..2cf82683 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeparticles/qdeclarativeparticles.pro @@ -0,0 +1,16 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative gui +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativeparticles.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativeparticles/tst_qdeclarativeparticles.cpp b/tests/auto/declarative/qdeclarativeparticles/tst_qdeclarativeparticles.cpp new file mode 100644 index 00000000..7e98a7a8 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeparticles/tst_qdeclarativeparticles.cpp @@ -0,0 +1,219 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_QDeclarativeParticles : public QObject +{ + Q_OBJECT +public: + tst_QDeclarativeParticles(); + +private slots: + void properties(); + void motionGravity(); + void motionWander(); + void runs(); +private: + QDeclarativeView *createView(const QString &filename); + +}; + +tst_QDeclarativeParticles::tst_QDeclarativeParticles() +{ +} + +void tst_QDeclarativeParticles::properties() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/particlestest.qml"); + QVERIFY(canvas->rootObject()); + + QObject* particles = canvas->rootObject()->findChild("particles"); + QVERIFY(particles); + + particles->setProperty("source", QUrl::fromLocalFile(SRCDIR "/data/particle.png")); + QCOMPARE(particles->property("source").toUrl(), QUrl::fromLocalFile(SRCDIR "/data/particle.png")); + + particles->setProperty("lifeSpanDeviation", (1000)); + QCOMPARE(particles->property("lifeSpanDeviation").toInt(), 1000); + + particles->setProperty("fadeInDuration", 1000); + QCOMPARE(particles->property("fadeInDuration").toInt(), 1000); + + particles->setProperty("fadeOutDuration", 1000); + QCOMPARE(particles->property("fadeOutDuration").toInt(), 1000); + + particles->setProperty("angle", 100.0); + QCOMPARE(particles->property("angle").toDouble(), 100.0); + + particles->setProperty("angleDeviation", 100.0); + QCOMPARE(particles->property("angleDeviation").toDouble(), 100.0); + + particles->setProperty("velocity", 100.0); + QCOMPARE(particles->property("velocity").toDouble(), 100.0); + + particles->setProperty("velocityDeviation", 100.0); + QCOMPARE(particles->property("velocityDeviation").toDouble(), 100.0); + + particles->setProperty("emissionVariance", 0.5); + QCOMPARE(particles->property("emissionVariance").toDouble(),0.5); + + particles->setProperty("emissionRate", 12); + QCOMPARE(particles->property("emissionRate").toInt(), 12); +} + +void tst_QDeclarativeParticles::motionGravity() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/particlemotiontest.qml"); + QVERIFY(canvas->rootObject()); + + QObject* particles = canvas->rootObject()->findChild("particles"); + QVERIFY(particles); + + QObject* motionGravity = canvas->rootObject()->findChild("motionGravity"); + //QCOMPARE(qvariant_cast(particles->property("motion")), motionGravity); + + QSignalSpy xattractorSpy(motionGravity, SIGNAL(xattractorChanged())); + QSignalSpy yattractorSpy(motionGravity, SIGNAL(yattractorChanged())); + QSignalSpy accelerationSpy(motionGravity, SIGNAL(accelerationChanged())); + + QCOMPARE(motionGravity->property("xattractor").toDouble(), 0.0); + QCOMPARE(motionGravity->property("yattractor").toDouble(), 1000.0); + QCOMPARE(motionGravity->property("acceleration").toDouble(), 25.0); + + motionGravity->setProperty("xattractor", 20.0); + motionGravity->setProperty("yattractor", 10.0); + motionGravity->setProperty("acceleration", 10.0); + + QCOMPARE(motionGravity->property("xattractor").toDouble(), 20.0); + QCOMPARE(motionGravity->property("yattractor").toDouble(), 10.0); + QCOMPARE(motionGravity->property("acceleration").toDouble(), 10.0); + + QCOMPARE(xattractorSpy.count(), 1); + QCOMPARE(yattractorSpy.count(), 1); + QCOMPARE(accelerationSpy.count(), 1); + + motionGravity->setProperty("xattractor", 20.0); + motionGravity->setProperty("yattractor", 10.0); + motionGravity->setProperty("acceleration", 10.0); + + QCOMPARE(xattractorSpy.count(), 1); + QCOMPARE(yattractorSpy.count(), 1); + QCOMPARE(accelerationSpy.count(), 1); +} + +void tst_QDeclarativeParticles::motionWander() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/particlemotiontest.qml"); + QVERIFY(canvas->rootObject()); + + QObject* particles = canvas->rootObject()->findChild("particles"); + QVERIFY(particles); + + QSignalSpy motionSpy(particles, SIGNAL(motionChanged())); + QObject* motionWander = canvas->rootObject()->findChild("motionWander"); + + QCOMPARE(motionSpy.count(), 0); + particles->setProperty("motion", QVariant::fromValue(motionWander)); + //QCOMPARE(particles->property("motion"), QVariant::fromValue(motionWander)); + //QCOMPARE(motionSpy.count(), 1); + + particles->setProperty("motion", QVariant::fromValue(motionWander)); + //QCOMPARE(motionSpy.count(), 1); + + QSignalSpy xvarianceSpy(motionWander, SIGNAL(xvarianceChanged())); + QSignalSpy yvarianceSpy(motionWander, SIGNAL(yvarianceChanged())); + QSignalSpy paceSpy(motionWander, SIGNAL(paceChanged())); + + QCOMPARE(motionWander->property("xvariance").toDouble(), 30.0); + QCOMPARE(motionWander->property("yvariance").toDouble(), 30.0); + QCOMPARE(motionWander->property("pace").toDouble(), 100.0); + + motionWander->setProperty("xvariance", 20.0); + motionWander->setProperty("yvariance", 10.0); + motionWander->setProperty("pace", 10.0); + + QCOMPARE(motionWander->property("xvariance").toDouble(), 20.0); + QCOMPARE(motionWander->property("yvariance").toDouble(), 10.0); + QCOMPARE(motionWander->property("pace").toDouble(), 10.0); + + QCOMPARE(xvarianceSpy.count(), 1); + QCOMPARE(yvarianceSpy.count(), 1); + QCOMPARE(paceSpy.count(), 1); + + QCOMPARE(motionWander->property("xvariance").toDouble(), 20.0); + QCOMPARE(motionWander->property("yvariance").toDouble(), 10.0); + QCOMPARE(motionWander->property("pace").toDouble(), 10.0); + + QCOMPARE(xvarianceSpy.count(), 1); + QCOMPARE(yvarianceSpy.count(), 1); + QCOMPARE(paceSpy.count(), 1); +} + +void tst_QDeclarativeParticles::runs() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/particlestest.qml"); + QVERIFY(canvas->rootObject()); + + QObject* particles = canvas->rootObject()->findChild("particles"); + QVERIFY(particles); + QTest::qWait(1000);//Run for one second. Test passes if it doesn't crash. +} + +QDeclarativeView *tst_QDeclarativeParticles::createView(const QString &filename) +{ + QDeclarativeView *canvas = new QDeclarativeView(0); + canvas->setFixedSize(240,320); + + canvas->setSource(QUrl::fromLocalFile(filename)); + + return canvas; +} +QTEST_MAIN(tst_QDeclarativeParticles) + +#include "tst_qdeclarativeparticles.moc" diff --git a/tests/auto/declarative/qdeclarativepathview/data/closedPath.qml b/tests/auto/declarative/qdeclarativepathview/data/closedPath.qml new file mode 100644 index 00000000..08b0d2a2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativepathview/data/closedPath.qml @@ -0,0 +1,24 @@ +import QtQuick 1.0 + +Path { + startY: 120 + startX: 160 + PathQuad { + y: 120 + x: 80 + controlY: 330 + controlX: 100 + } + PathLine { + y: 160 + x: 20 + } + PathCubic { + y: 120 + x: 160 + control1Y: 0 + control1X: 100 + control2Y: 000 + control2X: 200 + } +} diff --git a/tests/auto/declarative/qdeclarativepathview/data/datamodel.qml b/tests/auto/declarative/qdeclarativepathview/data/datamodel.qml new file mode 100644 index 00000000..e2c4e3dd --- /dev/null +++ b/tests/auto/declarative/qdeclarativepathview/data/datamodel.qml @@ -0,0 +1,38 @@ +import QtQuick 1.0 + +PathView { + id: pathview + property int viewCount: count + objectName: "pathview" + width: 240; height: 320 + pathItemCount: testObject.pathItemCount + + function checkProperties() { + testObject.error = false; + if (testObject.useModel && pathview.model != testData) { + console.log("model property incorrect"); + testObject.error = true; + } + } + + model: testObject.useModel ? testData : 0 + + delegate: Component { + id: myDelegate + Rectangle { + id: wrapper + objectName: "wrapper" + property bool onPath: PathView.onPath + width: 20; height: 20; color: name + Text { + objectName: "myText" + text: name + } + } + } + + path: Path { + startX: 120; startY: 20; + PathLine { x: 120; y: 300 } + } +} diff --git a/tests/auto/declarative/qdeclarativepathview/data/displaypath.qml b/tests/auto/declarative/qdeclarativepathview/data/displaypath.qml new file mode 100644 index 00000000..88dfc57b --- /dev/null +++ b/tests/auto/declarative/qdeclarativepathview/data/displaypath.qml @@ -0,0 +1,59 @@ +import QtQuick 1.0 + +Rectangle { + width: 240 + height: 320 + color: "#ffffff" + resources: [ + Component { + id: delegate + Rectangle { + id: wrapper + objectName: "wrapper" + height: 20 + width: 60 + color: "white" + border.color: "black" + Text { + text: index + } + Text { + x: 20 + id: displayText + objectName: "displayText" + text: display + } + } + } + ] + PathView { + id: view + objectName: "view" + width: 240 + height: 320 + model: testModel + delegate: delegate + path: Path { + startY: 120 + startX: 160 + PathQuad { + y: 120 + x: 80 + controlY: 330 + controlX: 100 + } + PathLine { + y: 160 + x: 20 + } + PathCubic { + y: 120 + x: 160 + control1Y: 0 + control1X: 100 + control2Y: 000 + control2X: 200 + } + } + } +} diff --git a/tests/auto/declarative/qdeclarativepathview/data/dragpath.qml b/tests/auto/declarative/qdeclarativepathview/data/dragpath.qml new file mode 100644 index 00000000..0f948408 --- /dev/null +++ b/tests/auto/declarative/qdeclarativepathview/data/dragpath.qml @@ -0,0 +1,19 @@ +import QtQuick 1.0 + +PathView { + width: 400 + height: 200 + model: 100 + pathItemCount: 20 + path: Path { + startX: 0; startY: 100 + PathLine { x: 400; y: 100 } + } + delegate: Rectangle { objectName: "wrapper"; height: 100; width: 2; color: PathView.isCurrentItem?"red" : "black" } + dragMargin: 100 + preferredHighlightBegin: 0.5 + preferredHighlightEnd: 0.5 + Text { + text: "current index: " + parent.currentIndex + } +} diff --git a/tests/auto/declarative/qdeclarativepathview/data/emptymodel.qml b/tests/auto/declarative/qdeclarativepathview/data/emptymodel.qml new file mode 100644 index 00000000..4deb45fd --- /dev/null +++ b/tests/auto/declarative/qdeclarativepathview/data/emptymodel.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +PathView { + model: emptyModel +} diff --git a/tests/auto/declarative/qdeclarativepathview/data/openPath.qml b/tests/auto/declarative/qdeclarativepathview/data/openPath.qml new file mode 100644 index 00000000..328e3cde --- /dev/null +++ b/tests/auto/declarative/qdeclarativepathview/data/openPath.qml @@ -0,0 +1,10 @@ +import QtQuick 1.0 + +Path { + startY: 120 + startX: 160 + PathLine { + y: 160 + x: 20 + } +} diff --git a/tests/auto/declarative/qdeclarativepathview/data/pathUpdate.qml b/tests/auto/declarative/qdeclarativepathview/data/pathUpdate.qml new file mode 100644 index 00000000..0c2ac0ce --- /dev/null +++ b/tests/auto/declarative/qdeclarativepathview/data/pathUpdate.qml @@ -0,0 +1,18 @@ +import QtQuick 1.0 + +Rectangle { + width: 400 + height: 400 + + PathView { + id: view + objectName: "pathView" + anchors.fill: parent + model: 10 + delegate: Rectangle { objectName: "wrapper"; color: "green"; width: 100; height: 100 } + path: Path { + startX: view.width/2; startY: 0 + PathLine { x: view.width/2; y: view.height } + } + } +} diff --git a/tests/auto/declarative/qdeclarativepathview/data/pathUpdateOnStartChanged.qml b/tests/auto/declarative/qdeclarativepathview/data/pathUpdateOnStartChanged.qml new file mode 100644 index 00000000..bd732ab1 --- /dev/null +++ b/tests/auto/declarative/qdeclarativepathview/data/pathUpdateOnStartChanged.qml @@ -0,0 +1,38 @@ +import QtQuick 1.0 + +Rectangle { + width: 800 + height: 480 + color: "black" + resources: [ + ListModel { + id: appModel + ListElement { color: "green" } + }, + Component { + id: appDelegate + Rectangle { + id: wrapper + objectName: "wrapper" + color: "green" + width: 100 + height: 100 + } + } + ] + PathView { + id: pathView + objectName: "pathView" + model: appModel + anchors.fill: parent + + transformOrigin: "Top" + delegate: appDelegate + path: Path { + objectName: "path" + startX: pathView.width / 2 // startX: 400 <- this works as expected + startY: 300 + PathLine { x: 400; y: 120 } + } + } +} diff --git a/tests/auto/declarative/qdeclarativepathview/data/pathtest.qml b/tests/auto/declarative/qdeclarativepathview/data/pathtest.qml new file mode 100644 index 00000000..b13c0066 --- /dev/null +++ b/tests/auto/declarative/qdeclarativepathview/data/pathtest.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 + +Path { + startX: 120; startY: 100 + + PathAttribute { name: "scale"; value: 1.0 } + PathQuad { x: 120; y: 25; controlX: 260; controlY: 75 } + PathPercent { value: 0.3 } + PathLine { x: 120; y: 100 } + PathCubic { + x: 180; y: 0; control1X: -10; control1Y: 90 + control2X: 210; control2Y: 90 + } +} diff --git a/tests/auto/declarative/qdeclarativepathview/data/pathview0.qml b/tests/auto/declarative/qdeclarativepathview/data/pathview0.qml new file mode 100644 index 00000000..28b6fb9a --- /dev/null +++ b/tests/auto/declarative/qdeclarativepathview/data/pathview0.qml @@ -0,0 +1,84 @@ +import QtQuick 1.0 + +Rectangle { + id: root + property int count: view.count + property int currentA: -1 + property int currentB: -1 + property real delegateWidth: 60 + property real delegateHeight: 20 + property real delegateScale: 1.0 + width: 240 + height: 320 + color: "#ffffff" + resources: [ + Component { + id: delegate + Rectangle { + id: wrapper + objectName: "wrapper" + height: root.delegateHeight + width: root.delegateWidth + scale: root.delegateScale + color: PathView.isCurrentItem ? "lightsteelblue" : "white" + border.color: "black" + Text { + text: index + } + Text { + x: 20 + id: textName + objectName: "textName" + text: name + } + Text { + x: 40 + id: textNumber + objectName: "textNumber" + text: number + } + PathView.onCurrentItemChanged: { + if (PathView.isCurrentItem) { + root.currentA = index; + root.currentB = wrapper.PathView.view.currentIndex; + } + } + } + } + ] + PathView { + id: view + objectName: "view" + width: 240 + height: 320 + model: testModel + delegate: delegate + highlight: Rectangle { + width: 60 + height: 20 + color: "yellow" + } + path: Path { + startY: 120 + startX: 160 + PathQuad { + y: 120 + x: 80 + controlY: 330 + controlX: 100 + } + PathLine { + y: 160 + x: 20 + } + PathCubic { + y: 120 + x: 160 + control1Y: 0 + control1X: 100 + control2Y: 000 + control2X: 200 + } + } + } +} diff --git a/tests/auto/declarative/qdeclarativepathview/data/pathview1.qml b/tests/auto/declarative/qdeclarativepathview/data/pathview1.qml new file mode 100644 index 00000000..d1ac5171 --- /dev/null +++ b/tests/auto/declarative/qdeclarativepathview/data/pathview1.qml @@ -0,0 +1,4 @@ +import QtQuick 1.0 + +PathView { +} diff --git a/tests/auto/declarative/qdeclarativepathview/data/pathview2.qml b/tests/auto/declarative/qdeclarativepathview/data/pathview2.qml new file mode 100644 index 00000000..1e1e893a --- /dev/null +++ b/tests/auto/declarative/qdeclarativepathview/data/pathview2.qml @@ -0,0 +1,57 @@ +import QtQuick 1.0 + +PathView { + id: photoPathView + 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 } + } + + model: 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" } + } + + delegate: 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 + } + } + } +} diff --git a/tests/auto/declarative/qdeclarativepathview/data/pathview3.qml b/tests/auto/declarative/qdeclarativepathview/data/pathview3.qml new file mode 100644 index 00000000..cd1ba037 --- /dev/null +++ b/tests/auto/declarative/qdeclarativepathview/data/pathview3.qml @@ -0,0 +1,59 @@ +import QtQuick 1.0 + +PathView { + id: photoPathView + y: 100; width: 800; height: 330; pathItemCount: 4; offset: 1 + dragMargin: 24 + preferredHighlightBegin: 0.50 + preferredHighlightEnd: 0.50 + + 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 } + } + + model: 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" } + } + + delegate: Component { + id: photoDelegate + Rectangle { + id: wrapper + width: 85; height: 85; color: lColor + + transform: Rotation { + id: itemRotation; origin.x: wrapper.width/2; origin.y: wrapper.height/2 + axis.y: 1; axis.z: 0 + } + } + } +} diff --git a/tests/auto/declarative/qdeclarativepathview/data/pathview_package.qml b/tests/auto/declarative/qdeclarativepathview/data/pathview_package.qml new file mode 100644 index 00000000..f9157bdd --- /dev/null +++ b/tests/auto/declarative/qdeclarativepathview/data/pathview_package.qml @@ -0,0 +1,88 @@ +import QtQuick 1.0 + +Item { + width: 800; height: 600 + Component { + id: photoDelegate + Package { + Item { id: pathItem; objectName: "pathItem"; Package.name: 'path'; width: 85; height: 85; scale: pathItem.PathView.scale } + Item { id: linearItem; Package.name: 'linear'; width: 85; height: 85 } + Rectangle { + id: wrapper + width: 85; height: 85; color: lColor + + transform: Rotation { + id: itemRotation; origin.x: wrapper.width/2; origin.y: wrapper.height/2 + axis.y: 1; axis.z: 0 + } + state: 'path' + states: [ + State { + name: 'path' + ParentChange { target: wrapper; parent: pathItem; x: 0; y: 0 } + PropertyChanges { target: wrapper; opacity: pathItem.PathView.onPath ? 1.0 : 0 } + } + ] + } + } + } + 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" } + } + VisualDataModel { id: visualModel; model: rssModel; delegate: photoDelegate } + + PathView { + id: photoPathView + objectName: "photoPathView" + width: 800; height: 330; pathItemCount: 4; offset: 1 + dragMargin: 24 + preferredHighlightBegin: 0.50 + preferredHighlightEnd: 0.50 + + 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 } + } + + model: visualModel.parts.path + } + + PathView { + y: 400; width: 800; height: 330; pathItemCount: 8 + + path: Path { + startX: 0; startY: 40; + PathLine { x: 800; y: 40 } + } + + model: visualModel.parts.linear + } +} diff --git a/tests/auto/declarative/qdeclarativepathview/data/propertychanges.qml b/tests/auto/declarative/qdeclarativepathview/data/propertychanges.qml new file mode 100644 index 00000000..c0cc8555 --- /dev/null +++ b/tests/auto/declarative/qdeclarativepathview/data/propertychanges.qml @@ -0,0 +1,116 @@ +import QtQuick 1.0 + +Rectangle { + width: 350; height: 220; color: "white" + Component { + id: myDelegate + Item { + id: wrapper + width: 180; height: 40; + opacity: PathView.opacity + Column { + x: 5; y: 5 + Text { text: 'Name: ' + name } + Text { text: 'Number: ' + number } + } + } + } + + PathView { + preferredHighlightBegin: 0.1 + preferredHighlightEnd: 0.1 + dragMargin: 5.0 + id: pathView + objectName: "pathView" + anchors.fill: parent + model: listModel + delegate: myDelegate + focus: true + path: Path { + id: myPath + objectName: "path" + startX: 220; startY: 200 + PathAttribute { name: "opacity"; value: 1.0; objectName: "pathAttribute"; } + PathQuad { x: 220; y: 25; controlX: 260; controlY: 75 } + PathAttribute { name: "opacity"; value: 0.3 } + PathQuad { x: 220; y: 200; controlX: -20; controlY: 75 } + } + Timer { + interval: 2000; running: true; repeat: true + onTriggered: { + if (pathView.path == alternatePath) + pathView.path = myPath; + else + pathView.path = alternatePath; + } + } + } + + data:[ + ListModel { + id: listModel + ListElement { + name: "Bill Smith" + number: "555 3264" + } + ListElement { + name: "John Brown" + number: "555 8426" + } + ListElement { + name: "Sam Wise" + number: "555 0473" + } + ListElement { + name: "Bill Smith" + number: "555 3264" + } + ListElement { + name: "John Brown" + number: "555 8426" + } + ListElement { + name: "Sam Wise" + number: "555 0473" + } + ListElement { + name: "Bill Smith" + number: "555 3264" + } + ListElement { + name: "John Brown" + number: "555 8426" + } + ListElement { + name: "Sam Wise" + number: "555 0473" + } + }, + ListModel { + objectName: "alternateModel" + ListElement { + name: "Jack" + number: "555 8426" + } + ListElement { + name: "Mary" + number: "555 3264" + } + }, + Path { + id: alternatePath + objectName: "alternatePath" + startX: 100; startY: 40 + PathAttribute { name: "opacity"; value: 0.0 } + PathLine { x: 100; y: 160 } + PathAttribute { name: "opacity"; value: 0.2 } + PathLine { x: 300; y: 160 } + PathAttribute { name: "opacity"; value: 0.0 } + PathLine { x: 300; y: 40 } + PathAttribute { name: "opacity"; value: 0.2 } + PathLine { x: 100; y: 40 } + } + ] +} + + diff --git a/tests/auto/declarative/qdeclarativepathview/data/treemodel.qml b/tests/auto/declarative/qdeclarativepathview/data/treemodel.qml new file mode 100644 index 00000000..56f7ae46 --- /dev/null +++ b/tests/auto/declarative/qdeclarativepathview/data/treemodel.qml @@ -0,0 +1,19 @@ +import QtQuick 1.0 + +PathView { + width: 320 + height: 240 + function setRoot(index) { + vdm.rootIndex = vdm.modelIndex(index); + } + model: VisualDataModel { + id: vdm + model: myModel + delegate: Text { objectName: "wrapper"; text: display } + } + + path: Path { + startX: 0; startY: 120 + PathLine { x: 320; y: 120 } + } +} diff --git a/tests/auto/declarative/qdeclarativepathview/data/undefinedpath.qml b/tests/auto/declarative/qdeclarativepathview/data/undefinedpath.qml new file mode 100644 index 00000000..5a647cb0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativepathview/data/undefinedpath.qml @@ -0,0 +1,17 @@ +import QtQuick 1.0 + +PathView { + id: pathView + width: 240; height: 200 + path: Path { + startX: pathView.undef/2.0; startY: 0 + PathLine { x: pathView.undef/2.0; y: 0 } + } + + delegate: Text { text: value } + model: ListModel { + ListElement { value: "one" } + ListElement { value: "two" } + ListElement { value: "three" } + } +} diff --git a/tests/auto/declarative/qdeclarativepathview/data/vdm.qml b/tests/auto/declarative/qdeclarativepathview/data/vdm.qml new file mode 100644 index 00000000..012db3fb --- /dev/null +++ b/tests/auto/declarative/qdeclarativepathview/data/vdm.qml @@ -0,0 +1,28 @@ +import QtQuick 1.0 + +PathView { + id: pathView + width: 240; height: 320 + + pathItemCount: 4 + preferredHighlightBegin : 0.5 + preferredHighlightEnd : 0.5 + + path: Path { + startX: 120; startY: 20; + PathLine { x: 120; y: 300 } + } + + ListModel { + id: mo + ListElement { value: "one" } + ListElement { value: "two" } + ListElement { value: "three" } + } + + model: VisualDataModel { + delegate: Text { text: model.value } + model : mo + } +} + diff --git a/tests/auto/declarative/qdeclarativepathview/qdeclarativepathview.pro b/tests/auto/declarative/qdeclarativepathview/qdeclarativepathview.pro new file mode 100644 index 00000000..e0404c55 --- /dev/null +++ b/tests/auto/declarative/qdeclarativepathview/qdeclarativepathview.pro @@ -0,0 +1,16 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativepathview.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp b/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp new file mode 100644 index 00000000..cb5b135e --- /dev/null +++ b/tests/auto/declarative/qdeclarativepathview/tst_qdeclarativepathview.cpp @@ -0,0 +1,1065 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../../../shared/util.h" + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +static void initStandardTreeModel(QStandardItemModel *model) +{ + QStandardItem *item; + item = new QStandardItem(QLatin1String("Row 1 Item")); + model->insertRow(0, item); + + item = new QStandardItem(QLatin1String("Row 2 Item")); + item->setCheckable(true); + model->insertRow(1, item); + + QStandardItem *childItem = new QStandardItem(QLatin1String("Row 2 Child Item")); + item->setChild(0, childItem); + + item = new QStandardItem(QLatin1String("Row 3 Item")); + item->setIcon(QIcon()); + model->insertRow(2, item); +} + + +class tst_QDeclarativePathView : public QObject +{ + Q_OBJECT +public: + tst_QDeclarativePathView(); + +private slots: + void initValues(); + void items(); + void dataModel(); + void pathview2(); + void pathview3(); + void path(); + void pathMoved(); + void setCurrentIndex(); + void resetModel(); + void propertyChanges(); + void pathChanges(); + void componentChanges(); + void modelChanges(); + void pathUpdateOnStartChanged(); + void package(); + void emptyModel(); + void closed(); + void pathUpdate(); + void visualDataModel(); + void undefinedPath(); + void mouseDrag(); + void treeModel(); + void changePreferredHighlight(); + +private: + QDeclarativeView *createView(); + template + T *findItem(QGraphicsObject *parent, const QString &objectName, int index=-1); + template + QList findItems(QGraphicsObject *parent, const QString &objectName); +}; + +class TestObject : public QObject +{ + Q_OBJECT + + Q_PROPERTY(bool error READ error WRITE setError) + Q_PROPERTY(bool useModel READ useModel NOTIFY useModelChanged) + Q_PROPERTY(int pathItemCount READ pathItemCount NOTIFY pathItemCountChanged) + +public: + TestObject() : QObject(), mError(true), mUseModel(true), mPathItemCount(-1) {} + + bool error() const { return mError; } + void setError(bool err) { mError = err; } + + bool useModel() const { return mUseModel; } + void setUseModel(bool use) { mUseModel = use; emit useModelChanged(); } + + int pathItemCount() const { return mPathItemCount; } + void setPathItemCount(int count) { mPathItemCount = count; emit pathItemCountChanged(); } + +signals: + void useModelChanged(); + void pathItemCountChanged(); + +private: + bool mError; + bool mUseModel; + int mPathItemCount; +}; + +class TestModel : public QAbstractListModel +{ +public: + enum Roles { Name = Qt::UserRole+1, Number = Qt::UserRole+2 }; + + TestModel(QObject *parent=0) : QAbstractListModel(parent) { + QHash roles; + roles[Name] = "name"; + roles[Number] = "number"; + setRoleNames(roles); + } + + int rowCount(const QModelIndex &parent=QModelIndex()) const { Q_UNUSED(parent); return list.count(); } + QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const { + QVariant rv; + if (role == Name) + rv = list.at(index.row()).first; + else if (role == Number) + rv = list.at(index.row()).second; + + return rv; + } + + int count() const { return rowCount(); } + QString name(int index) const { return list.at(index).first; } + QString number(int index) const { return list.at(index).second; } + + void addItem(const QString &name, const QString &number) { + beginInsertRows(QModelIndex(), list.count(), list.count()); + list.append(QPair(name, number)); + endInsertRows(); + } + + void insertItem(int index, const QString &name, const QString &number) { + beginInsertRows(QModelIndex(), index, index); + list.insert(index, QPair(name, number)); + endInsertRows(); + } + + void removeItem(int index) { + beginRemoveRows(QModelIndex(), index, index); + list.removeAt(index); + endRemoveRows(); + } + + void moveItem(int from, int to) { + beginMoveRows(QModelIndex(), from, from, QModelIndex(), to); + list.move(from, to); + endMoveRows(); + } + + void modifyItem(int idx, const QString &name, const QString &number) { + list[idx] = QPair(name, number); + emit dataChanged(index(idx,0), index(idx,0)); + } + +private: + QList > list; +}; + + +tst_QDeclarativePathView::tst_QDeclarativePathView() +{ +} + +void tst_QDeclarativePathView::initValues() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/pathview1.qml")); + QDeclarativePathView *obj = qobject_cast(c.create()); + + QVERIFY(obj != 0); + QVERIFY(obj->path() == 0); + QVERIFY(obj->delegate() == 0); + QCOMPARE(obj->model(), QVariant()); + QCOMPARE(obj->currentIndex(), 0); + QCOMPARE(obj->offset(), 0.); + QCOMPARE(obj->preferredHighlightBegin(), 0.); + QCOMPARE(obj->dragMargin(), 0.); + QCOMPARE(obj->count(), 0); + QCOMPARE(obj->pathItemCount(), -1); +} + +void tst_QDeclarativePathView::items() +{ + QDeclarativeView *canvas = createView(); + + TestModel model; + model.addItem("Fred", "12345"); + model.addItem("John", "2345"); + model.addItem("Bob", "54321"); + model.addItem("Bill", "4321"); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/pathview0.qml")); + qApp->processEvents(); + + QDeclarativePathView *pathview = findItem(canvas->rootObject(), "view"); + QVERIFY(pathview != 0); + + QCOMPARE(pathview->count(), model.count()); + QCOMPARE(canvas->rootObject()->property("count").toInt(), model.count()); + QCOMPARE(pathview->childItems().count(), model.count()+1); // assumes all are visible, including highlight + + for (int i = 0; i < model.count(); ++i) { + QDeclarativeText *name = findItem(pathview, "textName", i); + QVERIFY(name != 0); + QCOMPARE(name->text(), model.name(i)); + QDeclarativeText *number = findItem(pathview, "textNumber", i); + QVERIFY(number != 0); + QCOMPARE(number->text(), model.number(i)); + } + + QDeclarativePath *path = qobject_cast(pathview->path()); + QVERIFY(path); + + QVERIFY(pathview->highlightItem()); + QPointF start = path->pointAt(0.0); + QPointF offset; + offset.setX(pathview->highlightItem()->width()/2); + offset.setY(pathview->highlightItem()->height()/2); + QCOMPARE(pathview->highlightItem()->pos() + offset, start); + + delete canvas; +} + +void tst_QDeclarativePathView::pathview2() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/pathview2.qml")); + QDeclarativePathView *obj = qobject_cast(c.create()); + + QVERIFY(obj != 0); + QVERIFY(obj->path() != 0); + QVERIFY(obj->delegate() != 0); + QVERIFY(obj->model() != QVariant()); + QCOMPARE(obj->currentIndex(), 0); + QCOMPARE(obj->offset(), 0.); + QCOMPARE(obj->preferredHighlightBegin(), 0.); + QCOMPARE(obj->dragMargin(), 0.); + QCOMPARE(obj->count(), 8); + QCOMPARE(obj->pathItemCount(), 10); +} + +void tst_QDeclarativePathView::pathview3() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/pathview3.qml")); + QDeclarativePathView *obj = qobject_cast(c.create()); + + QVERIFY(obj != 0); + QVERIFY(obj->path() != 0); + QVERIFY(obj->delegate() != 0); + QVERIFY(obj->model() != QVariant()); + QCOMPARE(obj->currentIndex(), 0); + QCOMPARE(obj->offset(), 1.0); + QCOMPARE(obj->preferredHighlightBegin(), 0.5); + QCOMPARE(obj->dragMargin(), 24.); + QCOMPARE(obj->count(), 8); + QCOMPARE(obj->pathItemCount(), 4); +} + +void tst_QDeclarativePathView::path() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/pathtest.qml")); + QDeclarativePath *obj = qobject_cast(c.create()); + + QVERIFY(obj != 0); + QCOMPARE(obj->startX(), 120.); + QCOMPARE(obj->startY(), 100.); + QVERIFY(obj->path() != QPainterPath()); + + QDeclarativeListReference list(obj, "pathElements"); + QCOMPARE(list.count(), 5); + + QDeclarativePathAttribute* attr = qobject_cast(list.at(0)); + QVERIFY(attr != 0); + QCOMPARE(attr->name(), QString("scale")); + QCOMPARE(attr->value(), 1.0); + + QDeclarativePathQuad* quad = qobject_cast(list.at(1)); + QVERIFY(quad != 0); + QCOMPARE(quad->x(), 120.); + QCOMPARE(quad->y(), 25.); + QCOMPARE(quad->controlX(), 260.); + QCOMPARE(quad->controlY(), 75.); + + QDeclarativePathPercent* perc = qobject_cast(list.at(2)); + QVERIFY(perc != 0); + QCOMPARE(perc->value(), 0.3); + + QDeclarativePathLine* line = qobject_cast(list.at(3)); + QVERIFY(line != 0); + QCOMPARE(line->x(), 120.); + QCOMPARE(line->y(), 100.); + + QDeclarativePathCubic* cubic = qobject_cast(list.at(4)); + QVERIFY(cubic != 0); + QCOMPARE(cubic->x(), 180.); + QCOMPARE(cubic->y(), 0.); + QCOMPARE(cubic->control1X(), -10.); + QCOMPARE(cubic->control1Y(), 90.); + QCOMPARE(cubic->control2X(), 210.); + QCOMPARE(cubic->control2Y(), 90.); +} + +void tst_QDeclarativePathView::dataModel() +{ + QDeclarativeView *canvas = createView(); + + QDeclarativeContext *ctxt = canvas->rootContext(); + TestObject *testObject = new TestObject; + ctxt->setContextProperty("testObject", testObject); + + TestModel model; + model.addItem("red", "1"); + model.addItem("green", "2"); + model.addItem("blue", "3"); + model.addItem("purple", "4"); + model.addItem("gray", "5"); + model.addItem("brown", "6"); + model.addItem("yellow", "7"); + model.addItem("thistle", "8"); + model.addItem("cyan", "9"); + model.addItem("peachpuff", "10"); + model.addItem("powderblue", "11"); + model.addItem("gold", "12"); + model.addItem("sandybrown", "13"); + + ctxt->setContextProperty("testData", &model); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/datamodel.qml")); + qApp->processEvents(); + + QDeclarativePathView *pathview = qobject_cast(canvas->rootObject()); + QVERIFY(pathview != 0); + + QMetaObject::invokeMethod(canvas->rootObject(), "checkProperties"); + QVERIFY(testObject->error() == false); + + QDeclarativeItem *item = findItem(pathview, "wrapper", 0); + QVERIFY(item); + QCOMPARE(item->x(), 110.0); + QCOMPARE(item->y(), 10.0); + + model.insertItem(4, "orange", "10"); + QTest::qWait(100); + + QCOMPARE(canvas->rootObject()->property("viewCount").toInt(), model.count()); + QTRY_COMPARE(findItems(pathview, "wrapper").count(), 14); + + QVERIFY(pathview->currentIndex() == 0); + + QDeclarativeText *text = findItem(pathview, "myText", 4); + QVERIFY(text); + QCOMPARE(text->text(), model.name(4)); + + model.removeItem(2); + QCOMPARE(canvas->rootObject()->property("viewCount").toInt(), model.count()); + text = findItem(pathview, "myText", 2); + QVERIFY(text); + QCOMPARE(text->text(), model.name(2)); + + testObject->setPathItemCount(5); + QMetaObject::invokeMethod(canvas->rootObject(), "checkProperties"); + QVERIFY(testObject->error() == false); + + QTRY_COMPARE(findItems(pathview, "wrapper").count(), 5); + + QDeclarativeRectangle *testItem = findItem(pathview, "wrapper", 4); + QVERIFY(testItem != 0); + testItem = findItem(pathview, "wrapper", 5); + QVERIFY(testItem == 0); + + pathview->setCurrentIndex(1); + + model.insertItem(2, "pink", "2"); + QTest::qWait(100); + + QTRY_COMPARE(findItems(pathview, "wrapper").count(), 5); + QVERIFY(pathview->currentIndex() == 1); + + text = findItem(pathview, "myText", 2); + QVERIFY(text); + QCOMPARE(text->text(), model.name(2)); + + model.removeItem(3); + QTRY_COMPARE(findItems(pathview, "wrapper").count(), 5); + text = findItem(pathview, "myText", 3); + QVERIFY(text); + QCOMPARE(text->text(), model.name(3)); + + model.moveItem(3, 5); + QTRY_COMPARE(findItems(pathview, "wrapper").count(), 5); + QList items = findItems(pathview, "wrapper"); + foreach (QDeclarativeItem *item, items) { + QVERIFY(item->property("onPath").toBool()); + } + + // QTBUG-14199 + pathview->setOffset(7); + pathview->setOffset(0); + QCOMPARE(findItems(pathview, "wrapper").count(), 5); + + pathview->setCurrentIndex(model.count()-1); + model.removeItem(model.count()-1); + QCOMPARE(pathview->currentIndex(), model.count()-1); + + // QTBUG-18825 + // Confirm that the target offset is adjusted when removing items + pathview->setCurrentIndex(model.count()-1); + QTRY_COMPARE(pathview->offset(), 1.); + pathview->setCurrentIndex(model.count()-5); + model.removeItem(model.count()-1); + model.removeItem(model.count()-1); + model.removeItem(model.count()-1); + QTRY_COMPARE(pathview->offset(), 2.); + + delete canvas; +} + +void tst_QDeclarativePathView::pathMoved() +{ + QDeclarativeView *canvas = createView(); + + TestModel model; + model.addItem("Ben", "12345"); + model.addItem("Bohn", "2345"); + model.addItem("Bob", "54321"); + model.addItem("Bill", "4321"); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/pathview0.qml")); + qApp->processEvents(); + + QDeclarativePathView *pathview = findItem(canvas->rootObject(), "view"); + QVERIFY(pathview != 0); + + QDeclarativeRectangle *firstItem = findItem(pathview, "wrapper", 0); + QVERIFY(firstItem); + QDeclarativePath *path = qobject_cast(pathview->path()); + QVERIFY(path); + QPointF start = path->pointAt(0.0); + QPointF offset;//Center of item is at point, but pos is from corner + offset.setX(firstItem->width()/2); + offset.setY(firstItem->height()/2); + QCOMPARE(firstItem->pos() + offset, start); + pathview->setOffset(1.0); + + for(int i=0; i(pathview, "wrapper", i); + QPointF itemPos(path->pointAt(0.25 + i*0.25)); + QCOMPARE(curItem->pos() + offset, QPointF(qRound(itemPos.x()), qRound(itemPos.y()))); + } + + pathview->setOffset(0.0); + QCOMPARE(firstItem->pos() + offset, start); + + // Change delegate size + pathview->setOffset(0.1); + pathview->setOffset(0.0); + canvas->rootObject()->setProperty("delegateWidth", 30); + QCOMPARE(firstItem->width(), 30.0); + offset.setX(firstItem->width()/2); + QTRY_COMPARE(firstItem->pos() + offset, start); + + // Change delegate scale + pathview->setOffset(0.1); + pathview->setOffset(0.0); + canvas->rootObject()->setProperty("delegateScale", 1.2); + QTRY_COMPARE(firstItem->pos() + offset, start); + + delete canvas; +} + +void tst_QDeclarativePathView::setCurrentIndex() +{ + QDeclarativeView *canvas = createView(); + + TestModel model; + model.addItem("Ben", "12345"); + model.addItem("Bohn", "2345"); + model.addItem("Bob", "54321"); + model.addItem("Bill", "4321"); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/pathview0.qml")); + qApp->processEvents(); + + QDeclarativePathView *pathview = findItem(canvas->rootObject(), "view"); + QVERIFY(pathview != 0); + + QDeclarativeRectangle *firstItem = findItem(pathview, "wrapper", 0); + QVERIFY(firstItem); + QDeclarativePath *path = qobject_cast(pathview->path()); + QVERIFY(path); + QPointF start = path->pointAt(0.0); + QPointF offset;//Center of item is at point, but pos is from corner + offset.setX(firstItem->width()/2); + offset.setY(firstItem->height()/2); + QCOMPARE(firstItem->pos() + offset, start); + QCOMPARE(canvas->rootObject()->property("currentA").toInt(), 0); + QCOMPARE(canvas->rootObject()->property("currentB").toInt(), 0); + + pathview->setCurrentIndex(2); + + firstItem = findItem(pathview, "wrapper", 2); + QTRY_COMPARE(firstItem->pos() + offset, start); + QCOMPARE(canvas->rootObject()->property("currentA").toInt(), 2); + QCOMPARE(canvas->rootObject()->property("currentB").toInt(), 2); + + pathview->decrementCurrentIndex(); + QTRY_COMPARE(pathview->currentIndex(), 1); + firstItem = findItem(pathview, "wrapper", 1); + QVERIFY(firstItem); + QTRY_COMPARE(firstItem->pos() + offset, start); + + pathview->decrementCurrentIndex(); + QTRY_COMPARE(pathview->currentIndex(), 0); + firstItem = findItem(pathview, "wrapper", 0); + QVERIFY(firstItem); + QTRY_COMPARE(firstItem->pos() + offset, start); + + pathview->decrementCurrentIndex(); + QTRY_COMPARE(pathview->currentIndex(), 3); + firstItem = findItem(pathview, "wrapper", 3); + QVERIFY(firstItem); + QTRY_COMPARE(firstItem->pos() + offset, start); + + pathview->incrementCurrentIndex(); + QTRY_COMPARE(pathview->currentIndex(), 0); + firstItem = findItem(pathview, "wrapper", 0); + QVERIFY(firstItem); + QTRY_COMPARE(firstItem->pos() + offset, start); + + delete canvas; +} + +void tst_QDeclarativePathView::resetModel() +{ + QDeclarativeView *canvas = createView(); + + QStringList strings; + strings << "one" << "two" << "three"; + QStringListModel model(strings); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/displaypath.qml")); + qApp->processEvents(); + + QDeclarativePathView *pathview = findItem(canvas->rootObject(), "view"); + QVERIFY(pathview != 0); + + QCOMPARE(pathview->count(), model.rowCount()); + + for (int i = 0; i < model.rowCount(); ++i) { + QDeclarativeText *display = findItem(pathview, "displayText", i); + QVERIFY(display != 0); + QCOMPARE(display->text(), strings.at(i)); + } + + strings.clear(); + strings << "four" << "five" << "six" << "seven"; + model.setStringList(strings); + + QCOMPARE(pathview->count(), model.rowCount()); + + for (int i = 0; i < model.rowCount(); ++i) { + QDeclarativeText *display = findItem(pathview, "displayText", i); + QVERIFY(display != 0); + QCOMPARE(display->text(), strings.at(i)); + } +} + +void tst_QDeclarativePathView::propertyChanges() +{ + QDeclarativeView *canvas = createView(); + QVERIFY(canvas); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/propertychanges.qml")); + + QDeclarativePathView *pathView = canvas->rootObject()->findChild("pathView"); + QVERIFY(pathView); + + QSignalSpy snapPositionSpy(pathView, SIGNAL(preferredHighlightBeginChanged())); + QSignalSpy dragMarginSpy(pathView, SIGNAL(dragMarginChanged())); + + QCOMPARE(pathView->preferredHighlightBegin(), 0.1); + QCOMPARE(pathView->dragMargin(), 5.0); + + pathView->setPreferredHighlightBegin(0.4); + pathView->setPreferredHighlightEnd(0.4); + pathView->setDragMargin(20.0); + + QCOMPARE(pathView->preferredHighlightBegin(), 0.4); + QCOMPARE(pathView->preferredHighlightEnd(), 0.4); + QCOMPARE(pathView->dragMargin(), 20.0); + + QCOMPARE(snapPositionSpy.count(), 1); + QCOMPARE(dragMarginSpy.count(), 1); + + pathView->setPreferredHighlightBegin(0.4); + pathView->setPreferredHighlightEnd(0.4); + pathView->setDragMargin(20.0); + + QCOMPARE(snapPositionSpy.count(), 1); + QCOMPARE(dragMarginSpy.count(), 1); + delete canvas; +} + +void tst_QDeclarativePathView::pathChanges() +{ + QDeclarativeView *canvas = createView(); + QVERIFY(canvas); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/propertychanges.qml")); + + QDeclarativePathView *pathView = canvas->rootObject()->findChild("pathView"); + QVERIFY(pathView); + + QDeclarativePath *path = canvas->rootObject()->findChild("path"); + QVERIFY(path); + + QSignalSpy startXSpy(path, SIGNAL(startXChanged())); + QSignalSpy startYSpy(path, SIGNAL(startYChanged())); + + QCOMPARE(path->startX(), 220.0); + QCOMPARE(path->startY(), 200.0); + + path->setStartX(240.0); + path->setStartY(220.0); + + QCOMPARE(path->startX(), 240.0); + QCOMPARE(path->startY(), 220.0); + + QCOMPARE(startXSpy.count(),1); + QCOMPARE(startYSpy.count(),1); + + path->setStartX(240); + path->setStartY(220); + + QCOMPARE(startXSpy.count(),1); + QCOMPARE(startYSpy.count(),1); + + QDeclarativePath *alternatePath = canvas->rootObject()->findChild("alternatePath"); + QVERIFY(alternatePath); + + QSignalSpy pathSpy(pathView, SIGNAL(pathChanged())); + + QCOMPARE(pathView->path(), path); + + pathView->setPath(alternatePath); + QCOMPARE(pathView->path(), alternatePath); + QCOMPARE(pathSpy.count(),1); + + pathView->setPath(alternatePath); + QCOMPARE(pathSpy.count(),1); + + QDeclarativePathAttribute *pathAttribute = canvas->rootObject()->findChild("pathAttribute"); + QVERIFY(pathAttribute); + + QSignalSpy nameSpy(pathAttribute, SIGNAL(nameChanged())); + QCOMPARE(pathAttribute->name(), QString("opacity")); + + pathAttribute->setName("scale"); + QCOMPARE(pathAttribute->name(), QString("scale")); + QCOMPARE(nameSpy.count(),1); + + pathAttribute->setName("scale"); + QCOMPARE(nameSpy.count(),1); + delete canvas; +} + +void tst_QDeclarativePathView::componentChanges() +{ + QDeclarativeView *canvas = createView(); + QVERIFY(canvas); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/propertychanges.qml")); + + QDeclarativePathView *pathView = canvas->rootObject()->findChild("pathView"); + QVERIFY(pathView); + + QDeclarativeComponent delegateComponent(canvas->engine()); + delegateComponent.setData("import QtQuick 1.0; Text { text: 'Name: ' + name }", QUrl::fromLocalFile("")); + + QSignalSpy delegateSpy(pathView, SIGNAL(delegateChanged())); + + pathView->setDelegate(&delegateComponent); + QCOMPARE(pathView->delegate(), &delegateComponent); + QCOMPARE(delegateSpy.count(),1); + + pathView->setDelegate(&delegateComponent); + QCOMPARE(delegateSpy.count(),1); + delete canvas; +} + +void tst_QDeclarativePathView::modelChanges() +{ + QDeclarativeView *canvas = createView(); + QVERIFY(canvas); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/propertychanges.qml")); + + QDeclarativePathView *pathView = canvas->rootObject()->findChild("pathView"); + QVERIFY(pathView); + + QDeclarativeListModel *alternateModel = canvas->rootObject()->findChild("alternateModel"); + QVERIFY(alternateModel); + QVariant modelVariant = QVariant::fromValue(alternateModel); + QSignalSpy modelSpy(pathView, SIGNAL(modelChanged())); + + pathView->setModel(modelVariant); + QCOMPARE(pathView->model(), modelVariant); + QCOMPARE(modelSpy.count(),1); + + pathView->setModel(modelVariant); + QCOMPARE(modelSpy.count(),1); + + pathView->setModel(QVariant()); + QCOMPARE(modelSpy.count(),2); + + delete canvas; +} + +void tst_QDeclarativePathView::pathUpdateOnStartChanged() +{ + QDeclarativeView *canvas = createView(); + QVERIFY(canvas); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/pathUpdateOnStartChanged.qml")); + + QDeclarativePathView *pathView = canvas->rootObject()->findChild("pathView"); + QVERIFY(pathView); + + QDeclarativePath *path = canvas->rootObject()->findChild("path"); + QVERIFY(path); + QCOMPARE(path->startX(), 400.0); + QCOMPARE(path->startY(), 300.0); + + QDeclarativeItem *item = findItem(pathView, "wrapper", 0); + QVERIFY(item); + QCOMPARE(item->x(), path->startX() - item->width() / 2.0); + QCOMPARE(item->y(), path->startY() - item->height() / 2.0); + + delete canvas; +} + +void tst_QDeclarativePathView::package() +{ + QDeclarativeView *canvas = createView(); + QVERIFY(canvas); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/pathview_package.qml")); + + QDeclarativePathView *pathView = canvas->rootObject()->findChild("photoPathView"); + QVERIFY(pathView); + + QDeclarativeItem *item = findItem(pathView, "pathItem"); + QVERIFY(item); + QVERIFY(item->scale() != 1.0); + + delete canvas; +} + +//QTBUG-13017 +void tst_QDeclarativePathView::emptyModel() +{ + QDeclarativeView *canvas = createView(); + + QStringListModel model; + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("emptyModel", &model); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/emptymodel.qml")); + qApp->processEvents(); + + QDeclarativePathView *pathview = qobject_cast(canvas->rootObject()); + QVERIFY(pathview != 0); + + QCOMPARE(pathview->offset(), qreal(0.0)); + + delete canvas; +} + +void tst_QDeclarativePathView::closed() +{ + QDeclarativeEngine engine; + + { + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/openPath.qml")); + QDeclarativePath *obj = qobject_cast(c.create()); + QVERIFY(obj); + QCOMPARE(obj->isClosed(), false); + delete obj; + } + + { + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/closedPath.qml")); + QDeclarativePath *obj = qobject_cast(c.create()); + QVERIFY(obj); + QCOMPARE(obj->isClosed(), true); + delete obj; + } +} + +// QTBUG-14239 +void tst_QDeclarativePathView::pathUpdate() +{ + QDeclarativeView *canvas = createView(); + QVERIFY(canvas); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/pathUpdate.qml")); + + QDeclarativePathView *pathView = canvas->rootObject()->findChild("pathView"); + QVERIFY(pathView); + + QDeclarativeItem *item = findItem(pathView, "wrapper", 0); + QVERIFY(item); + QCOMPARE(item->x(), 150.0); + + delete canvas; +} + +void tst_QDeclarativePathView::visualDataModel() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/vdm.qml")); + + QDeclarativePathView *obj = qobject_cast(c.create()); + QVERIFY(obj != 0); + + QCOMPARE(obj->count(), 3); + + delete obj; +} + +void tst_QDeclarativePathView::undefinedPath() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/undefinedpath.qml")); + + QDeclarativePathView *obj = qobject_cast(c.create()); + QVERIFY(obj != 0); + + QCOMPARE(obj->count(), 3); + + delete obj; +} + +void tst_QDeclarativePathView::mouseDrag() +{ + QDeclarativeView *canvas = createView(); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/dragpath.qml")); + canvas->show(); + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(canvas)); + + QDeclarativePathView *pathview = qobject_cast(canvas->rootObject()); + QVERIFY(pathview != 0); + + int current = pathview->currentIndex(); + + QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(10,100))); + + { + QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(QPoint(30,100)), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(canvas->viewport(), &mv); + } + { + QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(QPoint(90,100)), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(canvas->viewport(), &mv); + } + + QVERIFY(pathview->currentIndex() != current); + + QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(40,100))); + + delete canvas; +} + +void tst_QDeclarativePathView::treeModel() +{ + QDeclarativeView *canvas = createView(); + + QStandardItemModel model; + initStandardTreeModel(&model); + canvas->engine()->rootContext()->setContextProperty("myModel", &model); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/treemodel.qml")); + + QDeclarativePathView *pathview = qobject_cast(canvas->rootObject()); + QVERIFY(pathview != 0); + QCOMPARE(pathview->count(), 3); + + QDeclarativeText *item = findItem(pathview, "wrapper", 0); + QVERIFY(item); + QCOMPARE(item->text(), QLatin1String("Row 1 Item")); + + QVERIFY(QMetaObject::invokeMethod(pathview, "setRoot", Q_ARG(QVariant, 1))); + QCOMPARE(pathview->count(), 1); + + QTRY_VERIFY(item = findItem(pathview, "wrapper", 0)); + QTRY_COMPARE(item->text(), QLatin1String("Row 2 Child Item")); + + delete canvas; +} + +void tst_QDeclarativePathView::changePreferredHighlight() +{ + QDeclarativeView *canvas = createView(); + canvas->setFixedSize(400,200); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/dragpath.qml")); + canvas->show(); + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(canvas)); + + QDeclarativePathView *pathview = qobject_cast(canvas->rootObject()); + QVERIFY(pathview != 0); + + int current = pathview->currentIndex(); + QCOMPARE(current, 0); + + QDeclarativeRectangle *firstItem = findItem(pathview, "wrapper", 0); + QVERIFY(firstItem); + QDeclarativePath *path = qobject_cast(pathview->path()); + QVERIFY(path); + QPointF start = path->pointAt(0.5); + start.setX(qRound(start.x())); + start.setY(qRound(start.y())); + QPointF offset;//Center of item is at point, but pos is from corner + offset.setX(firstItem->width()/2); + offset.setY(firstItem->height()/2); + QTRY_COMPARE(firstItem->pos() + offset, start); + + pathview->setPreferredHighlightBegin(0.8); + pathview->setPreferredHighlightEnd(0.8); + start = path->pointAt(0.8); + start.setX(qRound(start.x())); + start.setY(qRound(start.y())); + QTRY_COMPARE(firstItem->pos() + offset, start); + QCOMPARE(pathview->currentIndex(), 0); + + delete canvas; +} + +QDeclarativeView *tst_QDeclarativePathView::createView() +{ + QDeclarativeView *canvas = new QDeclarativeView(0); + canvas->setFixedSize(240,320); + + return canvas; +} + +/* + Find an item with the specified objectName. If index is supplied then the + item must also evaluate the {index} expression equal to index + */ +template +T *tst_QDeclarativePathView::findItem(QGraphicsObject *parent, const QString &objectName, int index) +{ + const QMetaObject &mo = T::staticMetaObject; + //qDebug() << parent->childItems().count() << "children"; + for (int i = 0; i < parent->childItems().count(); ++i) { + QDeclarativeItem *item = qobject_cast(parent->childItems().at(i)); + if(!item) + continue; + //qDebug() << "try" << item; + if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName)) { + if (index != -1) { + QDeclarativeExpression e(qmlContext(item), item, "index"); + if (e.evaluate().toInt() == index) + return static_cast(item); + } else { + return static_cast(item); + } + } + item = findItem(item, objectName, index); + if (item) + return static_cast(item); + } + + return 0; +} + +template +QList tst_QDeclarativePathView::findItems(QGraphicsObject *parent, const QString &objectName) +{ + QList items; + const QMetaObject &mo = T::staticMetaObject; + //qDebug() << parent->QGraphicsObject::children().count() << "children"; + for (int i = 0; i < parent->childItems().count(); ++i) { + QDeclarativeItem *item = qobject_cast(parent->childItems().at(i)); + if(!item) + continue; + //qDebug() << "try" << item; + if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName)) + items.append(static_cast(item)); + items += findItems(item, objectName); + } + + return items; +} + +QTEST_MAIN(tst_QDeclarativePathView) + +#include "tst_qdeclarativepathview.moc" diff --git a/tests/auto/declarative/qdeclarativepincharea/data/flickresize.qml b/tests/auto/declarative/qdeclarativepincharea/data/flickresize.qml new file mode 100644 index 00000000..2da58fce --- /dev/null +++ b/tests/auto/declarative/qdeclarativepincharea/data/flickresize.qml @@ -0,0 +1,50 @@ +import QtQuick 1.1 + +Flickable { + id: flick + property real scale: 1.0 + width: 640 + height: 360 + contentWidth: 500 + contentHeight: 500 + + PinchArea { + objectName: "pincharea" + width: Math.max(flick.contentWidth, flick.width) + height: Math.max(flick.contentHeight, flick.height) + + property real initialWidth + property real initialHeight + onPinchStarted: { + initialWidth = flick.contentWidth + initialHeight = flick.contentHeight + } + + onPinchUpdated: { + // adjust content pos due to drag + flick.contentX += pinch.previousCenter.x - pinch.center.x + flick.contentY += pinch.previousCenter.y - pinch.center.y + + // resize content + flick.resizeContent(initialWidth * pinch.scale, initialHeight * pinch.scale, pinch.center) + flick.scale = pinch.scale + } + + onPinchFinished: { + // Move its content within bounds. + flick.returnToBounds() + } + + Rectangle { + width: flick.contentWidth + height: flick.contentHeight + color: "white" + Rectangle { + anchors.centerIn: parent + width: parent.width-40 + height: parent.height-40 + color: "blue" + } + } + } +} diff --git a/tests/auto/declarative/qdeclarativepincharea/data/pinchproperties.qml b/tests/auto/declarative/qdeclarativepincharea/data/pinchproperties.qml new file mode 100644 index 00000000..0b59d9dc --- /dev/null +++ b/tests/auto/declarative/qdeclarativepincharea/data/pinchproperties.qml @@ -0,0 +1,46 @@ +import QtQuick 1.1 +Rectangle { + id: whiteRect + property variant center + property real scale + width: 240; height: 320 + color: "white" + Rectangle { + id: blackRect + objectName: "blackrect" + color: "black" + y: 50 + x: 50 + width: 100 + height: 100 + opacity: (whiteRect.width-blackRect.x+whiteRect.height-blackRect.y-199)/200 + Text { text: blackRect.opacity} + PinchArea { + id: pincharea + objectName: "pincharea" + anchors.fill: parent + pinch.target: blackRect + pinch.dragAxis: Drag.XandYAxis + pinch.minimumX: 0 + pinch.maximumX: whiteRect.width-blackRect.width + pinch.minimumY: 0 + pinch.maximumY: whiteRect.height-blackRect.height + pinch.minimumScale: 1.0 + pinch.maximumScale: 2.0 + pinch.minimumRotation: 0.0 + pinch.maximumRotation: 90.0 + onPinchStarted: { + whiteRect.center = pinch.center + whiteRect.scale = pinch.scale + } + onPinchUpdated: { + whiteRect.center = pinch.center + whiteRect.scale = pinch.scale + } + onPinchFinished: { + whiteRect.center = pinch.center + whiteRect.scale = pinch.scale + } + } + } + } diff --git a/tests/auto/declarative/qdeclarativepincharea/qdeclarativepincharea.pro b/tests/auto/declarative/qdeclarativepincharea/qdeclarativepincharea.pro new file mode 100644 index 00000000..3bdb3fcc --- /dev/null +++ b/tests/auto/declarative/qdeclarativepincharea/qdeclarativepincharea.pro @@ -0,0 +1,16 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative gui +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativepincharea.cpp + +symbian: { + importFiles.sources = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativepincharea/tst_qdeclarativepincharea.cpp b/tests/auto/declarative/qdeclarativepincharea/tst_qdeclarativepincharea.cpp new file mode 100644 index 00000000..4f63240d --- /dev/null +++ b/tests/auto/declarative/qdeclarativepincharea/tst_qdeclarativepincharea.cpp @@ -0,0 +1,388 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_QDeclarativePinchArea: public QObject +{ + Q_OBJECT +private slots: + void pinchProperties(); + void scale(); + void pan(); + void flickable(); + +private: + QDeclarativeView *createView(); +}; + +void tst_QDeclarativePinchArea::pinchProperties() +{ + QDeclarativeView *canvas = createView(); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/pinchproperties.qml")); + canvas->show(); + canvas->setFocus(); + QVERIFY(canvas->rootObject() != 0); + + QDeclarativePinchArea *pinchArea = canvas->rootObject()->findChild("pincharea"); + QDeclarativePinch *pinch = pinchArea->pinch(); + QVERIFY(pinchArea != 0); + QVERIFY(pinch != 0); + + // target + QDeclarativeItem *blackRect = canvas->rootObject()->findChild("blackrect"); + QVERIFY(blackRect != 0); + QVERIFY(blackRect == pinch->target()); + QDeclarativeItem *rootItem = qobject_cast(canvas->rootObject()); + QVERIFY(rootItem != 0); + QSignalSpy targetSpy(pinch, SIGNAL(targetChanged())); + pinch->setTarget(rootItem); + QCOMPARE(targetSpy.count(),1); + pinch->setTarget(rootItem); + QCOMPARE(targetSpy.count(),1); + + // axis + QCOMPARE(pinch->axis(), QDeclarativePinch::XandYAxis); + QSignalSpy axisSpy(pinch, SIGNAL(dragAxisChanged())); + pinch->setAxis(QDeclarativePinch::XAxis); + QCOMPARE(pinch->axis(), QDeclarativePinch::XAxis); + QCOMPARE(axisSpy.count(),1); + pinch->setAxis(QDeclarativePinch::XAxis); + QCOMPARE(axisSpy.count(),1); + + // minimum and maximum drag properties + QSignalSpy xminSpy(pinch, SIGNAL(minimumXChanged())); + QSignalSpy xmaxSpy(pinch, SIGNAL(maximumXChanged())); + QSignalSpy yminSpy(pinch, SIGNAL(minimumYChanged())); + QSignalSpy ymaxSpy(pinch, SIGNAL(maximumYChanged())); + + QCOMPARE(pinch->xmin(), 0.0); + QCOMPARE(pinch->xmax(), rootItem->width()-blackRect->width()); + QCOMPARE(pinch->ymin(), 0.0); + QCOMPARE(pinch->ymax(), rootItem->height()-blackRect->height()); + + pinch->setXmin(10); + pinch->setXmax(10); + pinch->setYmin(10); + pinch->setYmax(10); + + QCOMPARE(pinch->xmin(), 10.0); + QCOMPARE(pinch->xmax(), 10.0); + QCOMPARE(pinch->ymin(), 10.0); + QCOMPARE(pinch->ymax(), 10.0); + + QCOMPARE(xminSpy.count(),1); + QCOMPARE(xmaxSpy.count(),1); + QCOMPARE(yminSpy.count(),1); + QCOMPARE(ymaxSpy.count(),1); + + pinch->setXmin(10); + pinch->setXmax(10); + pinch->setYmin(10); + pinch->setYmax(10); + + QCOMPARE(xminSpy.count(),1); + QCOMPARE(xmaxSpy.count(),1); + QCOMPARE(yminSpy.count(),1); + QCOMPARE(ymaxSpy.count(),1); + + // minimum and maximum scale properties + QSignalSpy scaleMinSpy(pinch, SIGNAL(minimumScaleChanged())); + QSignalSpy scaleMaxSpy(pinch, SIGNAL(maximumScaleChanged())); + + QCOMPARE(pinch->minimumScale(), 1.0); + QCOMPARE(pinch->maximumScale(), 2.0); + + pinch->setMinimumScale(0.5); + pinch->setMaximumScale(1.5); + + QCOMPARE(pinch->minimumScale(), 0.5); + QCOMPARE(pinch->maximumScale(), 1.5); + + QCOMPARE(scaleMinSpy.count(),1); + QCOMPARE(scaleMaxSpy.count(),1); + + pinch->setMinimumScale(0.5); + pinch->setMaximumScale(1.5); + + QCOMPARE(scaleMinSpy.count(),1); + QCOMPARE(scaleMaxSpy.count(),1); + + // minimum and maximum rotation properties + QSignalSpy rotMinSpy(pinch, SIGNAL(minimumRotationChanged())); + QSignalSpy rotMaxSpy(pinch, SIGNAL(maximumRotationChanged())); + + QCOMPARE(pinch->minimumRotation(), 0.0); + QCOMPARE(pinch->maximumRotation(), 90.0); + + pinch->setMinimumRotation(-90.0); + pinch->setMaximumRotation(45.0); + + QCOMPARE(pinch->minimumRotation(), -90.0); + QCOMPARE(pinch->maximumRotation(), 45.0); + + QCOMPARE(rotMinSpy.count(),1); + QCOMPARE(rotMaxSpy.count(),1); + + pinch->setMinimumRotation(-90.0); + pinch->setMaximumRotation(45.0); + + QCOMPARE(rotMinSpy.count(),1); + QCOMPARE(rotMaxSpy.count(),1); + + delete canvas; +} + +QTouchEvent::TouchPoint makeTouchPoint(int id, QPoint p, QGraphicsView *v, QGraphicsItem *i) +{ + QTouchEvent::TouchPoint touchPoint(id); + touchPoint.setPos(i->mapFromScene(p)); + touchPoint.setScreenPos(v->mapToGlobal(p)); + touchPoint.setScenePos(p); + return touchPoint; +} + +void tst_QDeclarativePinchArea::scale() +{ + QDeclarativeView *canvas = createView(); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/pinchproperties.qml")); + canvas->show(); + canvas->setFocus(); + QTest::qWaitForWindowShown(canvas); + QVERIFY(canvas->rootObject() != 0); + qApp->processEvents(); + + QDeclarativePinchArea *pinchArea = canvas->rootObject()->findChild("pincharea"); + QDeclarativePinch *pinch = pinchArea->pinch(); + QVERIFY(pinchArea != 0); + QVERIFY(pinch != 0); + + QDeclarativeItem *root = qobject_cast(canvas->rootObject()); + QVERIFY(root != 0); + + // target + QDeclarativeItem *blackRect = canvas->rootObject()->findChild("blackrect"); + QVERIFY(blackRect != 0); + + QWidget *vp = canvas->viewport(); + + QPoint p1(80, 80); + QPoint p2(100, 100); + + QTest::touchEvent(vp).press(0, p1); + QTest::touchEvent(vp).stationary(0).press(1, p2); + p1 -= QPoint(10,10); + p2 += QPoint(10,10); + QTest::touchEvent(vp).move(0, p1).move(1, p2); + + QCOMPARE(root->property("scale").toReal(), 1.0); + + p1 -= QPoint(10,10); + p2 += QPoint(10,10); + QTest::touchEvent(vp).move(0, p1).move(1, p2); + + QCOMPARE(root->property("scale").toReal(), 1.5); + QCOMPARE(root->property("center").toPointF(), QPointF(40, 40)); // blackrect is at 50,50 + QCOMPARE(blackRect->scale(), 1.5); + + // scale beyond bound + p1 -= QPoint(50,50); + p2 += QPoint(50,50); + QTest::touchEvent(vp).move(0, p1).move(1, p2); + + QCOMPARE(blackRect->scale(), 2.0); + + QTest::touchEvent(vp).release(0, p1).release(1, p2); + + delete canvas; +} + +void tst_QDeclarativePinchArea::pan() +{ + QDeclarativeView *canvas = createView(); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/pinchproperties.qml")); + canvas->show(); + canvas->setFocus(); + QTest::qWaitForWindowShown(canvas); + QVERIFY(canvas->rootObject() != 0); + qApp->processEvents(); + + QDeclarativePinchArea *pinchArea = canvas->rootObject()->findChild("pincharea"); + QDeclarativePinch *pinch = pinchArea->pinch(); + QVERIFY(pinchArea != 0); + QVERIFY(pinch != 0); + + QDeclarativeItem *root = qobject_cast(canvas->rootObject()); + QVERIFY(root != 0); + + // target + QDeclarativeItem *blackRect = canvas->rootObject()->findChild("blackrect"); + QVERIFY(blackRect != 0); + + QWidget *vp = canvas->viewport(); + + QPoint p1(80, 80); + QPoint p2(100, 100); + + QTest::touchEvent(vp).press(0, p1); + QTest::touchEvent(vp).stationary(0).press(1, p2); + p1 += QPoint(10,10); + p2 += QPoint(10,10); + QTest::touchEvent(vp).move(0, p1).move(1, p2); + + QCOMPARE(root->property("scale").toReal(), 1.0); + + p1 += QPoint(10,10); + p2 += QPoint(10,10); + QTest::touchEvent(vp).move(0, p1).move(1, p2); + + QCOMPARE(root->property("center").toPointF(), QPointF(60, 60)); // blackrect is at 50,50 + + QCOMPARE(blackRect->x(), 60.0); + QCOMPARE(blackRect->y(), 60.0); + + // pan x beyond bound + p1 += QPoint(100,100); + p2 += QPoint(100,100); + QTest::touchEvent(vp).move(0, p1).move(1, p2); + + QCOMPARE(blackRect->x(), 140.0); + QCOMPARE(blackRect->y(), 160.0); + + QTest::touchEvent(vp).release(0, p1).release(1, p2); + + delete canvas; +} + +void tst_QDeclarativePinchArea::flickable() +{ + QDeclarativeView *canvas = createView(); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/flickresize.qml")); + canvas->show(); + canvas->setFocus(); + QTest::qWaitForWindowShown(canvas); + QVERIFY(canvas->rootObject() != 0); + qApp->processEvents(); + + QDeclarativePinchArea *pinchArea = canvas->rootObject()->findChild("pincharea"); + QDeclarativePinch *pinch = pinchArea->pinch(); + QVERIFY(pinchArea != 0); + QVERIFY(pinch != 0); + + QDeclarativeFlickable *root = qobject_cast(canvas->rootObject()); + QVERIFY(root != 0); + + QWidget *vp = canvas->viewport(); + + QPoint p1(110, 80); + QPoint p2(100, 100); + + // begin by moving one touch point (mouse) + QTest::mousePress(vp, Qt::LeftButton, 0, canvas->mapFromScene(p1)); + QTest::touchEvent(vp).press(0, p1); + { + p1 -= QPoint(10,10); + QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(p1), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(canvas->viewport(), &mv); + QTest::touchEvent(vp).move(0, p1); + } + { + p1 -= QPoint(10,10); + QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(p1), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(vp, &mv); + QTest::touchEvent(vp).move(0, p1); + } + { + p1 -= QPoint(10,10); + QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(p1), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(vp, &mv); + QTest::touchEvent(vp).move(0, p1); + } + + // Flickable has reacted to the gesture + QVERIFY(root->isMoving()); + QVERIFY(root->property("scale").toReal() == 1.0); + + // add another touch point and continue moving + QTest::touchEvent(vp).stationary(0).press(1, p2); + p1 -= QPoint(10,10); + p2 += QPoint(10,10); + QTest::touchEvent(vp).move(0, p1).move(1, p2); + + QCOMPARE(root->property("scale").toReal(), 1.0); + + p1 -= QPoint(10,10); + p2 += QPoint(10,10); + QTest::touchEvent(vp).move(0, p1).move(1, p2); + + // PinchArea has stolen the gesture. + QVERIFY(!root->isMoving()); + QVERIFY(root->property("scale").toReal() > 1.0); + + QTest::mouseRelease(vp, Qt::LeftButton, 0, canvas->mapFromScene(p1)); + QTest::touchEvent(vp).release(0, p1).release(1, p2); + + delete canvas; +} + +QDeclarativeView *tst_QDeclarativePinchArea::createView() +{ + QDeclarativeView *canvas = new QDeclarativeView(0); + canvas->viewport()->setAttribute(Qt::WA_AcceptTouchEvents); + canvas->setFixedSize(240,320); + + return canvas; +} + +QTEST_MAIN(tst_QDeclarativePinchArea) + +#include "tst_qdeclarativepincharea.moc" diff --git a/tests/auto/declarative/qdeclarativepixmapcache/data/exists.png b/tests/auto/declarative/qdeclarativepixmapcache/data/exists.png new file mode 100644 index 00000000..399bd0b1 Binary files /dev/null and b/tests/auto/declarative/qdeclarativepixmapcache/data/exists.png differ diff --git a/tests/auto/declarative/qdeclarativepixmapcache/data/exists1.png b/tests/auto/declarative/qdeclarativepixmapcache/data/exists1.png new file mode 100644 index 00000000..399bd0b1 Binary files /dev/null and b/tests/auto/declarative/qdeclarativepixmapcache/data/exists1.png differ diff --git a/tests/auto/declarative/qdeclarativepixmapcache/data/exists2.png b/tests/auto/declarative/qdeclarativepixmapcache/data/exists2.png new file mode 100644 index 00000000..399bd0b1 Binary files /dev/null and b/tests/auto/declarative/qdeclarativepixmapcache/data/exists2.png differ diff --git a/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists.png b/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists.png new file mode 100644 index 00000000..399bd0b1 Binary files /dev/null and b/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists.png differ diff --git a/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists1.png b/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists1.png new file mode 100644 index 00000000..399bd0b1 Binary files /dev/null and b/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists1.png differ diff --git a/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists2.png b/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists2.png new file mode 100644 index 00000000..399bd0b1 Binary files /dev/null and b/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists2.png differ diff --git a/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists3.png b/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists3.png new file mode 100644 index 00000000..399bd0b1 Binary files /dev/null and b/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists3.png differ diff --git a/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists4.png b/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists4.png new file mode 100644 index 00000000..399bd0b1 Binary files /dev/null and b/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists4.png differ diff --git a/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists5.png b/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists5.png new file mode 100644 index 00000000..399bd0b1 Binary files /dev/null and b/tests/auto/declarative/qdeclarativepixmapcache/data/http/exists5.png differ diff --git a/tests/auto/declarative/qdeclarativepixmapcache/data/massive.png b/tests/auto/declarative/qdeclarativepixmapcache/data/massive.png new file mode 100644 index 00000000..bc6cc9e6 Binary files /dev/null and b/tests/auto/declarative/qdeclarativepixmapcache/data/massive.png differ diff --git a/tests/auto/declarative/qdeclarativepixmapcache/qdeclarativepixmapcache.pro b/tests/auto/declarative/qdeclarativepixmapcache/qdeclarativepixmapcache.pro new file mode 100644 index 00000000..88871e95 --- /dev/null +++ b/tests/auto/declarative/qdeclarativepixmapcache/qdeclarativepixmapcache.pro @@ -0,0 +1,24 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +QT += network +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativepixmapcache.cpp + +INCLUDEPATH += ../shared/ +HEADERS += ../shared/testhttpserver.h +SOURCES += ../shared/testhttpserver.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +# QMAKE_CXXFLAGS = -fprofile-arcs -ftest-coverage +# LIBS += -lgcov + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativepixmapcache/tst_qdeclarativepixmapcache.cpp b/tests/auto/declarative/qdeclarativepixmapcache/tst_qdeclarativepixmapcache.cpp new file mode 100644 index 00000000..6609485f --- /dev/null +++ b/tests/auto/declarative/qdeclarativepixmapcache/tst_qdeclarativepixmapcache.cpp @@ -0,0 +1,396 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include "testhttpserver.h" +#include "../../../shared/util.h" + +#ifndef QT_NO_CONCURRENT +#include +#include +#endif + +// These don't let normal people run tests! +//#include "../network-settings.h" + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_qdeclarativepixmapcache : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativepixmapcache() : + thisfile(QUrl::fromLocalFile(__FILE__)), + server(14452) + { + server.serveDirectory(SRCDIR "/data/http"); + } + +private slots: + void single(); + void single_data(); + void parallel(); + void parallel_data(); + void massive(); + void cancelcrash(); + void shrinkcache(); +#ifndef QT_NO_CONCURRENT + void networkCrash(); +#endif +private: + QDeclarativeEngine engine; + QUrl thisfile; + TestHTTPServer server; +}; + + +static int slotters=0; + +class Slotter : public QObject +{ + Q_OBJECT +public: + Slotter() + { + gotslot = false; + slotters++; + } + bool gotslot; + +public slots: + void got() + { + gotslot = true; + --slotters; + if (slotters==0) + QTestEventLoop::instance().exitLoop(); + } +}; + +#ifndef QT_NO_LOCALFILE_OPTIMIZED_QML +static const bool localfile_optimized = true; +#else +static const bool localfile_optimized = false; +#endif + +void tst_qdeclarativepixmapcache::single_data() +{ + // Note, since QDeclarativePixmapCache is shared, tests affect each other! + // so use different files fore all test functions. + + QTest::addColumn("target"); + QTest::addColumn("incache"); + QTest::addColumn("exists"); + QTest::addColumn("neterror"); + + // File URLs are optimized + QTest::newRow("local") << thisfile.resolved(QUrl("data/exists.png")) << localfile_optimized << true << false; + QTest::newRow("local") << thisfile.resolved(QUrl("data/notexists.png")) << localfile_optimized << false << false; + QTest::newRow("remote") << QUrl("http://127.0.0.1:14452/exists.png") << false << true << false; + QTest::newRow("remote") << QUrl("http://127.0.0.1:14452/notexists.png") << false << false << true; +} + +void tst_qdeclarativepixmapcache::single() +{ + QFETCH(QUrl, target); + QFETCH(bool, incache); + QFETCH(bool, exists); + QFETCH(bool, neterror); + + QString expectedError; + if (neterror) { + expectedError = "Error downloading " + target.toString() + " - server replied: Not found"; + } else if (!exists) { + expectedError = "Cannot open: " + target.toString(); + } + + QDeclarativePixmap pixmap; + QVERIFY(pixmap.width() <= 0); // Check Qt assumption + + pixmap.load(&engine, target); + + if (incache) { + QCOMPARE(pixmap.error(), expectedError); + if (exists) { + QVERIFY(pixmap.status() == QDeclarativePixmap::Ready); + QVERIFY(pixmap.width() > 0); + } else { + QVERIFY(pixmap.status() == QDeclarativePixmap::Error); + QVERIFY(pixmap.width() <= 0); + } + } else { + QVERIFY(pixmap.width() <= 0); + + Slotter getter; + pixmap.connectFinished(&getter, SLOT(got())); + QTestEventLoop::instance().enterLoop(10); + QVERIFY(!QTestEventLoop::instance().timeout()); + QVERIFY(getter.gotslot); + if (exists) { + QVERIFY(pixmap.status() == QDeclarativePixmap::Ready); + QVERIFY(pixmap.width() > 0); + } else { + QVERIFY(pixmap.status() == QDeclarativePixmap::Error); + QVERIFY(pixmap.width() <= 0); + } + QCOMPARE(pixmap.error(), expectedError); + } +} + +void tst_qdeclarativepixmapcache::parallel_data() +{ + // Note, since QDeclarativePixmapCache is shared, tests affect each other! + // so use different files fore all test functions. + + QTest::addColumn("target1"); + QTest::addColumn("target2"); + QTest::addColumn("incache"); + QTest::addColumn("cancel"); // which one to cancel + + QTest::newRow("local") + << thisfile.resolved(QUrl("data/exists1.png")) + << thisfile.resolved(QUrl("data/exists2.png")) + << (localfile_optimized ? 2 : 0) + << -1; + + QTest::newRow("remote") + << QUrl("http://127.0.0.1:14452/exists2.png") + << QUrl("http://127.0.0.1:14452/exists3.png") + << 0 + << -1; + + QTest::newRow("remoteagain") + << QUrl("http://127.0.0.1:14452/exists2.png") + << QUrl("http://127.0.0.1:14452/exists3.png") + << 2 + << -1; + + QTest::newRow("remotecopy") + << QUrl("http://127.0.0.1:14452/exists4.png") + << QUrl("http://127.0.0.1:14452/exists4.png") + << 0 + << -1; + + QTest::newRow("remotecopycancel") + << QUrl("http://127.0.0.1:14452/exists5.png") + << QUrl("http://127.0.0.1:14452/exists5.png") + << 0 + << 0; +} + +void tst_qdeclarativepixmapcache::parallel() +{ + QFETCH(QUrl, target1); + QFETCH(QUrl, target2); + QFETCH(int, incache); + QFETCH(int, cancel); + + QList targets; + targets << target1 << target2; + + QList pixmaps; + QList pending; + QList getters; + + for (int i=0; iload(&engine, target); + + QVERIFY(pixmap->status() != QDeclarativePixmap::Error); + pixmaps.append(pixmap); + if (pixmap->isReady()) { + QVERIFY(pixmap->width() > 0); + getters.append(0); + pending.append(false); + } else { + QVERIFY(pixmap->width() <= 0); + getters.append(new Slotter); + pixmap->connectFinished(getters[i], SLOT(got())); + pending.append(true); + } + } + + QCOMPARE(incache+slotters, targets.count()); + + if (cancel >= 0) { + pixmaps.at(cancel)->clear(getters[cancel]); + slotters--; + } + + if (slotters) { + QTestEventLoop::instance().enterLoop(10); + QVERIFY(!QTestEventLoop::instance().timeout()); + } + + for (int i=0; igotslot); + } else { + if (pending[i]) + QVERIFY(getters[i]->gotslot); + + QVERIFY(pixmap->isReady()); + QVERIFY(pixmap->width() > 0); + delete getters[i]; + } + } + + qDeleteAll(pixmaps); +} + +void tst_qdeclarativepixmapcache::massive() +{ + QUrl url = thisfile.resolved(QUrl("data/massive.png")); + + // Confirm that massive images remain in the cache while they are + // in use by the application. + { + qint64 cachekey = 0; + QDeclarativePixmap p(0, url); + QVERIFY(p.isReady()); + QVERIFY(p.pixmap().size() == QSize(10000, 1000)); + cachekey = p.pixmap().cacheKey(); + + QDeclarativePixmap p2(0, url); + QVERIFY(p2.isReady()); + QVERIFY(p2.pixmap().size() == QSize(10000, 1000)); + + QVERIFY(p2.pixmap().cacheKey() == cachekey); + } + + // Confirm that massive images are removed from the cache when + // they become unused + { + qint64 cachekey = 0; + { + QDeclarativePixmap p(0, url); + QVERIFY(p.isReady()); + QVERIFY(p.pixmap().size() == QSize(10000, 1000)); + cachekey = p.pixmap().cacheKey(); + } + + QDeclarativePixmap p2(0, url); + QVERIFY(p2.isReady()); + QVERIFY(p2.pixmap().size() == QSize(10000, 1000)); + + QVERIFY(p2.pixmap().cacheKey() != cachekey); + } +} + +// QTBUG-12729 +void tst_qdeclarativepixmapcache::cancelcrash() +{ + QUrl url("http://127.0.0.1:14452/cancelcrash_notexist.png"); + for (int ii = 0; ii < 1000; ++ii) { + QDeclarativePixmap pix(&engine, url); + } +} + +class MyPixmapProvider : public QDeclarativeImageProvider +{ +public: + MyPixmapProvider() + : QDeclarativeImageProvider(Pixmap) {} + + virtual QPixmap requestPixmap(const QString &d, QSize *, const QSize &) { + Q_UNUSED(d) + QPixmap pix(800, 600); + pix.fill(Qt::red); + return pix; + } +}; + +// QTBUG-13345 +void tst_qdeclarativepixmapcache::shrinkcache() +{ + QDeclarativeEngine engine; + engine.addImageProvider(QLatin1String("mypixmaps"), new MyPixmapProvider); + + for (int ii = 0; ii < 4000; ++ii) { + QUrl url("image://mypixmaps/" + QString::number(ii)); + QDeclarativePixmap p(&engine, url); + } +} + +#ifndef QT_NO_CONCURRENT + +void createNetworkServer() +{ + QEventLoop eventLoop; + TestHTTPServer server(14453); + server.serveDirectory(SRCDIR "/data/http"); + QTimer::singleShot(100, &eventLoop, SLOT(quit())); + eventLoop.exec(); +} + +#ifndef QT_NO_CONCURRENT +// QT-3957 +void tst_qdeclarativepixmapcache::networkCrash() +{ + QFuture future = QtConcurrent::run(createNetworkServer); + QDeclarativeEngine engine; + for (int ii = 0; ii < 100 ; ++ii) { + QDeclarativePixmap* pixmap = new QDeclarativePixmap; + pixmap->load(&engine, QUrl(QString("http://127.0.0.1:14453/exists.png"))); + QTest::qSleep(1); + pixmap->clear(); + delete pixmap; + } + future.cancel(); +} +#endif + +#endif + +QTEST_MAIN(tst_qdeclarativepixmapcache) + +#include "tst_qdeclarativepixmapcache.moc" diff --git a/tests/auto/declarative/qdeclarativepositioners/data/flow-testimplicitsize.qml b/tests/auto/declarative/qdeclarativepositioners/data/flow-testimplicitsize.qml new file mode 100644 index 00000000..ee4e1048 --- /dev/null +++ b/tests/auto/declarative/qdeclarativepositioners/data/flow-testimplicitsize.qml @@ -0,0 +1,19 @@ +import QtQuick 1.1 + +Rectangle { + width: 300; height: 200; + + property int flowLayout: 1 + + Flow { + objectName: "flow" + layoutDirection: (flowLayout == 2) ? Qt.RightToLeft : Qt.LeftToRight + flow: (flowLayout == 1) ? Flow.TopToBottom : Flow.LeftToRight; + + spacing: 20 + anchors.horizontalCenter: parent.horizontalCenter + Rectangle { color: "red"; width: 100; height: 50 } + Rectangle { color: "blue"; width: 100; height: 50 } + } +} + diff --git a/tests/auto/declarative/qdeclarativepositioners/data/flowtest-toptobottom.qml b/tests/auto/declarative/qdeclarativepositioners/data/flowtest-toptobottom.qml new file mode 100644 index 00000000..ec1d6660 --- /dev/null +++ b/tests/auto/declarative/qdeclarativepositioners/data/flowtest-toptobottom.qml @@ -0,0 +1,44 @@ +import QtQuick 1.1 + +Item { + height: 90 + width: 480 + property bool testRightToLeft: false + + Flow { + objectName: "flow" + height: parent.height + layoutDirection: testRightToLeft ? Qt.RightToLeft : Qt.LeftToRight + flow: Flow.TopToBottom + Rectangle { + objectName: "one" + color: "red" + width: 50 + height: 50 + } + Rectangle { + objectName: "two" + color: "green" + width: 20 + height: 50 + } + Rectangle { + objectName: "three" + color: "blue" + width: 50 + height: 20 + } + Rectangle { + objectName: "four" + color: "cyan" + width: 50 + height: 50 + } + Rectangle { + objectName: "five" + color: "magenta" + width: 10 + height: 10 + } + } +} diff --git a/tests/auto/declarative/qdeclarativepositioners/data/flowtest.qml b/tests/auto/declarative/qdeclarativepositioners/data/flowtest.qml new file mode 100644 index 00000000..7c124a3d --- /dev/null +++ b/tests/auto/declarative/qdeclarativepositioners/data/flowtest.qml @@ -0,0 +1,43 @@ +import QtQuick 1.1 + +Item { + width: 90 + height: 480 + property bool testRightToLeft: false + + Flow { + objectName: "flow" + width: parent.width + layoutDirection: testRightToLeft ? Qt.RightToLeft : Qt.LeftToRight + Rectangle { + objectName: "one" + color: "red" + width: 50 + height: 50 + } + Rectangle { + objectName: "two" + color: "green" + width: 20 + height: 50 + } + Rectangle { + objectName: "three" + color: "blue" + width: 50 + height: 20 + } + Rectangle { + objectName: "four" + color: "cyan" + width: 50 + height: 50 + } + Rectangle { + objectName: "five" + color: "magenta" + width: 10 + height: 10 + } + } +} diff --git a/tests/auto/declarative/qdeclarativepositioners/data/grid-animated.qml b/tests/auto/declarative/qdeclarativepositioners/data/grid-animated.qml new file mode 100644 index 00000000..3dcbed11 --- /dev/null +++ b/tests/auto/declarative/qdeclarativepositioners/data/grid-animated.qml @@ -0,0 +1,64 @@ +import QtQuick 1.1 + +Item { + width: 640 + height: 480 + property bool testRightToLeft: true + + Grid { + objectName: "grid" + columns: 3 + layoutDirection: testRightToLeft ? Qt.RightToLeft : Qt.LeftToRight + add: Transition { + NumberAnimation { + properties: "x,y"; + } + } + move: Transition { + NumberAnimation { + properties: "x,y"; + } + } + Rectangle { + objectName: "one" + color: "red" + x: -100 + y: -100 + width: 50 + height: 50 + } + Rectangle { + objectName: "two" + x: -100 + y: -100 + opacity: 0 + color: "green" + width: 50 + height: 50 + } + Rectangle { + objectName: "three" + color: "blue" + x: -100 + y: -100 + width: 50 + height: 50 + } + Rectangle { + objectName: "four" + color: "cyan" + x: -100 + y: -100 + width: 50 + height: 50 + } + Rectangle { + objectName: "five" + color: "magenta" + x: -100 + y: -100 + width: 50 + height: 50 + } + } +} diff --git a/tests/auto/declarative/qdeclarativepositioners/data/grid-spacing.qml b/tests/auto/declarative/qdeclarativepositioners/data/grid-spacing.qml new file mode 100644 index 00000000..f0373300 --- /dev/null +++ b/tests/auto/declarative/qdeclarativepositioners/data/grid-spacing.qml @@ -0,0 +1,41 @@ +import QtQuick 1.0 + +Item { + width: 640 + height: 480 + Grid { + objectName: "grid" + columns: 3 + spacing: 4 + Rectangle { + objectName: "one" + color: "red" + width: 50 + height: 50 + } + Rectangle { + objectName: "two" + color: "green" + width: 20 + height: 50 + } + Rectangle { + objectName: "three" + color: "blue" + width: 50 + height: 20 + } + Rectangle { + objectName: "four" + color: "cyan" + width: 50 + height: 50 + } + Rectangle { + objectName: "five" + color: "magenta" + width: 10 + height: 10 + } + } +} diff --git a/tests/auto/declarative/qdeclarativepositioners/data/grid-toptobottom.qml b/tests/auto/declarative/qdeclarativepositioners/data/grid-toptobottom.qml new file mode 100644 index 00000000..5d4c3373 --- /dev/null +++ b/tests/auto/declarative/qdeclarativepositioners/data/grid-toptobottom.qml @@ -0,0 +1,41 @@ +import QtQuick 1.0 + +Item { + width: 640 + height: 480 + Grid { + objectName: "grid" + rows: 3 + flow: Grid.TopToBottom + Rectangle { + objectName: "one" + color: "red" + width: 50 + height: 50 + } + Rectangle { + objectName: "two" + color: "green" + width: 20 + height: 50 + } + Rectangle { + objectName: "three" + color: "blue" + width: 50 + height: 20 + } + Rectangle { + objectName: "four" + color: "cyan" + width: 50 + height: 50 + } + Rectangle { + objectName: "five" + color: "magenta" + width: 10 + height: 10 + } + } +} diff --git a/tests/auto/declarative/qdeclarativepositioners/data/gridtest.qml b/tests/auto/declarative/qdeclarativepositioners/data/gridtest.qml new file mode 100644 index 00000000..929b7267 --- /dev/null +++ b/tests/auto/declarative/qdeclarativepositioners/data/gridtest.qml @@ -0,0 +1,42 @@ +import QtQuick 1.1 + +Item { + width: 640 + height: 480 + property bool testRightToLeft: false + Grid { + layoutDirection: testRightToLeft ? Qt.RightToLeft : Qt.LeftToRight + objectName: "grid" + columns: 3 + Rectangle { + objectName: "one" + color: "red" + width: 50 + height: 50 + } + Rectangle { + objectName: "two" + color: "green" + width: 20 + height: 50 + } + Rectangle { + objectName: "three" + color: "blue" + width: 30 + height: 20 + } + Rectangle { + objectName: "four" + color: "cyan" + width: 50 + height: 50 + } + Rectangle { + objectName: "five" + color: "magenta" + width: 10 + height: 10 + } + } +} diff --git a/tests/auto/declarative/qdeclarativepositioners/data/gridzerocolumns.qml b/tests/auto/declarative/qdeclarativepositioners/data/gridzerocolumns.qml new file mode 100644 index 00000000..169f9744 --- /dev/null +++ b/tests/auto/declarative/qdeclarativepositioners/data/gridzerocolumns.qml @@ -0,0 +1,40 @@ +import QtQuick 1.0 + +Item { + width: 640 + height: 480 + Grid { + objectName: "grid" + columns: 0 + Rectangle { + objectName: "one" + color: "red" + width: 50 + height: 50 + } + Rectangle { + objectName: "two" + color: "green" + width: 20 + height: 50 + } + Rectangle { + objectName: "three" + color: "blue" + width: 50 + height: 20 + } + Rectangle { + objectName: "four" + color: "cyan" + width: 50 + height: 50 + } + Rectangle { + objectName: "five" + color: "magenta" + width: 10 + height: 10 + } + } +} diff --git a/tests/auto/declarative/qdeclarativepositioners/data/horizontal-animated.qml b/tests/auto/declarative/qdeclarativepositioners/data/horizontal-animated.qml new file mode 100644 index 00000000..3c95f53f --- /dev/null +++ b/tests/auto/declarative/qdeclarativepositioners/data/horizontal-animated.qml @@ -0,0 +1,44 @@ +import QtQuick 1.1 + +Item { + width: 640 + height: 480 + property bool testRightToLeft: false + + Row { + objectName: "row" + layoutDirection: testRightToLeft ? Qt.RightToLeft : Qt.LeftToRight + add: Transition { + NumberAnimation { + properties: "x"; + } + } + move: Transition { + NumberAnimation { + properties: "x"; + } + } + Rectangle { + objectName: "one" + color: "red" + x: -100; + width: 50 + height: 50 + } + Rectangle { + objectName: "two" + color: "blue" + x: -100; + opacity: 0 + width: 50 + height: 50 + } + Rectangle { + objectName: "three" + x: -100; + color: "green" + width: 50 + height: 50 + } + } +} diff --git a/tests/auto/declarative/qdeclarativepositioners/data/horizontal-spacing.qml b/tests/auto/declarative/qdeclarativepositioners/data/horizontal-spacing.qml new file mode 100644 index 00000000..64bedb02 --- /dev/null +++ b/tests/auto/declarative/qdeclarativepositioners/data/horizontal-spacing.qml @@ -0,0 +1,31 @@ +import QtQuick 1.1 + +Item { + width: 640 + height: 480 + property bool testRightToLeft: false + + Row { + objectName: "row" + spacing: 10 + layoutDirection: testRightToLeft ? Qt.RightToLeft : Qt.LeftToRight + Rectangle { + objectName: "one" + color: "red" + width: 50 + height: 50 + } + Rectangle { + objectName: "two" + color: "red" + width: 20 + height: 10 + } + Rectangle { + objectName: "three" + color: "red" + width: 40 + height: 20 + } + } +} diff --git a/tests/auto/declarative/qdeclarativepositioners/data/horizontal.qml b/tests/auto/declarative/qdeclarativepositioners/data/horizontal.qml new file mode 100644 index 00000000..d35c02d5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativepositioners/data/horizontal.qml @@ -0,0 +1,29 @@ +import QtQuick 1.1 + +Item { + width: 640 + height: 480 + property bool testRightToLeft: false + Row { + objectName: "row" + layoutDirection: testRightToLeft ? Qt.RightToLeft : Qt.LeftToRight + Rectangle { + objectName: "one" + color: "red" + width: 50 + height: 50 + } + Rectangle { + objectName: "two" + color: "red" + width: 20 + height: 10 + } + Rectangle { + objectName: "three" + color: "red" + width: 40 + height: 20 + } + } +} diff --git a/tests/auto/declarative/qdeclarativepositioners/data/propertychangestest.qml b/tests/auto/declarative/qdeclarativepositioners/data/propertychangestest.qml new file mode 100644 index 00000000..3c95c4c2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativepositioners/data/propertychangestest.qml @@ -0,0 +1,39 @@ +import QtQuick 1.0 + +Grid { + id: myGrid + + width: 270 + height: 270 + x: 3 + y: 3 + columns: 4 + spacing: 3 + + add: columnTransition + move: columnTransition + + Repeater { + model: 20 + Rectangle { color: "black"; width: 50; height: 50 } + } + + data: [ + Transition { + id: rowTransition + objectName: "rowTransition" + NumberAnimation { + properties: "x,y"; + easing.type: "OutInCubic" + } + }, + Transition { + id: columnTransition + objectName: "columnTransition" + NumberAnimation { + properties: "x,y"; + easing.type: "OutInCubic" + } + } + ] +} diff --git a/tests/auto/declarative/qdeclarativepositioners/data/repeatertest.qml b/tests/auto/declarative/qdeclarativepositioners/data/repeatertest.qml new file mode 100644 index 00000000..f93ce67d --- /dev/null +++ b/tests/auto/declarative/qdeclarativepositioners/data/repeatertest.qml @@ -0,0 +1,38 @@ +import QtQuick 1.0 + +Item { + width: 640 + height: 480 + Row { + Repeater{ model: 3; + delegate: Component { + Rectangle { + color: "red" + width: 50 + height: 50 + z: {if(index == 0){2;}else if(index == 1){1;} else{3;}} + objectName: {if(index == 0){"one";}else if(index == 1){"two";} else{"three";}} + } + } + } + } + + //This crashed once (QTBUG-16959) because the repeater ended up on the end of the list + //If this grid just instantiates without crashing, then it has not regressed. + Grid { + id: grid + rows: 2 + flow: Grid.TopToBottom + + Repeater { + model: 13 + Rectangle { + color: "goldenrod" + width: 100 + height: 100 + radius: 10 + border.width: 1 + } + } + } +} diff --git a/tests/auto/declarative/qdeclarativepositioners/data/vertical-animated.qml b/tests/auto/declarative/qdeclarativepositioners/data/vertical-animated.qml new file mode 100644 index 00000000..8899ac83 --- /dev/null +++ b/tests/auto/declarative/qdeclarativepositioners/data/vertical-animated.qml @@ -0,0 +1,41 @@ +import QtQuick 1.0 + +Item { + width: 640 + height: 480 + Column { + objectName: "column" + add: Transition { + NumberAnimation { + properties: "y"; + } + } + move: Transition { + NumberAnimation { + properties: "y"; + } + } + Rectangle { + objectName: "one" + color: "red" + y: -100 + width: 50 + height: 50 + } + Rectangle { + objectName: "two" + color: "blue" + y: -100 + opacity: 0 + width: 50 + height: 50 + } + Rectangle { + objectName: "three" + color: "red" + y: -100 + width: 50 + height: 50 + } + } +} diff --git a/tests/auto/declarative/qdeclarativepositioners/data/vertical-spacing.qml b/tests/auto/declarative/qdeclarativepositioners/data/vertical-spacing.qml new file mode 100644 index 00000000..55789611 --- /dev/null +++ b/tests/auto/declarative/qdeclarativepositioners/data/vertical-spacing.qml @@ -0,0 +1,28 @@ +import QtQuick 1.0 + +Item { + width: 640 + height: 480 + Column { + objectName: "column" + spacing: 10 + Rectangle { + objectName: "one" + color: "red" + width: 50 + height: 50 + } + Rectangle { + objectName: "two" + color: "red" + width: 20 + height: 10 + } + Rectangle { + objectName: "three" + color: "red" + width: 40 + height: 20 + } + } +} diff --git a/tests/auto/declarative/qdeclarativepositioners/data/vertical.qml b/tests/auto/declarative/qdeclarativepositioners/data/vertical.qml new file mode 100644 index 00000000..310d791d --- /dev/null +++ b/tests/auto/declarative/qdeclarativepositioners/data/vertical.qml @@ -0,0 +1,27 @@ +import QtQuick 1.0 + +Item { + width: 640 + height: 480 + Column { + objectName: "column" + Rectangle { + objectName: "one" + color: "red" + width: 50 + height: 50 + } + Rectangle { + objectName: "two" + color: "red" + width: 20 + height: 10 + } + Rectangle { + objectName: "three" + color: "red" + width: 40 + height: 20 + } + } +} diff --git a/tests/auto/declarative/qdeclarativepositioners/data/verticalqgraphicswidget.qml b/tests/auto/declarative/qdeclarativepositioners/data/verticalqgraphicswidget.qml new file mode 100644 index 00000000..c320714f --- /dev/null +++ b/tests/auto/declarative/qdeclarativepositioners/data/verticalqgraphicswidget.qml @@ -0,0 +1,24 @@ +import QtQuick 1.0 + +Item { + width: 640 + height: 480 + Column { + objectName: "column" + QGraphicsWidget { + objectName: "one" + width: 50 + height: 50 + } + QGraphicsWidget { + objectName: "two" + width: 20 + height: 10 + } + QGraphicsWidget { + objectName: "three" + width: 40 + height: 20 + } + } +} diff --git a/tests/auto/declarative/qdeclarativepositioners/qdeclarativepositioners.pro b/tests/auto/declarative/qdeclarativepositioners/qdeclarativepositioners.pro new file mode 100644 index 00000000..27e59485 --- /dev/null +++ b/tests/auto/declarative/qdeclarativepositioners/qdeclarativepositioners.pro @@ -0,0 +1,15 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +SOURCES += tst_qdeclarativepositioners.cpp +macx:CONFIG -= app_bundle + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativepositioners/tst_qdeclarativepositioners.cpp b/tests/auto/declarative/qdeclarativepositioners/tst_qdeclarativepositioners.cpp new file mode 100644 index 00000000..31a49391 --- /dev/null +++ b/tests/auto/declarative/qdeclarativepositioners/tst_qdeclarativepositioners.cpp @@ -0,0 +1,1342 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../../../shared/util.h" + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_QDeclarativePositioners : public QObject +{ + Q_OBJECT +public: + tst_QDeclarativePositioners(); + +private slots: + void test_horizontal(); + void test_horizontal_rtl(); + void test_horizontal_spacing(); + void test_horizontal_spacing_rightToLeft(); + void test_horizontal_animated(); + void test_horizontal_animated_rightToLeft(); + void test_vertical(); + void test_vertical_spacing(); + void test_vertical_animated(); + void test_grid(); + void test_grid_topToBottom(); + void test_grid_rightToLeft(); + void test_grid_spacing(); + void test_grid_animated(); + void test_grid_animated_rightToLeft(); + void test_grid_zero_columns(); + void test_propertychanges(); + void test_repeater(); + void test_flow(); + void test_flow_rightToLeft(); + void test_flow_topToBottom(); + void test_flow_resize(); + void test_flow_resize_rightToLeft(); + void test_flow_implicit_resize(); + void test_conflictinganchors(); + void test_vertical_qgraphicswidget(); + void test_mirroring(); + void testQtQuick11Attributes(); + void testQtQuick11Attributes_data(); +private: + QDeclarativeView *createView(const QString &filename); +}; + +tst_QDeclarativePositioners::tst_QDeclarativePositioners() +{ +} + +void tst_QDeclarativePositioners::test_horizontal() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/horizontal.qml"); + + canvas->rootObject()->setProperty("testRightToLeft", false); + + QDeclarativeRectangle *one = canvas->rootObject()->findChild("one"); + QVERIFY(one != 0); + + QDeclarativeRectangle *two = canvas->rootObject()->findChild("two"); + QVERIFY(two != 0); + + QDeclarativeRectangle *three = canvas->rootObject()->findChild("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); + + QDeclarativeItem *row = canvas->rootObject()->findChild("row"); + QCOMPARE(row->width(), 110.0); + QCOMPARE(row->height(), 50.0); + + delete canvas; +} + +void tst_QDeclarativePositioners::test_horizontal_rtl() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/horizontal.qml"); + + canvas->rootObject()->setProperty("testRightToLeft", true); + + QDeclarativeRectangle *one = canvas->rootObject()->findChild("one"); + QVERIFY(one != 0); + + QDeclarativeRectangle *two = canvas->rootObject()->findChild("two"); + QVERIFY(two != 0); + + QDeclarativeRectangle *three = canvas->rootObject()->findChild("three"); + QVERIFY(three != 0); + + QCOMPARE(one->x(), 60.0); + QCOMPARE(one->y(), 0.0); + QCOMPARE(two->x(), 40.0); + QCOMPARE(two->y(), 0.0); + QCOMPARE(three->x(), 0.0); + QCOMPARE(three->y(), 0.0); + + QDeclarativeItem *row = canvas->rootObject()->findChild("row"); + QCOMPARE(row->width(), 110.0); + QCOMPARE(row->height(), 50.0); + + // Change the width of the row and check that items stay to the right + row->setWidth(200); + QCOMPARE(one->x(), 150.0); + QCOMPARE(one->y(), 0.0); + QCOMPARE(two->x(), 130.0); + QCOMPARE(two->y(), 0.0); + QCOMPARE(three->x(), 90.0); + QCOMPARE(three->y(), 0.0); + + delete canvas; +} + +void tst_QDeclarativePositioners::test_horizontal_spacing() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/horizontal-spacing.qml"); + + canvas->rootObject()->setProperty("testRightToLeft", false); + + QDeclarativeRectangle *one = canvas->rootObject()->findChild("one"); + QVERIFY(one != 0); + + QDeclarativeRectangle *two = canvas->rootObject()->findChild("two"); + QVERIFY(two != 0); + + QDeclarativeRectangle *three = canvas->rootObject()->findChild("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); + + QDeclarativeItem *row = canvas->rootObject()->findChild("row"); + QCOMPARE(row->width(), 130.0); + QCOMPARE(row->height(), 50.0); + + delete canvas; +} + +void tst_QDeclarativePositioners::test_horizontal_spacing_rightToLeft() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/horizontal-spacing.qml"); + + canvas->rootObject()->setProperty("testRightToLeft", true); + + QDeclarativeRectangle *one = canvas->rootObject()->findChild("one"); + QVERIFY(one != 0); + + QDeclarativeRectangle *two = canvas->rootObject()->findChild("two"); + QVERIFY(two != 0); + + QDeclarativeRectangle *three = canvas->rootObject()->findChild("three"); + QVERIFY(three != 0); + + QCOMPARE(one->x(), 80.0); + QCOMPARE(one->y(), 0.0); + QCOMPARE(two->x(), 50.0); + QCOMPARE(two->y(), 0.0); + QCOMPARE(three->x(), 00.0); + QCOMPARE(three->y(), 0.0); + + QDeclarativeItem *row = canvas->rootObject()->findChild("row"); + QCOMPARE(row->width(), 130.0); + QCOMPARE(row->height(), 50.0); + + delete canvas; +} + +void tst_QDeclarativePositioners::test_horizontal_animated() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/horizontal-animated.qml"); + + canvas->rootObject()->setProperty("testRightToLeft", false); + + QDeclarativeRectangle *one = canvas->rootObject()->findChild("one"); + QVERIFY(one != 0); + + QDeclarativeRectangle *two = canvas->rootObject()->findChild("two"); + QVERIFY(two != 0); + + QDeclarativeRectangle *three = canvas->rootObject()->findChild("three"); + QVERIFY(three != 0); + + //Note that they animate in + QCOMPARE(one->x(), -100.0); + QCOMPARE(two->x(), -100.0); + QCOMPARE(three->x(), -100.0); + + QDeclarativeItem *row = canvas->rootObject()->findChild("row"); + QVERIFY(row); + QCOMPARE(row->width(), 100.0); + QCOMPARE(row->height(), 50.0); + + //QTRY_COMPARE used instead of waiting for the expected time of animation completion + //Note that this means the duration of the animation is NOT tested + + QTRY_COMPARE(one->x(), 0.0); + QTRY_COMPARE(one->y(), 0.0); + QTRY_COMPARE(two->opacity(), 0.0); + QTRY_COMPARE(two->x(), -100.0);//Not 'in' yet + QTRY_COMPARE(two->y(), 0.0); + QTRY_COMPARE(three->x(), 50.0); + QTRY_COMPARE(three->y(), 0.0); + + //Add 'two' + two->setOpacity(1.0); + QCOMPARE(two->opacity(), 1.0); + + // New size should be immediate + QCOMPARE(row->width(), 150.0); + QCOMPARE(row->height(), 50.0); + + QTest::qWait(0);//Let the animation start + QCOMPARE(two->x(), -100.0); + QCOMPARE(three->x(), 50.0); + + QTRY_COMPARE(two->x(), 50.0); + QTRY_COMPARE(three->x(), 100.0); + + delete canvas; +} + +void tst_QDeclarativePositioners::test_horizontal_animated_rightToLeft() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/horizontal-animated.qml"); + + canvas->rootObject()->setProperty("testRightToLeft", true); + + QDeclarativeRectangle *one = canvas->rootObject()->findChild("one"); + QVERIFY(one != 0); + + QDeclarativeRectangle *two = canvas->rootObject()->findChild("two"); + QVERIFY(two != 0); + + QDeclarativeRectangle *three = canvas->rootObject()->findChild("three"); + QVERIFY(three != 0); + + //Note that they animate in + QCOMPARE(one->x(), -100.0); + QCOMPARE(two->x(), -100.0); + QCOMPARE(three->x(), -100.0); + + QDeclarativeItem *row = canvas->rootObject()->findChild("row"); + QVERIFY(row); + QCOMPARE(row->width(), 100.0); + QCOMPARE(row->height(), 50.0); + + //QTRY_COMPARE used instead of waiting for the expected time of animation completion + //Note that this means the duration of the animation is NOT tested + + QTRY_COMPARE(one->x(), 50.0); + QTRY_COMPARE(one->y(), 0.0); + QTRY_COMPARE(two->opacity(), 0.0); + QTRY_COMPARE(two->x(), -100.0);//Not 'in' yet + QTRY_COMPARE(two->y(), 0.0); + QTRY_COMPARE(three->x(), 0.0); + QTRY_COMPARE(three->y(), 0.0); + + //Add 'two' + two->setOpacity(1.0); + QCOMPARE(two->opacity(), 1.0); + + // New size should be immediate + QCOMPARE(row->width(), 150.0); + QCOMPARE(row->height(), 50.0); + + QTest::qWait(0);//Let the animation start + QCOMPARE(one->x(), 50.0); + QCOMPARE(two->x(), -100.0); + + QTRY_COMPARE(one->x(), 100.0); + QTRY_COMPARE(two->x(), 50.0); + + delete canvas; +} + +void tst_QDeclarativePositioners::test_vertical() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/vertical.qml"); + + QDeclarativeRectangle *one = canvas->rootObject()->findChild("one"); + QVERIFY(one != 0); + + QDeclarativeRectangle *two = canvas->rootObject()->findChild("two"); + QVERIFY(two != 0); + + QDeclarativeRectangle *three = canvas->rootObject()->findChild("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); + + QDeclarativeItem *column = canvas->rootObject()->findChild("column"); + QVERIFY(column); + QCOMPARE(column->height(), 80.0); + QCOMPARE(column->width(), 50.0); + + delete canvas; +} + +void tst_QDeclarativePositioners::test_vertical_spacing() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/vertical-spacing.qml"); + + QDeclarativeRectangle *one = canvas->rootObject()->findChild("one"); + QVERIFY(one != 0); + + QDeclarativeRectangle *two = canvas->rootObject()->findChild("two"); + QVERIFY(two != 0); + + QDeclarativeRectangle *three = canvas->rootObject()->findChild("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); + + QDeclarativeItem *column = canvas->rootObject()->findChild("column"); + QCOMPARE(column->height(), 100.0); + QCOMPARE(column->width(), 50.0); + + delete canvas; +} + +void tst_QDeclarativePositioners::test_vertical_animated() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/vertical-animated.qml"); + + //Note that they animate in + QDeclarativeRectangle *one = canvas->rootObject()->findChild("one"); + QVERIFY(one != 0); + QCOMPARE(one->y(), -100.0); + + QDeclarativeRectangle *two = canvas->rootObject()->findChild("two"); + QVERIFY(two != 0); + QCOMPARE(two->y(), -100.0); + + QDeclarativeRectangle *three = canvas->rootObject()->findChild("three"); + QVERIFY(three != 0); + QCOMPARE(three->y(), -100.0); + + QDeclarativeItem *column = canvas->rootObject()->findChild("column"); + QVERIFY(column); + QCOMPARE(column->height(), 100.0); + QCOMPARE(column->width(), 50.0); + + //QTRY_COMPARE used instead of waiting for the expected time of animation completion + //Note that this means the duration of the animation is NOT tested + + QTRY_COMPARE(one->y(), 0.0); + QTRY_COMPARE(one->x(), 0.0); + QTRY_COMPARE(two->opacity(), 0.0); + QTRY_COMPARE(two->y(), -100.0);//Not 'in' yet + QTRY_COMPARE(two->x(), 0.0); + QTRY_COMPARE(three->y(), 50.0); + QTRY_COMPARE(three->x(), 0.0); + + //Add 'two' + two->setOpacity(1.0); + QTRY_COMPARE(two->opacity(), 1.0); + QCOMPARE(column->height(), 150.0); + QCOMPARE(column->width(), 50.0); + QTest::qWait(0);//Let the animation start + QCOMPARE(two->y(), -100.0); + QCOMPARE(three->y(), 50.0); + + QTRY_COMPARE(two->y(), 50.0); + QTRY_COMPARE(three->y(), 100.0); + + delete canvas; +} + +void tst_QDeclarativePositioners::test_grid() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/gridtest.qml"); + + QDeclarativeRectangle *one = canvas->rootObject()->findChild("one"); + QVERIFY(one != 0); + QDeclarativeRectangle *two = canvas->rootObject()->findChild("two"); + QVERIFY(two != 0); + QDeclarativeRectangle *three = canvas->rootObject()->findChild("three"); + QVERIFY(three != 0); + QDeclarativeRectangle *four = canvas->rootObject()->findChild("four"); + QVERIFY(four != 0); + QDeclarativeRectangle *five = canvas->rootObject()->findChild("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); + + QDeclarativeGrid *grid = canvas->rootObject()->findChild("grid"); + QCOMPARE(grid->flow(), QDeclarativeGrid::LeftToRight); + QCOMPARE(grid->width(), 100.0); + QCOMPARE(grid->height(), 100.0); + + delete canvas; +} + +void tst_QDeclarativePositioners::test_grid_topToBottom() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/grid-toptobottom.qml"); + + QDeclarativeRectangle *one = canvas->rootObject()->findChild("one"); + QVERIFY(one != 0); + QDeclarativeRectangle *two = canvas->rootObject()->findChild("two"); + QVERIFY(two != 0); + QDeclarativeRectangle *three = canvas->rootObject()->findChild("three"); + QVERIFY(three != 0); + QDeclarativeRectangle *four = canvas->rootObject()->findChild("four"); + QVERIFY(four != 0); + QDeclarativeRectangle *five = canvas->rootObject()->findChild("five"); + QVERIFY(five != 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(), 100.0); + QCOMPARE(four->x(), 50.0); + QCOMPARE(four->y(), 0.0); + QCOMPARE(five->x(), 50.0); + QCOMPARE(five->y(), 50.0); + + QDeclarativeGrid *grid = canvas->rootObject()->findChild("grid"); + QCOMPARE(grid->flow(), QDeclarativeGrid::TopToBottom); + QCOMPARE(grid->width(), 100.0); + QCOMPARE(grid->height(), 120.0); + + delete canvas; +} + +void tst_QDeclarativePositioners::test_grid_rightToLeft() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/gridtest.qml"); + + canvas->rootObject()->setProperty("testRightToLeft", true); + + QDeclarativeRectangle *one = canvas->rootObject()->findChild("one"); + QVERIFY(one != 0); + QDeclarativeRectangle *two = canvas->rootObject()->findChild("two"); + QVERIFY(two != 0); + QDeclarativeRectangle *three = canvas->rootObject()->findChild("three"); + QVERIFY(three != 0); + QDeclarativeRectangle *four = canvas->rootObject()->findChild("four"); + QVERIFY(four != 0); + QDeclarativeRectangle *five = canvas->rootObject()->findChild("five"); + QVERIFY(five != 0); + + QCOMPARE(one->x(), 50.0); + QCOMPARE(one->y(), 0.0); + QCOMPARE(two->x(), 30.0); + QCOMPARE(two->y(), 0.0); + QCOMPARE(three->x(), 0.0); + QCOMPARE(three->y(), 0.0); + QCOMPARE(four->x(), 50.0); + QCOMPARE(four->y(), 50.0); + QCOMPARE(five->x(), 40.0); + QCOMPARE(five->y(), 50.0); + + QDeclarativeGrid *grid = canvas->rootObject()->findChild("grid"); + QCOMPARE(grid->layoutDirection(), Qt::RightToLeft); + QCOMPARE(grid->width(), 100.0); + QCOMPARE(grid->height(), 100.0); + + // Change the width of the grid and check that items stay to the right + grid->setWidth(200); + QCOMPARE(one->x(), 150.0); + QCOMPARE(one->y(), 0.0); + QCOMPARE(two->x(), 130.0); + QCOMPARE(two->y(), 0.0); + QCOMPARE(three->x(), 100.0); + QCOMPARE(three->y(), 0.0); + QCOMPARE(four->x(), 150.0); + QCOMPARE(four->y(), 50.0); + QCOMPARE(five->x(), 140.0); + QCOMPARE(five->y(), 50.0); + + delete canvas; +} + +void tst_QDeclarativePositioners::test_grid_spacing() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/grid-spacing.qml"); + + QDeclarativeRectangle *one = canvas->rootObject()->findChild("one"); + QVERIFY(one != 0); + QDeclarativeRectangle *two = canvas->rootObject()->findChild("two"); + QVERIFY(two != 0); + QDeclarativeRectangle *three = canvas->rootObject()->findChild("three"); + QVERIFY(three != 0); + QDeclarativeRectangle *four = canvas->rootObject()->findChild("four"); + QVERIFY(four != 0); + QDeclarativeRectangle *five = canvas->rootObject()->findChild("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); + + QDeclarativeItem *grid = canvas->rootObject()->findChild("grid"); + QCOMPARE(grid->width(), 128.0); + QCOMPARE(grid->height(), 104.0); + + delete canvas; +} + +void tst_QDeclarativePositioners::test_grid_animated() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/grid-animated.qml"); + + canvas->rootObject()->setProperty("testRightToLeft", false); + + //Note that all animate in + QDeclarativeRectangle *one = canvas->rootObject()->findChild("one"); + QVERIFY(one != 0); + QCOMPARE(one->x(), -100.0); + QCOMPARE(one->y(), -100.0); + + QDeclarativeRectangle *two = canvas->rootObject()->findChild("two"); + QVERIFY(two != 0); + QCOMPARE(two->x(), -100.0); + QCOMPARE(two->y(), -100.0); + + QDeclarativeRectangle *three = canvas->rootObject()->findChild("three"); + QVERIFY(three != 0); + QCOMPARE(three->x(), -100.0); + QCOMPARE(three->y(), -100.0); + + QDeclarativeRectangle *four = canvas->rootObject()->findChild("four"); + QVERIFY(four != 0); + QCOMPARE(four->x(), -100.0); + QCOMPARE(four->y(), -100.0); + + QDeclarativeRectangle *five = canvas->rootObject()->findChild("five"); + QVERIFY(five != 0); + QCOMPARE(five->x(), -100.0); + QCOMPARE(five->y(), -100.0); + + QDeclarativeItem *grid = canvas->rootObject()->findChild("grid"); + QVERIFY(grid); + QCOMPARE(grid->width(), 150.0); + QCOMPARE(grid->height(), 100.0); + + //QTRY_COMPARE used instead of waiting for the expected time of animation completion + //Note that this means the duration of the animation is NOT tested + + QTRY_COMPARE(one->y(), 0.0); + QTRY_COMPARE(one->x(), 0.0); + QTRY_COMPARE(two->opacity(), 0.0); + QTRY_COMPARE(two->y(), -100.0); + QTRY_COMPARE(two->x(), -100.0); + QTRY_COMPARE(three->y(), 0.0); + QTRY_COMPARE(three->x(), 50.0); + QTRY_COMPARE(four->y(), 0.0); + QTRY_COMPARE(four->x(), 100.0); + QTRY_COMPARE(five->y(), 50.0); + QTRY_COMPARE(five->x(), 0.0); + + //Add 'two' + two->setOpacity(1.0); + QCOMPARE(two->opacity(), 1.0); + QCOMPARE(grid->width(), 150.0); + QCOMPARE(grid->height(), 100.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); + //Let the animation complete + QTRY_COMPARE(two->x(), 50.0); + QTRY_COMPARE(two->y(), 0.0); + QTRY_COMPARE(one->x(), 0.0); + QTRY_COMPARE(one->y(), 0.0); + QTRY_COMPARE(three->x(), 100.0); + QTRY_COMPARE(three->y(), 0.0); + QTRY_COMPARE(four->x(), 0.0); + QTRY_COMPARE(four->y(), 50.0); + QTRY_COMPARE(five->x(), 50.0); + QTRY_COMPARE(five->y(), 50.0); + + delete canvas; +} + +void tst_QDeclarativePositioners::test_grid_animated_rightToLeft() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/grid-animated.qml"); + + canvas->rootObject()->setProperty("testRightToLeft", true); + + //Note that all animate in + QDeclarativeRectangle *one = canvas->rootObject()->findChild("one"); + QVERIFY(one != 0); + QCOMPARE(one->x(), -100.0); + QCOMPARE(one->y(), -100.0); + + QDeclarativeRectangle *two = canvas->rootObject()->findChild("two"); + QVERIFY(two != 0); + QCOMPARE(two->x(), -100.0); + QCOMPARE(two->y(), -100.0); + + QDeclarativeRectangle *three = canvas->rootObject()->findChild("three"); + QVERIFY(three != 0); + QCOMPARE(three->x(), -100.0); + QCOMPARE(three->y(), -100.0); + + QDeclarativeRectangle *four = canvas->rootObject()->findChild("four"); + QVERIFY(four != 0); + QCOMPARE(four->x(), -100.0); + QCOMPARE(four->y(), -100.0); + + QDeclarativeRectangle *five = canvas->rootObject()->findChild("five"); + QVERIFY(five != 0); + QCOMPARE(five->x(), -100.0); + QCOMPARE(five->y(), -100.0); + + QDeclarativeItem *grid = canvas->rootObject()->findChild("grid"); + QVERIFY(grid); + QCOMPARE(grid->width(), 150.0); + QCOMPARE(grid->height(), 100.0); + + //QTRY_COMPARE used instead of waiting for the expected time of animation completion + //Note that this means the duration of the animation is NOT tested + + QTRY_COMPARE(one->y(), 0.0); + QTRY_COMPARE(one->x(), 100.0); + QTRY_COMPARE(two->opacity(), 0.0); + QTRY_COMPARE(two->y(), -100.0); + QTRY_COMPARE(two->x(), -100.0); + QTRY_COMPARE(three->y(), 0.0); + QTRY_COMPARE(three->x(), 50.0); + QTRY_COMPARE(four->y(), 0.0); + QTRY_COMPARE(four->x(), 0.0); + QTRY_COMPARE(five->y(), 50.0); + QTRY_COMPARE(five->x(), 100.0); + + //Add 'two' + two->setOpacity(1.0); + QCOMPARE(two->opacity(), 1.0); + QCOMPARE(grid->width(), 150.0); + QCOMPARE(grid->height(), 100.0); + QTest::qWait(0);//Let the animation start + QCOMPARE(two->x(), -100.0); + QCOMPARE(two->y(), -100.0); + QCOMPARE(one->x(), 100.0); + QCOMPARE(one->y(), 0.0); + QCOMPARE(three->x(), 50.0); + QCOMPARE(three->y(), 0.0); + QCOMPARE(four->x(), 0.0); + QCOMPARE(four->y(), 0.0); + QCOMPARE(five->x(), 100.0); + QCOMPARE(five->y(), 50.0); + //Let the animation complete + QTRY_COMPARE(two->x(), 50.0); + QTRY_COMPARE(two->y(), 0.0); + QTRY_COMPARE(one->x(), 100.0); + QTRY_COMPARE(one->y(), 0.0); + QTRY_COMPARE(three->x(), 0.0); + QTRY_COMPARE(three->y(), 0.0); + QTRY_COMPARE(four->x(), 100.0); + QTRY_COMPARE(four->y(), 50.0); + QTRY_COMPARE(five->x(), 50.0); + QTRY_COMPARE(five->y(), 50.0); + + delete canvas; +} + +void tst_QDeclarativePositioners::test_grid_zero_columns() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/gridzerocolumns.qml"); + + QDeclarativeRectangle *one = canvas->rootObject()->findChild("one"); + QVERIFY(one != 0); + QDeclarativeRectangle *two = canvas->rootObject()->findChild("two"); + QVERIFY(two != 0); + QDeclarativeRectangle *three = canvas->rootObject()->findChild("three"); + QVERIFY(three != 0); + QDeclarativeRectangle *four = canvas->rootObject()->findChild("four"); + QVERIFY(four != 0); + QDeclarativeRectangle *five = canvas->rootObject()->findChild("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(), 120.0); + QCOMPARE(four->y(), 0.0); + QCOMPARE(five->x(), 0.0); + QCOMPARE(five->y(), 50.0); + + QDeclarativeItem *grid = canvas->rootObject()->findChild("grid"); + QCOMPARE(grid->width(), 170.0); + QCOMPARE(grid->height(), 60.0); + + delete canvas; +} + +void tst_QDeclarativePositioners::test_propertychanges() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/propertychangestest.qml"); + + QDeclarativeGrid *grid = qobject_cast(canvas->rootObject()); + QVERIFY(grid != 0); + QDeclarativeTransition *rowTransition = canvas->rootObject()->findChild("rowTransition"); + QDeclarativeTransition *columnTransition = canvas->rootObject()->findChild("columnTransition"); + + QSignalSpy addSpy(grid, SIGNAL(addChanged())); + QSignalSpy moveSpy(grid, SIGNAL(moveChanged())); + QSignalSpy columnsSpy(grid, SIGNAL(columnsChanged())); + QSignalSpy rowsSpy(grid, SIGNAL(rowsChanged())); + + QVERIFY(grid); + QVERIFY(rowTransition); + QVERIFY(columnTransition); + QCOMPARE(grid->add(), columnTransition); + QCOMPARE(grid->move(), columnTransition); + QCOMPARE(grid->columns(), 4); + QCOMPARE(grid->rows(), -1); + + grid->setAdd(rowTransition); + grid->setMove(rowTransition); + QCOMPARE(grid->add(), rowTransition); + QCOMPARE(grid->move(), rowTransition); + QCOMPARE(addSpy.count(),1); + QCOMPARE(moveSpy.count(),1); + + grid->setAdd(rowTransition); + grid->setMove(rowTransition); + QCOMPARE(addSpy.count(),1); + QCOMPARE(moveSpy.count(),1); + + grid->setAdd(0); + grid->setMove(0); + QCOMPARE(addSpy.count(),2); + QCOMPARE(moveSpy.count(),2); + + grid->setColumns(-1); + grid->setRows(3); + QCOMPARE(grid->columns(), -1); + QCOMPARE(grid->rows(), 3); + QCOMPARE(columnsSpy.count(),1); + QCOMPARE(rowsSpy.count(),1); + + grid->setColumns(-1); + grid->setRows(3); + QCOMPARE(columnsSpy.count(),1); + QCOMPARE(rowsSpy.count(),1); + + grid->setColumns(2); + grid->setRows(2); + QCOMPARE(columnsSpy.count(),2); + QCOMPARE(rowsSpy.count(),2); + + delete canvas; +} + +void tst_QDeclarativePositioners::test_repeater() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/repeatertest.qml"); + + QDeclarativeRectangle *one = canvas->rootObject()->findChild("one"); + QVERIFY(one != 0); + + QDeclarativeRectangle *two = canvas->rootObject()->findChild("two"); + QVERIFY(two != 0); + + QDeclarativeRectangle *three = canvas->rootObject()->findChild("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); + + delete canvas; +} + +void tst_QDeclarativePositioners::test_flow() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/flowtest.qml"); + + canvas->rootObject()->setProperty("testRightToLeft", false); + + QDeclarativeRectangle *one = canvas->rootObject()->findChild("one"); + QVERIFY(one != 0); + QDeclarativeRectangle *two = canvas->rootObject()->findChild("two"); + QVERIFY(two != 0); + QDeclarativeRectangle *three = canvas->rootObject()->findChild("three"); + QVERIFY(three != 0); + QDeclarativeRectangle *four = canvas->rootObject()->findChild("four"); + QVERIFY(four != 0); + QDeclarativeRectangle *five = canvas->rootObject()->findChild("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(), 0.0); + QCOMPARE(three->y(), 50.0); + QCOMPARE(four->x(), 0.0); + QCOMPARE(four->y(), 70.0); + QCOMPARE(five->x(), 50.0); + QCOMPARE(five->y(), 70.0); + + QDeclarativeItem *flow = canvas->rootObject()->findChild("flow"); + QVERIFY(flow); + QCOMPARE(flow->width(), 90.0); + QCOMPARE(flow->height(), 120.0); + + delete canvas; +} + +void tst_QDeclarativePositioners::test_flow_rightToLeft() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/flowtest.qml"); + + canvas->rootObject()->setProperty("testRightToLeft", true); + + QDeclarativeRectangle *one = canvas->rootObject()->findChild("one"); + QVERIFY(one != 0); + QDeclarativeRectangle *two = canvas->rootObject()->findChild("two"); + QVERIFY(two != 0); + QDeclarativeRectangle *three = canvas->rootObject()->findChild("three"); + QVERIFY(three != 0); + QDeclarativeRectangle *four = canvas->rootObject()->findChild("four"); + QVERIFY(four != 0); + QDeclarativeRectangle *five = canvas->rootObject()->findChild("five"); + QVERIFY(five != 0); + + QCOMPARE(one->x(), 40.0); + QCOMPARE(one->y(), 0.0); + QCOMPARE(two->x(), 20.0); + QCOMPARE(two->y(), 0.0); + QCOMPARE(three->x(), 40.0); + QCOMPARE(three->y(), 50.0); + QCOMPARE(four->x(), 40.0); + QCOMPARE(four->y(), 70.0); + QCOMPARE(five->x(), 30.0); + QCOMPARE(five->y(), 70.0); + + QDeclarativeItem *flow = canvas->rootObject()->findChild("flow"); + QVERIFY(flow); + QCOMPARE(flow->width(), 90.0); + QCOMPARE(flow->height(), 120.0); + + delete canvas; +} + +void tst_QDeclarativePositioners::test_flow_topToBottom() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/flowtest-toptobottom.qml"); + + canvas->rootObject()->setProperty("testRightToLeft", false); + + QDeclarativeRectangle *one = canvas->rootObject()->findChild("one"); + QVERIFY(one != 0); + QDeclarativeRectangle *two = canvas->rootObject()->findChild("two"); + QVERIFY(two != 0); + QDeclarativeRectangle *three = canvas->rootObject()->findChild("three"); + QVERIFY(three != 0); + QDeclarativeRectangle *four = canvas->rootObject()->findChild("four"); + QVERIFY(four != 0); + QDeclarativeRectangle *five = canvas->rootObject()->findChild("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(), 50.0); + QCOMPARE(three->y(), 50.0); + QCOMPARE(four->x(), 100.0); + QCOMPARE(four->y(), 00.0); + QCOMPARE(five->x(), 100.0); + QCOMPARE(five->y(), 50.0); + + QDeclarativeItem *flow = canvas->rootObject()->findChild("flow"); + QVERIFY(flow); + QCOMPARE(flow->height(), 90.0); + QCOMPARE(flow->width(), 150.0); + + canvas->rootObject()->setProperty("testRightToLeft", true); + + QVERIFY(flow); + QCOMPARE(flow->height(), 90.0); + QCOMPARE(flow->width(), 150.0); + + QCOMPARE(one->x(), 100.0); + QCOMPARE(one->y(), 0.0); + QCOMPARE(two->x(), 80.0); + QCOMPARE(two->y(), 0.0); + QCOMPARE(three->x(), 50.0); + QCOMPARE(three->y(), 50.0); + QCOMPARE(four->x(), 0.0); + QCOMPARE(four->y(), 0.0); + QCOMPARE(five->x(), 40.0); + QCOMPARE(five->y(), 50.0); + + delete canvas; +} + +void tst_QDeclarativePositioners::test_flow_resize() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/flowtest.qml"); + + QDeclarativeItem *root = qobject_cast(canvas->rootObject()); + QVERIFY(root); + root->setWidth(125); + root->setProperty("testRightToLeft", false); + + QDeclarativeRectangle *one = canvas->rootObject()->findChild("one"); + QVERIFY(one != 0); + QDeclarativeRectangle *two = canvas->rootObject()->findChild("two"); + QVERIFY(two != 0); + QDeclarativeRectangle *three = canvas->rootObject()->findChild("three"); + QVERIFY(three != 0); + QDeclarativeRectangle *four = canvas->rootObject()->findChild("four"); + QVERIFY(four != 0); + QDeclarativeRectangle *five = canvas->rootObject()->findChild("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); + + delete canvas; +} + +void tst_QDeclarativePositioners::test_flow_resize_rightToLeft() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/flowtest.qml"); + + QDeclarativeItem *root = qobject_cast(canvas->rootObject()); + QVERIFY(root); + root->setWidth(125); + root->setProperty("testRightToLeft", true); + + QDeclarativeRectangle *one = canvas->rootObject()->findChild("one"); + QVERIFY(one != 0); + QDeclarativeRectangle *two = canvas->rootObject()->findChild("two"); + QVERIFY(two != 0); + QDeclarativeRectangle *three = canvas->rootObject()->findChild("three"); + QVERIFY(three != 0); + QDeclarativeRectangle *four = canvas->rootObject()->findChild("four"); + QVERIFY(four != 0); + QDeclarativeRectangle *five = canvas->rootObject()->findChild("five"); + QVERIFY(five != 0); + + QCOMPARE(one->x(), 75.0); + QCOMPARE(one->y(), 0.0); + QCOMPARE(two->x(), 55.0); + QCOMPARE(two->y(), 0.0); + QCOMPARE(three->x(), 5.0); + QCOMPARE(three->y(), 0.0); + QCOMPARE(four->x(), 75.0); + QCOMPARE(four->y(), 50.0); + QCOMPARE(five->x(), 65.0); + QCOMPARE(five->y(), 50.0); + + delete canvas; +} + +void tst_QDeclarativePositioners::test_flow_implicit_resize() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/flow-testimplicitsize.qml"); + QVERIFY(canvas->rootObject() != 0); + + QDeclarativeFlow *flow = canvas->rootObject()->findChild("flow"); + QVERIFY(flow != 0); + + QCOMPARE(flow->width(), 100.0); + QCOMPARE(flow->height(), 120.0); + + canvas->rootObject()->setProperty("flowLayout", 0); + QCOMPARE(flow->flow(), QDeclarativeFlow::LeftToRight); + QCOMPARE(flow->width(), 220.0); + QCOMPARE(flow->height(), 50.0); + + canvas->rootObject()->setProperty("flowLayout", 1); + QCOMPARE(flow->flow(), QDeclarativeFlow::TopToBottom); + QCOMPARE(flow->width(), 100.0); + QCOMPARE(flow->height(), 120.0); + + canvas->rootObject()->setProperty("flowLayout", 2); + QCOMPARE(flow->layoutDirection(), Qt::RightToLeft); + QCOMPARE(flow->width(), 220.0); + QCOMPARE(flow->height(), 50.0); + + delete canvas; +} + +QString warningMessage; + +void interceptWarnings(QtMsgType type, const char *msg) +{ + Q_UNUSED( type ); + warningMessage = msg; +} + +void tst_QDeclarativePositioners::test_conflictinganchors() +{ + QtMsgHandler oldMsgHandler = qInstallMsgHandler(interceptWarnings); + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine); + + component.setData("import QtQuick 1.0\nColumn { Item {} }", QUrl::fromLocalFile("")); + QDeclarativeItem *item = qobject_cast(component.create()); + QVERIFY(item); + QVERIFY(warningMessage.isEmpty()); + + component.setData("import QtQuick 1.0\nRow { Item {} }", QUrl::fromLocalFile("")); + item = qobject_cast(component.create()); + QVERIFY(item); + QVERIFY(warningMessage.isEmpty()); + + component.setData("import QtQuick 1.0\nGrid { Item {} }", QUrl::fromLocalFile("")); + item = qobject_cast(component.create()); + QVERIFY(item); + QVERIFY(warningMessage.isEmpty()); + + component.setData("import QtQuick 1.0\nFlow { Item {} }", QUrl::fromLocalFile("")); + item = qobject_cast(component.create()); + QVERIFY(item); + QVERIFY(warningMessage.isEmpty()); + + component.setData("import QtQuick 1.0\nColumn { Item { anchors.top: parent.top } }", QUrl::fromLocalFile("")); + item = qobject_cast(component.create()); + QVERIFY(item); + QCOMPARE(warningMessage, QString("file::2:1: QML Column: Cannot specify top, bottom, verticalCenter, fill or centerIn anchors for items inside Column")); + warningMessage.clear(); + + component.setData("import QtQuick 1.0\nColumn { Item { anchors.centerIn: parent } }", QUrl::fromLocalFile("")); + item = qobject_cast(component.create()); + QVERIFY(item); + QCOMPARE(warningMessage, QString("file::2:1: QML Column: Cannot specify top, bottom, verticalCenter, fill or centerIn anchors for items inside Column")); + warningMessage.clear(); + + component.setData("import QtQuick 1.0\nColumn { Item { anchors.left: parent.left } }", QUrl::fromLocalFile("")); + item = qobject_cast(component.create()); + QVERIFY(item); + QVERIFY(warningMessage.isEmpty()); + warningMessage.clear(); + + component.setData("import QtQuick 1.0\nRow { Item { anchors.left: parent.left } }", QUrl::fromLocalFile("")); + item = qobject_cast(component.create()); + QVERIFY(item); + QCOMPARE(warningMessage, QString("file::2:1: QML Row: Cannot specify left, right, horizontalCenter, fill or centerIn anchors for items inside Row")); + warningMessage.clear(); + + component.setData("import QtQuick 1.0\nRow { Item { anchors.fill: parent } }", QUrl::fromLocalFile("")); + item = qobject_cast(component.create()); + QVERIFY(item); + QCOMPARE(warningMessage, QString("file::2:1: QML Row: Cannot specify left, right, horizontalCenter, fill or centerIn anchors for items inside Row")); + warningMessage.clear(); + + component.setData("import QtQuick 1.0\nRow { Item { anchors.top: parent.top } }", QUrl::fromLocalFile("")); + item = qobject_cast(component.create()); + QVERIFY(item); + QVERIFY(warningMessage.isEmpty()); + warningMessage.clear(); + + component.setData("import QtQuick 1.0\nGrid { Item { anchors.horizontalCenter: parent.horizontalCenter } }", QUrl::fromLocalFile("")); + item = qobject_cast(component.create()); + QVERIFY(item); + QCOMPARE(warningMessage, QString("file::2:1: QML Grid: Cannot specify anchors for items inside Grid")); + warningMessage.clear(); + + component.setData("import QtQuick 1.0\nGrid { Item { anchors.centerIn: parent } }", QUrl::fromLocalFile("")); + item = qobject_cast(component.create()); + QVERIFY(item); + QCOMPARE(warningMessage, QString("file::2:1: QML Grid: Cannot specify anchors for items inside Grid")); + warningMessage.clear(); + + component.setData("import QtQuick 1.0\nFlow { Item { anchors.verticalCenter: parent.verticalCenter } }", QUrl::fromLocalFile("")); + item = qobject_cast(component.create()); + QVERIFY(item); + QCOMPARE(warningMessage, QString("file::2:1: QML Flow: Cannot specify anchors for items inside Flow")); + + component.setData("import QtQuick 1.0\nFlow { Item { anchors.fill: parent } }", QUrl::fromLocalFile("")); + item = qobject_cast(component.create()); + QVERIFY(item); + QCOMPARE(warningMessage, QString("file::2:1: QML Flow: Cannot specify anchors for items inside Flow")); + qInstallMsgHandler(oldMsgHandler); +} + +void tst_QDeclarativePositioners::test_vertical_qgraphicswidget() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/verticalqgraphicswidget.qml"); + + QGraphicsWidget *one = canvas->rootObject()->findChild("one"); + QVERIFY(one != 0); + + QGraphicsWidget *two = canvas->rootObject()->findChild("two"); + QVERIFY(two != 0); + + QGraphicsWidget *three = canvas->rootObject()->findChild("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); + + QDeclarativeItem *column = canvas->rootObject()->findChild("column"); + QVERIFY(column); + QCOMPARE(column->height(), 80.0); + QCOMPARE(column->width(), 50.0); + + two->resize(QSizeF(two->size().width(), 20.0)); + QCOMPARE(three->x(), 0.0); + QCOMPARE(three->y(), 70.0); + + two->setOpacity(0.0); + QCOMPARE(one->x(), 0.0); + QCOMPARE(one->y(), 0.0); + QCOMPARE(three->x(), 0.0); + QCOMPARE(three->y(), 50.0); + + one->setVisible(false); + QCOMPARE(three->x(), 0.0); + QCOMPARE(three->y(), 0.0); + + delete canvas; +} + +void tst_QDeclarativePositioners::test_mirroring() +{ + QList qmlFiles; + qmlFiles << "horizontal.qml" << "gridtest.qml" << "flowtest.qml"; + QList objectNames; + objectNames << "one" << "two" << "three" << "four" << "five"; + + foreach(const QString qmlFile, qmlFiles) { + QDeclarativeView *canvasA = createView(QString(SRCDIR) + "/data/" + qmlFile); + QDeclarativeItem *rootA = qobject_cast(canvasA->rootObject()); + + QDeclarativeView *canvasB = createView(QString(SRCDIR) + "/data/" + qmlFile); + QDeclarativeItem *rootB = qobject_cast(canvasB->rootObject()); + + rootA->setProperty("testRightToLeft", true); // layoutDirection: Qt.RightToLeft + + // LTR != RTL + foreach(const QString objectName, objectNames) { + // horizontal.qml only has three items + if (qmlFile == QString("horizontal.qml") && objectName == QString("four")) + break; + QDeclarativeItem *itemA = rootA->findChild(objectName); + QDeclarativeItem *itemB = rootB->findChild(objectName); + QVERIFY(itemA->x() != itemB->x()); + } + + QDeclarativeItemPrivate* rootPrivateB = QDeclarativeItemPrivate::get(rootB); + + rootPrivateB->effectiveLayoutMirror = true; // LayoutMirroring.enabled: true + rootPrivateB->isMirrorImplicit = false; + rootPrivateB->inheritMirrorFromItem = true; // LayoutMirroring.childrenInherit: true + rootPrivateB->resolveLayoutMirror(); + + // RTL == mirror + foreach(const QString objectName, objectNames) { + // horizontal.qml only has three items + if (qmlFile == QString("horizontal.qml") && objectName == QString("four")) + break; + QDeclarativeItem *itemA = rootA->findChild(objectName); + QDeclarativeItem *itemB = rootB->findChild(objectName); + QCOMPARE(itemA->x(), itemB->x()); + } + + rootA->setProperty("testRightToLeft", false); // layoutDirection: Qt.LeftToRight + rootB->setProperty("testRightToLeft", true); // layoutDirection: Qt.RightToLeft + + // LTR == RTL + mirror + foreach(const QString objectName, objectNames) { + // horizontal.qml only has three items + if (qmlFile == QString("horizontal.qml") && objectName == QString("four")) + break; + QDeclarativeItem *itemA = rootA->findChild(objectName); + QDeclarativeItem *itemB = rootB->findChild(objectName); + QCOMPARE(itemA->x(), itemB->x()); + } + delete canvasA; + delete canvasB; + } +} + +void tst_QDeclarativePositioners::testQtQuick11Attributes() +{ + QFETCH(QString, code); + QFETCH(QString, warning); + QFETCH(QString, error); + + QDeclarativeEngine engine; + QObject *obj; + + QDeclarativeComponent valid(&engine); + valid.setData("import QtQuick 1.1; " + code.toUtf8(), QUrl("")); + obj = valid.create(); + QVERIFY(obj); + QVERIFY(valid.errorString().isEmpty()); + delete obj; + + QDeclarativeComponent invalid(&engine); + invalid.setData("import QtQuick 1.0; " + code.toUtf8(), QUrl("")); + QTest::ignoreMessage(QtWarningMsg, warning.toUtf8()); + obj = invalid.create(); + QCOMPARE(invalid.errorString(), error); + delete obj; +} + +void tst_QDeclarativePositioners::testQtQuick11Attributes_data() +{ + QTest::addColumn("code"); + QTest::addColumn("warning"); + QTest::addColumn("error"); + + QTest::newRow("Flow.layoutDirection") << "Flow { layoutDirection: Qt.LeftToRight }" + << "QDeclarativeComponent: Component is not ready" + << ":1 \"Flow.layoutDirection\" is not available in QtQuick 1.0.\n"; + + QTest::newRow("Row.layoutDirection") << "Row { layoutDirection: Qt.LeftToRight }" + << "QDeclarativeComponent: Component is not ready" + << ":1 \"Row.layoutDirection\" is not available in QtQuick 1.0.\n"; + + QTest::newRow("Grid.layoutDirection") << "Grid { layoutDirection: Qt.LeftToRight }" + << "QDeclarativeComponent: Component is not ready" + << ":1 \"Grid.layoutDirection\" is not available in QtQuick 1.0.\n"; +} + +QDeclarativeView *tst_QDeclarativePositioners::createView(const QString &filename) +{ + QDeclarativeView *canvas = new QDeclarativeView(0); + + canvas->setSource(QUrl::fromLocalFile(filename)); + + return canvas; +} + + +QTEST_MAIN(tst_QDeclarativePositioners) + +#include "tst_qdeclarativepositioners.moc" diff --git a/tests/auto/declarative/qdeclarativeproperty/data/TestType.qml b/tests/auto/declarative/qdeclarativeproperty/data/TestType.qml new file mode 100644 index 00000000..cef86b4f --- /dev/null +++ b/tests/auto/declarative/qdeclarativeproperty/data/TestType.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +QtObject { + property int a: 10 +} + diff --git a/tests/auto/declarative/qdeclarativeproperty/data/aliasPropertyBindings.qml b/tests/auto/declarative/qdeclarativeproperty/data/aliasPropertyBindings.qml new file mode 100644 index 00000000..a253a58d --- /dev/null +++ b/tests/auto/declarative/qdeclarativeproperty/data/aliasPropertyBindings.qml @@ -0,0 +1,19 @@ +import QtQuick 1.0 + +Item { + id: root + + property real test: 9 + property real test2: 3 + + property real realProperty: test * test + test + property alias aliasProperty: root.realProperty + + states: State { + name: "switch" + PropertyChanges { + target: root + aliasProperty: 32 * test2 + } + } +} diff --git a/tests/auto/declarative/qdeclarativeproperty/data/readSynthesizedObject.qml b/tests/auto/declarative/qdeclarativeproperty/data/readSynthesizedObject.qml new file mode 100644 index 00000000..a91d3ed9 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeproperty/data/readSynthesizedObject.qml @@ -0,0 +1,9 @@ +import QtQuick 1.0 + +QtObject { + property TestType test + + test: TestType { + property int b: 19 + } +} diff --git a/tests/auto/declarative/qdeclarativeproperty/qdeclarativeproperty.pro b/tests/auto/declarative/qdeclarativeproperty/qdeclarativeproperty.pro new file mode 100644 index 00000000..17508602 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeproperty/qdeclarativeproperty.pro @@ -0,0 +1,16 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativeproperty.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativeproperty/tst_qdeclarativeproperty.cpp b/tests/auto/declarative/qdeclarativeproperty/tst_qdeclarativeproperty.cpp new file mode 100644 index 00000000..1f464bfd --- /dev/null +++ b/tests/auto/declarative/qdeclarativeproperty/tst_qdeclarativeproperty.cpp @@ -0,0 +1,1494 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +inline QUrl TEST_FILE(const QString &filename) +{ + QFileInfo fileInfo(__FILE__); + return QUrl::fromLocalFile(fileInfo.absoluteDir().filePath(QLatin1String("data/") + filename)); +} + +class MyQmlObject : public QObject +{ + Q_OBJECT +public: + MyQmlObject() {} +}; + +QML_DECLARE_TYPE(MyQmlObject); + +class MyAttached : public QObject +{ + Q_OBJECT + Q_PROPERTY(int foo READ foo WRITE setFoo) +public: + MyAttached(QObject *parent) : QObject(parent), m_foo(13) {} + + int foo() const { return m_foo; } + void setFoo(int f) { m_foo = f; } + +private: + int m_foo; +}; + +class MyContainer : public QObject +{ + Q_OBJECT + Q_PROPERTY(QDeclarativeListProperty children READ children) +public: + MyContainer() {} + + QDeclarativeListProperty children() { return QDeclarativeListProperty(this, m_children); } + + static MyAttached *qmlAttachedProperties(QObject *o) { + return new MyAttached(o); + } + +private: + QList m_children; +}; + +QML_DECLARE_TYPE(MyContainer); +QML_DECLARE_TYPEINFO(MyContainer, QML_HAS_ATTACHED_PROPERTIES) + +class tst_qdeclarativeproperty : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativeproperty() {} + +private slots: + void initTestCase(); + + // Constructors + void qmlmetaproperty(); + void qmlmetaproperty_object(); + void qmlmetaproperty_object_string(); + void qmlmetaproperty_object_context(); + void qmlmetaproperty_object_string_context(); + + // Methods + void name(); + void read(); + void write(); + void reset(); + + // Functionality + void writeObjectToList(); + void writeListToList(); + + //writeToReadOnly(); + + // Bugs + void crashOnValueProperty(); + void aliasPropertyBindings(); + + void copy(); +private: + QDeclarativeEngine engine; +}; + +void tst_qdeclarativeproperty::qmlmetaproperty() +{ + QDeclarativeProperty prop; + + QWeakPointer binding(new QDeclarativeBinding(QLatin1String("null"), 0, engine.rootContext())); + QVERIFY(binding != 0); + QWeakPointer expression(new QDeclarativeExpression()); + QVERIFY(expression != 0); + + QObject *obj = new QObject; + + QCOMPARE(prop.name(), QString()); + QCOMPARE(prop.read(), QVariant()); + QCOMPARE(prop.write(QVariant()), false); + QCOMPARE(prop.hasNotifySignal(), false); + QCOMPARE(prop.needsNotifySignal(), false); + QCOMPARE(prop.connectNotifySignal(0, SLOT(deleteLater())), false); + QCOMPARE(prop.connectNotifySignal(obj, SLOT(deleteLater())), false); + QCOMPARE(prop.connectNotifySignal(obj, 0), false); + QCOMPARE(prop.connectNotifySignal(0, obj->metaObject()->indexOfMethod("deleteLater()")), false); + QCOMPARE(prop.connectNotifySignal(obj, obj->metaObject()->indexOfMethod("deleteLater()")), false); + QCOMPARE(prop.connectNotifySignal(obj, -1), false); + QVERIFY(prop.method().signature() == 0); + QCOMPARE(prop.type(), QDeclarativeProperty::Invalid); + QCOMPARE(prop.isProperty(), false); + QCOMPARE(prop.isWritable(), false); + QCOMPARE(prop.isDesignable(), false); + QCOMPARE(prop.isResettable(), false); + QCOMPARE(prop.isSignalProperty(), false); + QCOMPARE(prop.isValid(), false); + QCOMPARE(prop.object(), (QObject *)0); + QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::InvalidCategory); + QCOMPARE(prop.propertyType(), 0); + QCOMPARE(prop.propertyTypeName(), (const char *)0); + QVERIFY(prop.property().name() == 0); + QVERIFY(QDeclarativePropertyPrivate::binding(prop) == 0); + QVERIFY(QDeclarativePropertyPrivate::setBinding(prop, binding.data()) == 0); + QVERIFY(binding == 0); + QVERIFY(QDeclarativePropertyPrivate::signalExpression(prop) == 0); + QVERIFY(QDeclarativePropertyPrivate::setSignalExpression(prop, expression.data()) == 0); + QVERIFY(expression == 0); + QCOMPARE(prop.index(), -1); + QCOMPARE(QDeclarativePropertyPrivate::valueTypeCoreIndex(prop), -1); + + delete obj; +} + +class PropertyObject : public QObject +{ + Q_OBJECT + Q_PROPERTY(int defaultProperty READ defaultProperty) + Q_PROPERTY(QRect rectProperty READ rectProperty) + Q_PROPERTY(QRect wrectProperty READ wrectProperty WRITE setWRectProperty) + Q_PROPERTY(QUrl url READ url WRITE setUrl) + Q_PROPERTY(int resettableProperty READ resettableProperty WRITE setResettableProperty RESET resetProperty) + Q_PROPERTY(int propertyWithNotify READ propertyWithNotify WRITE setPropertyWithNotify NOTIFY oddlyNamedNotifySignal) + Q_PROPERTY(MyQmlObject *qmlObject READ qmlObject) + + Q_CLASSINFO("DefaultProperty", "defaultProperty") +public: + PropertyObject() : m_resetProperty(9) {} + + int defaultProperty() { return 10; } + QRect rectProperty() { return QRect(10, 10, 1, 209); } + + QRect wrectProperty() { return m_rect; } + void setWRectProperty(const QRect &r) { m_rect = r; } + + QUrl url() { return m_url; } + void setUrl(const QUrl &u) { m_url = u; } + + int resettableProperty() const { return m_resetProperty; } + void setResettableProperty(int r) { m_resetProperty = r; } + void resetProperty() { m_resetProperty = 9; } + + int propertyWithNotify() const { return m_propertyWithNotify; } + void setPropertyWithNotify(int i) { m_propertyWithNotify = i; emit oddlyNamedNotifySignal(); } + + MyQmlObject *qmlObject() { return &m_qmlObject; } +signals: + void clicked(); + void oddlyNamedNotifySignal(); + +private: + int m_resetProperty; + QRect m_rect; + QUrl m_url; + int m_propertyWithNotify; + MyQmlObject m_qmlObject; +}; + +QML_DECLARE_TYPE(PropertyObject); + +void tst_qdeclarativeproperty::qmlmetaproperty_object() +{ + QObject object; // Has no default property + PropertyObject dobject; // Has default property + + { + QDeclarativeProperty prop(&object); + + QWeakPointer binding(new QDeclarativeBinding(QLatin1String("null"), 0, engine.rootContext())); + QVERIFY(binding != 0); + QWeakPointer expression(new QDeclarativeExpression()); + QVERIFY(expression != 0); + + QObject *obj = new QObject; + + QCOMPARE(prop.name(), QString()); + QCOMPARE(prop.read(), QVariant()); + QCOMPARE(prop.write(QVariant()), false); + QCOMPARE(prop.hasNotifySignal(), false); + QCOMPARE(prop.needsNotifySignal(), false); + QCOMPARE(prop.connectNotifySignal(0, SLOT(deleteLater())), false); + QCOMPARE(prop.connectNotifySignal(obj, SLOT(deleteLater())), false); + QCOMPARE(prop.connectNotifySignal(obj, 0), false); + QCOMPARE(prop.connectNotifySignal(0, obj->metaObject()->indexOfMethod("deleteLater()")), false); + QCOMPARE(prop.connectNotifySignal(obj, obj->metaObject()->indexOfMethod("deleteLater()")), false); + QCOMPARE(prop.connectNotifySignal(obj, -1), false); + QVERIFY(prop.method().signature() == 0); + QCOMPARE(prop.type(), QDeclarativeProperty::Invalid); + QCOMPARE(prop.isProperty(), false); + QCOMPARE(prop.isWritable(), false); + QCOMPARE(prop.isDesignable(), false); + QCOMPARE(prop.isResettable(), false); + QCOMPARE(prop.isSignalProperty(), false); + QCOMPARE(prop.isValid(), false); + QCOMPARE(prop.object(), (QObject *)0); + QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::InvalidCategory); + QCOMPARE(prop.propertyType(), 0); + QCOMPARE(prop.propertyTypeName(), (const char *)0); + QVERIFY(prop.property().name() == 0); + QVERIFY(QDeclarativePropertyPrivate::binding(prop) == 0); + QVERIFY(QDeclarativePropertyPrivate::setBinding(prop, binding.data()) == 0); + QVERIFY(binding == 0); + QVERIFY(QDeclarativePropertyPrivate::signalExpression(prop) == 0); + QVERIFY(QDeclarativePropertyPrivate::setSignalExpression(prop, expression.data()) == 0); + QVERIFY(expression == 0); + QCOMPARE(prop.index(), -1); + QCOMPARE(QDeclarativePropertyPrivate::valueTypeCoreIndex(prop), -1); + + delete obj; + } + + { + QDeclarativeProperty prop(&dobject); + + QWeakPointer binding(new QDeclarativeBinding(QLatin1String("null"), 0, engine.rootContext())); + binding.data()->setTarget(prop); + QVERIFY(binding != 0); + QWeakPointer expression(new QDeclarativeExpression()); + QVERIFY(expression != 0); + + QObject *obj = new QObject; + + QCOMPARE(prop.name(), QString("defaultProperty")); + QCOMPARE(prop.read(), QVariant(10)); + QCOMPARE(prop.write(QVariant()), false); + QCOMPARE(prop.hasNotifySignal(), false); + QCOMPARE(prop.needsNotifySignal(), true); + QCOMPARE(prop.connectNotifySignal(0, SLOT(deleteLater())), false); + QCOMPARE(prop.connectNotifySignal(obj, SLOT(deleteLater())), false); + QCOMPARE(prop.connectNotifySignal(obj, 0), false); + QCOMPARE(prop.connectNotifySignal(0, obj->metaObject()->indexOfMethod("deleteLater()")), false); + QCOMPARE(prop.connectNotifySignal(obj, obj->metaObject()->indexOfMethod("deleteLater()")), false); + QCOMPARE(prop.connectNotifySignal(obj, -1), false); + QVERIFY(prop.method().signature() == 0); + QCOMPARE(prop.type(), QDeclarativeProperty::Property); + QCOMPARE(prop.isProperty(), true); + QCOMPARE(prop.isWritable(), false); + QCOMPARE(prop.isDesignable(), true); + QCOMPARE(prop.isResettable(), false); + QCOMPARE(prop.isSignalProperty(), false); + QCOMPARE(prop.isValid(), true); + QCOMPARE(prop.object(), qobject_cast(&dobject)); + QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::Normal); + QCOMPARE(prop.propertyType(), (int)QVariant::Int); + QCOMPARE(prop.propertyTypeName(), "int"); + QCOMPARE(QString(prop.property().name()), QString("defaultProperty")); + QVERIFY(QDeclarativePropertyPrivate::binding(prop) == 0); + QTest::ignoreMessage(QtWarningMsg, ": Unable to assign null to int"); + QVERIFY(QDeclarativePropertyPrivate::setBinding(prop, binding.data()) == 0); + QVERIFY(binding != 0); + QVERIFY(QDeclarativePropertyPrivate::binding(prop) == binding.data()); + QVERIFY(QDeclarativePropertyPrivate::signalExpression(prop) == 0); + QVERIFY(QDeclarativePropertyPrivate::setSignalExpression(prop, expression.data()) == 0); + QVERIFY(expression == 0); + QCOMPARE(prop.index(), dobject.metaObject()->indexOfProperty("defaultProperty")); + QCOMPARE(QDeclarativePropertyPrivate::valueTypeCoreIndex(prop), -1); + + delete obj; + } +} + +void tst_qdeclarativeproperty::qmlmetaproperty_object_string() +{ + QObject object; + PropertyObject dobject; + + { + QDeclarativeProperty prop(&object, QString("defaultProperty")); + + QWeakPointer binding(new QDeclarativeBinding(QLatin1String("null"), 0, engine.rootContext())); + QVERIFY(binding != 0); + QWeakPointer expression(new QDeclarativeExpression()); + QVERIFY(expression != 0); + + QObject *obj = new QObject; + + QCOMPARE(prop.name(), QString()); + QCOMPARE(prop.read(), QVariant()); + QCOMPARE(prop.write(QVariant()), false); + QCOMPARE(prop.hasNotifySignal(), false); + QCOMPARE(prop.needsNotifySignal(), false); + QCOMPARE(prop.connectNotifySignal(0, SLOT(deleteLater())), false); + QCOMPARE(prop.connectNotifySignal(obj, SLOT(deleteLater())), false); + QCOMPARE(prop.connectNotifySignal(obj, 0), false); + QCOMPARE(prop.connectNotifySignal(0, obj->metaObject()->indexOfMethod("deleteLater()")), false); + QCOMPARE(prop.connectNotifySignal(obj, obj->metaObject()->indexOfMethod("deleteLater()")), false); + QCOMPARE(prop.connectNotifySignal(obj, -1), false); + QVERIFY(prop.method().signature() == 0); + QCOMPARE(prop.type(), QDeclarativeProperty::Invalid); + QCOMPARE(prop.isProperty(), false); + QCOMPARE(prop.isWritable(), false); + QCOMPARE(prop.isDesignable(), false); + QCOMPARE(prop.isResettable(), false); + QCOMPARE(prop.isSignalProperty(), false); + QCOMPARE(prop.isValid(), false); + QCOMPARE(prop.object(), (QObject *)0); + QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::InvalidCategory); + QCOMPARE(prop.propertyType(), 0); + QCOMPARE(prop.propertyTypeName(), (const char *)0); + QVERIFY(prop.property().name() == 0); + QVERIFY(QDeclarativePropertyPrivate::binding(prop) == 0); + QVERIFY(QDeclarativePropertyPrivate::setBinding(prop, binding.data()) == 0); + QVERIFY(binding == 0); + QVERIFY(QDeclarativePropertyPrivate::signalExpression(prop) == 0); + QVERIFY(QDeclarativePropertyPrivate::setSignalExpression(prop, expression.data()) == 0); + QVERIFY(expression == 0); + QCOMPARE(prop.index(), -1); + QCOMPARE(QDeclarativePropertyPrivate::valueTypeCoreIndex(prop), -1); + + delete obj; + } + + { + QDeclarativeProperty prop(&dobject, QString("defaultProperty")); + + QWeakPointer binding(new QDeclarativeBinding(QLatin1String("null"), 0, engine.rootContext())); + binding.data()->setTarget(prop); + QVERIFY(binding != 0); + QWeakPointer expression(new QDeclarativeExpression()); + QVERIFY(expression != 0); + + QObject *obj = new QObject; + + QCOMPARE(prop.name(), QString("defaultProperty")); + QCOMPARE(prop.read(), QVariant(10)); + QCOMPARE(prop.write(QVariant()), false); + QCOMPARE(prop.hasNotifySignal(), false); + QCOMPARE(prop.needsNotifySignal(), true); + QCOMPARE(prop.connectNotifySignal(0, SLOT(deleteLater())), false); + QCOMPARE(prop.connectNotifySignal(obj, SLOT(deleteLater())), false); + QCOMPARE(prop.connectNotifySignal(obj, 0), false); + QCOMPARE(prop.connectNotifySignal(0, obj->metaObject()->indexOfMethod("deleteLater()")), false); + QCOMPARE(prop.connectNotifySignal(obj, obj->metaObject()->indexOfMethod("deleteLater()")), false); + QCOMPARE(prop.connectNotifySignal(obj, -1), false); + QVERIFY(prop.method().signature() == 0); + QCOMPARE(prop.type(), QDeclarativeProperty::Property); + QCOMPARE(prop.isProperty(), true); + QCOMPARE(prop.isWritable(), false); + QCOMPARE(prop.isDesignable(), true); + QCOMPARE(prop.isResettable(), false); + QCOMPARE(prop.isSignalProperty(), false); + QCOMPARE(prop.isValid(), true); + QCOMPARE(prop.object(), qobject_cast(&dobject)); + QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::Normal); + QCOMPARE(prop.propertyType(), (int)QVariant::Int); + QCOMPARE(prop.propertyTypeName(), "int"); + QCOMPARE(QString(prop.property().name()), QString("defaultProperty")); + QVERIFY(QDeclarativePropertyPrivate::binding(prop) == 0); + QTest::ignoreMessage(QtWarningMsg, ": Unable to assign null to int"); + QVERIFY(QDeclarativePropertyPrivate::setBinding(prop, binding.data()) == 0); + QVERIFY(binding != 0); + QVERIFY(QDeclarativePropertyPrivate::binding(prop) == binding.data()); + QVERIFY(QDeclarativePropertyPrivate::signalExpression(prop) == 0); + QVERIFY(QDeclarativePropertyPrivate::setSignalExpression(prop, expression.data()) == 0); + QVERIFY(expression == 0); + QCOMPARE(prop.index(), dobject.metaObject()->indexOfProperty("defaultProperty")); + QCOMPARE(QDeclarativePropertyPrivate::valueTypeCoreIndex(prop), -1); + + delete obj; + } + + { + QDeclarativeProperty prop(&dobject, QString("onClicked")); + + QWeakPointer binding(new QDeclarativeBinding(QLatin1String("null"), 0, engine.rootContext())); + binding.data()->setTarget(prop); + QVERIFY(binding != 0); + QWeakPointer expression(new QDeclarativeExpression()); + QVERIFY(expression != 0); + + QObject *obj = new QObject; + + QCOMPARE(prop.name(), QString("onClicked")); + QCOMPARE(prop.read(), QVariant()); + QCOMPARE(prop.write(QVariant("Hello")), false); + QCOMPARE(prop.hasNotifySignal(), false); + QCOMPARE(prop.needsNotifySignal(), false); + QCOMPARE(prop.connectNotifySignal(0, SLOT(deleteLater())), false); + QCOMPARE(prop.connectNotifySignal(obj, SLOT(deleteLater())), false); + QCOMPARE(prop.connectNotifySignal(obj, 0), false); + QCOMPARE(prop.connectNotifySignal(0, obj->metaObject()->indexOfMethod("deleteLater()")), false); + QCOMPARE(prop.connectNotifySignal(obj, obj->metaObject()->indexOfMethod("deleteLater()")), false); + QCOMPARE(prop.connectNotifySignal(obj, -1), false); + QCOMPARE(QString(prop.method().signature()), QString("clicked()")); + QCOMPARE(prop.type(), QDeclarativeProperty::SignalProperty); + QCOMPARE(prop.isProperty(), false); + QCOMPARE(prop.isWritable(), false); + QCOMPARE(prop.isDesignable(), false); + QCOMPARE(prop.isResettable(), false); + QCOMPARE(prop.isSignalProperty(), true); + QCOMPARE(prop.isValid(), true); + QCOMPARE(prop.object(), qobject_cast(&dobject)); + QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::InvalidCategory); + QCOMPARE(prop.propertyType(), 0); + QCOMPARE(prop.propertyTypeName(), (const char *)0); + QCOMPARE(prop.property().name(), (const char *)0); + QVERIFY(QDeclarativePropertyPrivate::binding(prop) == 0); + QVERIFY(QDeclarativePropertyPrivate::setBinding(prop, binding.data()) == 0); + QVERIFY(binding == 0); + QVERIFY(QDeclarativePropertyPrivate::signalExpression(prop) == 0); + QVERIFY(QDeclarativePropertyPrivate::setSignalExpression(prop, expression.data()) == 0); + QVERIFY(expression != 0); + QVERIFY(QDeclarativePropertyPrivate::signalExpression(prop) == expression.data()); + QCOMPARE(prop.index(), dobject.metaObject()->indexOfMethod("clicked()")); + QCOMPARE(QDeclarativePropertyPrivate::valueTypeCoreIndex(prop), -1); + + delete obj; + } + + { + QDeclarativeProperty prop(&dobject, QString("onPropertyWithNotifyChanged")); + + QWeakPointer binding(new QDeclarativeBinding(QLatin1String("null"), 0, engine.rootContext())); + binding.data()->setTarget(prop); + QVERIFY(binding != 0); + QWeakPointer expression(new QDeclarativeExpression()); + QVERIFY(expression != 0); + + QObject *obj = new QObject; + + QCOMPARE(prop.name(), QString("onOddlyNamedNotifySignal")); + QCOMPARE(prop.read(), QVariant()); + QCOMPARE(prop.write(QVariant("Hello")), false); + QCOMPARE(prop.hasNotifySignal(), false); + QCOMPARE(prop.needsNotifySignal(), false); + QCOMPARE(prop.connectNotifySignal(0, SLOT(deleteLater())), false); + QCOMPARE(prop.connectNotifySignal(obj, SLOT(deleteLater())), false); + QCOMPARE(prop.connectNotifySignal(obj, 0), false); + QCOMPARE(prop.connectNotifySignal(0, obj->metaObject()->indexOfMethod("deleteLater()")), false); + QCOMPARE(prop.connectNotifySignal(obj, obj->metaObject()->indexOfMethod("deleteLater()")), false); + QCOMPARE(prop.connectNotifySignal(obj, -1), false); + QCOMPARE(QString(prop.method().signature()), QString("oddlyNamedNotifySignal()")); + QCOMPARE(prop.type(), QDeclarativeProperty::SignalProperty); + QCOMPARE(prop.isProperty(), false); + QCOMPARE(prop.isWritable(), false); + QCOMPARE(prop.isDesignable(), false); + QCOMPARE(prop.isResettable(), false); + QCOMPARE(prop.isSignalProperty(), true); + QCOMPARE(prop.isValid(), true); + QCOMPARE(prop.object(), qobject_cast(&dobject)); + QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::InvalidCategory); + QCOMPARE(prop.propertyType(), 0); + QCOMPARE(prop.propertyTypeName(), (const char *)0); + QCOMPARE(prop.property().name(), (const char *)0); + QVERIFY(QDeclarativePropertyPrivate::binding(prop) == 0); + QVERIFY(QDeclarativePropertyPrivate::setBinding(prop, binding.data()) == 0); + QVERIFY(binding == 0); + QVERIFY(QDeclarativePropertyPrivate::signalExpression(prop) == 0); + QVERIFY(QDeclarativePropertyPrivate::setSignalExpression(prop, expression.data()) == 0); + QVERIFY(expression != 0); + QVERIFY(QDeclarativePropertyPrivate::signalExpression(prop) == expression.data()); + QCOMPARE(prop.index(), dobject.metaObject()->indexOfMethod("oddlyNamedNotifySignal()")); + QCOMPARE(QDeclarativePropertyPrivate::valueTypeCoreIndex(prop), -1); + + delete obj; + } +} + +void tst_qdeclarativeproperty::qmlmetaproperty_object_context() +{ + QObject object; // Has no default property + PropertyObject dobject; // Has default property + + { + QDeclarativeProperty prop(&object, engine.rootContext()); + + QWeakPointer binding(new QDeclarativeBinding(QLatin1String("null"), 0, engine.rootContext())); + QVERIFY(binding != 0); + QWeakPointer expression(new QDeclarativeExpression()); + QVERIFY(expression != 0); + + QObject *obj = new QObject; + + QCOMPARE(prop.name(), QString()); + QCOMPARE(prop.read(), QVariant()); + QCOMPARE(prop.write(QVariant()), false); + QCOMPARE(prop.hasNotifySignal(), false); + QCOMPARE(prop.needsNotifySignal(), false); + QCOMPARE(prop.connectNotifySignal(0, SLOT(deleteLater())), false); + QCOMPARE(prop.connectNotifySignal(obj, SLOT(deleteLater())), false); + QCOMPARE(prop.connectNotifySignal(obj, 0), false); + QCOMPARE(prop.connectNotifySignal(0, obj->metaObject()->indexOfMethod("deleteLater()")), false); + QCOMPARE(prop.connectNotifySignal(obj, obj->metaObject()->indexOfMethod("deleteLater()")), false); + QCOMPARE(prop.connectNotifySignal(obj, -1), false); + QVERIFY(prop.method().signature() == 0); + QCOMPARE(prop.type(), QDeclarativeProperty::Invalid); + QCOMPARE(prop.isProperty(), false); + QCOMPARE(prop.isWritable(), false); + QCOMPARE(prop.isDesignable(), false); + QCOMPARE(prop.isResettable(), false); + QCOMPARE(prop.isSignalProperty(), false); + QCOMPARE(prop.isValid(), false); + QCOMPARE(prop.object(), (QObject *)0); + QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::InvalidCategory); + QCOMPARE(prop.propertyType(), 0); + QCOMPARE(prop.propertyTypeName(), (const char *)0); + QVERIFY(prop.property().name() == 0); + QVERIFY(QDeclarativePropertyPrivate::binding(prop) == 0); + QVERIFY(QDeclarativePropertyPrivate::setBinding(prop, binding.data()) == 0); + QVERIFY(binding == 0); + QVERIFY(QDeclarativePropertyPrivate::signalExpression(prop) == 0); + QVERIFY(QDeclarativePropertyPrivate::setSignalExpression(prop, expression.data()) == 0); + QVERIFY(expression == 0); + QCOMPARE(prop.index(), -1); + QCOMPARE(QDeclarativePropertyPrivate::valueTypeCoreIndex(prop), -1); + + delete obj; + } + + { + QDeclarativeProperty prop(&dobject, engine.rootContext()); + + QWeakPointer binding(new QDeclarativeBinding(QLatin1String("null"), 0, engine.rootContext())); + binding.data()->setTarget(prop); + QVERIFY(binding != 0); + QWeakPointer expression(new QDeclarativeExpression()); + QVERIFY(expression != 0); + + QObject *obj = new QObject; + + QCOMPARE(prop.name(), QString("defaultProperty")); + QCOMPARE(prop.read(), QVariant(10)); + QCOMPARE(prop.write(QVariant()), false); + QCOMPARE(prop.hasNotifySignal(), false); + QCOMPARE(prop.needsNotifySignal(), true); + QCOMPARE(prop.connectNotifySignal(0, SLOT(deleteLater())), false); + QCOMPARE(prop.connectNotifySignal(obj, SLOT(deleteLater())), false); + QCOMPARE(prop.connectNotifySignal(obj, 0), false); + QCOMPARE(prop.connectNotifySignal(0, obj->metaObject()->indexOfMethod("deleteLater()")), false); + QCOMPARE(prop.connectNotifySignal(obj, obj->metaObject()->indexOfMethod("deleteLater()")), false); + QCOMPARE(prop.connectNotifySignal(obj, -1), false); + QVERIFY(prop.method().signature() == 0); + QCOMPARE(prop.type(), QDeclarativeProperty::Property); + QCOMPARE(prop.isProperty(), true); + QCOMPARE(prop.isWritable(), false); + QCOMPARE(prop.isDesignable(), true); + QCOMPARE(prop.isResettable(), false); + QCOMPARE(prop.isSignalProperty(), false); + QCOMPARE(prop.isValid(), true); + QCOMPARE(prop.object(), qobject_cast(&dobject)); + QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::Normal); + QCOMPARE(prop.propertyType(), (int)QVariant::Int); + QCOMPARE(prop.propertyTypeName(), "int"); + QCOMPARE(QString(prop.property().name()), QString("defaultProperty")); + QVERIFY(QDeclarativePropertyPrivate::binding(prop) == 0); + QTest::ignoreMessage(QtWarningMsg, ": Unable to assign null to int"); + QVERIFY(QDeclarativePropertyPrivate::setBinding(prop, binding.data()) == 0); + QVERIFY(binding != 0); + QVERIFY(QDeclarativePropertyPrivate::binding(prop) == binding.data()); + QVERIFY(QDeclarativePropertyPrivate::signalExpression(prop) == 0); + QVERIFY(QDeclarativePropertyPrivate::setSignalExpression(prop, expression.data()) == 0); + QVERIFY(expression == 0); + QCOMPARE(prop.index(), dobject.metaObject()->indexOfProperty("defaultProperty")); + QCOMPARE(QDeclarativePropertyPrivate::valueTypeCoreIndex(prop), -1); + + delete obj; + } +} + +void tst_qdeclarativeproperty::qmlmetaproperty_object_string_context() +{ + QObject object; + PropertyObject dobject; + + { + QDeclarativeProperty prop(&object, QString("defaultProperty"), engine.rootContext()); + + QWeakPointer binding(new QDeclarativeBinding(QLatin1String("null"), 0, engine.rootContext())); + QVERIFY(binding != 0); + QWeakPointer expression(new QDeclarativeExpression()); + QVERIFY(expression != 0); + + QObject *obj = new QObject; + + QCOMPARE(prop.name(), QString()); + QCOMPARE(prop.read(), QVariant()); + QCOMPARE(prop.write(QVariant()), false); + QCOMPARE(prop.hasNotifySignal(), false); + QCOMPARE(prop.needsNotifySignal(), false); + QCOMPARE(prop.connectNotifySignal(0, SLOT(deleteLater())), false); + QCOMPARE(prop.connectNotifySignal(obj, SLOT(deleteLater())), false); + QCOMPARE(prop.connectNotifySignal(obj, 0), false); + QCOMPARE(prop.connectNotifySignal(0, obj->metaObject()->indexOfMethod("deleteLater()")), false); + QCOMPARE(prop.connectNotifySignal(obj, obj->metaObject()->indexOfMethod("deleteLater()")), false); + QCOMPARE(prop.connectNotifySignal(obj, -1), false); + QVERIFY(prop.method().signature() == 0); + QCOMPARE(prop.type(), QDeclarativeProperty::Invalid); + QCOMPARE(prop.isProperty(), false); + QCOMPARE(prop.isWritable(), false); + QCOMPARE(prop.isDesignable(), false); + QCOMPARE(prop.isResettable(), false); + QCOMPARE(prop.isSignalProperty(), false); + QCOMPARE(prop.isValid(), false); + QCOMPARE(prop.object(), (QObject *)0); + QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::InvalidCategory); + QCOMPARE(prop.propertyType(), 0); + QCOMPARE(prop.propertyTypeName(), (const char *)0); + QVERIFY(prop.property().name() == 0); + QVERIFY(QDeclarativePropertyPrivate::binding(prop) == 0); + QVERIFY(QDeclarativePropertyPrivate::setBinding(prop, binding.data()) == 0); + QVERIFY(binding == 0); + QVERIFY(QDeclarativePropertyPrivate::signalExpression(prop) == 0); + QVERIFY(QDeclarativePropertyPrivate::setSignalExpression(prop, expression.data()) == 0); + QVERIFY(expression == 0); + QCOMPARE(prop.index(), -1); + QCOMPARE(QDeclarativePropertyPrivate::valueTypeCoreIndex(prop), -1); + + delete obj; + } + + { + QDeclarativeProperty prop(&dobject, QString("defaultProperty"), engine.rootContext()); + + QWeakPointer binding(new QDeclarativeBinding(QLatin1String("null"), 0, engine.rootContext())); + binding.data()->setTarget(prop); + QVERIFY(binding != 0); + QWeakPointer expression(new QDeclarativeExpression()); + QVERIFY(expression != 0); + + QObject *obj = new QObject; + + QCOMPARE(prop.name(), QString("defaultProperty")); + QCOMPARE(prop.read(), QVariant(10)); + QCOMPARE(prop.write(QVariant()), false); + QCOMPARE(prop.hasNotifySignal(), false); + QCOMPARE(prop.needsNotifySignal(), true); + QCOMPARE(prop.connectNotifySignal(0, SLOT(deleteLater())), false); + QCOMPARE(prop.connectNotifySignal(obj, SLOT(deleteLater())), false); + QCOMPARE(prop.connectNotifySignal(obj, 0), false); + QCOMPARE(prop.connectNotifySignal(0, obj->metaObject()->indexOfMethod("deleteLater()")), false); + QCOMPARE(prop.connectNotifySignal(obj, obj->metaObject()->indexOfMethod("deleteLater()")), false); + QCOMPARE(prop.connectNotifySignal(obj, -1), false); + QVERIFY(prop.method().signature() == 0); + QCOMPARE(prop.type(), QDeclarativeProperty::Property); + QCOMPARE(prop.isProperty(), true); + QCOMPARE(prop.isWritable(), false); + QCOMPARE(prop.isDesignable(), true); + QCOMPARE(prop.isResettable(), false); + QCOMPARE(prop.isSignalProperty(), false); + QCOMPARE(prop.isValid(), true); + QCOMPARE(prop.object(), qobject_cast(&dobject)); + QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::Normal); + QCOMPARE(prop.propertyType(), (int)QVariant::Int); + QCOMPARE(prop.propertyTypeName(), "int"); + QCOMPARE(QString(prop.property().name()), QString("defaultProperty")); + QVERIFY(QDeclarativePropertyPrivate::binding(prop) == 0); + QTest::ignoreMessage(QtWarningMsg, ": Unable to assign null to int"); + QVERIFY(QDeclarativePropertyPrivate::setBinding(prop, binding.data()) == 0); + QVERIFY(binding != 0); + QVERIFY(QDeclarativePropertyPrivate::binding(prop) == binding.data()); + QVERIFY(QDeclarativePropertyPrivate::signalExpression(prop) == 0); + QVERIFY(QDeclarativePropertyPrivate::setSignalExpression(prop, expression.data()) == 0); + QVERIFY(expression == 0); + QCOMPARE(prop.index(), dobject.metaObject()->indexOfProperty("defaultProperty")); + QCOMPARE(QDeclarativePropertyPrivate::valueTypeCoreIndex(prop), -1); + + delete obj; + } + + { + QDeclarativeProperty prop(&dobject, QString("onClicked"), engine.rootContext()); + + QWeakPointer binding(new QDeclarativeBinding(QLatin1String("null"), 0, engine.rootContext())); + binding.data()->setTarget(prop); + QVERIFY(binding != 0); + QWeakPointer expression(new QDeclarativeExpression()); + QVERIFY(expression != 0); + + QObject *obj = new QObject; + + QCOMPARE(prop.name(), QString("onClicked")); + QCOMPARE(prop.read(), QVariant()); + QCOMPARE(prop.write(QVariant("Hello")), false); + QCOMPARE(prop.hasNotifySignal(), false); + QCOMPARE(prop.needsNotifySignal(), false); + QCOMPARE(prop.connectNotifySignal(0, SLOT(deleteLater())), false); + QCOMPARE(prop.connectNotifySignal(obj, SLOT(deleteLater())), false); + QCOMPARE(prop.connectNotifySignal(obj, 0), false); + QCOMPARE(prop.connectNotifySignal(0, obj->metaObject()->indexOfMethod("deleteLater()")), false); + QCOMPARE(prop.connectNotifySignal(obj, obj->metaObject()->indexOfMethod("deleteLater()")), false); + QCOMPARE(prop.connectNotifySignal(obj, -1), false); + QCOMPARE(QString(prop.method().signature()), QString("clicked()")); + QCOMPARE(prop.type(), QDeclarativeProperty::SignalProperty); + QCOMPARE(prop.isProperty(), false); + QCOMPARE(prop.isWritable(), false); + QCOMPARE(prop.isDesignable(), false); + QCOMPARE(prop.isResettable(), false); + QCOMPARE(prop.isSignalProperty(), true); + QCOMPARE(prop.isValid(), true); + QCOMPARE(prop.object(), qobject_cast(&dobject)); + QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::InvalidCategory); + QCOMPARE(prop.propertyType(), 0); + QCOMPARE(prop.propertyTypeName(), (const char *)0); + QCOMPARE(prop.property().name(), (const char *)0); + QVERIFY(QDeclarativePropertyPrivate::binding(prop) == 0); + QVERIFY(QDeclarativePropertyPrivate::setBinding(prop, binding.data()) == 0); + QVERIFY(binding == 0); + QVERIFY(QDeclarativePropertyPrivate::signalExpression(prop) == 0); + QVERIFY(QDeclarativePropertyPrivate::setSignalExpression(prop, expression.data()) == 0); + QVERIFY(expression != 0); + QVERIFY(QDeclarativePropertyPrivate::signalExpression(prop) == expression.data()); + QCOMPARE(prop.index(), dobject.metaObject()->indexOfMethod("clicked()")); + QCOMPARE(QDeclarativePropertyPrivate::valueTypeCoreIndex(prop), -1); + + delete obj; + } + + { + QDeclarativeProperty prop(&dobject, QString("onPropertyWithNotifyChanged"), engine.rootContext()); + + QWeakPointer binding(new QDeclarativeBinding(QLatin1String("null"), 0, engine.rootContext())); + binding.data()->setTarget(prop); + QVERIFY(binding != 0); + QWeakPointer expression(new QDeclarativeExpression()); + QVERIFY(expression != 0); + + QObject *obj = new QObject; + + QCOMPARE(prop.name(), QString("onOddlyNamedNotifySignal")); + QCOMPARE(prop.read(), QVariant()); + QCOMPARE(prop.write(QVariant("Hello")), false); + QCOMPARE(prop.hasNotifySignal(), false); + QCOMPARE(prop.needsNotifySignal(), false); + QCOMPARE(prop.connectNotifySignal(0, SLOT(deleteLater())), false); + QCOMPARE(prop.connectNotifySignal(obj, SLOT(deleteLater())), false); + QCOMPARE(prop.connectNotifySignal(obj, 0), false); + QCOMPARE(prop.connectNotifySignal(0, obj->metaObject()->indexOfMethod("deleteLater()")), false); + QCOMPARE(prop.connectNotifySignal(obj, obj->metaObject()->indexOfMethod("deleteLater()")), false); + QCOMPARE(prop.connectNotifySignal(obj, -1), false); + QCOMPARE(QString(prop.method().signature()), QString("oddlyNamedNotifySignal()")); + QCOMPARE(prop.type(), QDeclarativeProperty::SignalProperty); + QCOMPARE(prop.isProperty(), false); + QCOMPARE(prop.isWritable(), false); + QCOMPARE(prop.isDesignable(), false); + QCOMPARE(prop.isResettable(), false); + QCOMPARE(prop.isSignalProperty(), true); + QCOMPARE(prop.isValid(), true); + QCOMPARE(prop.object(), qobject_cast(&dobject)); + QCOMPARE(prop.propertyTypeCategory(), QDeclarativeProperty::InvalidCategory); + QCOMPARE(prop.propertyType(), 0); + QCOMPARE(prop.propertyTypeName(), (const char *)0); + QCOMPARE(prop.property().name(), (const char *)0); + QVERIFY(QDeclarativePropertyPrivate::binding(prop) == 0); + QVERIFY(QDeclarativePropertyPrivate::setBinding(prop, binding.data()) == 0); + QVERIFY(binding == 0); + QVERIFY(QDeclarativePropertyPrivate::signalExpression(prop) == 0); + QVERIFY(QDeclarativePropertyPrivate::setSignalExpression(prop, expression.data()) == 0); + QVERIFY(expression != 0); + QVERIFY(QDeclarativePropertyPrivate::signalExpression(prop) == expression.data()); + QCOMPARE(prop.index(), dobject.metaObject()->indexOfMethod("oddlyNamedNotifySignal()")); + QCOMPARE(QDeclarativePropertyPrivate::valueTypeCoreIndex(prop), -1); + + delete obj; + } +} + +void tst_qdeclarativeproperty::name() +{ + { + QDeclarativeProperty p; + QCOMPARE(p.name(), QString()); + } + + { + PropertyObject o; + QDeclarativeProperty p(&o); + QCOMPARE(p.name(), QString("defaultProperty")); + } + + { + QObject o; + QDeclarativeProperty p(&o, QString("objectName")); + QCOMPARE(p.name(), QString("objectName")); + } + + { + PropertyObject o; + QDeclarativeProperty p(&o, "onClicked"); + QCOMPARE(p.name(), QString("onClicked")); + } + + { + QObject o; + QDeclarativeProperty p(&o, "onClicked"); + QCOMPARE(p.name(), QString()); + } + + { + PropertyObject o; + QDeclarativeProperty p(&o, "onPropertyWithNotifyChanged"); + QCOMPARE(p.name(), QString("onOddlyNamedNotifySignal")); + } + + { + QObject o; + QDeclarativeProperty p(&o, "onPropertyWithNotifyChanged"); + QCOMPARE(p.name(), QString()); + } + + { + QObject o; + QDeclarativeProperty p(&o, "foo"); + QCOMPARE(p.name(), QString()); + } + + { + QDeclarativeProperty p(0, "foo"); + QCOMPARE(p.name(), QString()); + } + + { + PropertyObject o; + QDeclarativeProperty p(&o, "rectProperty"); + QCOMPARE(p.name(), QString("rectProperty")); + } + + { + PropertyObject o; + QDeclarativeProperty p(&o, "rectProperty.x"); + QCOMPARE(p.name(), QString("rectProperty.x")); + } + + { + PropertyObject o; + QDeclarativeProperty p(&o, "rectProperty.foo"); + QCOMPARE(p.name(), QString()); + } +} + +void tst_qdeclarativeproperty::read() +{ + // Invalid + { + QDeclarativeProperty p; + QCOMPARE(p.read(), QVariant()); + } + + // Default prop + { + PropertyObject o; + QDeclarativeProperty p(&o); + QCOMPARE(p.read(), QVariant(10)); + } + + // Invalid default prop + { + QObject o; + QDeclarativeProperty p(&o); + QCOMPARE(p.read(), QVariant()); + } + + // Value prop by name + { + QObject o; + + QDeclarativeProperty p(&o, "objectName"); + QCOMPARE(p.read(), QVariant(QString())); + + o.setObjectName("myName"); + + QCOMPARE(p.read(), QVariant("myName")); + } + + // Value prop by name (static) + { + QObject o; + + QCOMPARE(QDeclarativeProperty::read(&o, "objectName"), QVariant(QString())); + + o.setObjectName("myName"); + + QCOMPARE(QDeclarativeProperty::read(&o, "objectName"), QVariant("myName")); + } + + // Value-type prop + { + PropertyObject o; + QDeclarativeProperty p(&o, "rectProperty.x"); + QCOMPARE(p.read(), QVariant(10)); + } + + // Invalid value-type prop + { + PropertyObject o; + QDeclarativeProperty p(&o, "rectProperty.foo"); + QCOMPARE(p.read(), QVariant()); + } + + // Signal property + { + PropertyObject o; + QDeclarativeProperty p(&o, "onClicked"); + QCOMPARE(p.read(), QVariant()); + + QVERIFY(0 == QDeclarativePropertyPrivate::setSignalExpression(p, new QDeclarativeExpression())); + QVERIFY(0 != QDeclarativePropertyPrivate::signalExpression(p)); + + QCOMPARE(p.read(), QVariant()); + } + + // Automatic signal property + { + PropertyObject o; + QDeclarativeProperty p(&o, "onPropertyWithNotifyChanged"); + QCOMPARE(p.read(), QVariant()); + + QVERIFY(0 == QDeclarativePropertyPrivate::setSignalExpression(p, new QDeclarativeExpression())); + QVERIFY(0 != QDeclarativePropertyPrivate::signalExpression(p)); + + QCOMPARE(p.read(), QVariant()); + } + + // Deleted object + { + PropertyObject *o = new PropertyObject; + QDeclarativeProperty p(o, "rectProperty.x"); + QCOMPARE(p.read(), QVariant(10)); + delete o; + QCOMPARE(p.read(), QVariant()); + } + + // Object property + { + PropertyObject o; + QDeclarativeProperty p(&o, "qmlObject"); + QCOMPARE(p.propertyTypeCategory(), QDeclarativeProperty::Object); + QCOMPARE(p.propertyType(), qMetaTypeId()); + QVariant v = p.read(); + QVERIFY(v.userType() == QMetaType::QObjectStar); + QVERIFY(qvariant_cast(v) == o.qmlObject()); + } + { + QDeclarativeComponent component(&engine, TEST_FILE("readSynthesizedObject.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QDeclarativeProperty p(object, "test", &engine); + + QCOMPARE(p.propertyTypeCategory(), QDeclarativeProperty::Object); + QVERIFY(p.propertyType() != QMetaType::QObjectStar); + + QVariant v = p.read(); + QVERIFY(v.userType() == QMetaType::QObjectStar); + QCOMPARE(qvariant_cast(v)->property("a").toInt(), 10); + QCOMPARE(qvariant_cast(v)->property("b").toInt(), 19); + } + { // static + QDeclarativeComponent component(&engine, TEST_FILE("readSynthesizedObject.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QVariant v = QDeclarativeProperty::read(object, "test", &engine); + QVERIFY(v.userType() == QMetaType::QObjectStar); + QCOMPARE(qvariant_cast(v)->property("a").toInt(), 10); + QCOMPARE(qvariant_cast(v)->property("b").toInt(), 19); + } + + // Attached property + { + QDeclarativeComponent component(&engine); + component.setData("import Test 1.0\nMyContainer { }", QUrl()); + QObject *object = component.create(); + QVERIFY(object != 0); + + QDeclarativeProperty p(object, "MyContainer.foo", qmlContext(object)); + QCOMPARE(p.read(), QVariant(13)); + delete object; + } + { + QDeclarativeComponent component(&engine); + component.setData("import Test 1.0\nMyContainer { MyContainer.foo: 10 }", QUrl()); + QObject *object = component.create(); + QVERIFY(object != 0); + + QDeclarativeProperty p(object, "MyContainer.foo", qmlContext(object)); + QCOMPARE(p.read(), QVariant(10)); + delete object; + } + { + QDeclarativeComponent component(&engine); + component.setData("import Test 1.0 as Foo\nFoo.MyContainer { Foo.MyContainer.foo: 10 }", QUrl()); + QObject *object = component.create(); + QVERIFY(object != 0); + + QDeclarativeProperty p(object, "Foo.MyContainer.foo", qmlContext(object)); + QCOMPARE(p.read(), QVariant(10)); + delete object; + } + { // static + QDeclarativeComponent component(&engine); + component.setData("import Test 1.0 as Foo\nFoo.MyContainer { Foo.MyContainer.foo: 10 }", QUrl()); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(QDeclarativeProperty::read(object, "Foo.MyContainer.foo", qmlContext(object)), QVariant(10)); + delete object; + } +} + +void tst_qdeclarativeproperty::write() +{ + // Invalid + { + QDeclarativeProperty p; + QCOMPARE(p.write(QVariant(10)), false); + } + + // Read-only default prop + { + PropertyObject o; + QDeclarativeProperty p(&o); + QCOMPARE(p.write(QVariant(10)), false); + } + + // Invalid default prop + { + QObject o; + QDeclarativeProperty p(&o); + QCOMPARE(p.write(QVariant(10)), false); + } + + // Read-only prop by name + { + PropertyObject o; + QDeclarativeProperty p(&o, QString("defaultProperty")); + QCOMPARE(p.write(QVariant(10)), false); + } + + // Writable prop by name + { + PropertyObject o; + QDeclarativeProperty p(&o, QString("objectName")); + QCOMPARE(o.objectName(), QString()); + QCOMPARE(p.write(QVariant(QString("myName"))), true); + QCOMPARE(o.objectName(), QString("myName")); + } + + // Writable prop by name (static) + { + PropertyObject o; + QCOMPARE(QDeclarativeProperty::write(&o, QString("objectName"), QVariant(QString("myName"))), true); + QCOMPARE(o.objectName(), QString("myName")); + } + + // Deleted object + { + PropertyObject *o = new PropertyObject; + QDeclarativeProperty p(o, QString("objectName")); + QCOMPARE(p.write(QVariant(QString("myName"))), true); + QCOMPARE(o->objectName(), QString("myName")); + + delete o; + + QCOMPARE(p.write(QVariant(QString("myName"))), false); + } + + // Signal property + { + PropertyObject o; + QDeclarativeProperty p(&o, "onClicked"); + QCOMPARE(p.write(QVariant("console.log(1921)")), false); + + QVERIFY(0 == QDeclarativePropertyPrivate::setSignalExpression(p, new QDeclarativeExpression())); + QVERIFY(0 != QDeclarativePropertyPrivate::signalExpression(p)); + + QCOMPARE(p.write(QVariant("console.log(1921)")), false); + + QVERIFY(0 != QDeclarativePropertyPrivate::signalExpression(p)); + } + + // Automatic signal property + { + PropertyObject o; + QDeclarativeProperty p(&o, "onPropertyWithNotifyChanged"); + QCOMPARE(p.write(QVariant("console.log(1921)")), false); + + QVERIFY(0 == QDeclarativePropertyPrivate::setSignalExpression(p, new QDeclarativeExpression())); + QVERIFY(0 != QDeclarativePropertyPrivate::signalExpression(p)); + + QCOMPARE(p.write(QVariant("console.log(1921)")), false); + + QVERIFY(0 != QDeclarativePropertyPrivate::signalExpression(p)); + } + + // Value-type property + { + PropertyObject o; + QDeclarativeProperty p(&o, "wrectProperty"); + + QCOMPARE(o.wrectProperty(), QRect()); + QCOMPARE(p.write(QRect(1, 13, 99, 8)), true); + QCOMPARE(o.wrectProperty(), QRect(1, 13, 99, 8)); + + QDeclarativeProperty p2(&o, "wrectProperty.x"); + QCOMPARE(p2.read(), QVariant(1)); + QCOMPARE(p2.write(QVariant(6)), true); + QCOMPARE(p2.read(), QVariant(6)); + QCOMPARE(o.wrectProperty(), QRect(6, 13, 99, 8)); + } + + // URL-property + { + PropertyObject o; + QDeclarativeProperty p(&o, "url"); + + QCOMPARE(p.write(QUrl("main.qml")), true); + QCOMPARE(o.url(), QUrl("main.qml")); + + QDeclarativeProperty p2(&o, "url", engine.rootContext()); + + QUrl result = engine.baseUrl().resolved(QUrl("main.qml")); + QVERIFY(result != QUrl("main.qml")); + + QCOMPARE(p2.write(QUrl("main.qml")), true); + QCOMPARE(o.url(), result); + } + { // static + PropertyObject o; + + QCOMPARE(QDeclarativeProperty::write(&o, "url", QUrl("main.qml")), true); + QCOMPARE(o.url(), QUrl("main.qml")); + + QUrl result = engine.baseUrl().resolved(QUrl("main.qml")); + QVERIFY(result != QUrl("main.qml")); + + QCOMPARE(QDeclarativeProperty::write(&o, "url", QUrl("main.qml"), engine.rootContext()), true); + QCOMPARE(o.url(), result); + } + + // Attached property + { + QDeclarativeComponent component(&engine); + component.setData("import Test 1.0\nMyContainer { }", QUrl()); + QObject *object = component.create(); + QVERIFY(object != 0); + + QDeclarativeProperty p(object, "MyContainer.foo", qmlContext(object)); + p.write(QVariant(99)); + QCOMPARE(p.read(), QVariant(99)); + delete object; + } + { + QDeclarativeComponent component(&engine); + component.setData("import Test 1.0 as Foo\nFoo.MyContainer { Foo.MyContainer.foo: 10 }", QUrl()); + QObject *object = component.create(); + QVERIFY(object != 0); + + QDeclarativeProperty p(object, "Foo.MyContainer.foo", qmlContext(object)); + p.write(QVariant(99)); + QCOMPARE(p.read(), QVariant(99)); + delete object; + } +} + +void tst_qdeclarativeproperty::reset() +{ + // Invalid + { + QDeclarativeProperty p; + QCOMPARE(p.isResettable(), false); + QCOMPARE(p.reset(), false); + } + + // Read-only default prop + { + PropertyObject o; + QDeclarativeProperty p(&o); + QCOMPARE(p.isResettable(), false); + QCOMPARE(p.reset(), false); + } + + // Invalid default prop + { + QObject o; + QDeclarativeProperty p(&o); + QCOMPARE(p.isResettable(), false); + QCOMPARE(p.reset(), false); + } + + // Non-resettable-only prop by name + { + PropertyObject o; + QDeclarativeProperty p(&o, QString("defaultProperty")); + QCOMPARE(p.isResettable(), false); + QCOMPARE(p.reset(), false); + } + + // Resettable prop by name + { + PropertyObject o; + QDeclarativeProperty p(&o, QString("resettableProperty")); + + QCOMPARE(p.read(), QVariant(9)); + QCOMPARE(p.write(QVariant(11)), true); + QCOMPARE(p.read(), QVariant(11)); + + QCOMPARE(p.isResettable(), true); + QCOMPARE(p.reset(), true); + + QCOMPARE(p.read(), QVariant(9)); + } + + // Deleted object + { + PropertyObject *o = new PropertyObject; + + QDeclarativeProperty p(o, QString("resettableProperty")); + + QCOMPARE(p.isResettable(), true); + QCOMPARE(p.reset(), true); + + delete o; + + QCOMPARE(p.isResettable(), false); + QCOMPARE(p.reset(), false); + } + + // Signal property + { + PropertyObject o; + QDeclarativeProperty p(&o, "onClicked"); + + QCOMPARE(p.isResettable(), false); + QCOMPARE(p.reset(), false); + } + + // Automatic signal property + { + PropertyObject o; + QDeclarativeProperty p(&o, "onPropertyWithNotifyChanged"); + + QCOMPARE(p.isResettable(), false); + QCOMPARE(p.reset(), false); + } +} + +void tst_qdeclarativeproperty::writeObjectToList() +{ + QDeclarativeComponent containerComponent(&engine); + containerComponent.setData("import Test 1.0\nMyContainer { children: MyQmlObject {} }", QUrl()); + MyContainer *container = qobject_cast(containerComponent.create()); + QVERIFY(container != 0); + QDeclarativeListReference list(container, "children"); + QVERIFY(list.count() == 1); + + MyQmlObject *object = new MyQmlObject; + QDeclarativeProperty prop(container, "children"); + prop.write(qVariantFromValue(object)); + QCOMPARE(list.count(), 1); + QCOMPARE(list.at(0), qobject_cast(object)); +} + +Q_DECLARE_METATYPE(QList); +void tst_qdeclarativeproperty::writeListToList() +{ + QDeclarativeComponent containerComponent(&engine); + containerComponent.setData("import Test 1.0\nMyContainer { children: MyQmlObject {} }", QUrl()); + MyContainer *container = qobject_cast(containerComponent.create()); + QVERIFY(container != 0); + QDeclarativeListReference list(container, "children"); + QVERIFY(list.count() == 1); + + QList objList; + objList << new MyQmlObject() << new MyQmlObject() << new MyQmlObject() << new MyQmlObject(); + QDeclarativeProperty prop(container, "children"); + prop.write(qVariantFromValue(objList)); + QCOMPARE(list.count(), 4); + + //XXX need to try this with read/write prop (for read-only it correctly doesn't write) + /*QList typedObjList; + typedObjList << new MyQmlObject(); + prop.write(qVariantFromValue(&typedObjList)); + QCOMPARE(container->children()->size(), 1);*/ +} + +void tst_qdeclarativeproperty::crashOnValueProperty() +{ + QDeclarativeEngine *engine = new QDeclarativeEngine; + QDeclarativeComponent component(engine); + + component.setData("import Test 1.0\nPropertyObject { wrectProperty.x: 10 }", QUrl()); + PropertyObject *obj = qobject_cast(component.create()); + QVERIFY(obj != 0); + + QDeclarativeProperty p(obj, "wrectProperty.x", qmlContext(obj)); + QCOMPARE(p.name(), QString("wrectProperty.x")); + + QCOMPARE(p.read(), QVariant(10)); + + //don't crash once the engine is deleted + delete engine; + engine = 0; + + QCOMPARE(p.propertyTypeName(), "int"); + QCOMPARE(p.read(), QVariant(10)); + p.write(QVariant(20)); + QCOMPARE(p.read(), QVariant(20)); +} + +// QTBUG-13719 +void tst_qdeclarativeproperty::aliasPropertyBindings() +{ + QDeclarativeComponent component(&engine, TEST_FILE("aliasPropertyBindings.qml")); + + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("realProperty").toReal(), 90.); + QCOMPARE(object->property("aliasProperty").toReal(), 90.); + + object->setProperty("test", 10); + + QCOMPARE(object->property("realProperty").toReal(), 110.); + QCOMPARE(object->property("aliasProperty").toReal(), 110.); + + QDeclarativeProperty realProperty(object, QLatin1String("realProperty")); + QDeclarativeProperty aliasProperty(object, QLatin1String("aliasProperty")); + + // Check there is a binding on these two properties + QVERIFY(QDeclarativePropertyPrivate::binding(realProperty) != 0); + QVERIFY(QDeclarativePropertyPrivate::binding(aliasProperty) != 0); + + // Check that its the same binding on these two properties + QCOMPARE(QDeclarativePropertyPrivate::binding(realProperty), + QDeclarativePropertyPrivate::binding(aliasProperty)); + + // Change the binding + object->setProperty("state", QString("switch")); + + QVERIFY(QDeclarativePropertyPrivate::binding(realProperty) != 0); + QVERIFY(QDeclarativePropertyPrivate::binding(aliasProperty) != 0); + QCOMPARE(QDeclarativePropertyPrivate::binding(realProperty), + QDeclarativePropertyPrivate::binding(aliasProperty)); + + QCOMPARE(object->property("realProperty").toReal(), 96.); + QCOMPARE(object->property("aliasProperty").toReal(), 96.); + + // Check the old binding really has not effect any more + object->setProperty("test", 4); + + QCOMPARE(object->property("realProperty").toReal(), 96.); + QCOMPARE(object->property("aliasProperty").toReal(), 96.); + + object->setProperty("test2", 9); + + QCOMPARE(object->property("realProperty").toReal(), 288.); + QCOMPARE(object->property("aliasProperty").toReal(), 288.); + + // Revert + object->setProperty("state", QString("")); + + QVERIFY(QDeclarativePropertyPrivate::binding(realProperty) != 0); + QVERIFY(QDeclarativePropertyPrivate::binding(aliasProperty) != 0); + QCOMPARE(QDeclarativePropertyPrivate::binding(realProperty), + QDeclarativePropertyPrivate::binding(aliasProperty)); + + QCOMPARE(object->property("realProperty").toReal(), 20.); + QCOMPARE(object->property("aliasProperty").toReal(), 20.); + + object->setProperty("test2", 3); + + QCOMPARE(object->property("realProperty").toReal(), 20.); + QCOMPARE(object->property("aliasProperty").toReal(), 20.); + + delete object; +} + +void tst_qdeclarativeproperty::copy() +{ + PropertyObject object; + + QDeclarativeProperty *property = new QDeclarativeProperty(&object, QLatin1String("defaultProperty")); + QCOMPARE(property->name(), QString("defaultProperty")); + QCOMPARE(property->read(), QVariant(10)); + QCOMPARE(property->type(), QDeclarativeProperty::Property); + QCOMPARE(property->propertyTypeCategory(), QDeclarativeProperty::Normal); + QCOMPARE(property->propertyType(), (int)QVariant::Int); + + QDeclarativeProperty p1(*property); + QCOMPARE(p1.name(), QString("defaultProperty")); + QCOMPARE(p1.read(), QVariant(10)); + QCOMPARE(p1.type(), QDeclarativeProperty::Property); + QCOMPARE(p1.propertyTypeCategory(), QDeclarativeProperty::Normal); + QCOMPARE(p1.propertyType(), (int)QVariant::Int); + + QDeclarativeProperty p2(&object, QLatin1String("url")); + QCOMPARE(p2.name(), QString("url")); + p2 = *property; + QCOMPARE(p2.name(), QString("defaultProperty")); + QCOMPARE(p2.read(), QVariant(10)); + QCOMPARE(p2.type(), QDeclarativeProperty::Property); + QCOMPARE(p2.propertyTypeCategory(), QDeclarativeProperty::Normal); + QCOMPARE(p2.propertyType(), (int)QVariant::Int); + + delete property; property = 0; + + QCOMPARE(p1.name(), QString("defaultProperty")); + QCOMPARE(p1.read(), QVariant(10)); + QCOMPARE(p1.type(), QDeclarativeProperty::Property); + QCOMPARE(p1.propertyTypeCategory(), QDeclarativeProperty::Normal); + QCOMPARE(p1.propertyType(), (int)QVariant::Int); + + QCOMPARE(p2.name(), QString("defaultProperty")); + QCOMPARE(p2.read(), QVariant(10)); + QCOMPARE(p2.type(), QDeclarativeProperty::Property); + QCOMPARE(p2.propertyTypeCategory(), QDeclarativeProperty::Normal); + QCOMPARE(p2.propertyType(), (int)QVariant::Int); +} + +void tst_qdeclarativeproperty::initTestCase() +{ + qmlRegisterType("Test",1,0,"MyQmlObject"); + qmlRegisterType("Test",1,0,"PropertyObject"); + qmlRegisterType("Test",1,0,"MyContainer"); +} + + +QTEST_MAIN(tst_qdeclarativeproperty) + +#include "tst_qdeclarativeproperty.moc" diff --git a/tests/auto/declarative/qdeclarativepropertymap/qdeclarativepropertymap.pro b/tests/auto/declarative/qdeclarativepropertymap/qdeclarativepropertymap.pro new file mode 100644 index 00000000..3c0f7b34 --- /dev/null +++ b/tests/auto/declarative/qdeclarativepropertymap/qdeclarativepropertymap.pro @@ -0,0 +1,8 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativepropertymap.cpp + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativepropertymap/tst_qdeclarativepropertymap.cpp b/tests/auto/declarative/qdeclarativepropertymap/tst_qdeclarativepropertymap.cpp new file mode 100644 index 00000000..33a66891 --- /dev/null +++ b/tests/auto/declarative/qdeclarativepropertymap/tst_qdeclarativepropertymap.cpp @@ -0,0 +1,223 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include + +class tst_QDeclarativePropertyMap : public QObject +{ + Q_OBJECT +public: + tst_QDeclarativePropertyMap() {} + +private slots: + void insert(); + void operatorInsert(); + void operatorValue(); + void clear(); + void changed(); + void count(); + + void crashBug(); +}; + +void tst_QDeclarativePropertyMap::insert() +{ + QDeclarativePropertyMap map; + map.insert(QLatin1String("key1"),100); + map.insert(QLatin1String("key2"),200); + QVERIFY(map.keys().count() == 2); + QVERIFY(map.contains(QLatin1String("key1"))); + + QCOMPARE(map.value(QLatin1String("key1")), QVariant(100)); + QCOMPARE(map.value(QLatin1String("key2")), QVariant(200)); + + map.insert(QLatin1String("key1"),"Hello World"); + QCOMPARE(map.value(QLatin1String("key1")), QVariant("Hello World")); + + //inserting property names same with existing method(signal, slot, method) names is not allowed + //QDeclarativePropertyMap has an invokable keys() method + QTest::ignoreMessage(QtWarningMsg, "Creating property with name \"keys\" is not permitted, conflicts with internal symbols. "); + map.insert(QLatin1String("keys"), 1); + QVERIFY(map.keys().count() == 2); + QVERIFY(!map.contains(QLatin1String("keys"))); + QVERIFY(map.value(QLatin1String("keys")).isNull()); + + //QDeclarativePropertyMap has a deleteLater() slot + QTest::ignoreMessage(QtWarningMsg, "Creating property with name \"deleteLater\" is not permitted, conflicts with internal symbols. "); + map.insert(QLatin1String("deleteLater"), 1); + QVERIFY(map.keys().count() == 2); + QVERIFY(!map.contains(QLatin1String("deleteLater"))); + QVERIFY(map.value(QLatin1String("deleteLater")).isNull()); + + //QDeclarativePropertyMap has an valueChanged() signal + QTest::ignoreMessage(QtWarningMsg, "Creating property with name \"valueChanged\" is not permitted, conflicts with internal symbols. "); + map.insert(QLatin1String("valueChanged"), 1); + QVERIFY(map.keys().count() == 2); + QVERIFY(!map.contains(QLatin1String("valueChanged"))); + QVERIFY(map.value(QLatin1String("valueChanged")).isNull()); + + //but 'valueChange' should be ok + map.insert(QLatin1String("valueChange"), 1); + QVERIFY(map.keys().count() == 3); + QVERIFY(map.contains(QLatin1String("valueChange"))); + QCOMPARE(map.value(QLatin1String("valueChange")), QVariant(1)); + + //'valueCHANGED' should be ok, too + map.insert(QLatin1String("valueCHANGED"), 1); + QVERIFY(map.keys().count() == 4); + QVERIFY(map.contains(QLatin1String("valueCHANGED"))); + QCOMPARE(map.value(QLatin1String("valueCHANGED")), QVariant(1)); +} + +void tst_QDeclarativePropertyMap::operatorInsert() +{ + QDeclarativePropertyMap map; + map[QLatin1String("key1")] = 100; + map[QLatin1String("key2")] = 200; + QVERIFY(map.keys().count() == 2); + + QCOMPARE(map.value(QLatin1String("key1")), QVariant(100)); + QCOMPARE(map.value(QLatin1String("key2")), QVariant(200)); + + map[QLatin1String("key1")] = "Hello World"; + QCOMPARE(map.value(QLatin1String("key1")), QVariant("Hello World")); +} + +void tst_QDeclarativePropertyMap::operatorValue() +{ + QDeclarativePropertyMap map; + map.insert(QLatin1String("key1"),100); + map.insert(QLatin1String("key2"),200); + QVERIFY(map.count() == 2); + QVERIFY(map.contains(QLatin1String("key1"))); + + const QDeclarativePropertyMap &constMap = map; + + QCOMPARE(constMap.value(QLatin1String("key1")), QVariant(100)); + QCOMPARE(constMap.value(QLatin1String("key2")), QVariant(200)); + QCOMPARE(constMap[QLatin1String("key1")], constMap.value(QLatin1String("key1"))); + QCOMPARE(constMap[QLatin1String("key2")], constMap.value(QLatin1String("key2"))); +} + +void tst_QDeclarativePropertyMap::clear() +{ + QDeclarativePropertyMap map; + map.insert(QLatin1String("key1"),100); + QVERIFY(map.keys().count() == 1); + + QCOMPARE(map.value(QLatin1String("key1")), QVariant(100)); + + map.clear(QLatin1String("key1")); + QVERIFY(map.keys().count() == 1); + QVERIFY(map.contains(QLatin1String("key1"))); + QCOMPARE(map.value(QLatin1String("key1")), QVariant()); +} + +void tst_QDeclarativePropertyMap::changed() +{ + QDeclarativePropertyMap map; + QSignalSpy spy(&map, SIGNAL(valueChanged(const QString&, const QVariant&))); + map.insert(QLatin1String("key1"),100); + map.insert(QLatin1String("key2"),200); + QCOMPARE(spy.count(), 0); + + map.clear(QLatin1String("key1")); + QCOMPARE(spy.count(), 0); + + //make changes in QML + QDeclarativeEngine engine; + QDeclarativeContext *ctxt = engine.rootContext(); + ctxt->setContextProperty(QLatin1String("testdata"), &map); + QDeclarativeComponent component(&engine); + component.setData("import QtQuick 1.0\nText { text: { testdata.key1 = 'Hello World'; 'X' } }", + QUrl::fromLocalFile("")); + QVERIFY(component.isReady()); + QDeclarativeText *txt = qobject_cast(component.create()); + QVERIFY(txt); + QCOMPARE(txt->text(), QString('X')); + QCOMPARE(spy.count(), 1); + QList arguments = spy.takeFirst(); + QCOMPARE(arguments.count(), 2); + QCOMPARE(arguments.at(0).toString(),QLatin1String("key1")); + QCOMPARE(arguments.at(1).value(),QVariant("Hello World")); + QCOMPARE(map.value(QLatin1String("key1")), QVariant("Hello World")); +} + +void tst_QDeclarativePropertyMap::count() +{ + QDeclarativePropertyMap map; + QCOMPARE(map.isEmpty(), true); + map.insert(QLatin1String("key1"),100); + map.insert(QLatin1String("key2"),200); + QCOMPARE(map.count(), 2); + QCOMPARE(map.isEmpty(), false); + + map.insert(QLatin1String("key3"),"Hello World"); + QCOMPARE(map.count(), 3); + + //clearing doesn't remove the key + map.clear(QLatin1String("key3")); + QCOMPARE(map.count(), 3); + QCOMPARE(map.size(), map.count()); +} + +void tst_QDeclarativePropertyMap::crashBug() +{ + QDeclarativePropertyMap map; + + QDeclarativeEngine engine; + QDeclarativeContext context(&engine); + context.setContextProperty("map", &map); + + QDeclarativeComponent c(&engine); + c.setData("import QtQuick 1.0\nBinding { target: map; property: \"myProp\"; value: 10 + 23 }",QUrl()); + QObject *obj = c.create(&context); + delete obj; +} + +QTEST_MAIN(tst_QDeclarativePropertyMap) + +#include "tst_qdeclarativepropertymap.moc" diff --git a/tests/auto/declarative/qdeclarativeqt/data/atob.qml b/tests/auto/declarative/qdeclarativeqt/data/atob.qml new file mode 100644 index 00000000..f74aae83 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeqt/data/atob.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +QtObject { + property string test1: Qt.atob() + property string test2: Qt.atob("SGVsbG8gd29ybGQh") +} + diff --git a/tests/auto/declarative/qdeclarativeqt/data/btoa.qml b/tests/auto/declarative/qdeclarativeqt/data/btoa.qml new file mode 100644 index 00000000..63b58c07 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeqt/data/btoa.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +QtObject { + property string test1: Qt.btoa() + property string test2: Qt.btoa("Hello world!") +} diff --git a/tests/auto/declarative/qdeclarativeqt/data/consoleLog.qml b/tests/auto/declarative/qdeclarativeqt/data/consoleLog.qml new file mode 100644 index 00000000..fe47f3ff --- /dev/null +++ b/tests/auto/declarative/qdeclarativeqt/data/consoleLog.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 + +QtObject { + Component.onCompleted: { + console.log("completed", "ok") + console.log("completed ok") + } +} diff --git a/tests/auto/declarative/qdeclarativeqt/data/createComponent.qml b/tests/auto/declarative/qdeclarativeqt/data/createComponent.qml new file mode 100644 index 00000000..9d0dd345 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeqt/data/createComponent.qml @@ -0,0 +1,20 @@ +import QtQuick 1.0 + +QtObject { + property bool emptyArg: false + + property string relativeUrl + property string absoluteUrl + + property QtObject incorectArgCount1: Qt.createComponent() + property QtObject incorectArgCount2: Qt.createComponent("main.qml", 10) + + Component.onCompleted: { + emptyArg = (Qt.createComponent("") == null); + var r = Qt.createComponent("createComponentData.qml"); + relativeUrl = r.url; + + var a = Qt.createComponent("http://www.example.com/test.qml"); + absoluteUrl = a.url; + } +} diff --git a/tests/auto/declarative/qdeclarativeqt/data/createComponentData.qml b/tests/auto/declarative/qdeclarativeqt/data/createComponentData.qml new file mode 100644 index 00000000..6ac470ea --- /dev/null +++ b/tests/auto/declarative/qdeclarativeqt/data/createComponentData.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +QtObject { + property int test: 1913 +} diff --git a/tests/auto/declarative/qdeclarativeqt/data/createComponent_lib.js b/tests/auto/declarative/qdeclarativeqt/data/createComponent_lib.js new file mode 100644 index 00000000..30499e94 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeqt/data/createComponent_lib.js @@ -0,0 +1,11 @@ +.pragma library + +function loadComponent() { + var component = Qt.createComponent("createComponentData.qml"); + return component.status; +} + +function createComponent() { + var component = Qt.createComponent("createComponentData.qml"); + return component.createObject(null); +} diff --git a/tests/auto/declarative/qdeclarativeqt/data/createComponent_lib.qml b/tests/auto/declarative/qdeclarativeqt/data/createComponent_lib.qml new file mode 100644 index 00000000..5b8c1b13 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeqt/data/createComponent_lib.qml @@ -0,0 +1,12 @@ +import QtQuick 1.0 +import "createComponent_lib.js" as Test + +Item { + property int status: Component.Null + property int readValue: 0 + + Component.onCompleted: { + status = Test.loadComponent() + readValue = Test.createComponent().test; + } +} diff --git a/tests/auto/declarative/qdeclarativeqt/data/createQmlObject.qml b/tests/auto/declarative/qdeclarativeqt/data/createQmlObject.qml new file mode 100644 index 00000000..8c35ebf1 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeqt/data/createQmlObject.qml @@ -0,0 +1,31 @@ +import QtQuick 1.0 + +Item { + id: root + + // errors resulting in exceptions + property QtObject incorrectArgCount1: Qt.createQmlObject() + property QtObject incorrectArgCount2: Qt.createQmlObject("import QtQuick 1.0\nQtObject{}", root, "main.qml", 10) + property QtObject noParent: Qt.createQmlObject("import QtQuick 1.0\nQtObject{\nproperty int test: 13}", 0) + property QtObject notAvailable: Qt.createQmlObject("import QtQuick 1.0\nQtObject{Blah{}}", root) + property QtObject errors: Qt.createQmlObject("import QtQuick 1.0\nQtObject{\nproperty int test: 13\nproperty int test: 13\n}", root, "main.qml") + + property bool emptyArg: false + + property bool success: false + + Component.onCompleted: { + // errors resulting in nulls + emptyArg = (Qt.createQmlObject("", root) == null); + try { + Qt.createQmlObject("import QtQuick 1.0\nQtObject{property int test\nonTestChanged: QtObject{}\n}", root) + } catch (error) { + console.log("RunTimeError: ",error.message); + } + + var o = Qt.createQmlObject("import QtQuick 1.0\nQtObject{\nproperty int test: 13\n}", root); + success = (o.test == 13); + + Qt.createQmlObject("import QtQuick 1.0\nItem {}\n", root); + } +} diff --git a/tests/auto/declarative/qdeclarativeqt/data/darker.qml b/tests/auto/declarative/qdeclarativeqt/data/darker.qml new file mode 100644 index 00000000..d2ef866d --- /dev/null +++ b/tests/auto/declarative/qdeclarativeqt/data/darker.qml @@ -0,0 +1,12 @@ +import QtQuick 1.0 + +QtObject { + property variant test1: Qt.darker(Qt.rgba(1, 0.8, 0.3)) + property variant test2: Qt.darker() + property variant test3: Qt.darker(Qt.rgba(1, 0.8, 0.3), 2.8) + property variant test4: Qt.darker("red"); + property variant test5: Qt.darker("perfectred"); // Non-existant color + property variant test6: Qt.darker(10); + property variant test7: Qt.darker(Qt.rgba(1, 0.8, 0.3), 2.8, 10) +} + diff --git a/tests/auto/declarative/qdeclarativeqt/data/enums.qml b/tests/auto/declarative/qdeclarativeqt/data/enums.qml new file mode 100644 index 00000000..aec6f63c --- /dev/null +++ b/tests/auto/declarative/qdeclarativeqt/data/enums.qml @@ -0,0 +1,9 @@ +import QtQuick 1.0 + +QtObject { + property int test1: Qt.Key_Escape + property int test2: Qt.DescendingOrder + property int test3: Qt.ElideMiddle + property int test4: Qt.AlignRight +} + diff --git a/tests/auto/declarative/qdeclarativeqt/data/fontFamilies.qml b/tests/auto/declarative/qdeclarativeqt/data/fontFamilies.qml new file mode 100644 index 00000000..c9f50d48 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeqt/data/fontFamilies.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +QtObject { + property variant test1: Qt.fontFamilies(10) + property variant test2: Qt.fontFamilies(); +} diff --git a/tests/auto/declarative/qdeclarativeqt/data/formatting.qml b/tests/auto/declarative/qdeclarativeqt/data/formatting.qml new file mode 100644 index 00000000..f520aeb4 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeqt/data/formatting.qml @@ -0,0 +1,44 @@ +import QtQuick 1.0 + +QtObject { + property date dateFromString: "2008-12-24" + property variant jsdate: new Date(2008,11,24,14,15,38,200) // months are 0-based + + function formatDate(prop) { + var v = eval(prop) + return [ + Qt.formatDate(v), + Qt.formatDate(v, Qt.DefaultLocaleLongDate), + Qt.formatDate(v, "ddd MMMM d yy") + ] + } + + function formatTime(prop) { + var v = eval(prop) + return [ + Qt.formatTime(v), + Qt.formatTime(v, Qt.DefaultLocaleLongDate), + Qt.formatTime(v, "H:m:s a"), + Qt.formatTime(v, "hh:mm:ss.zzz") + ] + } + + function formatDateTime(prop) { + var v = eval(prop) + return [ + Qt.formatDateTime(v), + Qt.formatDateTime(v, Qt.DefaultLocaleLongDate), + Qt.formatDateTime(v, "M/d/yy H:m:s a") + ] + } + + // Error cases + property string err_date1: Qt.formatDate() + property string err_date2: Qt.formatDate(new Date, new Object) + + property string err_time1: Qt.formatTime() + property string err_time2: Qt.formatTime(new Date, new Object) + + property string err_dateTime1: Qt.formatDateTime() + property string err_dateTime2: Qt.formatDateTime(new Date, new Object) +} diff --git a/tests/auto/declarative/qdeclarativeqt/data/hsla.qml b/tests/auto/declarative/qdeclarativeqt/data/hsla.qml new file mode 100644 index 00000000..3bcc7912 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeqt/data/hsla.qml @@ -0,0 +1,11 @@ +import QtQuick 1.0 + +QtObject { + property color test1: Qt.hsla(1, 0, 0, 0.8); + property color test2: Qt.hsla(1, 0.5, 0.3); + property color test3: Qt.hsla(1, 1); + property color test4: Qt.hsla(1, 1, 1, 1, 1); + property color test5: Qt.hsla(1.2, 1.3, 1.4, 1.5); + property color test6: Qt.hsla(-0.1, -0.2, -0.3, -0.4); +} + diff --git a/tests/auto/declarative/qdeclarativeqt/data/isQtObject.qml b/tests/auto/declarative/qdeclarativeqt/data/isQtObject.qml new file mode 100644 index 00000000..37b952d4 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeqt/data/isQtObject.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 + +QtObject { + id: root + + property QtObject nullObject + + property bool test1: Qt.isQtObject(root) + property bool test2: Qt.isQtObject(nullObject) + property bool test3: Qt.isQtObject(10) + property bool test4: Qt.isQtObject(null) + property bool test5: Qt.isQtObject({ a: 10, b: 11 }) +} + diff --git a/tests/auto/declarative/qdeclarativeqt/data/lighter.qml b/tests/auto/declarative/qdeclarativeqt/data/lighter.qml new file mode 100644 index 00000000..67f0d0f3 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeqt/data/lighter.qml @@ -0,0 +1,11 @@ +import QtQuick 1.0 + +QtObject { + property variant test1: Qt.lighter(Qt.rgba(1, 0.8, 0.3)) + property variant test2: Qt.lighter() + property variant test3: Qt.lighter(Qt.rgba(1, 0.8, 0.3), 1.8) + property variant test4: Qt.lighter("red"); + property variant test5: Qt.lighter("perfectred"); // Non-existant color + property variant test6: Qt.lighter(10); + property variant test7: Qt.lighter(Qt.rgba(1, 0.8, 0.3), 1.8, 5) +} diff --git a/tests/auto/declarative/qdeclarativeqt/data/md5.qml b/tests/auto/declarative/qdeclarativeqt/data/md5.qml new file mode 100644 index 00000000..32e90c04 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeqt/data/md5.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +QtObject { + property string test1: Qt.md5() + property string test2: Qt.md5("Hello World") +} diff --git a/tests/auto/declarative/qdeclarativeqt/data/openUrlExternally.qml b/tests/auto/declarative/qdeclarativeqt/data/openUrlExternally.qml new file mode 100644 index 00000000..dc4049c9 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeqt/data/openUrlExternally.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 + +QtObject { + Component.onCompleted: Qt.openUrlExternally("test:url") + + property bool testFile + onTestFileChanged: Qt.openUrlExternally("test.html") +} diff --git a/tests/auto/declarative/qdeclarativeqt/data/openUrlExternally_lib.js b/tests/auto/declarative/qdeclarativeqt/data/openUrlExternally_lib.js new file mode 100644 index 00000000..702357af --- /dev/null +++ b/tests/auto/declarative/qdeclarativeqt/data/openUrlExternally_lib.js @@ -0,0 +1,9 @@ +.pragma library + +function loadTest() { + Qt.openUrlExternally("test:url") +} + +function loadFile() { + Qt.openUrlExternally("test.html") +} diff --git a/tests/auto/declarative/qdeclarativeqt/data/openUrlExternally_lib.qml b/tests/auto/declarative/qdeclarativeqt/data/openUrlExternally_lib.qml new file mode 100644 index 00000000..456653b8 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeqt/data/openUrlExternally_lib.qml @@ -0,0 +1,9 @@ +import QtQuick 1.0 +import "openUrlExternally_lib.js" as Test + +Item { + Component.onCompleted: Test.loadTest(); + + property bool testFile + onTestFileChanged: Test.loadFile(); +} diff --git a/tests/auto/declarative/qdeclarativeqt/data/point.qml b/tests/auto/declarative/qdeclarativeqt/data/point.qml new file mode 100644 index 00000000..8b0188ea --- /dev/null +++ b/tests/auto/declarative/qdeclarativeqt/data/point.qml @@ -0,0 +1,9 @@ +import QtQuick 1.0 + +QtObject { + property variant test1: Qt.point(19, 34); + property variant test2: Qt.point(-3, 109.2); + property variant test3: Qt.point(-3); + property variant test4: Qt.point(-3, 109.2, 1); +} + diff --git a/tests/auto/declarative/qdeclarativeqt/data/quit.qml b/tests/auto/declarative/qdeclarativeqt/data/quit.qml new file mode 100644 index 00000000..62564a64 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeqt/data/quit.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +QtObject { + Component.onCompleted: Qt.quit() +} diff --git a/tests/auto/declarative/qdeclarativeqt/data/rect.qml b/tests/auto/declarative/qdeclarativeqt/data/rect.qml new file mode 100644 index 00000000..872bf50e --- /dev/null +++ b/tests/auto/declarative/qdeclarativeqt/data/rect.qml @@ -0,0 +1,9 @@ +import QtQuick 1.0 + +QtObject { + property variant test1: Qt.rect(10, 13, 100, 109) + property variant test2: Qt.rect(-10, 13, 100, 109.6) + property variant test3: Qt.rect(10, 13); + property variant test4: Qt.rect(10, 13, 100, 109, 10) + property variant test5: Qt.rect(10, 13, 100, -109) +} diff --git a/tests/auto/declarative/qdeclarativeqt/data/rgba.qml b/tests/auto/declarative/qdeclarativeqt/data/rgba.qml new file mode 100644 index 00000000..bbafc6d9 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeqt/data/rgba.qml @@ -0,0 +1,10 @@ +import QtQuick 1.0 + +QtObject { + property color test1: Qt.rgba(1, 0, 0, 0.8); + property color test2: Qt.rgba(1, 0.5, 0.3); + property color test3: Qt.rgba(1, 1); + property color test4: Qt.rgba(1, 1, 1, 1, 1); + property color test5: Qt.rgba(1.2, 1.3, 1.4, 1.5); + property color test6: Qt.rgba(-0.1, -0.2, -0.3, -0.4); +} diff --git a/tests/auto/declarative/qdeclarativeqt/data/size.qml b/tests/auto/declarative/qdeclarativeqt/data/size.qml new file mode 100644 index 00000000..8e102eb6 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeqt/data/size.qml @@ -0,0 +1,11 @@ +import QtQuick 1.0 + +QtObject { + property variant test1: Qt.size(19, 34); + property variant test2: Qt.size(3, 109.2); + property variant test3: Qt.size(-3, 10); + property variant test4: Qt.size(3); + property variant test5: Qt.size(3, 109.2, 1); +} + + diff --git a/tests/auto/declarative/qdeclarativeqt/data/tint.qml b/tests/auto/declarative/qdeclarativeqt/data/tint.qml new file mode 100644 index 00000000..f8738865 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeqt/data/tint.qml @@ -0,0 +1,9 @@ +import QtQuick 1.0 + +QtObject { + property color test1: Qt.tint("red", "blue"); + property color test2: Qt.tint(Qt.rgba(1, 0, 0), Qt.rgba(0, 0, 0, 0)); + property color test3: Qt.tint("red", Qt.rgba(0, 0, 1, 0.5)); + property color test4: Qt.tint("red", Qt.rgba(0, 0, 1, 0.5), 10); + property color test5: Qt.tint("red") +} diff --git a/tests/auto/declarative/qdeclarativeqt/data/vector.qml b/tests/auto/declarative/qdeclarativeqt/data/vector.qml new file mode 100644 index 00000000..f494fe05 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeqt/data/vector.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 + +QtObject { + property variant test1: Qt.vector3d(1, 0, 0.9); + property variant test2: Qt.vector3d(102, -10, -982.1); + property variant test3: Qt.vector3d(102, -10); + property variant test4: Qt.vector3d(102, -10, -982.1, 10); +} diff --git a/tests/auto/declarative/qdeclarativeqt/qdeclarativeqt.pro b/tests/auto/declarative/qdeclarativeqt/qdeclarativeqt.pro new file mode 100644 index 00000000..4b197ebf --- /dev/null +++ b/tests/auto/declarative/qdeclarativeqt/qdeclarativeqt.pro @@ -0,0 +1,18 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative script +SOURCES += tst_qdeclarativeqt.cpp +macx:CONFIG -= app_bundle + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +# QMAKE_CXXFLAGS = -fprofile-arcs -ftest-coverage +# LIBS += -lgcov + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativeqt/tst_qdeclarativeqt.cpp b/tests/auto/declarative/qdeclarativeqt/tst_qdeclarativeqt.cpp new file mode 100644 index 00000000..9a5e4600 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeqt/tst_qdeclarativeqt.cpp @@ -0,0 +1,608 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_qdeclarativeqt : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativeqt() {} + +private slots: + void enums(); + void rgba(); + void hsla(); + void rect(); + void point(); + void size(); + void vector(); + void lighter(); + void darker(); + void tint(); + void openUrlExternally(); + void openUrlExternally_pragmaLibrary(); + void md5(); + void createComponent(); + void createComponent_pragmaLibrary(); + void createQmlObject(); + void consoleLog(); + void dateTimeFormatting(); + void dateTimeFormatting_data(); + void isQtObject(); + void btoa(); + void atob(); + void fontFamilies(); + void quit(); + +private: + QDeclarativeEngine engine; +}; + +inline QUrl TEST_FILE(const QString &filename) +{ + return QUrl::fromLocalFile(QLatin1String(SRCDIR) + QLatin1String("/data/") + filename); +} + +void tst_qdeclarativeqt::enums() +{ + QDeclarativeComponent component(&engine, TEST_FILE("enums.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("test1").toInt(), (int)Qt::Key_Escape); + QCOMPARE(object->property("test2").toInt(), (int)Qt::DescendingOrder); + QCOMPARE(object->property("test3").toInt(), (int)Qt::ElideMiddle); + QCOMPARE(object->property("test4").toInt(), (int)Qt::AlignRight); + + delete object; +} + +void tst_qdeclarativeqt::rgba() +{ + QDeclarativeComponent component(&engine, TEST_FILE("rgba.qml")); + + QString warning1 = component.url().toString() + ":6: Error: Qt.rgba(): Invalid arguments"; + QString warning2 = component.url().toString() + ":7: Error: Qt.rgba(): Invalid arguments"; + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1)); + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2)); + + QObject *object = component.create(); + QVERIFY(object != 0); + + + QCOMPARE(qvariant_cast(object->property("test1")), QColor::fromRgbF(1, 0, 0, 0.8)); + QCOMPARE(qvariant_cast(object->property("test2")), QColor::fromRgbF(1, 0.5, 0.3, 1)); + QCOMPARE(qvariant_cast(object->property("test3")), QColor()); + QCOMPARE(qvariant_cast(object->property("test4")), QColor()); + QCOMPARE(qvariant_cast(object->property("test5")), QColor::fromRgbF(1, 1, 1, 1)); + QCOMPARE(qvariant_cast(object->property("test6")), QColor::fromRgbF(0, 0, 0, 0)); + + delete object; +} + +void tst_qdeclarativeqt::hsla() +{ + QDeclarativeComponent component(&engine, TEST_FILE("hsla.qml")); + + QString warning1 = component.url().toString() + ":6: Error: Qt.hsla(): Invalid arguments"; + QString warning2 = component.url().toString() + ":7: Error: Qt.hsla(): Invalid arguments"; + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1)); + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2)); + + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(qvariant_cast(object->property("test1")), QColor::fromHslF(1, 0, 0, 0.8)); + QCOMPARE(qvariant_cast(object->property("test2")), QColor::fromHslF(1, 0.5, 0.3, 1)); + QCOMPARE(qvariant_cast(object->property("test3")), QColor()); + QCOMPARE(qvariant_cast(object->property("test4")), QColor()); + QCOMPARE(qvariant_cast(object->property("test5")), QColor::fromHslF(1, 1, 1, 1)); + QCOMPARE(qvariant_cast(object->property("test6")), QColor::fromHslF(0, 0, 0, 0)); + + delete object; +} + +void tst_qdeclarativeqt::rect() +{ + QDeclarativeComponent component(&engine, TEST_FILE("rect.qml")); + + QString warning1 = component.url().toString() + ":6: Error: Qt.rect(): Invalid arguments"; + QString warning2 = component.url().toString() + ":7: Error: Qt.rect(): Invalid arguments"; + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1)); + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2)); + + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(qvariant_cast(object->property("test1")), QRectF(10, 13, 100, 109)); + QCOMPARE(qvariant_cast(object->property("test2")), QRectF(-10, 13, 100, 109.6)); + QCOMPARE(qvariant_cast(object->property("test3")), QRectF()); + QCOMPARE(qvariant_cast(object->property("test4")), QRectF()); + QCOMPARE(qvariant_cast(object->property("test5")), QRectF(10, 13, 100, -109)); + + delete object; +} + +void tst_qdeclarativeqt::point() +{ + QDeclarativeComponent component(&engine, TEST_FILE("point.qml")); + + QString warning1 = component.url().toString() + ":6: Error: Qt.point(): Invalid arguments"; + QString warning2 = component.url().toString() + ":7: Error: Qt.point(): Invalid arguments"; + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1)); + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2)); + + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(qvariant_cast(object->property("test1")), QPointF(19, 34)); + QCOMPARE(qvariant_cast(object->property("test2")), QPointF(-3, 109.2)); + QCOMPARE(qvariant_cast(object->property("test3")), QPointF()); + QCOMPARE(qvariant_cast(object->property("test4")), QPointF()); + + delete object; +} + +void tst_qdeclarativeqt::size() +{ + QDeclarativeComponent component(&engine, TEST_FILE("size.qml")); + + QString warning1 = component.url().toString() + ":7: Error: Qt.size(): Invalid arguments"; + QString warning2 = component.url().toString() + ":8: Error: Qt.size(): Invalid arguments"; + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1)); + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2)); + + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(qvariant_cast(object->property("test1")), QSizeF(19, 34)); + QCOMPARE(qvariant_cast(object->property("test2")), QSizeF(3, 109.2)); + QCOMPARE(qvariant_cast(object->property("test3")), QSizeF(-3, 10)); + QCOMPARE(qvariant_cast(object->property("test4")), QSizeF()); + QCOMPARE(qvariant_cast(object->property("test5")), QSizeF()); + + delete object; +} + +void tst_qdeclarativeqt::vector() +{ + QDeclarativeComponent component(&engine, TEST_FILE("vector.qml")); + + QString warning1 = component.url().toString() + ":6: Error: Qt.vector(): Invalid arguments"; + QString warning2 = component.url().toString() + ":7: Error: Qt.vector(): Invalid arguments"; + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1)); + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2)); + + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(qvariant_cast(object->property("test1")), QVector3D(1, 0, 0.9)); + QCOMPARE(qvariant_cast(object->property("test2")), QVector3D(102, -10, -982.1)); + QCOMPARE(qvariant_cast(object->property("test3")), QVector3D()); + QCOMPARE(qvariant_cast(object->property("test4")), QVector3D()); + + delete object; +} + +void tst_qdeclarativeqt::lighter() +{ + QDeclarativeComponent component(&engine, TEST_FILE("lighter.qml")); + + QString warning1 = component.url().toString() + ":5: Error: Qt.lighter(): Invalid arguments"; + QString warning2 = component.url().toString() + ":10: Error: Qt.lighter(): Invalid arguments"; + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1)); + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2)); + + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(qvariant_cast(object->property("test1")), QColor::fromRgbF(1, 0.8, 0.3).lighter()); + QCOMPARE(qvariant_cast(object->property("test2")), QColor()); + QCOMPARE(qvariant_cast(object->property("test3")), QColor::fromRgbF(1, 0.8, 0.3).lighter(180)); + QCOMPARE(qvariant_cast(object->property("test4")), QColor("red").lighter()); + QCOMPARE(qvariant_cast(object->property("test5")), QColor()); + QCOMPARE(qvariant_cast(object->property("test6")), QColor()); + + delete object; +} + +void tst_qdeclarativeqt::darker() +{ + QDeclarativeComponent component(&engine, TEST_FILE("darker.qml")); + + QString warning1 = component.url().toString() + ":5: Error: Qt.darker(): Invalid arguments"; + QString warning2 = component.url().toString() + ":10: Error: Qt.darker(): Invalid arguments"; + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1)); + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2)); + + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(qvariant_cast(object->property("test1")), QColor::fromRgbF(1, 0.8, 0.3).darker()); + QCOMPARE(qvariant_cast(object->property("test2")), QColor()); + QCOMPARE(qvariant_cast(object->property("test3")), QColor::fromRgbF(1, 0.8, 0.3).darker(280)); + QCOMPARE(qvariant_cast(object->property("test4")), QColor("red").darker()); + QCOMPARE(qvariant_cast(object->property("test5")), QColor()); + QCOMPARE(qvariant_cast(object->property("test6")), QColor()); + + delete object; +} + +void tst_qdeclarativeqt::tint() +{ + QDeclarativeComponent component(&engine, TEST_FILE("tint.qml")); + + QString warning1 = component.url().toString() + ":7: Error: Qt.tint(): Invalid arguments"; + QString warning2 = component.url().toString() + ":8: Error: Qt.tint(): Invalid arguments"; + + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1)); + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2)); + + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(qvariant_cast(object->property("test1")), QColor::fromRgbF(0, 0, 1)); + QCOMPARE(qvariant_cast(object->property("test2")), QColor::fromRgbF(1, 0, 0)); + QColor test3 = qvariant_cast(object->property("test3")); + QCOMPARE(test3.rgba(), 0xFF7F0080); + QCOMPARE(qvariant_cast(object->property("test4")), QColor()); + QCOMPARE(qvariant_cast(object->property("test5")), QColor()); + + delete object; +} + +class MyUrlHandler : public QObject +{ + Q_OBJECT +public: + MyUrlHandler() : called(0) { } + int called; + QUrl last; + +public slots: + void noteCall(const QUrl &url) { called++; last = url; } +}; + +void tst_qdeclarativeqt::openUrlExternally() +{ + MyUrlHandler handler; + + QDesktopServices::setUrlHandler("test", &handler, "noteCall"); + QDesktopServices::setUrlHandler("file", &handler, "noteCall"); + + QDeclarativeComponent component(&engine, TEST_FILE("openUrlExternally.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + QCOMPARE(handler.called,1); + QCOMPARE(handler.last, QUrl("test:url")); + + object->setProperty("testFile", true); + + QCOMPARE(handler.called,2); + QCOMPARE(handler.last, TEST_FILE("test.html")); + + QDesktopServices::unsetUrlHandler("test"); + QDesktopServices::unsetUrlHandler("file"); +} + +void tst_qdeclarativeqt::openUrlExternally_pragmaLibrary() +{ + MyUrlHandler handler; + + QDesktopServices::setUrlHandler("test", &handler, "noteCall"); + QDesktopServices::setUrlHandler("file", &handler, "noteCall"); + + QDeclarativeComponent component(&engine, TEST_FILE("openUrlExternally_lib.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + QCOMPARE(handler.called,1); + QCOMPARE(handler.last, QUrl("test:url")); + + object->setProperty("testFile", true); + + QCOMPARE(handler.called,2); + QCOMPARE(handler.last, TEST_FILE("test.html")); + + QDesktopServices::unsetUrlHandler("test"); + QDesktopServices::unsetUrlHandler("file"); +} + +void tst_qdeclarativeqt::md5() +{ + QDeclarativeComponent component(&engine, TEST_FILE("md5.qml")); + + QString warning1 = component.url().toString() + ":4: Error: Qt.md5(): Invalid arguments"; + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1)); + + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("test2").toString(), QLatin1String(QCryptographicHash::hash("Hello World", QCryptographicHash::Md5).toHex())); + + delete object; +} + +void tst_qdeclarativeqt::createComponent() +{ + QDeclarativeComponent component(&engine, TEST_FILE("createComponent.qml")); + + QString warning1 = component.url().toString() + ":9: Error: Qt.createComponent(): Invalid arguments"; + QString warning2 = component.url().toString() + ":10: Error: Qt.createComponent(): Invalid arguments"; + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1)); + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2)); + + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("absoluteUrl").toString(), QString("http://www.example.com/test.qml")); + QCOMPARE(object->property("relativeUrl").toString(), TEST_FILE("createComponentData.qml").toString()); + + delete object; +} + +void tst_qdeclarativeqt::createComponent_pragmaLibrary() +{ + // Currently, just loading createComponent_lib.qml causes crash on some platforms + QDeclarativeComponent component(&engine, TEST_FILE("createComponent_lib.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + QCOMPARE(object->property("status").toInt(), int(QDeclarativeComponent::Ready)); + QCOMPARE(object->property("readValue").toInt(), int(1913)); + delete object; +} + +void tst_qdeclarativeqt::createQmlObject() +{ + QDeclarativeComponent component(&engine, TEST_FILE("createQmlObject.qml")); + + QString warning1 = component.url().toString() + ":7: Error: Qt.createQmlObject(): Invalid arguments"; + QString warning2 = component.url().toString()+ ":10: Error: Qt.createQmlObject() failed to create object: " + TEST_FILE("inline").toString() + ":2:10: Blah is not a type\n"; + QString warning3 = component.url().toString()+ ":11: Error: Qt.createQmlObject() failed to create object: " + TEST_FILE("main.qml").toString() + ":4:1: Duplicate property name\n"; + QString warning4 = component.url().toString()+ ":9: Error: Qt.createQmlObject(): Missing parent object"; + QString warning5 = component.url().toString()+ ":8: Error: Qt.createQmlObject(): Invalid arguments"; + QString warning6 = "RunTimeError: Qt.createQmlObject() failed to create object: " + TEST_FILE("inline").toString() + ":3: Cannot assign object type QObject with no default method\n"; + + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1)); + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2)); + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning3)); + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning4)); + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning5)); + QTest::ignoreMessage(QtDebugMsg, qPrintable(warning6)); + + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("emptyArg").toBool(), true); + QCOMPARE(object->property("success").toBool(), true); + + QDeclarativeItem *item = qobject_cast(object); + QVERIFY(item != 0); + QVERIFY(item->childItems().count() == 1); + + delete object; +} + +void tst_qdeclarativeqt::consoleLog() +{ + QTest::ignoreMessage(QtDebugMsg, "completed ok"); + QTest::ignoreMessage(QtDebugMsg, "completed ok"); + QDeclarativeComponent component(&engine, TEST_FILE("consoleLog.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + delete object; +} + +void tst_qdeclarativeqt::dateTimeFormatting() +{ + QFETCH(QString, method); + QFETCH(QStringList, inputProperties); + QFETCH(QStringList, expectedResults); + + QDate date(2008,12,24); + QTime time(14,15,38,200); + QDateTime dateTime(date, time); + + QDeclarativeEngine eng; + + eng.rootContext()->setContextProperty("qdate", date); + eng.rootContext()->setContextProperty("qtime", time); + eng.rootContext()->setContextProperty("qdatetime", dateTime); + + QDeclarativeComponent component(&eng, TEST_FILE("formatting.qml")); + + QStringList warnings; + warnings << component.url().toString() + ":37: Error: Qt.formatDate(): Invalid date format" + << component.url().toString() + ":36: Error: Qt.formatDate(): Invalid arguments" + << component.url().toString() + ":40: Error: Qt.formatTime(): Invalid time format" + << component.url().toString() + ":39: Error: Qt.formatTime(): Invalid arguments" + << component.url().toString() + ":43: Error: Qt.formatDateTime(): Invalid datetime format" + << component.url().toString() + ":42: Error: Qt.formatDateTime(): Invalid arguments"; + + foreach (const QString &warning, warnings) + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning)); + + QObject *object = component.create(); + QVERIFY2(component.errorString().isEmpty(), qPrintable(component.errorString())); + QVERIFY(object != 0); + + QVERIFY(inputProperties.count() > 0); + + QVariant result; + foreach(const QString &prop, inputProperties) { + QVERIFY(QMetaObject::invokeMethod(object, method.toUtf8().constData(), + Q_RETURN_ARG(QVariant, result), + Q_ARG(QVariant, prop))); + + QStringList output = result.toStringList(); + for (int i=0; i("method"); + QTest::addColumn("inputProperties"); + QTest::addColumn("expectedResults"); + + QDate date(2008,12,24); + QTime time(14,15,38,200); + QDateTime dateTime(date, time); + + QTest::newRow("formatDate") + << "formatDate" + << (QStringList() << "dateFromString" << "jsdate" << "qdate" << "qdatetime") + << (QStringList() << date.toString(Qt::DefaultLocaleShortDate) + << date.toString(Qt::DefaultLocaleLongDate) + << date.toString("ddd MMMM d yy")); + + QTest::newRow("formatTime") + << "formatTime" + << (QStringList() << "jsdate" << "qtime" << "qdatetime") + << (QStringList() << time.toString(Qt::DefaultLocaleShortDate) + << time.toString(Qt::DefaultLocaleLongDate) + << time.toString("H:m:s a") + << time.toString("hh:mm:ss.zzz")); + + QTest::newRow("formatDateTime") + << "formatDateTime" + << (QStringList() << "jsdate" << "qdatetime") + << (QStringList() << dateTime.toString(Qt::DefaultLocaleShortDate) + << dateTime.toString(Qt::DefaultLocaleLongDate) + << dateTime.toString("M/d/yy H:m:s a")); +} + +void tst_qdeclarativeqt::isQtObject() +{ + QDeclarativeComponent component(&engine, TEST_FILE("isQtObject.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("test1").toBool(), true); + QCOMPARE(object->property("test2").toBool(), false); + QCOMPARE(object->property("test3").toBool(), false); + QCOMPARE(object->property("test4").toBool(), false); + QCOMPARE(object->property("test5").toBool(), false); + + delete object; +} + +void tst_qdeclarativeqt::btoa() +{ + QDeclarativeComponent component(&engine, TEST_FILE("btoa.qml")); + + QString warning1 = component.url().toString() + ":4: Error: Qt.btoa(): Invalid arguments"; + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1)); + + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("test2").toString(), QString("SGVsbG8gd29ybGQh")); + + delete object; +} + +void tst_qdeclarativeqt::atob() +{ + QDeclarativeComponent component(&engine, TEST_FILE("atob.qml")); + + QString warning1 = component.url().toString() + ":4: Error: Qt.atob(): Invalid arguments"; + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1)); + + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("test2").toString(), QString("Hello world!")); + + delete object; +} + +void tst_qdeclarativeqt::fontFamilies() +{ + QDeclarativeComponent component(&engine, TEST_FILE("fontFamilies.qml")); + + QString warning1 = component.url().toString() + ":4: Error: Qt.fontFamilies(): Invalid arguments"; + QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1)); + + QObject *object = component.create(); + QVERIFY(object != 0); + + QFontDatabase database; + QCOMPARE(object->property("test2"), QVariant::fromValue(database.families())); + + delete object; +} + +void tst_qdeclarativeqt::quit() +{ + QDeclarativeComponent component(&engine, TEST_FILE("quit.qml")); + + QSignalSpy spy(&engine, SIGNAL(quit())); + QObject *object = component.create(); + QVERIFY(object != 0); + QCOMPARE(spy.count(), 1); + + delete object; +} + +QTEST_MAIN(tst_qdeclarativeqt) + +#include "tst_qdeclarativeqt.moc" diff --git a/tests/auto/declarative/qdeclarativerepeater/data/intmodel.qml b/tests/auto/declarative/qdeclarativerepeater/data/intmodel.qml new file mode 100644 index 00000000..85e1608b --- /dev/null +++ b/tests/auto/declarative/qdeclarativerepeater/data/intmodel.qml @@ -0,0 +1,29 @@ +import QtQuick 1.0 + +Rectangle { + id: container + objectName: "container" + width: 240 + height: 320 + color: "white" + + function checkProperties() { + testObject.error = false; + if (repeater.delegate != comp) { + console.log("delegate property incorrect"); + testObject.error = true; + } + } + + Component { + id: comp + Item{} + } + + Repeater { + id: repeater + objectName: "repeater" + model: testData + delegate: comp + } +} diff --git a/tests/auto/declarative/qdeclarativerepeater/data/itemlist.qml b/tests/auto/declarative/qdeclarativerepeater/data/itemlist.qml new file mode 100644 index 00000000..590a9cd1 --- /dev/null +++ b/tests/auto/declarative/qdeclarativerepeater/data/itemlist.qml @@ -0,0 +1,68 @@ +// This example demonstrates placing items in a view using +// a VisualItemModel + +import QtQuick 1.0 + +Rectangle { + id: root + color: "lightgray" + width: 240 + height: 320 + property variant itemModel: itemModel1 + + function checkProperties() { + testObject.error = false; + if (testObject.useModel && view.model != root.itemModel) { + console.log("model property incorrect"); + testObject.error = true; + } + } + + function switchModel() { + root.itemModel = itemModel2 + } + + VisualItemModel { + id: itemModel1 + objectName: "itemModel1" + Rectangle { + objectName: "item1" + height: 50; width: 100; color: "#FFFEF0" + Text { objectName: "text1"; text: "index: " + parent.VisualItemModel.index; font.bold: true; anchors.centerIn: parent } + } + Rectangle { + objectName: "item2" + height: 50; width: 100; color: "#F0FFF7" + Text { objectName: "text2"; text: "index: " + parent.VisualItemModel.index; font.bold: true; anchors.centerIn: parent } + } + Rectangle { + objectName: "item3" + height: 50; width: 100; color: "#F4F0FF" + Text { objectName: "text3"; text: "index: " + parent.VisualItemModel.index; font.bold: true; anchors.centerIn: parent } + } + } + + VisualItemModel { + id: itemModel2 + objectName: "itemModel2" + Rectangle { + objectName: "item4" + height: 50; width: 100; color: "#FFFEF0" + Text { objectName: "text4"; text: "index: " + parent.VisualItemModel.index; font.bold: true; anchors.centerIn: parent } + } + Rectangle { + objectName: "item5" + height: 50; width: 100; color: "#F0FFF7" + Text { objectName: "text5"; text: "index: " + parent.VisualItemModel.index; font.bold: true; anchors.centerIn: parent } + } + } + + Column { + objectName: "container" + Repeater { + id: view + objectName: "repeater" + model: testObject.useModel ? root.itemModel : 0 + } + } +} diff --git a/tests/auto/declarative/qdeclarativerepeater/data/modelChanged.qml b/tests/auto/declarative/qdeclarativerepeater/data/modelChanged.qml new file mode 100644 index 00000000..0b57d50b --- /dev/null +++ b/tests/auto/declarative/qdeclarativerepeater/data/modelChanged.qml @@ -0,0 +1,26 @@ +import QtQuick 1.1 + +Column { + Repeater { + id: repeater + objectName: "repeater" + + property int itemsCount + property variant itemsFound: [] + + delegate: Rectangle { + color: "red" + width: (index+1)*50 + height: 50 + } + + onModelChanged: { + repeater.itemsCount = repeater.count + var items = [] + for (var i=0; i +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +inline QUrl TEST_FILE(const QString &filename) +{ + return QUrl::fromLocalFile(QLatin1String(SRCDIR) + QLatin1String("/data/") + filename); +} + +class tst_QDeclarativeRepeater : public QObject +{ + Q_OBJECT +public: + tst_QDeclarativeRepeater(); + +private slots: + void numberModel(); + void objectList(); + void stringList(); + void dataModel_adding(); + void dataModel_removing(); + void dataModel_changes(); + void itemModel(); + void resetModel(); + void modelChanged(); + void properties(); + void testQtQuick11Attributes(); + void testQtQuick11Attributes_data(); + +private: + QDeclarativeView *createView(); + template + T *findItem(QGraphicsObject *parent, const QString &objectName, int index); + template + T *findItem(QGraphicsObject *parent, const QString &id); +}; + +class TestObject : public QObject +{ + Q_OBJECT + + Q_PROPERTY(bool error READ error WRITE setError) + Q_PROPERTY(bool useModel READ useModel NOTIFY useModelChanged) + +public: + TestObject() : QObject(), mError(true), mUseModel(false) {} + + bool error() const { return mError; } + void setError(bool err) { mError = err; } + + bool useModel() const { return mUseModel; } + void setUseModel(bool use) { mUseModel = use; emit useModelChanged(); } + +signals: + void useModelChanged(); + +private: + bool mError; + bool mUseModel; +}; + +class TestModel : public QAbstractListModel +{ +public: + enum Roles { Name = Qt::UserRole+1, Number = Qt::UserRole+2 }; + + TestModel(QObject *parent=0) : QAbstractListModel(parent) { + QHash roles; + roles[Name] = "name"; + roles[Number] = "number"; + setRoleNames(roles); + } + + int rowCount(const QModelIndex &parent=QModelIndex()) const { Q_UNUSED(parent); return list.count(); } + QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const { + QVariant rv; + if (role == Name) + rv = list.at(index.row()).first; + else if (role == Number) + rv = list.at(index.row()).second; + + return rv; + } + + int count() const { return rowCount(); } + QString name(int index) const { return list.at(index).first; } + QString number(int index) const { return list.at(index).second; } + + void addItem(const QString &name, const QString &number) { + emit beginInsertRows(QModelIndex(), list.count(), list.count()); + list.append(QPair(name, number)); + emit endInsertRows(); + } + + void insertItem(int index, const QString &name, const QString &number) { + emit beginInsertRows(QModelIndex(), index, index); + list.insert(index, QPair(name, number)); + emit endInsertRows(); + } + + void removeItem(int index) { + emit beginRemoveRows(QModelIndex(), index, index); + list.removeAt(index); + emit endRemoveRows(); + } + + void moveItem(int from, int to) { + emit beginMoveRows(QModelIndex(), from, from, QModelIndex(), to); + list.move(from, to); + emit endMoveRows(); + } + + void modifyItem(int idx, const QString &name, const QString &number) { + list[idx] = QPair(name, number); + emit dataChanged(index(idx,0), index(idx,0)); + } + +private: + QList > list; +}; + + +tst_QDeclarativeRepeater::tst_QDeclarativeRepeater() +{ +} + +void tst_QDeclarativeRepeater::numberModel() +{ + QDeclarativeView *canvas = createView(); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testData", 5); + TestObject *testObject = new TestObject; + ctxt->setContextProperty("testObject", testObject); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/intmodel.qml")); + qApp->processEvents(); + + QDeclarativeRepeater *repeater = findItem(canvas->rootObject(), "repeater"); + QVERIFY(repeater != 0); + QCOMPARE(repeater->parentItem()->childItems().count(), 5+1); + + QVERIFY(!repeater->itemAt(-1)); + for (int i=0; icount(); i++) + QCOMPARE(repeater->itemAt(i), repeater->parentItem()->childItems().at(i)); + QVERIFY(!repeater->itemAt(repeater->count())); + + QMetaObject::invokeMethod(canvas->rootObject(), "checkProperties"); + QVERIFY(testObject->error() == false); + + delete testObject; + delete canvas; +} + +class MyObject : public QObject +{ + Q_OBJECT + Q_PROPERTY(int idx READ idx CONSTANT) +public: + MyObject(int i) : QObject(), m_idx(i) {} + + int idx() const { return m_idx; } + + int m_idx; +}; + +void tst_QDeclarativeRepeater::objectList() +{ + QDeclarativeView *canvas = createView(); + QObjectList data; + for(int i=0; i<100; i++) + data << new MyObject(i); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testData", QVariant::fromValue(data)); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/objlist.qml")); + qApp->processEvents(); + + QDeclarativeRepeater *repeater = findItem(canvas->rootObject(), "repeater"); + QVERIFY(repeater != 0); + QCOMPARE(repeater->property("errors").toInt(), 0);//If this fails either they are out of order or can't find the object's data + QCOMPARE(repeater->property("instantiated").toInt(), 100); + + QVERIFY(!repeater->itemAt(-1)); + for (int i=0; iitemAt(i), repeater->parentItem()->childItems().at(i)); + QVERIFY(!repeater->itemAt(data.count())); + + QSignalSpy addedSpy(repeater, SIGNAL(itemAdded(int,QDeclarativeItem*))); + QSignalSpy removedSpy(repeater, SIGNAL(itemRemoved(int,QDeclarativeItem*))); + ctxt->setContextProperty("testData", QVariant::fromValue(data)); + QCOMPARE(addedSpy.count(), data.count()); + QCOMPARE(removedSpy.count(), data.count()); + + qDeleteAll(data); + delete canvas; +} + +/* +The Repeater element creates children at its own position in its parent's +stacking order. In this test we insert a repeater between two other Text +elements to test this. +*/ +void tst_QDeclarativeRepeater::stringList() +{ + QDeclarativeView *canvas = createView(); + + QStringList data; + data << "One"; + data << "Two"; + data << "Three"; + data << "Four"; + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testData", data); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/repeater1.qml")); + qApp->processEvents(); + + QDeclarativeRepeater *repeater = findItem(canvas->rootObject(), "repeater"); + QVERIFY(repeater != 0); + + QDeclarativeItem *container = findItem(canvas->rootObject(), "container"); + QVERIFY(container != 0); + + QCOMPARE(container->childItems().count(), data.count() + 3); + + bool saw_repeater = false; + for (int i = 0; i < container->childItems().count(); ++i) { + + if (i == 0) { + QDeclarativeText *name = qobject_cast(container->childItems().at(i)); + QVERIFY(name != 0); + QCOMPARE(name->text(), QLatin1String("Zero")); + } else if (i == container->childItems().count() - 2) { + // The repeater itself + QDeclarativeRepeater *rep = qobject_cast(container->childItems().at(i)); + QCOMPARE(rep, repeater); + saw_repeater = true; + continue; + } else if (i == container->childItems().count() - 1) { + QDeclarativeText *name = qobject_cast(container->childItems().at(i)); + QVERIFY(name != 0); + QCOMPARE(name->text(), QLatin1String("Last")); + } else { + QDeclarativeText *name = qobject_cast(container->childItems().at(i)); + QVERIFY(name != 0); + QCOMPARE(name->text(), data.at(i-1)); + } + } + QVERIFY(saw_repeater); + + delete canvas; +} + +void tst_QDeclarativeRepeater::dataModel_adding() +{ + QDeclarativeView *canvas = createView(); + QDeclarativeContext *ctxt = canvas->rootContext(); + TestObject *testObject = new TestObject; + ctxt->setContextProperty("testObject", testObject); + + TestModel testModel; + ctxt->setContextProperty("testData", &testModel); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/repeater2.qml")); + qApp->processEvents(); + + QDeclarativeRepeater *repeater = findItem(canvas->rootObject(), "repeater"); + QVERIFY(repeater != 0); + QDeclarativeItem *container = findItem(canvas->rootObject(), "container"); + QVERIFY(container != 0); + + QVERIFY(!repeater->itemAt(0)); + + QSignalSpy countSpy(repeater, SIGNAL(countChanged())); + QSignalSpy addedSpy(repeater, SIGNAL(itemAdded(int,QDeclarativeItem*))); + + // add to empty model + testModel.addItem("two", "2"); + QCOMPARE(repeater->itemAt(0), container->childItems().at(0)); + QCOMPARE(countSpy.count(), 1); countSpy.clear(); + QCOMPARE(addedSpy.count(), 1); + QCOMPARE(addedSpy.at(0).at(0).toInt(), 0); + QCOMPARE(addedSpy.at(0).at(1).value(), container->childItems().at(0)); + addedSpy.clear(); + + // insert at start + testModel.insertItem(0, "one", "1"); + QCOMPARE(repeater->itemAt(0), container->childItems().at(0)); + QCOMPARE(countSpy.count(), 1); countSpy.clear(); + QCOMPARE(addedSpy.count(), 1); + QCOMPARE(addedSpy.at(0).at(0).toInt(), 0); + QCOMPARE(addedSpy.at(0).at(1).value(), container->childItems().at(0)); + addedSpy.clear(); + + // insert at end + testModel.insertItem(2, "four", "4"); + QCOMPARE(repeater->itemAt(2), container->childItems().at(2)); + QCOMPARE(countSpy.count(), 1); countSpy.clear(); + QCOMPARE(addedSpy.count(), 1); + QCOMPARE(addedSpy.at(0).at(0).toInt(), 2); + QCOMPARE(addedSpy.at(0).at(1).value(), container->childItems().at(2)); + addedSpy.clear(); + + // insert in middle + testModel.insertItem(2, "three", "3"); + QCOMPARE(repeater->itemAt(2), container->childItems().at(2)); + QCOMPARE(countSpy.count(), 1); countSpy.clear(); + QCOMPARE(addedSpy.count(), 1); + QCOMPARE(addedSpy.at(0).at(0).toInt(), 2); + QCOMPARE(addedSpy.at(0).at(1).value(), container->childItems().at(2)); + addedSpy.clear(); + + delete testObject; + delete canvas; +} + +void tst_QDeclarativeRepeater::dataModel_removing() +{ + QDeclarativeView *canvas = createView(); + QDeclarativeContext *ctxt = canvas->rootContext(); + TestObject *testObject = new TestObject; + ctxt->setContextProperty("testObject", testObject); + + TestModel testModel; + testModel.addItem("one", "1"); + testModel.addItem("two", "2"); + testModel.addItem("three", "3"); + testModel.addItem("four", "4"); + testModel.addItem("five", "5"); + + ctxt->setContextProperty("testData", &testModel); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/repeater2.qml")); + qApp->processEvents(); + + QDeclarativeRepeater *repeater = findItem(canvas->rootObject(), "repeater"); + QVERIFY(repeater != 0); + QDeclarativeItem *container = findItem(canvas->rootObject(), "container"); + QVERIFY(container != 0); + QCOMPARE(container->childItems().count(), repeater->count()+1); + + QSignalSpy countSpy(repeater, SIGNAL(countChanged())); + QSignalSpy removedSpy(repeater, SIGNAL(itemRemoved(int,QDeclarativeItem*))); + + // remove at start + QDeclarativeItem *item = repeater->itemAt(0); + QCOMPARE(item, container->childItems().at(0)); + + testModel.removeItem(0); + QVERIFY(repeater->itemAt(0) != item); + QCOMPARE(countSpy.count(), 1); countSpy.clear(); + QCOMPARE(removedSpy.count(), 1); + QCOMPARE(removedSpy.at(0).at(0).toInt(), 0); + QCOMPARE(removedSpy.at(0).at(1).value(), item); + removedSpy.clear(); + + // remove at end + int lastIndex = testModel.count()-1; + item = repeater->itemAt(lastIndex); + QCOMPARE(item, container->childItems().at(lastIndex)); + + testModel.removeItem(lastIndex); + QVERIFY(repeater->itemAt(lastIndex) != item); + QCOMPARE(countSpy.count(), 1); countSpy.clear(); + QCOMPARE(removedSpy.count(), 1); + QCOMPARE(removedSpy.at(0).at(0).toInt(), lastIndex); + QCOMPARE(removedSpy.at(0).at(1).value(), item); + removedSpy.clear(); + + // remove from middle + item = repeater->itemAt(1); + QCOMPARE(item, container->childItems().at(1)); + + testModel.removeItem(1); + QVERIFY(repeater->itemAt(lastIndex) != item); + QCOMPARE(countSpy.count(), 1); countSpy.clear(); + QCOMPARE(removedSpy.count(), 1); + QCOMPARE(removedSpy.at(0).at(0).toInt(), 1); + QCOMPARE(removedSpy.at(0).at(1).value(), item); + removedSpy.clear(); + + delete testObject; + delete canvas; +} + +void tst_QDeclarativeRepeater::dataModel_changes() +{ + QDeclarativeView *canvas = createView(); + QDeclarativeContext *ctxt = canvas->rootContext(); + TestObject *testObject = new TestObject; + ctxt->setContextProperty("testObject", testObject); + + TestModel testModel; + testModel.addItem("one", "1"); + testModel.addItem("two", "2"); + testModel.addItem("three", "3"); + + ctxt->setContextProperty("testData", &testModel); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/repeater2.qml")); + qApp->processEvents(); + + QDeclarativeRepeater *repeater = findItem(canvas->rootObject(), "repeater"); + QVERIFY(repeater != 0); + QDeclarativeItem *container = findItem(canvas->rootObject(), "container"); + QVERIFY(container != 0); + QCOMPARE(container->childItems().count(), repeater->count()+1); + + // Check that model changes are propagated + QDeclarativeText *text = findItem(canvas->rootObject(), "myName", 1); + QVERIFY(text); + QCOMPARE(text->text(), QString("two")); + + testModel.modifyItem(1, "Item two", "_2"); + text = findItem(canvas->rootObject(), "myName", 1); + QVERIFY(text); + QCOMPARE(text->text(), QString("Item two")); + + text = findItem(canvas->rootObject(), "myNumber", 1); + QVERIFY(text); + QCOMPARE(text->text(), QString("_2")); + + delete testObject; + delete canvas; +} + +void tst_QDeclarativeRepeater::itemModel() +{ + QDeclarativeView *canvas = createView(); + QDeclarativeContext *ctxt = canvas->rootContext(); + TestObject *testObject = new TestObject; + ctxt->setContextProperty("testObject", testObject); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/itemlist.qml")); + qApp->processEvents(); + + QDeclarativeRepeater *repeater = findItem(canvas->rootObject(), "repeater"); + QVERIFY(repeater != 0); + + QDeclarativeItem *container = findItem(canvas->rootObject(), "container"); + QVERIFY(container != 0); + + QCOMPARE(container->childItems().count(), 1); + + testObject->setUseModel(true); + QMetaObject::invokeMethod(canvas->rootObject(), "checkProperties"); + QVERIFY(testObject->error() == false); + + QCOMPARE(container->childItems().count(), 4); + QVERIFY(qobject_cast(container->childItems().at(0))->objectName() == "item1"); + QVERIFY(qobject_cast(container->childItems().at(1))->objectName() == "item2"); + QVERIFY(qobject_cast(container->childItems().at(2))->objectName() == "item3"); + QVERIFY(container->childItems().at(3) == repeater); + + QMetaObject::invokeMethod(canvas->rootObject(), "switchModel"); + QCOMPARE(container->childItems().count(), 3); + QVERIFY(qobject_cast(container->childItems().at(0))->objectName() == "item4"); + QVERIFY(qobject_cast(container->childItems().at(1))->objectName() == "item5"); + QVERIFY(container->childItems().at(2) == repeater); + + testObject->setUseModel(false); + QCOMPARE(container->childItems().count(), 1); + + delete testObject; + delete canvas; +} + +void tst_QDeclarativeRepeater::resetModel() +{ + QDeclarativeView *canvas = createView(); + + QStringList dataA; + for (int i=0; i<10; i++) + dataA << QString::number(i); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testData", dataA); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/repeater1.qml")); + qApp->processEvents(); + QDeclarativeRepeater *repeater = findItem(canvas->rootObject(), "repeater"); + QVERIFY(repeater != 0); + QDeclarativeItem *container = findItem(canvas->rootObject(), "container"); + QVERIFY(container != 0); + + QCOMPARE(repeater->count(), dataA.count()); + for (int i=0; icount(); i++) + QCOMPARE(repeater->itemAt(i), container->childItems().at(i+1)); // +1 to skip first Text object + + QSignalSpy modelChangedSpy(repeater, SIGNAL(modelChanged())); + QSignalSpy countSpy(repeater, SIGNAL(countChanged())); + QSignalSpy addedSpy(repeater, SIGNAL(itemAdded(int,QDeclarativeItem*))); + QSignalSpy removedSpy(repeater, SIGNAL(itemRemoved(int,QDeclarativeItem*))); + + QStringList dataB; + for (int i=0; i<20; i++) + dataB << QString::number(i); + + // reset context property + ctxt->setContextProperty("testData", dataB); + QCOMPARE(repeater->count(), dataB.count()); + + QCOMPARE(modelChangedSpy.count(), 1); + QCOMPARE(countSpy.count(), 1); + QCOMPARE(removedSpy.count(), dataA.count()); + QCOMPARE(addedSpy.count(), dataB.count()); + for (int i=0; i(), repeater->itemAt(i)); + } + modelChangedSpy.clear(); + countSpy.clear(); + removedSpy.clear(); + addedSpy.clear(); + + // reset via setModel() + repeater->setModel(dataA); + QCOMPARE(repeater->count(), dataA.count()); + + QCOMPARE(modelChangedSpy.count(), 1); + QCOMPARE(countSpy.count(), 1); + QCOMPARE(removedSpy.count(), dataB.count()); + QCOMPARE(addedSpy.count(), dataA.count()); + for (int i=0; i(), repeater->itemAt(i)); + } + + delete canvas; +} + +// QTBUG-17156 +void tst_QDeclarativeRepeater::modelChanged() +{ + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine, TEST_FILE("/modelChanged.qml")); + + QDeclarativeItem *rootObject = qobject_cast(component.create()); + QVERIFY(rootObject); + QDeclarativeRepeater *repeater = findItem(rootObject, "repeater"); + QVERIFY(repeater); + + repeater->setModel(4); + QCOMPARE(repeater->count(), 4); + QCOMPARE(repeater->property("itemsCount").toInt(), 4); + QCOMPARE(repeater->property("itemsFound").toList().count(), 4); + + repeater->setModel(10); + QCOMPARE(repeater->count(), 10); + QCOMPARE(repeater->property("itemsCount").toInt(), 10); + QCOMPARE(repeater->property("itemsFound").toList().count(), 10); + + delete rootObject; +} + +void tst_QDeclarativeRepeater::properties() +{ + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine, TEST_FILE("/properties.qml")); + + QDeclarativeItem *rootObject = qobject_cast(component.create()); + QVERIFY(rootObject); + + QDeclarativeRepeater *repeater = findItem(rootObject, "repeater"); + QVERIFY(repeater); + + QSignalSpy modelSpy(repeater, SIGNAL(modelChanged())); + repeater->setModel(3); + QCOMPARE(modelSpy.count(),1); + repeater->setModel(3); + QCOMPARE(modelSpy.count(),1); + + QSignalSpy delegateSpy(repeater, SIGNAL(delegateChanged())); + + QDeclarativeComponent rectComponent(&engine); + rectComponent.setData("import QtQuick 1.0; Rectangle {}", QUrl::fromLocalFile("")); + + repeater->setDelegate(&rectComponent); + QCOMPARE(delegateSpy.count(),1); + repeater->setDelegate(&rectComponent); + QCOMPARE(delegateSpy.count(),1); + + delete rootObject; +} + +void tst_QDeclarativeRepeater::testQtQuick11Attributes() +{ + QFETCH(QString, code); + QFETCH(QString, warning); + QFETCH(QString, error); + + QDeclarativeEngine engine; + QObject *obj; + + QDeclarativeComponent invalid(&engine); + invalid.setData("import QtQuick 1.0; Repeater { " + code.toUtf8() + " }", QUrl("")); + QTest::ignoreMessage(QtWarningMsg, warning.toUtf8()); + obj = invalid.create(); + QCOMPARE(invalid.errorString(), error); + delete obj; + + QDeclarativeComponent valid(&engine); + valid.setData("import QtQuick 1.1; Repeater { " + code.toUtf8() + " }", QUrl("")); + obj = valid.create(); + QVERIFY(obj); + QVERIFY(valid.errorString().isEmpty()); + delete obj; +} + +void tst_QDeclarativeRepeater::testQtQuick11Attributes_data() +{ + QTest::addColumn("code"); + QTest::addColumn("warning"); + QTest::addColumn("error"); + + QTest::newRow("itemAdded") << "onItemAdded: count" + << "QDeclarativeComponent: Component is not ready" + << ":1 \"Repeater.onItemAdded\" is not available in QtQuick 1.0.\n"; + + QTest::newRow("itemRemoved") << "onItemRemoved: count" + << "QDeclarativeComponent: Component is not ready" + << ":1 \"Repeater.onItemRemoved\" is not available in QtQuick 1.0.\n"; + + QTest::newRow("itemAt") << "Component.onCompleted: itemAt(0)" + << ":1: ReferenceError: Can't find variable: itemAt" + << ""; +} + + +QDeclarativeView *tst_QDeclarativeRepeater::createView() +{ + QDeclarativeView *canvas = new QDeclarativeView(0); + canvas->setFixedSize(240,320); + + return canvas; +} + +template +T *tst_QDeclarativeRepeater::findItem(QGraphicsObject *parent, const QString &objectName, int index) +{ + const QMetaObject &mo = T::staticMetaObject; + //qDebug() << parent->childItems().count() << "children"; + for (int i = 0; i < parent->childItems().count(); ++i) { + QDeclarativeItem *item = qobject_cast(parent->childItems().at(i)); + if(!item) + continue; + //qDebug() << "try" << item; + if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName)) { + if (index != -1) { + QDeclarativeExpression e(qmlContext(item), item, "index"); + if (e.evaluate().toInt() == index) + return static_cast(item); + } else { + return static_cast(item); + } + } + item = findItem(item, objectName, index); + if (item) + return static_cast(item); + } + + return 0; +} + +template +T *tst_QDeclarativeRepeater::findItem(QGraphicsObject *parent, const QString &objectName) +{ + const QMetaObject &mo = T::staticMetaObject; + if (mo.cast(parent) && (objectName.isEmpty() || parent->objectName() == objectName)) + return static_cast(parent); + for (int i = 0; i < parent->childItems().count(); ++i) { + QDeclarativeItem *child = qobject_cast(parent->childItems().at(i)); + if (!child) + continue; + QDeclarativeItem *item = findItem(child, objectName); + if (item) + return static_cast(item); + } + + return 0; +} + +QTEST_MAIN(tst_QDeclarativeRepeater) + +#include "tst_qdeclarativerepeater.moc" diff --git a/tests/auto/declarative/qdeclarativesmoothedanimation/data/smoothedanimation1.qml b/tests/auto/declarative/qdeclarativesmoothedanimation/data/smoothedanimation1.qml new file mode 100644 index 00000000..3a2c4e38 --- /dev/null +++ b/tests/auto/declarative/qdeclarativesmoothedanimation/data/smoothedanimation1.qml @@ -0,0 +1,3 @@ +import QtQuick 1.0 + +SmoothedAnimation {} diff --git a/tests/auto/declarative/qdeclarativesmoothedanimation/data/smoothedanimation2.qml b/tests/auto/declarative/qdeclarativesmoothedanimation/data/smoothedanimation2.qml new file mode 100644 index 00000000..47935d48 --- /dev/null +++ b/tests/auto/declarative/qdeclarativesmoothedanimation/data/smoothedanimation2.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +SmoothedAnimation { + to: 10; duration: 300; reversingMode: SmoothedAnimation.Immediate +} diff --git a/tests/auto/declarative/qdeclarativesmoothedanimation/data/smoothedanimation3.qml b/tests/auto/declarative/qdeclarativesmoothedanimation/data/smoothedanimation3.qml new file mode 100644 index 00000000..fe44cce1 --- /dev/null +++ b/tests/auto/declarative/qdeclarativesmoothedanimation/data/smoothedanimation3.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +SmoothedAnimation { + to: 10; velocity: 250; reversingMode: SmoothedAnimation.Sync + maximumEasingTime: 150 +} diff --git a/tests/auto/declarative/qdeclarativesmoothedanimation/data/smoothedanimationBehavior.qml b/tests/auto/declarative/qdeclarativesmoothedanimation/data/smoothedanimationBehavior.qml new file mode 100644 index 00000000..65611227 --- /dev/null +++ b/tests/auto/declarative/qdeclarativesmoothedanimation/data/smoothedanimationBehavior.qml @@ -0,0 +1,24 @@ +import QtQuick 1.0 + +Rectangle { + width: 400; height: 400; color: "blue" + + Rectangle { + id: rect1 + color: "red" + width: 60; height: 60; + x: 100; y: 100; + SmoothedAnimation on x { to: 200; velocity: 500 } + SmoothedAnimation on y { to: 200; velocity: 500 } + } + + Rectangle { + objectName: "theRect" + color: "green" + width: 60; height: 60; + x: rect1.x; y: rect1.y; + // id are needed for SmoothedAnimation in order to avoid deferred creation + Behavior on x { SmoothedAnimation { id: anim1; objectName: "easeX"; velocity: 400 } } + Behavior on y { SmoothedAnimation { id: anim2; objectName: "easeY"; velocity: 400 } } + } + } diff --git a/tests/auto/declarative/qdeclarativesmoothedanimation/data/smoothedanimationValueSource.qml b/tests/auto/declarative/qdeclarativesmoothedanimation/data/smoothedanimationValueSource.qml new file mode 100644 index 00000000..5036d5f2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativesmoothedanimation/data/smoothedanimationValueSource.qml @@ -0,0 +1,13 @@ +import QtQuick 1.0 + +Rectangle { + width: 300; height: 300; + Rectangle { + objectName: "theRect" + color: "red" + width: 60; height: 60; + x: 100; y: 100; + SmoothedAnimation on x { objectName: "easeX"; to: 200; velocity: 500 } + SmoothedAnimation on y { objectName: "easeY"; to: 200; duration: 250; velocity: 500 } + } +} diff --git a/tests/auto/declarative/qdeclarativesmoothedanimation/qdeclarativesmoothedanimation.pro b/tests/auto/declarative/qdeclarativesmoothedanimation/qdeclarativesmoothedanimation.pro new file mode 100644 index 00000000..1e77d6eb --- /dev/null +++ b/tests/auto/declarative/qdeclarativesmoothedanimation/qdeclarativesmoothedanimation.pro @@ -0,0 +1,16 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative gui +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativesmoothedanimation.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativesmoothedanimation/tst_qdeclarativesmoothedanimation.cpp b/tests/auto/declarative/qdeclarativesmoothedanimation/tst_qdeclarativesmoothedanimation.cpp new file mode 100644 index 00000000..c779c8f8 --- /dev/null +++ b/tests/auto/declarative/qdeclarativesmoothedanimation/tst_qdeclarativesmoothedanimation.cpp @@ -0,0 +1,212 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include "../../../shared/util.h" + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_qdeclarativesmoothedanimation : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativesmoothedanimation(); + +private slots: + void defaultValues(); + void values(); + void disabled(); + void simpleAnimation(); + void valueSource(); + void behavior(); + +private: + QDeclarativeEngine engine; +}; + +tst_qdeclarativesmoothedanimation::tst_qdeclarativesmoothedanimation() +{ +} + +void tst_qdeclarativesmoothedanimation::defaultValues() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/smoothedanimation1.qml")); + QDeclarativeSmoothedAnimation *obj = qobject_cast(c.create()); + + QVERIFY(obj != 0); + + QCOMPARE(obj->to(), 0.); + QCOMPARE(obj->velocity(), 200.); + QCOMPARE(obj->duration(), -1); + QCOMPARE(obj->maximumEasingTime(), -1); + QCOMPARE(obj->reversingMode(), QDeclarativeSmoothedAnimation::Eased); + + delete obj; +} + +void tst_qdeclarativesmoothedanimation::values() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/smoothedanimation2.qml")); + QDeclarativeSmoothedAnimation *obj = qobject_cast(c.create()); + + QVERIFY(obj != 0); + + QCOMPARE(obj->to(), 10.); + QCOMPARE(obj->velocity(), 200.); + QCOMPARE(obj->duration(), 300); + QCOMPARE(obj->maximumEasingTime(), -1); + QCOMPARE(obj->reversingMode(), QDeclarativeSmoothedAnimation::Immediate); + + delete obj; +} + +void tst_qdeclarativesmoothedanimation::disabled() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/smoothedanimation3.qml")); + QDeclarativeSmoothedAnimation *obj = qobject_cast(c.create()); + + QVERIFY(obj != 0); + + QCOMPARE(obj->to(), 10.); + QCOMPARE(obj->velocity(), 250.); + QCOMPARE(obj->maximumEasingTime(), 150); + QCOMPARE(obj->reversingMode(), QDeclarativeSmoothedAnimation::Sync); + + delete obj; +} + +void tst_qdeclarativesmoothedanimation::simpleAnimation() +{ + QDeclarativeRectangle rect; + QDeclarativeSmoothedAnimation animation; + animation.setTarget(&rect); + animation.setProperty("x"); + animation.setTo(200); + animation.setDuration(250); + QVERIFY(animation.target() == &rect); + QVERIFY(animation.property() == "x"); + QVERIFY(animation.to() == 200); + animation.start(); + QVERIFY(animation.isRunning()); + QTest::qWait(animation.duration()); + QTRY_COMPARE(rect.x(), qreal(200)); + + rect.setX(0); + animation.start(); + animation.pause(); + QVERIFY(animation.isRunning()); + QVERIFY(animation.isPaused()); + animation.setCurrentTime(125); + QVERIFY(animation.currentTime() == 125); + QCOMPARE(rect.x(), qreal(100)); +} + +void tst_qdeclarativesmoothedanimation::valueSource() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/smoothedanimationValueSource.qml")); + + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); + + QDeclarativeRectangle *theRect = rect->findChild("theRect"); + QVERIFY(theRect); + + QDeclarativeSmoothedAnimation *easeX = rect->findChild("easeX"); + QVERIFY(easeX); + QVERIFY(easeX->isRunning()); + + QDeclarativeSmoothedAnimation *easeY = rect->findChild("easeY"); + QVERIFY(easeY); + QVERIFY(easeY->isRunning()); + + // XXX get the proper duration + QTest::qWait(100); + + QTRY_VERIFY(!easeX->isRunning()); + QTRY_VERIFY(!easeY->isRunning()); + + QTRY_COMPARE(theRect->x(), qreal(200)); + QTRY_COMPARE(theRect->y(), qreal(200)); +} + +void tst_qdeclarativesmoothedanimation::behavior() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/smoothedanimationBehavior.qml")); + + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect); + + QDeclarativeRectangle *theRect = rect->findChild("theRect"); + QVERIFY(theRect); + + QDeclarativeSmoothedAnimation *easeX = rect->findChild("easeX"); + QVERIFY(easeX); + + QDeclarativeSmoothedAnimation *easeY = rect->findChild("easeY"); + QVERIFY(easeY); + + // XXX get the proper duration + QTest::qWait(400); + + QTRY_VERIFY(!easeX->isRunning()); + QTRY_VERIFY(!easeY->isRunning()); + + QTRY_COMPARE(theRect->x(), qreal(200)); + QTRY_COMPARE(theRect->y(), qreal(200)); +} + +QTEST_MAIN(tst_qdeclarativesmoothedanimation) + +#include "tst_qdeclarativesmoothedanimation.moc" diff --git a/tests/auto/declarative/qdeclarativespringanimation/data/springanimation1.qml b/tests/auto/declarative/qdeclarativespringanimation/data/springanimation1.qml new file mode 100644 index 00000000..8890a78f --- /dev/null +++ b/tests/auto/declarative/qdeclarativespringanimation/data/springanimation1.qml @@ -0,0 +1,4 @@ +import QtQuick 1.0 + +SpringAnimation { +} diff --git a/tests/auto/declarative/qdeclarativespringanimation/data/springanimation2.qml b/tests/auto/declarative/qdeclarativespringanimation/data/springanimation2.qml new file mode 100644 index 00000000..de75bb06 --- /dev/null +++ b/tests/auto/declarative/qdeclarativespringanimation/data/springanimation2.qml @@ -0,0 +1,9 @@ +import QtQuick 1.0 + +SpringAnimation { + to: 1.44; velocity: 0.9 + spring: 1.0; damping: 0.5 + epsilon: 0.25; modulus: 360.0 + mass: 2.0; + running: true; +} diff --git a/tests/auto/declarative/qdeclarativespringanimation/data/springanimation3.qml b/tests/auto/declarative/qdeclarativespringanimation/data/springanimation3.qml new file mode 100644 index 00000000..b68d769f --- /dev/null +++ b/tests/auto/declarative/qdeclarativespringanimation/data/springanimation3.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 + +SpringAnimation { + to: 1.44; velocity: 0.9 + spring: 1.0; damping: 0.5 + epsilon: 0.25; modulus: 360.0 + mass: 2.0; running: false +} diff --git a/tests/auto/declarative/qdeclarativespringanimation/qdeclarativespringanimation.pro b/tests/auto/declarative/qdeclarativespringanimation/qdeclarativespringanimation.pro new file mode 100644 index 00000000..da477fce --- /dev/null +++ b/tests/auto/declarative/qdeclarativespringanimation/qdeclarativespringanimation.pro @@ -0,0 +1,16 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative gui +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativespringanimation.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativespringanimation/tst_qdeclarativespringanimation.cpp b/tests/auto/declarative/qdeclarativespringanimation/tst_qdeclarativespringanimation.cpp new file mode 100644 index 00000000..d97705af --- /dev/null +++ b/tests/auto/declarative/qdeclarativespringanimation/tst_qdeclarativespringanimation.cpp @@ -0,0 +1,136 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include "../../../shared/util.h" + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_qdeclarativespringanimation : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativespringanimation(); + +private slots: + void defaultValues(); + void values(); + void disabled(); + +private: + QDeclarativeEngine engine; +}; + +tst_qdeclarativespringanimation::tst_qdeclarativespringanimation() +{ +} + +void tst_qdeclarativespringanimation::defaultValues() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/springanimation1.qml")); + QDeclarativeSpringAnimation *obj = qobject_cast(c.create()); + + QVERIFY(obj != 0); + + QCOMPARE(obj->to(), 0.); + QCOMPARE(obj->velocity(), 0.); + QCOMPARE(obj->spring(), 0.); + QCOMPARE(obj->damping(), 0.); + QCOMPARE(obj->epsilon(), 0.01); + QCOMPARE(obj->modulus(), 0.); + QCOMPARE(obj->mass(), 1.); + QCOMPARE(obj->isRunning(), false); + + delete obj; +} + +void tst_qdeclarativespringanimation::values() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/springanimation2.qml")); + QDeclarativeSpringAnimation *obj = qobject_cast(c.create()); + + QVERIFY(obj != 0); + + QCOMPARE(obj->to(), 1.44); + QCOMPARE(obj->velocity(), 0.9); + QCOMPARE(obj->spring(), 1.0); + QCOMPARE(obj->damping(), 0.5); + QCOMPARE(obj->epsilon(), 0.25); + QCOMPARE(obj->modulus(), 360.0); + QCOMPARE(obj->mass(), 2.0); + QCOMPARE(obj->isRunning(), true); + + QTRY_COMPARE(obj->isRunning(), false); + + delete obj; +} + +void tst_qdeclarativespringanimation::disabled() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/springanimation3.qml")); + QDeclarativeSpringAnimation *obj = qobject_cast(c.create()); + + QVERIFY(obj != 0); + + QCOMPARE(obj->to(), 1.44); + QCOMPARE(obj->velocity(), 0.9); + QCOMPARE(obj->spring(), 1.0); + QCOMPARE(obj->damping(), 0.5); + QCOMPARE(obj->epsilon(), 0.25); + QCOMPARE(obj->modulus(), 360.0); + QCOMPARE(obj->mass(), 2.0); + QCOMPARE(obj->isRunning(), false); + + delete obj; +} + +QTEST_MAIN(tst_qdeclarativespringanimation) + +#include "tst_qdeclarativespringanimation.moc" diff --git a/tests/auto/declarative/qdeclarativestates/data/ExtendedRectangle.qml b/tests/auto/declarative/qdeclarativestates/data/ExtendedRectangle.qml new file mode 100644 index 00000000..d91f5044 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/ExtendedRectangle.qml @@ -0,0 +1,19 @@ +import QtQuick 1.0 +Rectangle { + id: extendedRect + objectName: "extendedRect" + property color extendedColor: "orange" + + width: 100; height: 100 + color: "red" + states: State { + name: "green" + PropertyChanges { + target: rect + onDidSomething: { + extendedRect.color = "green" + extendedColor = "green" + } + } + } +} diff --git a/tests/auto/declarative/qdeclarativestates/data/Implementation/MyType.qml b/tests/auto/declarative/qdeclarativestates/data/Implementation/MyType.qml new file mode 100644 index 00000000..6ad3b4a6 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/Implementation/MyType.qml @@ -0,0 +1,32 @@ +import QtQuick 1.0 + +Item { + Column { + anchors.centerIn: parent + Image { id: image1; objectName: "image1" } + Image { id: image2; objectName: "image2" } + Image { id: image3; objectName: "image3" } + } + + states: State { + name: "SetImageState" + PropertyChanges { + target: image1 + source: "images/qt-logo.png" + } + PropertyChanges { + target: image2 + source: "images/" + "qt-logo.png" + } + PropertyChanges { + target: image3 + source: "images/" + (true ? "qt-logo.png" : "") + } + } + + MouseArea { + anchors.fill: parent + onClicked: parent.state = "SetImageState" + } + +} diff --git a/tests/auto/declarative/qdeclarativestates/data/Implementation/images/qt-logo.png b/tests/auto/declarative/qdeclarativestates/data/Implementation/images/qt-logo.png new file mode 100644 index 00000000..14ddf2a0 Binary files /dev/null and b/tests/auto/declarative/qdeclarativestates/data/Implementation/images/qt-logo.png differ diff --git a/tests/auto/declarative/qdeclarativestates/data/QTBUG-14830.qml b/tests/auto/declarative/qdeclarativestates/data/QTBUG-14830.qml new file mode 100644 index 00000000..7f9ddbfa --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/QTBUG-14830.qml @@ -0,0 +1,29 @@ +import QtQuick 1.0 + +Rectangle { + width: 1024 + height: 768 + + Item { + id: area + objectName: "area" + property int numx: 6 + property int cellwidth: 1024/numx + + onWidthChanged: { + width = width>1024?1024:width; + } + + state: 'minimal' + states: [ + State { + name: 'minimal' + PropertyChanges { + target: area + width: cellwidth + } + } + ] + + } +} diff --git a/tests/auto/declarative/qdeclarativestates/data/anchorChanges1.qml b/tests/auto/declarative/qdeclarativestates/data/anchorChanges1.qml new file mode 100644 index 00000000..fad27080 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/anchorChanges1.qml @@ -0,0 +1,23 @@ +import QtQuick 1.0 + +Rectangle { + id: container + width: 200; height: 200 + Rectangle { + id: myRect + objectName: "MyRect" + width: 50; height: 50 + color: "green"; + anchors.left: parent.left + anchors.leftMargin: 5 + } + states: State { + name: "right" + AnchorChanges { + id: ancCh + target: myRect; + anchors.left: undefined + anchors.right: container.right + } + } +} diff --git a/tests/auto/declarative/qdeclarativestates/data/anchorChanges2.qml b/tests/auto/declarative/qdeclarativestates/data/anchorChanges2.qml new file mode 100644 index 00000000..e1d4d66a --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/anchorChanges2.qml @@ -0,0 +1,21 @@ +import QtQuick 1.0 + +Rectangle { + width: 200; height: 200 + Rectangle { + id: myRect + objectName: "MyRect" + width: 50; height: 50 + color: "green"; + anchors.left: parent.left + anchors.leftMargin: 5 + } + states: State { + name: "right" + AnchorChanges { + target: myRect; + anchors.left: undefined + anchors.right: parent.right + } + } +} diff --git a/tests/auto/declarative/qdeclarativestates/data/anchorChanges3.qml b/tests/auto/declarative/qdeclarativestates/data/anchorChanges3.qml new file mode 100644 index 00000000..116b8444 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/anchorChanges3.qml @@ -0,0 +1,29 @@ +import QtQuick 1.0 + +Rectangle { + id: container + width: 200; height: 200 + Rectangle { + id: myRect + objectName: "MyRect" + color: "green"; + anchors.left: parent.left + anchors.right: rightGuideline.left + anchors.top: topGuideline.top + anchors.bottom: container.bottom + } + Item { objectName: "LeftGuideline"; id: leftGuideline; x: 10 } + Item { id: rightGuideline; x: 150 } + Item { id: topGuideline; y: 10 } + Item { objectName: "BottomGuideline"; id: bottomGuideline; y: 150 } + states: State { + name: "reanchored" + AnchorChanges { + target: myRect; + anchors.left: leftGuideline.left + anchors.right: container.right + anchors.top: container.top + anchors.bottom: bottomGuideline.bottom + } + } +} diff --git a/tests/auto/declarative/qdeclarativestates/data/anchorChanges4.qml b/tests/auto/declarative/qdeclarativestates/data/anchorChanges4.qml new file mode 100644 index 00000000..eaff3734 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/anchorChanges4.qml @@ -0,0 +1,22 @@ +import QtQuick 1.0 + +Rectangle { + width: 200; height: 200 + Rectangle { + id: myRect + objectName: "MyRect" + color: "green"; + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + } + Item { objectName: "LeftGuideline"; id: leftGuideline; x: 10 } + Item { objectName: "BottomGuideline"; id: bottomGuideline; y: 150 } + states: State { + name: "reanchored" + AnchorChanges { + target: myRect; + anchors.horizontalCenter: bottomGuideline.horizontalCenter + anchors.verticalCenter: leftGuideline.verticalCenter + } + } +} diff --git a/tests/auto/declarative/qdeclarativestates/data/anchorChanges5.qml b/tests/auto/declarative/qdeclarativestates/data/anchorChanges5.qml new file mode 100644 index 00000000..ea7b2511 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/anchorChanges5.qml @@ -0,0 +1,22 @@ +import QtQuick 1.0 + +Rectangle { + width: 200; height: 200 + Rectangle { + id: myRect + objectName: "MyRect" + color: "green"; + anchors.horizontalCenter: parent.horizontalCenter + anchors.baseline: parent.baseline + } + Item { objectName: "LeftGuideline"; id: leftGuideline; x: 10 } + Item { objectName: "BottomGuideline"; id: bottomGuideline; y: 150 } + states: State { + name: "reanchored" + AnchorChanges { + target: myRect; + anchors.horizontalCenter: bottomGuideline.horizontalCenter + anchors.baseline: leftGuideline.baseline + } + } +} diff --git a/tests/auto/declarative/qdeclarativestates/data/anchorChangesCrash.qml b/tests/auto/declarative/qdeclarativestates/data/anchorChangesCrash.qml new file mode 100644 index 00000000..ca96da88 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/anchorChangesCrash.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 + +Rectangle { + id: container + width: 400 + height: 400 + + states: State { + name: "reanchored" + AnchorChanges { + anchors.top: container.top + } + } +} diff --git a/tests/auto/declarative/qdeclarativestates/data/anchorRewindBug.qml b/tests/auto/declarative/qdeclarativestates/data/anchorRewindBug.qml new file mode 100644 index 00000000..6277111e --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/anchorRewindBug.qml @@ -0,0 +1,37 @@ +import QtQuick 1.0 +Rectangle { + id: container + color: "red" + height: 200 + width: 200 + Column { + id: column + objectName: "column" + anchors.left: container.right + anchors.bottom: container.bottom + + Rectangle { + id: rectangle + color: "blue" + height: 100 + width: 200 + } + Rectangle { + color: "blue" + height: 100 + width: 200 + } + } + states: State { + name: "reanchored" + AnchorChanges { + target: column + anchors.left: undefined + anchors.right: container.right + } + PropertyChanges { + target: rectangle + opacity: 0 + } + } +} diff --git a/tests/auto/declarative/qdeclarativestates/data/anchorRewindBug2.qml b/tests/auto/declarative/qdeclarativestates/data/anchorRewindBug2.qml new file mode 100644 index 00000000..d8b02e9b --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/anchorRewindBug2.qml @@ -0,0 +1,25 @@ +import QtQuick 1.0 + +Rectangle { + id: root + width:200; height:300 + + Rectangle { + id: rectangle + objectName: "mover" + color: "green" + width:50; height:50 + } + + states: [ + State { + name: "anchored" + AnchorChanges { + target: rectangle + anchors.left: root.left + anchors.right: root.right + anchors.bottom: root.bottom + } + } + ] +} diff --git a/tests/auto/declarative/qdeclarativestates/data/attachedPropertyChanges.qml b/tests/auto/declarative/qdeclarativestates/data/attachedPropertyChanges.qml new file mode 100644 index 00000000..2cad0504 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/attachedPropertyChanges.qml @@ -0,0 +1,20 @@ +import Qt.test 1.0 +import QtQuick 1.0 + +Item { + id: item + width: 100; height: 100 + MyRectangle.foo: 0 + + states: State { + name: "foo1" + PropertyChanges { + target: item + MyRectangle.foo: 1 + width: 50 + } + } + + Component.onCompleted: item.state = "foo1" +} + diff --git a/tests/auto/declarative/qdeclarativestates/data/autoStateAtStartupRestoreBug.qml b/tests/auto/declarative/qdeclarativestates/data/autoStateAtStartupRestoreBug.qml new file mode 100644 index 00000000..ccd126f6 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/autoStateAtStartupRestoreBug.qml @@ -0,0 +1,18 @@ +import QtQuick 1.0 + +Item { + id: root + property int input: 1 + property int test: 9 + + states: [ + State { + name: "portrait" + when: root.input == 1 + PropertyChanges { + target: root + test: 3 + } + } + ] +} diff --git a/tests/auto/declarative/qdeclarativestates/data/basicBinding.qml b/tests/auto/declarative/qdeclarativestates/data/basicBinding.qml new file mode 100644 index 00000000..2060f030 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/basicBinding.qml @@ -0,0 +1,12 @@ +import QtQuick 1.0 +Rectangle { + id: myRectangle + + property color sourceColor: "blue" + width: 100; height: 100 + color: "red" + states: State { + name: "blue" + PropertyChanges { target: myRectangle; color: sourceColor } + } +} diff --git a/tests/auto/declarative/qdeclarativestates/data/basicBinding2.qml b/tests/auto/declarative/qdeclarativestates/data/basicBinding2.qml new file mode 100644 index 00000000..a329da33 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/basicBinding2.qml @@ -0,0 +1,12 @@ +import QtQuick 1.0 +Rectangle { + id: myRectangle + + property color sourceColor: "red" + width: 100; height: 100 + color: sourceColor + states: State { + name: "blue" + PropertyChanges { target: myRectangle; color: "blue" } + } +} diff --git a/tests/auto/declarative/qdeclarativestates/data/basicBinding3.qml b/tests/auto/declarative/qdeclarativestates/data/basicBinding3.qml new file mode 100644 index 00000000..cb054d21 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/basicBinding3.qml @@ -0,0 +1,13 @@ +import QtQuick 1.0 +Rectangle { + id: myRectangle + + property color sourceColor: "red" + property color sourceColor2: "blue" + width: 100; height: 100 + color: sourceColor + states: State { + name: "blue" + PropertyChanges { target: myRectangle; color: sourceColor2 } + } +} diff --git a/tests/auto/declarative/qdeclarativestates/data/basicBinding4.qml b/tests/auto/declarative/qdeclarativestates/data/basicBinding4.qml new file mode 100644 index 00000000..7a740e57 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/basicBinding4.qml @@ -0,0 +1,17 @@ +import QtQuick 1.0 +Rectangle { + id: myRectangle + + property color sourceColor: "blue" + width: 100; height: 100 + color: "red" + states: [ + State { + name: "blue" + PropertyChanges { target: myRectangle; color: sourceColor } + }, + State { + name: "green" + PropertyChanges { target: myRectangle; color: "green" } + }] +} diff --git a/tests/auto/declarative/qdeclarativestates/data/basicChanges.qml b/tests/auto/declarative/qdeclarativestates/data/basicChanges.qml new file mode 100644 index 00000000..08ce7875 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/basicChanges.qml @@ -0,0 +1,10 @@ +import QtQuick 1.0 +Rectangle { + id: myRectangle + width: 100; height: 100 + color: "red" + states: State { + name: "blue" + PropertyChanges { target: myRectangle; color: "blue" } + } +} diff --git a/tests/auto/declarative/qdeclarativestates/data/basicChanges2.qml b/tests/auto/declarative/qdeclarativestates/data/basicChanges2.qml new file mode 100644 index 00000000..ab97ba18 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/basicChanges2.qml @@ -0,0 +1,15 @@ +import QtQuick 1.0 +Rectangle { + id: myRectangle + width: 100; height: 100 + color: "red" + states: [ + State { + name: "blue" + PropertyChanges { target: myRectangle; color: "blue" } + }, + State { + name: "green" + PropertyChanges { target: myRectangle; color: "green" } + }] +} diff --git a/tests/auto/declarative/qdeclarativestates/data/basicChanges3.qml b/tests/auto/declarative/qdeclarativestates/data/basicChanges3.qml new file mode 100644 index 00000000..73ac34d7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/basicChanges3.qml @@ -0,0 +1,15 @@ +import QtQuick 1.0 +Rectangle { + id: myRectangle + width: 100; height: 100 + color: "red" + states: [ + State { + name: "blue" + PropertyChanges { target: myRectangle; color: "blue" } + }, + State { + name: "bordered" + PropertyChanges { target: myRectangle; border.width: 2 } + }] +} diff --git a/tests/auto/declarative/qdeclarativestates/data/basicChanges4.qml b/tests/auto/declarative/qdeclarativestates/data/basicChanges4.qml new file mode 100644 index 00000000..b5df9221 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/basicChanges4.qml @@ -0,0 +1,19 @@ +import Qt.test 1.0 +import QtQuick 1.0 + +MyRectangle { + id: rect + width: 100; height: 100 + color: "red" + + states: State { + name: "aBlueDay" + PropertyChanges { + target: rect + onPropertyWithNotifyChanged: { rect.color = "blue"; } + } + } + + Component.onCompleted: rect.state = "aBlueDay" +} + diff --git a/tests/auto/declarative/qdeclarativestates/data/basicExtension.qml b/tests/auto/declarative/qdeclarativestates/data/basicExtension.qml new file mode 100644 index 00000000..58c9fbe2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/basicExtension.qml @@ -0,0 +1,16 @@ +import QtQuick 1.0 +Rectangle { + id: myRectangle + width: 100; height: 100 + color: "red" + states: [ + State { + name: "blue" + PropertyChanges { target: myRectangle; color: "blue" } + }, + State { + name: "bordered" + extend: "blue" + PropertyChanges { target: myRectangle; border.width: 2 } + }] +} diff --git a/tests/auto/declarative/qdeclarativestates/data/deleting.qml b/tests/auto/declarative/qdeclarativestates/data/deleting.qml new file mode 100644 index 00000000..d1b3fd3a --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/deleting.qml @@ -0,0 +1,11 @@ +import QtQuick 1.0 +Rectangle { + id: myRectangle + width: 100; height: 100 + color: "red" + states: State { + name: "blue" + PropertyChanges { target: myRectangle; color: "blue"; objectName: "pc1" } + PropertyChanges { target: myRectangle; radius: 5; objectName: "pc2" } + } +} diff --git a/tests/auto/declarative/qdeclarativestates/data/deletingState.qml b/tests/auto/declarative/qdeclarativestates/data/deletingState.qml new file mode 100644 index 00000000..654e09cb --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/deletingState.qml @@ -0,0 +1,13 @@ +import QtQuick 1.0 +Rectangle { + id: myRectangle + width: 100; height: 100 + color: "red" + StateGroup { + id: stateGroup + states: State { + name: "blue" + PropertyChanges { target: myRectangle; color: "blue" } + } + } +} diff --git a/tests/auto/declarative/qdeclarativestates/data/editProperties.qml b/tests/auto/declarative/qdeclarativestates/data/editProperties.qml new file mode 100644 index 00000000..08d02096 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/editProperties.qml @@ -0,0 +1,34 @@ +import QtQuick 1.0 +Rectangle { + id: myRectangle + + property color sourceColor: "blue" + width: 400; height: 400 + color: "red" + + Rectangle { + id: rect2 + objectName: "rect2" + width: parent.width + 2 + height: 200 + color: "yellow" + } + + states: [ + State { + name: "blue" + PropertyChanges { + target: rect2 + width:50 + height: 40 + } + }, + State { + name: "green" + PropertyChanges { + target: rect2 + width: myRectangle.width / 2 + height: myRectangle.width / 4 + } + }] +} diff --git a/tests/auto/declarative/qdeclarativestates/data/explicit.qml b/tests/auto/declarative/qdeclarativestates/data/explicit.qml new file mode 100644 index 00000000..42673191 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/explicit.qml @@ -0,0 +1,15 @@ +import QtQuick 1.0 +Rectangle { + id: myRectangle + property color sourceColor: "blue" + width: 100; height: 100 + color: "red" + states: State { + name: "blue" + PropertyChanges { + objectName: "changes" + target: myRectangle; explicit: true + color: sourceColor + } + } +} diff --git a/tests/auto/declarative/qdeclarativestates/data/extendsBug.qml b/tests/auto/declarative/qdeclarativestates/data/extendsBug.qml new file mode 100644 index 00000000..a4b77b12 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/extendsBug.qml @@ -0,0 +1,26 @@ +import QtQuick 1.0 + +Rectangle { + width: 200 + height: 200 + + Rectangle { + id: rect + objectName: "greenRect" + width: 100 + height: 100 + color: "green" + } + + states:[ + State { + name: "a" + PropertyChanges { target: rect; x: 100 } + }, + State { + name: "b" + extend:"a" + PropertyChanges { target: rect; y: 100 } + } + ] +} diff --git a/tests/auto/declarative/qdeclarativestates/data/fakeExtension.qml b/tests/auto/declarative/qdeclarativestates/data/fakeExtension.qml new file mode 100644 index 00000000..a98c96be --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/fakeExtension.qml @@ -0,0 +1,16 @@ +import QtQuick 1.0 +Rectangle { + id: myRectangle + width: 100; height: 100 + color: "red" + states: [ + State { + name: "blue" + PropertyChanges { target: myRectangle; color: "blue" } + }, + State { + name: "green" + extend: "blue" + PropertyChanges { target: myRectangle; color: "green" } + }] +} diff --git a/tests/auto/declarative/qdeclarativestates/data/illegalObj.qml b/tests/auto/declarative/qdeclarativestates/data/illegalObj.qml new file mode 100644 index 00000000..e6444325 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/illegalObj.qml @@ -0,0 +1,12 @@ +import QtQuick 1.0 + +Rectangle { + id: myItem + + states : State { + PropertyChanges { + target: myItem + children: Item { id: newItem } + } + } +} diff --git a/tests/auto/declarative/qdeclarativestates/data/illegalTempState.qml b/tests/auto/declarative/qdeclarativestates/data/illegalTempState.qml new file mode 100644 index 00000000..c04b03c9 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/illegalTempState.qml @@ -0,0 +1,21 @@ +import QtQuick 1.0 + +Rectangle { + id: card + width: 100; height: 100 + + states: [ + State { + name: "placed" + PropertyChanges { target: card; state: "idle" } + }, + State { + name: "idle" + } + ] + + MouseArea { + anchors.fill: parent + onClicked: card.state = "placed" + } +} diff --git a/tests/auto/declarative/qdeclarativestates/data/image.png b/tests/auto/declarative/qdeclarativestates/data/image.png new file mode 100644 index 00000000..ed1833c9 Binary files /dev/null and b/tests/auto/declarative/qdeclarativestates/data/image.png differ diff --git a/tests/auto/declarative/qdeclarativestates/data/legalTempState.qml b/tests/auto/declarative/qdeclarativestates/data/legalTempState.qml new file mode 100644 index 00000000..4d500d9e --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/legalTempState.qml @@ -0,0 +1,23 @@ +import QtQuick 1.0 + +Rectangle { + id: card + width: 100; height: 100 + + states: [ + State { + name: "placed" + onCompleted: card.state = "idle" + StateChangeScript { script: console.log("entering placed") } + }, + State { + name: "idle" + StateChangeScript { script: console.log("entering idle") } + } + ] + + MouseArea { + anchors.fill: parent + onClicked: card.state = "placed" + } +} diff --git a/tests/auto/declarative/qdeclarativestates/data/nonExistantProp.qml b/tests/auto/declarative/qdeclarativestates/data/nonExistantProp.qml new file mode 100644 index 00000000..4973b82c --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/nonExistantProp.qml @@ -0,0 +1,11 @@ +import QtQuick 1.0 +Rectangle { + id: myRectangle + + width: 100; height: 100 + color: "red" + states: State { + name: "blue" + PropertyChanges { target: myRectangle; colr: "blue" } + } +} diff --git a/tests/auto/declarative/qdeclarativestates/data/parentChange1.qml b/tests/auto/declarative/qdeclarativestates/data/parentChange1.qml new file mode 100644 index 00000000..2f7e80eb --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/parentChange1.qml @@ -0,0 +1,37 @@ +import QtQuick 1.0 + +Rectangle { + width: 400; height: 400 + Item { + x: 10; y: 10 + Rectangle { + id: myRect + objectName: "MyRect" + x: 5 + width: 100; height: 100 + color: "red" + } + } + MouseArea { + id: clickable + anchors.fill: parent + } + + Item { + x: -100; y: -50 + Item { + id: newParent + objectName: "NewParent" + x: 248; y: 360 + } + } + + states: State { + name: "reparented" + when: clickable.pressed + ParentChange { + target: myRect + parent: newParent + } + } +} diff --git a/tests/auto/declarative/qdeclarativestates/data/parentChange2.qml b/tests/auto/declarative/qdeclarativestates/data/parentChange2.qml new file mode 100644 index 00000000..bdd0c6c2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/parentChange2.qml @@ -0,0 +1,31 @@ +import QtQuick 1.0 + +Rectangle { + id: newParent + width: 400; height: 400 + Item { + scale: .5 + rotation: 15 + x: 10; y: 10 + Rectangle { + id: myRect + objectName: "MyRect" + x: 5 + width: 100; height: 100 + color: "red" + } + } + MouseArea { + id: clickable + anchors.fill: parent + } + + states: State { + name: "reparented" + when: clickable.pressed + ParentChange { + target: myRect + parent: newParent + } + } +} diff --git a/tests/auto/declarative/qdeclarativestates/data/parentChange3.qml b/tests/auto/declarative/qdeclarativestates/data/parentChange3.qml new file mode 100644 index 00000000..55f3ead7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/parentChange3.qml @@ -0,0 +1,42 @@ +import QtQuick 1.0 + +Rectangle { + width: 400; height: 400 + Item { + scale: .5 + rotation: 15 + transformOrigin: "Center" + x: 10; y: 10 + Rectangle { + id: myRect + objectName: "MyRect" + x: 5 + width: 100; height: 100 + transformOrigin: "BottomLeft" + color: "red" + } + } + MouseArea { + id: clickable + anchors.fill: parent + } + + Item { + x: 200; y: 200 + rotation: 52; + scale: 2 + Item { + id: newParent + x: 100; y: 100 + } + } + + states: State { + name: "reparented" + when: clickable.pressed + ParentChange { + target: myRect + parent: newParent + } + } +} diff --git a/tests/auto/declarative/qdeclarativestates/data/parentChange4.qml b/tests/auto/declarative/qdeclarativestates/data/parentChange4.qml new file mode 100644 index 00000000..ae05b050 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/parentChange4.qml @@ -0,0 +1,30 @@ +import QtQuick 1.0 + +Rectangle { + width: 400; height: 400 + Rectangle { + id: myRect + objectName: "MyRect" + x: 5; y: 5 + width: 100; height: 100 + color: "red" + } + MouseArea { + id: clickable + anchors.fill: parent + } + + Item { + id: newParent + transform: Scale { xScale: .5; yScale: .7} + } + + states: State { + name: "reparented" + when: clickable.pressed + ParentChange { + target: myRect + parent: newParent + } + } +} diff --git a/tests/auto/declarative/qdeclarativestates/data/parentChange5.qml b/tests/auto/declarative/qdeclarativestates/data/parentChange5.qml new file mode 100644 index 00000000..32a0b91c --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/parentChange5.qml @@ -0,0 +1,30 @@ +import QtQuick 1.0 + +Rectangle { + width: 400; height: 400 + Rectangle { + id: myRect + objectName: "MyRect" + x: 5; y: 5 + width: 100; height: 100 + color: "red" + } + MouseArea { + id: clickable + anchors.fill: parent + } + + Item { + id: newParent + transform: Rotation { angle: 30; axis { x: 0; y: 1; z: 0 } } + } + + states: State { + name: "reparented" + when: clickable.pressed + ParentChange { + target: myRect + parent: newParent + } + } +} diff --git a/tests/auto/declarative/qdeclarativestates/data/parentChange6.qml b/tests/auto/declarative/qdeclarativestates/data/parentChange6.qml new file mode 100644 index 00000000..70ad894f --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/parentChange6.qml @@ -0,0 +1,30 @@ +import QtQuick 1.0 + +Rectangle { + width: 400; height: 400 + Rectangle { + id: myRect + objectName: "MyRect" + x: 5; y: 5 + width: 100; height: 100 + color: "red" + } + MouseArea { + id: clickable + anchors.fill: parent + } + + Item { + id: newParent + rotation: 180 + } + + states: State { + name: "reparented" + when: clickable.pressed + ParentChange { + target: myRect + parent: newParent + } + } +} diff --git a/tests/auto/declarative/qdeclarativestates/data/propertyErrors.qml b/tests/auto/declarative/qdeclarativestates/data/propertyErrors.qml new file mode 100644 index 00000000..3ab3c325 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/propertyErrors.qml @@ -0,0 +1,10 @@ +import QtQuick 1.0 +Rectangle { + id: myRectangle + width: 100; height: 100 + color: "red" + states: State { + name: "blue" + PropertyChanges { target: myRectangle; colr: "blue"; activeFocus: true } + } +} diff --git a/tests/auto/declarative/qdeclarativestates/data/reset.qml b/tests/auto/declarative/qdeclarativestates/data/reset.qml new file mode 100644 index 00000000..a140ffab --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/reset.qml @@ -0,0 +1,19 @@ +import QtQuick 1.0 + +Rectangle { + width: 640 + height: 480 + Image { + id: image + width: 40 + source: "image.png" + } + + states: State { + name: "state1" + PropertyChanges { + target: image + width: undefined + } + } +} diff --git a/tests/auto/declarative/qdeclarativestates/data/restoreEntryValues.qml b/tests/auto/declarative/qdeclarativestates/data/restoreEntryValues.qml new file mode 100644 index 00000000..dfd7c179 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/restoreEntryValues.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 +Rectangle { + id: myRectangle + width: 100; height: 100 + color: "red" + states: State { + name: "blue" + PropertyChanges { + target: myRectangle + restoreEntryValues: false + color: "blue" + } + } +} diff --git a/tests/auto/declarative/qdeclarativestates/data/returnToBase.qml b/tests/auto/declarative/qdeclarativestates/data/returnToBase.qml new file mode 100644 index 00000000..a0d053cf --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/returnToBase.qml @@ -0,0 +1,21 @@ +import QtQuick 1.0 + +Rectangle { + id: theRect + property bool triggerState: false + property string stateString: "" + states: [ State { + when: triggerState + PropertyChanges { + target: theRect + stateString: "inState" + } + }, + State { + name: "" + PropertyChanges { + target: theRect + stateString: "originalState" + } + }] +} diff --git a/tests/auto/declarative/qdeclarativestates/data/script.qml b/tests/auto/declarative/qdeclarativestates/data/script.qml new file mode 100644 index 00000000..630aaf0f --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/script.qml @@ -0,0 +1,10 @@ +import QtQuick 1.0 +Rectangle { + id: myRectangle + width: 100; height: 100 + color: "red" + states: State { + name: "blue" + StateChangeScript { script: myRectangle.color = "blue"; } + } +} diff --git a/tests/auto/declarative/qdeclarativestates/data/signalOverride.qml b/tests/auto/declarative/qdeclarativestates/data/signalOverride.qml new file mode 100644 index 00000000..0eaf5476 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/signalOverride.qml @@ -0,0 +1,18 @@ +import QtQuick 1.0 +import Qt.test 1.0 + +MyRectangle { + id: rect + + onDidSomething: color = "blue" + + width: 100; height: 100 + color: "red" + states: State { + name: "green" + PropertyChanges { + target: rect + onDidSomething: color = "green" + } + } +} diff --git a/tests/auto/declarative/qdeclarativestates/data/signalOverride2.qml b/tests/auto/declarative/qdeclarativestates/data/signalOverride2.qml new file mode 100644 index 00000000..ef26ff14 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/signalOverride2.qml @@ -0,0 +1,9 @@ +import QtQuick 1.0 +import Qt.test 1.0 + +MyRectangle { + id: rect + onDidSomething: color = "blue" + width: 100; height: 100 + ExtendedRectangle {} +} diff --git a/tests/auto/declarative/qdeclarativestates/data/signalOverrideCrash.qml b/tests/auto/declarative/qdeclarativestates/data/signalOverrideCrash.qml new file mode 100644 index 00000000..8e9b6983 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/signalOverrideCrash.qml @@ -0,0 +1,15 @@ +import QtQuick 1.0 +import Qt.test 1.0 + +MyRectangle { + id: rect + + width: 100; height: 100 + states: State { + name: "overridden" + PropertyChanges { + target: rect + onDidSomething: rect.state = "" + } + } +} diff --git a/tests/auto/declarative/qdeclarativestates/data/signalOverrideCrash2.qml b/tests/auto/declarative/qdeclarativestates/data/signalOverrideCrash2.qml new file mode 100644 index 00000000..74df9430 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/signalOverrideCrash2.qml @@ -0,0 +1,24 @@ +import QtQuick 1.0 + +Rectangle { + id: myRect + width: 400 + height: 400 + + states: [ + State { + name: "state1" + PropertyChanges { + target: myRect + onHeightChanged: console.log("Hello World") + color: "green" + } + }, + State { + name: "state2"; extend: "state1" + PropertyChanges { + target: myRect + color: "red" + } + }] +} diff --git a/tests/auto/declarative/qdeclarativestates/data/signalOverrideCrash3.qml b/tests/auto/declarative/qdeclarativestates/data/signalOverrideCrash3.qml new file mode 100644 index 00000000..ed1f22f3 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/signalOverrideCrash3.qml @@ -0,0 +1,27 @@ +import QtQuick 1.0 + +Rectangle { + id: myRect + width: 400 + height: 400 + + onHeightChanged: console.log("base state") + + states: [ + State { + name: "state1" + PropertyChanges { + target: myRect + onHeightChanged: console.log("state1") + color: "green" + } + }, + State { + name: "state2"; + PropertyChanges { + target: myRect + onHeightChanged: console.log("state2") + color: "red" + } + }] +} diff --git a/tests/auto/declarative/qdeclarativestates/data/unnamedWhen.qml b/tests/auto/declarative/qdeclarativestates/data/unnamedWhen.qml new file mode 100644 index 00000000..4425b4dd --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/unnamedWhen.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 + +Rectangle { + id: theRect + property bool triggerState: false + property string stateString: "" + states: State { + when: triggerState + PropertyChanges { + target: theRect + stateString: "inState" + } + } +} diff --git a/tests/auto/declarative/qdeclarativestates/data/urlResolution.qml b/tests/auto/declarative/qdeclarativestates/data/urlResolution.qml new file mode 100644 index 00000000..743f5404 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/urlResolution.qml @@ -0,0 +1,12 @@ +import QtQuick 1.0 +import "Implementation" + +Rectangle { + width: 100 + height: 200 + + MyType { + objectName: "MyType" + anchors.fill: parent + } +} diff --git a/tests/auto/declarative/qdeclarativestates/data/whenOrdering.qml b/tests/auto/declarative/qdeclarativestates/data/whenOrdering.qml new file mode 100644 index 00000000..48aef5a6 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/data/whenOrdering.qml @@ -0,0 +1,11 @@ +import QtQuick 1.0 + +Rectangle { + property bool condition1: false + property bool condition2: false + + states: [ + State { name: "state1"; when: condition1 }, + State { name: "state2"; when: condition2 } + ] +} diff --git a/tests/auto/declarative/qdeclarativestates/qdeclarativestates.pro b/tests/auto/declarative/qdeclarativestates/qdeclarativestates.pro new file mode 100644 index 00000000..4a0cc24b --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/qdeclarativestates.pro @@ -0,0 +1,15 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativestates.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test diff --git a/tests/auto/declarative/qdeclarativestates/tst_qdeclarativestates.cpp b/tests/auto/declarative/qdeclarativestates/tst_qdeclarativestates.cpp new file mode 100644 index 00000000..eb2558b0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestates/tst_qdeclarativestates.cpp @@ -0,0 +1,1531 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class MyAttached : public QObject +{ + Q_OBJECT + Q_PROPERTY(int foo READ foo WRITE setFoo) +public: + MyAttached(QObject *parent) : QObject(parent), m_foo(13) {} + + int foo() const { return m_foo; } + void setFoo(int f) { m_foo = f; } + +private: + int m_foo; +}; + +class MyRect : public QDeclarativeRectangle +{ + Q_OBJECT + Q_PROPERTY(int propertyWithNotify READ propertyWithNotify WRITE setPropertyWithNotify NOTIFY oddlyNamedNotifySignal) +public: + MyRect() {} + + void doSomething() { emit didSomething(); } + + int propertyWithNotify() const { return m_prop; } + void setPropertyWithNotify(int i) { m_prop = i; emit oddlyNamedNotifySignal(); } + + static MyAttached *qmlAttachedProperties(QObject *o) { + return new MyAttached(o); + } +Q_SIGNALS: + void didSomething(); + void oddlyNamedNotifySignal(); + +private: + int m_prop; +}; + +QML_DECLARE_TYPE(MyRect) +QML_DECLARE_TYPEINFO(MyRect, QML_HAS_ATTACHED_PROPERTIES) + +class tst_qdeclarativestates : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativestates() {} + +private: + static QByteArray fullDataPath(const QString &path); + +private slots: + void initTestCase(); + + void basicChanges(); + void attachedPropertyChanges(); + void basicExtension(); + void basicBinding(); + void signalOverride(); + void signalOverrideCrash(); + void signalOverrideCrash2(); + void signalOverrideCrash3(); + void parentChange(); + void parentChangeErrors(); + void anchorChanges(); + void anchorChanges2(); + void anchorChanges3(); + void anchorChanges4(); + void anchorChanges5(); + void anchorChangesRTL(); + void anchorChangesRTL2(); + void anchorChangesRTL3(); + void anchorChangesCrash(); + void anchorRewindBug(); + void anchorRewindBug2(); + void script(); + void restoreEntryValues(); + void explicitChanges(); + void propertyErrors(); + void incorrectRestoreBug(); + void autoStateAtStartupRestoreBug(); + void deletingChange(); + void deletingState(); + void tempState(); + void illegalTempState(); + void nonExistantProperty(); + void reset(); + void illegalObjectCreation(); + void whenOrdering(); + void urlResolution(); + void unnamedWhen(); + void returnToBase(); + void extendsBug(); + void editProperties(); + void QTBUG_14830(); +}; + +void tst_qdeclarativestates::initTestCase() +{ + qmlRegisterType("Qt.test", 1, 0, "MyRectangle"); +} + +QByteArray tst_qdeclarativestates::fullDataPath(const QString &path) +{ + return QUrl::fromLocalFile(SRCDIR + path).toString().toUtf8(); +} + +void tst_qdeclarativestates::basicChanges() +{ + QDeclarativeEngine engine; + + { + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/basicChanges.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + QVERIFY(rect != 0); + + QCOMPARE(rect->color(),QColor("red")); + + rectPrivate->setState("blue"); + QCOMPARE(rect->color(),QColor("blue")); + + rectPrivate->setState(""); + QCOMPARE(rect->color(),QColor("red")); + } + + { + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/basicChanges2.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + QVERIFY(rect != 0); + + QCOMPARE(rect->color(),QColor("red")); + + rectPrivate->setState("blue"); + QCOMPARE(rect->color(),QColor("blue")); + + rectPrivate->setState("green"); + QCOMPARE(rect->color(),QColor("green")); + + rectPrivate->setState(""); + QCOMPARE(rect->color(),QColor("red")); + + rectPrivate->setState("green"); + QCOMPARE(rect->color(),QColor("green")); + } + + { + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/basicChanges3.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + QVERIFY(rect != 0); + + QCOMPARE(rect->color(),QColor("red")); + QCOMPARE(rect->border()->width(),1); + + rectPrivate->setState("blue"); + QCOMPARE(rect->color(),QColor("blue")); + QCOMPARE(rect->border()->width(),1); + + rectPrivate->setState("bordered"); + QCOMPARE(rect->color(),QColor("red")); + QCOMPARE(rect->border()->width(),2); + + rectPrivate->setState(""); + QCOMPARE(rect->color(),QColor("red")); + QCOMPARE(rect->border()->width(),1); + //### we should be checking that this is an implicit rather than explicit 1 (which currently fails) + + rectPrivate->setState("bordered"); + QCOMPARE(rect->color(),QColor("red")); + QCOMPARE(rect->border()->width(),2); + + rectPrivate->setState("blue"); + QCOMPARE(rect->color(),QColor("blue")); + QCOMPARE(rect->border()->width(),1); + + } + + { + // Test basicChanges4.qml can magically connect to propertyWithNotify's notify + // signal using 'onPropertyWithNotifyChanged' even though the signal name is + // actually 'oddlyNamedNotifySignal' + + QDeclarativeComponent component(&engine, SRCDIR "/data/basicChanges4.qml"); + QVERIFY(component.isReady()); + + MyRect *rect = qobject_cast(component.create()); + QVERIFY(rect != 0); + + QMetaProperty prop = rect->metaObject()->property(rect->metaObject()->indexOfProperty("propertyWithNotify")); + QVERIFY(prop.hasNotifySignal()); + QString notifySignal = QByteArray(prop.notifySignal().signature()); + QVERIFY(!notifySignal.startsWith("propertyWithNotifyChanged(")); + + QCOMPARE(rect->color(), QColor(Qt::red)); + + rect->setPropertyWithNotify(100); + QCOMPARE(rect->color(), QColor(Qt::blue)); + } +} + +void tst_qdeclarativestates::attachedPropertyChanges() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent component(&engine, SRCDIR "/data/attachedPropertyChanges.qml"); + QVERIFY(component.isReady()); + + QDeclarativeItem *item = qobject_cast(component.create()); + QVERIFY(item != 0); + QCOMPARE(item->width(), 50.0); + + // Ensure attached property has been changed + QObject *attObj = qmlAttachedPropertiesObject(item, false); + QVERIFY(attObj); + + MyAttached *att = qobject_cast(attObj); + QVERIFY(att); + + QCOMPARE(att->foo(), 1); +} + +void tst_qdeclarativestates::basicExtension() +{ + QDeclarativeEngine engine; + + { + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/basicExtension.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + QVERIFY(rect != 0); + + QCOMPARE(rect->color(),QColor("red")); + QCOMPARE(rect->border()->width(),1); + + rectPrivate->setState("blue"); + QCOMPARE(rect->color(),QColor("blue")); + QCOMPARE(rect->border()->width(),1); + + rectPrivate->setState("bordered"); + QCOMPARE(rect->color(),QColor("blue")); + QCOMPARE(rect->border()->width(),2); + + rectPrivate->setState("blue"); + QCOMPARE(rect->color(),QColor("blue")); + QCOMPARE(rect->border()->width(),1); + + rectPrivate->setState(""); + QCOMPARE(rect->color(),QColor("red")); + QCOMPARE(rect->border()->width(),1); + + rectPrivate->setState("bordered"); + QCOMPARE(rect->color(),QColor("blue")); + QCOMPARE(rect->border()->width(),2); + + rectPrivate->setState(""); + QCOMPARE(rect->color(),QColor("red")); + QCOMPARE(rect->border()->width(),1); + } + + { + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/fakeExtension.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + QVERIFY(rect != 0); + + QCOMPARE(rect->color(),QColor("red")); + + rectPrivate->setState("blue"); + QCOMPARE(rect->color(),QColor("blue")); + + rectPrivate->setState("green"); + QCOMPARE(rect->color(),QColor("green")); + + rectPrivate->setState("blue"); + QCOMPARE(rect->color(),QColor("blue")); + + rectPrivate->setState("green"); + QCOMPARE(rect->color(),QColor("green")); + + rectPrivate->setState(""); + QCOMPARE(rect->color(),QColor("red")); + + rectPrivate->setState("green"); + QCOMPARE(rect->color(),QColor("green")); + } +} + +void tst_qdeclarativestates::basicBinding() +{ + QDeclarativeEngine engine; + + { + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/basicBinding.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + QVERIFY(rect != 0); + + QCOMPARE(rect->color(),QColor("red")); + + rectPrivate->setState("blue"); + QCOMPARE(rect->color(),QColor("blue")); + + rectPrivate->setState(""); + QCOMPARE(rect->color(),QColor("red")); + + rectPrivate->setState("blue"); + QCOMPARE(rect->color(),QColor("blue")); + rect->setProperty("sourceColor", QColor("green")); + QCOMPARE(rect->color(),QColor("green")); + + rectPrivate->setState(""); + QCOMPARE(rect->color(),QColor("red")); + rect->setProperty("sourceColor", QColor("yellow")); + QCOMPARE(rect->color(),QColor("red")); + + rectPrivate->setState("blue"); + QCOMPARE(rect->color(),QColor("yellow")); + } + + { + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/basicBinding2.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + QVERIFY(rect != 0); + + QCOMPARE(rect->color(),QColor("red")); + + rectPrivate->setState("blue"); + QCOMPARE(rect->color(),QColor("blue")); + + rectPrivate->setState(""); + QCOMPARE(rect->color(),QColor("red")); + + rectPrivate->setState("blue"); + QCOMPARE(rect->color(),QColor("blue")); + rect->setProperty("sourceColor", QColor("green")); + QCOMPARE(rect->color(),QColor("blue")); + + rectPrivate->setState(""); + QCOMPARE(rect->color(),QColor("green")); + rect->setProperty("sourceColor", QColor("yellow")); + QCOMPARE(rect->color(),QColor("yellow")); + + rectPrivate->setState("blue"); + QCOMPARE(rect->color(),QColor("blue")); + + rectPrivate->setState(""); + QCOMPARE(rect->color(),QColor("yellow")); + } + + { + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/basicBinding3.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + QVERIFY(rect != 0); + + QCOMPARE(rect->color(),QColor("red")); + rect->setProperty("sourceColor", QColor("green")); + QCOMPARE(rect->color(),QColor("green")); + + rectPrivate->setState("blue"); + QCOMPARE(rect->color(),QColor("blue")); + rect->setProperty("sourceColor", QColor("red")); + QCOMPARE(rect->color(),QColor("blue")); + rect->setProperty("sourceColor2", QColor("yellow")); + QCOMPARE(rect->color(),QColor("yellow")); + + rectPrivate->setState(""); + QCOMPARE(rect->color(),QColor("red")); + rect->setProperty("sourceColor2", QColor("green")); + QCOMPARE(rect->color(),QColor("red")); + rect->setProperty("sourceColor", QColor("yellow")); + QCOMPARE(rect->color(),QColor("yellow")); + } + + { + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/basicBinding4.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + QVERIFY(rect != 0); + + QCOMPARE(rect->color(),QColor("red")); + + rectPrivate->setState("blue"); + QCOMPARE(rect->color(),QColor("blue")); + rect->setProperty("sourceColor", QColor("yellow")); + QCOMPARE(rect->color(),QColor("yellow")); + + rectPrivate->setState("green"); + QCOMPARE(rect->color(),QColor("green")); + rect->setProperty("sourceColor", QColor("purple")); + QCOMPARE(rect->color(),QColor("green")); + + rectPrivate->setState("blue"); + QCOMPARE(rect->color(),QColor("purple")); + + rectPrivate->setState("green"); + QCOMPARE(rect->color(),QColor("green")); + + rectPrivate->setState(""); + QCOMPARE(rect->color(),QColor("red")); + } +} + +void tst_qdeclarativestates::signalOverride() +{ + QDeclarativeEngine engine; + + { + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/signalOverride.qml"); + MyRect *rect = qobject_cast(rectComponent.create()); + QVERIFY(rect != 0); + + QCOMPARE(rect->color(),QColor("red")); + rect->doSomething(); + QCOMPARE(rect->color(),QColor("blue")); + + QDeclarativeItemPrivate::get(rect)->setState("green"); + rect->doSomething(); + QCOMPARE(rect->color(),QColor("green")); + } + + { + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/signalOverride2.qml"); + MyRect *rect = qobject_cast(rectComponent.create()); + QVERIFY(rect != 0); + + QCOMPARE(rect->color(),QColor("white")); + rect->doSomething(); + QCOMPARE(rect->color(),QColor("blue")); + + QDeclarativeRectangle *innerRect = qobject_cast(rect->findChild("extendedRect")); + QDeclarativeItemPrivate::get(innerRect)->setState("green"); + rect->doSomething(); + QCOMPARE(rect->color(),QColor("blue")); + QCOMPARE(innerRect->color(),QColor("green")); + QCOMPARE(innerRect->property("extendedColor").value(),QColor("green")); + } +} + +void tst_qdeclarativestates::signalOverrideCrash() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/signalOverrideCrash.qml"); + MyRect *rect = qobject_cast(rectComponent.create()); + QVERIFY(rect != 0); + + QDeclarativeItemPrivate::get(rect)->setState("overridden"); + rect->doSomething(); +} + +void tst_qdeclarativestates::signalOverrideCrash2() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/signalOverrideCrash2.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QVERIFY(rect != 0); + + QDeclarativeItemPrivate::get(rect)->setState("state1"); + QDeclarativeItemPrivate::get(rect)->setState("state2"); + QDeclarativeItemPrivate::get(rect)->setState("state1"); + + delete rect; +} + +void tst_qdeclarativestates::signalOverrideCrash3() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/signalOverrideCrash3.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QVERIFY(rect != 0); + + QDeclarativeItemPrivate::get(rect)->setState("state1"); + QDeclarativeItemPrivate::get(rect)->setState(""); + QDeclarativeItemPrivate::get(rect)->setState("state2"); + QDeclarativeItemPrivate::get(rect)->setState(""); + + delete rect; +} + +void tst_qdeclarativestates::parentChange() +{ + QDeclarativeEngine engine; + + { + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/parentChange1.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QVERIFY(rect != 0); + + QDeclarativeRectangle *innerRect = qobject_cast(rect->findChild("MyRect")); + QVERIFY(innerRect != 0); + + QDeclarativeListReference list(rect, "states"); + QDeclarativeState *state = qobject_cast(list.at(0)); + QVERIFY(state != 0); + + qmlExecuteDeferred(state); + QDeclarativeParentChange *pChange = qobject_cast(state->operationAt(0)); + QVERIFY(pChange != 0); + QDeclarativeItem *nParent = qobject_cast(rect->findChild("NewParent")); + QVERIFY(nParent != 0); + + QCOMPARE(pChange->parent(), nParent); + + QDeclarativeItemPrivate::get(rect)->setState("reparented"); + QCOMPARE(innerRect->rotation(), qreal(0)); + QCOMPARE(innerRect->scale(), qreal(1)); + QCOMPARE(innerRect->x(), qreal(-133)); + QCOMPARE(innerRect->y(), qreal(-300)); + } + + { + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/parentChange2.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QVERIFY(rect != 0); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + QDeclarativeRectangle *innerRect = qobject_cast(rect->findChild("MyRect")); + QVERIFY(innerRect != 0); + + rectPrivate->setState("reparented"); + QCOMPARE(innerRect->rotation(), qreal(15)); + QCOMPARE(innerRect->scale(), qreal(.5)); + QCOMPARE(QString("%1").arg(innerRect->x()), QString("%1").arg(-19.9075)); + QCOMPARE(QString("%1").arg(innerRect->y()), QString("%1").arg(-8.73433)); + } + + { + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/parentChange3.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QVERIFY(rect != 0); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + QDeclarativeRectangle *innerRect = qobject_cast(rect->findChild("MyRect")); + QVERIFY(innerRect != 0); + + rectPrivate->setState("reparented"); + QCOMPARE(innerRect->rotation(), qreal(-37)); + QCOMPARE(innerRect->scale(), qreal(.25)); + QCOMPARE(QString("%1").arg(innerRect->x()), QString("%1").arg(-217.305)); + QCOMPARE(QString("%1").arg(innerRect->y()), QString("%1").arg(-164.413)); + + rectPrivate->setState(""); + QCOMPARE(innerRect->rotation(), qreal(0)); + QCOMPARE(innerRect->scale(), qreal(1)); + QCOMPARE(innerRect->x(), qreal(5)); + //do a non-qFuzzyCompare fuzzy compare + QVERIFY(innerRect->y() < qreal(0.00001) && innerRect->y() > qreal(-0.00001)); + } + + { + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/parentChange6.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QVERIFY(rect != 0); + + QDeclarativeRectangle *innerRect = qobject_cast(rect->findChild("MyRect")); + QVERIFY(innerRect != 0); + + QDeclarativeItemPrivate::get(rect)->setState("reparented"); + QCOMPARE(innerRect->rotation(), qreal(180)); + QCOMPARE(innerRect->scale(), qreal(1)); + QCOMPARE(innerRect->x(), qreal(-105)); + QCOMPARE(innerRect->y(), qreal(-105)); + } +} + +void tst_qdeclarativestates::parentChangeErrors() +{ + QDeclarativeEngine engine; + + { + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/parentChange4.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QVERIFY(rect != 0); + + QDeclarativeRectangle *innerRect = qobject_cast(rect->findChild("MyRect")); + QVERIFY(innerRect != 0); + + QTest::ignoreMessage(QtWarningMsg, fullDataPath("/data/parentChange4.qml") + ":25:9: QML ParentChange: Unable to preserve appearance under non-uniform scale"); + QDeclarativeItemPrivate::get(rect)->setState("reparented"); + QCOMPARE(innerRect->rotation(), qreal(0)); + QCOMPARE(innerRect->scale(), qreal(1)); + QCOMPARE(innerRect->x(), qreal(5)); + QCOMPARE(innerRect->y(), qreal(5)); + } + + { + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/parentChange5.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QVERIFY(rect != 0); + + QDeclarativeRectangle *innerRect = qobject_cast(rect->findChild("MyRect")); + QVERIFY(innerRect != 0); + + QTest::ignoreMessage(QtWarningMsg, fullDataPath("/data/parentChange5.qml") + ":25:9: QML ParentChange: Unable to preserve appearance under complex transform"); + QDeclarativeItemPrivate::get(rect)->setState("reparented"); + QCOMPARE(innerRect->rotation(), qreal(0)); + QCOMPARE(innerRect->scale(), qreal(1)); + QCOMPARE(innerRect->x(), qreal(5)); + QCOMPARE(innerRect->y(), qreal(5)); + } +} + +void tst_qdeclarativestates::anchorChanges() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/anchorChanges1.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QVERIFY(rect != 0); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + + QDeclarativeRectangle *innerRect = qobject_cast(rect->findChild("MyRect")); + QVERIFY(innerRect != 0); + + QDeclarativeListReference list(rect, "states"); + QDeclarativeState *state = qobject_cast(list.at(0)); + QVERIFY(state != 0); + + qmlExecuteDeferred(state); + QDeclarativeAnchorChanges *aChanges = qobject_cast(state->operationAt(0)); + QVERIFY(aChanges != 0); + + rectPrivate->setState("right"); + QCOMPARE(innerRect->x(), qreal(150)); + QCOMPARE(aChanges->object(), qobject_cast(innerRect)); + QCOMPARE(QDeclarativeItemPrivate::get(aChanges->object())->anchors()->left().anchorLine, QDeclarativeAnchorLine::Invalid); //### was reset (how do we distinguish from not set at all) + QCOMPARE(QDeclarativeItemPrivate::get(aChanges->object())->anchors()->right().item, rectPrivate->right().item); + QCOMPARE(QDeclarativeItemPrivate::get(aChanges->object())->anchors()->right().anchorLine, rectPrivate->right().anchorLine); + + rectPrivate->setState(""); + QCOMPARE(innerRect->x(), qreal(5)); + + delete rect; +} + +void tst_qdeclarativestates::anchorChanges2() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/anchorChanges2.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QVERIFY(rect != 0); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + + QDeclarativeRectangle *innerRect = qobject_cast(rect->findChild("MyRect")); + QVERIFY(innerRect != 0); + + rectPrivate->setState("right"); + QCOMPARE(innerRect->x(), qreal(150)); + + rectPrivate->setState(""); + QCOMPARE(innerRect->x(), qreal(5)); + + delete rect; +} + +void tst_qdeclarativestates::anchorChanges3() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/anchorChanges3.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QVERIFY(rect != 0); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + + QDeclarativeRectangle *innerRect = qobject_cast(rect->findChild("MyRect")); + QVERIFY(innerRect != 0); + + QDeclarativeItem *leftGuideline = qobject_cast(rect->findChild("LeftGuideline")); + QVERIFY(leftGuideline != 0); + + QDeclarativeItem *bottomGuideline = qobject_cast(rect->findChild("BottomGuideline")); + QVERIFY(bottomGuideline != 0); + + QDeclarativeListReference list(rect, "states"); + QDeclarativeState *state = qobject_cast(list.at(0)); + QVERIFY(state != 0); + + qmlExecuteDeferred(state); + QDeclarativeAnchorChanges *aChanges = qobject_cast(state->operationAt(0)); + QVERIFY(aChanges != 0); + + rectPrivate->setState("reanchored"); + QCOMPARE(aChanges->object(), qobject_cast(innerRect)); + QCOMPARE(QDeclarativeItemPrivate::get(aChanges->object())->anchors()->left().item, QDeclarativeItemPrivate::get(leftGuideline)->left().item); + QCOMPARE(QDeclarativeItemPrivate::get(aChanges->object())->anchors()->left().anchorLine, QDeclarativeItemPrivate::get(leftGuideline)->left().anchorLine); + QCOMPARE(QDeclarativeItemPrivate::get(aChanges->object())->anchors()->right().item, rectPrivate->right().item); + QCOMPARE(QDeclarativeItemPrivate::get(aChanges->object())->anchors()->right().anchorLine, rectPrivate->right().anchorLine); + QCOMPARE(QDeclarativeItemPrivate::get(aChanges->object())->anchors()->top().item, rectPrivate->top().item); + QCOMPARE(QDeclarativeItemPrivate::get(aChanges->object())->anchors()->top().anchorLine, rectPrivate->top().anchorLine); + QCOMPARE(QDeclarativeItemPrivate::get(aChanges->object())->anchors()->bottom().item, QDeclarativeItemPrivate::get(bottomGuideline)->bottom().item); + QCOMPARE(QDeclarativeItemPrivate::get(aChanges->object())->anchors()->bottom().anchorLine, QDeclarativeItemPrivate::get(bottomGuideline)->bottom().anchorLine); + + QCOMPARE(innerRect->x(), qreal(10)); + QCOMPARE(innerRect->y(), qreal(0)); + QCOMPARE(innerRect->width(), qreal(190)); + QCOMPARE(innerRect->height(), qreal(150)); + + rectPrivate->setState(""); + QCOMPARE(innerRect->x(), qreal(0)); + QCOMPARE(innerRect->y(), qreal(10)); + QCOMPARE(innerRect->width(), qreal(150)); + QCOMPARE(innerRect->height(), qreal(190)); + + delete rect; +} + +void tst_qdeclarativestates::anchorChanges4() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/anchorChanges4.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QVERIFY(rect != 0); + + QDeclarativeRectangle *innerRect = qobject_cast(rect->findChild("MyRect")); + QVERIFY(innerRect != 0); + + QDeclarativeItem *leftGuideline = qobject_cast(rect->findChild("LeftGuideline")); + QVERIFY(leftGuideline != 0); + + QDeclarativeItem *bottomGuideline = qobject_cast(rect->findChild("BottomGuideline")); + QVERIFY(bottomGuideline != 0); + + QDeclarativeListReference list(rect, "states"); + QDeclarativeState *state = qobject_cast(list.at(0)); + QVERIFY(state != 0); + + qmlExecuteDeferred(state); + QDeclarativeAnchorChanges *aChanges = qobject_cast(state->operationAt(0)); + QVERIFY(aChanges != 0); + + QDeclarativeItemPrivate::get(rect)->setState("reanchored"); + QCOMPARE(aChanges->object(), qobject_cast(innerRect)); + QCOMPARE(QDeclarativeItemPrivate::get(aChanges->object())->anchors()->horizontalCenter().item, QDeclarativeItemPrivate::get(bottomGuideline)->horizontalCenter().item); + QCOMPARE(QDeclarativeItemPrivate::get(aChanges->object())->anchors()->horizontalCenter().anchorLine, QDeclarativeItemPrivate::get(bottomGuideline)->horizontalCenter().anchorLine); + QCOMPARE(QDeclarativeItemPrivate::get(aChanges->object())->anchors()->verticalCenter().item, QDeclarativeItemPrivate::get(leftGuideline)->verticalCenter().item); + QCOMPARE(QDeclarativeItemPrivate::get(aChanges->object())->anchors()->verticalCenter().anchorLine, QDeclarativeItemPrivate::get(leftGuideline)->verticalCenter().anchorLine); + + delete rect; +} + +void tst_qdeclarativestates::anchorChanges5() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/anchorChanges5.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QVERIFY(rect != 0); + + QDeclarativeRectangle *innerRect = qobject_cast(rect->findChild("MyRect")); + QVERIFY(innerRect != 0); + + QDeclarativeItem *leftGuideline = qobject_cast(rect->findChild("LeftGuideline")); + QVERIFY(leftGuideline != 0); + + QDeclarativeItem *bottomGuideline = qobject_cast(rect->findChild("BottomGuideline")); + QVERIFY(bottomGuideline != 0); + + QDeclarativeListReference list(rect, "states"); + QDeclarativeState *state = qobject_cast(list.at(0)); + QVERIFY(state != 0); + + qmlExecuteDeferred(state); + QDeclarativeAnchorChanges *aChanges = qobject_cast(state->operationAt(0)); + QVERIFY(aChanges != 0); + + QDeclarativeItemPrivate::get(rect)->setState("reanchored"); + QCOMPARE(aChanges->object(), qobject_cast(innerRect)); + //QCOMPARE(aChanges->anchors()->horizontalCenter().item, bottomGuideline->horizontalCenter().item); + //QCOMPARE(aChanges->anchors()->horizontalCenter().anchorLine, bottomGuideline->horizontalCenter().anchorLine); + //QCOMPARE(aChanges->anchors()->baseline().item, leftGuideline->baseline().item); + //QCOMPARE(aChanges->anchors()->baseline().anchorLine, leftGuideline->baseline().anchorLine); + + delete rect; +} + +void mirrorAnchors(QDeclarativeItem *item) { + QDeclarativeItemPrivate *itemPrivate = QDeclarativeItemPrivate::get(item); + itemPrivate->setLayoutMirror(true); +} + +qreal offsetRTL(QDeclarativeItem *anchorItem, QDeclarativeItem *item) { + return anchorItem->width()+2*anchorItem->x()-item->width(); +} + +void tst_qdeclarativestates::anchorChangesRTL() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/anchorChanges1.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QVERIFY(rect != 0); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + + QDeclarativeRectangle *innerRect = qobject_cast(rect->findChild("MyRect")); + QVERIFY(innerRect != 0); + mirrorAnchors(innerRect); + + QDeclarativeListReference list(rect, "states"); + QDeclarativeState *state = qobject_cast(list.at(0)); + QVERIFY(state != 0); + + qmlExecuteDeferred(state); + QDeclarativeAnchorChanges *aChanges = qobject_cast(state->operationAt(0)); + QVERIFY(aChanges != 0); + + rectPrivate->setState("right"); + QCOMPARE(innerRect->x(), offsetRTL(rect, innerRect) - qreal(150)); + QCOMPARE(aChanges->object(), qobject_cast(innerRect)); + QCOMPARE(QDeclarativeItemPrivate::get(aChanges->object())->anchors()->left().anchorLine, QDeclarativeAnchorLine::Invalid); //### was reset (how do we distinguish from not set at all) + QCOMPARE(QDeclarativeItemPrivate::get(aChanges->object())->anchors()->right().item, rectPrivate->right().item); + QCOMPARE(QDeclarativeItemPrivate::get(aChanges->object())->anchors()->right().anchorLine, rectPrivate->right().anchorLine); + + rectPrivate->setState(""); + QCOMPARE(innerRect->x(), offsetRTL(rect, innerRect) -qreal(5)); + + delete rect; +} + +void tst_qdeclarativestates::anchorChangesRTL2() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/anchorChanges2.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QVERIFY(rect != 0); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + + QDeclarativeRectangle *innerRect = qobject_cast(rect->findChild("MyRect")); + QVERIFY(innerRect != 0); + mirrorAnchors(innerRect); + + rectPrivate->setState("right"); + QCOMPARE(innerRect->x(), offsetRTL(rect, innerRect) - qreal(150)); + + rectPrivate->setState(""); + QCOMPARE(innerRect->x(), offsetRTL(rect, innerRect) - qreal(5)); + + delete rect; +} + +void tst_qdeclarativestates::anchorChangesRTL3() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/anchorChanges3.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QVERIFY(rect != 0); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + + QDeclarativeRectangle *innerRect = qobject_cast(rect->findChild("MyRect")); + QVERIFY(innerRect != 0); + mirrorAnchors(innerRect); + + QDeclarativeItem *leftGuideline = qobject_cast(rect->findChild("LeftGuideline")); + QVERIFY(leftGuideline != 0); + + QDeclarativeItem *bottomGuideline = qobject_cast(rect->findChild("BottomGuideline")); + QVERIFY(bottomGuideline != 0); + + QDeclarativeListReference list(rect, "states"); + QDeclarativeState *state = qobject_cast(list.at(0)); + QVERIFY(state != 0); + + qmlExecuteDeferred(state); + QDeclarativeAnchorChanges *aChanges = qobject_cast(state->operationAt(0)); + QVERIFY(aChanges != 0); + + rectPrivate->setState("reanchored"); + QCOMPARE(aChanges->object(), qobject_cast(innerRect)); + QCOMPARE(QDeclarativeItemPrivate::get(aChanges->object())->anchors()->left().item, QDeclarativeItemPrivate::get(leftGuideline)->left().item); + QCOMPARE(QDeclarativeItemPrivate::get(aChanges->object())->anchors()->left().anchorLine, QDeclarativeItemPrivate::get(leftGuideline)->left().anchorLine); + QCOMPARE(QDeclarativeItemPrivate::get(aChanges->object())->anchors()->right().item, rectPrivate->right().item); + QCOMPARE(QDeclarativeItemPrivate::get(aChanges->object())->anchors()->right().anchorLine, rectPrivate->right().anchorLine); + QCOMPARE(QDeclarativeItemPrivate::get(aChanges->object())->anchors()->top().item, rectPrivate->top().item); + QCOMPARE(QDeclarativeItemPrivate::get(aChanges->object())->anchors()->top().anchorLine, rectPrivate->top().anchorLine); + QCOMPARE(QDeclarativeItemPrivate::get(aChanges->object())->anchors()->bottom().item, QDeclarativeItemPrivate::get(bottomGuideline)->bottom().item); + QCOMPARE(QDeclarativeItemPrivate::get(aChanges->object())->anchors()->bottom().anchorLine, QDeclarativeItemPrivate::get(bottomGuideline)->bottom().anchorLine); + + QCOMPARE(innerRect->x(), offsetRTL(leftGuideline, innerRect) - qreal(10)); + QCOMPARE(innerRect->y(), qreal(0)); + // between left side of parent and leftGuideline.x: 10, which has width 0 + QCOMPARE(innerRect->width(), qreal(10)); + QCOMPARE(innerRect->height(), qreal(150)); + + rectPrivate->setState(""); + QCOMPARE(innerRect->x(), offsetRTL(rect, innerRect) - qreal(0)); + QCOMPARE(innerRect->y(), qreal(10)); + // between right side of parent and left side of rightGuideline.x: 150, which has width 0 + QCOMPARE(innerRect->width(), qreal(50)); + QCOMPARE(innerRect->height(), qreal(190)); + + delete rect; +} + +//QTBUG-9609 +void tst_qdeclarativestates::anchorChangesCrash() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/anchorChangesCrash.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QVERIFY(rect != 0); + + QDeclarativeItemPrivate::get(rect)->setState("reanchored"); + + delete rect; +} + +// QTBUG-12273 +void tst_qdeclarativestates::anchorRewindBug() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/anchorRewindBug.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QVERIFY(rect != 0); + + QDeclarativeItem * column = rect->findChild("column"); + + QVERIFY(column != 0); + QVERIFY(!QDeclarativeItemPrivate::get(column)->heightValid); + QVERIFY(!QDeclarativeItemPrivate::get(column)->widthValid); + QCOMPARE(column->height(), 200.0); + QDeclarativeItemPrivate::get(rect)->setState("reanchored"); + + // column height and width should stay implicit + // and column's implicit resizing should still work + QVERIFY(!QDeclarativeItemPrivate::get(column)->heightValid); + QVERIFY(!QDeclarativeItemPrivate::get(column)->widthValid); + QCOMPARE(column->height(), 100.0); + + QDeclarativeItemPrivate::get(rect)->setState(""); + + // column height and width should stay implicit + // and column's implicit resizing should still work + QVERIFY(!QDeclarativeItemPrivate::get(column)->heightValid); + QVERIFY(!QDeclarativeItemPrivate::get(column)->widthValid); + QCOMPARE(column->height(), 200.0); + + delete rect; +} + +// QTBUG-11834 +void tst_qdeclarativestates::anchorRewindBug2() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/anchorRewindBug2.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QVERIFY(rect != 0); + + QDeclarativeRectangle *mover = rect->findChild("mover"); + + QVERIFY(mover != 0); + QCOMPARE(mover->y(), qreal(0.0)); + QCOMPARE(mover->width(), qreal(50.0)); + + QDeclarativeItemPrivate::get(rect)->setState("anchored"); + QCOMPARE(mover->y(), qreal(250.0)); + QCOMPARE(mover->width(), qreal(200.0)); + + QDeclarativeItemPrivate::get(rect)->setState(""); + QCOMPARE(mover->y(), qreal(0.0)); + QCOMPARE(mover->width(), qreal(50.0)); + + delete rect; +} + +void tst_qdeclarativestates::script() +{ + QDeclarativeEngine engine; + + { + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/script.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QVERIFY(rect != 0); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + QCOMPARE(rect->color(),QColor("red")); + + rectPrivate->setState("blue"); + QCOMPARE(rect->color(),QColor("blue")); + + rectPrivate->setState(""); + QCOMPARE(rect->color(),QColor("blue")); // a script isn't reverted + } +} + +void tst_qdeclarativestates::restoreEntryValues() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/restoreEntryValues.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QVERIFY(rect != 0); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + QCOMPARE(rect->color(),QColor("red")); + + rectPrivate->setState("blue"); + QCOMPARE(rect->color(),QColor("blue")); + + rectPrivate->setState(""); + QCOMPARE(rect->color(),QColor("blue")); +} + +void tst_qdeclarativestates::explicitChanges() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/explicit.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QVERIFY(rect != 0); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + QDeclarativeListReference list(rect, "states"); + QDeclarativeState *state = qobject_cast(list.at(0)); + QVERIFY(state != 0); + + qmlExecuteDeferred(state); + QDeclarativePropertyChanges *changes = qobject_cast(rect->findChild("changes")); + QVERIFY(changes != 0); + QVERIFY(changes->isExplicit()); + + QCOMPARE(rect->color(),QColor("red")); + + rectPrivate->setState("blue"); + QCOMPARE(rect->color(),QColor("blue")); + + rect->setProperty("sourceColor", QColor("green")); + QCOMPARE(rect->color(),QColor("blue")); + + rectPrivate->setState(""); + QCOMPARE(rect->color(),QColor("red")); + rect->setProperty("sourceColor", QColor("yellow")); + QCOMPARE(rect->color(),QColor("red")); + + rectPrivate->setState("blue"); + QCOMPARE(rect->color(),QColor("yellow")); +} + +void tst_qdeclarativestates::propertyErrors() +{ + QDeclarativeEngine engine; + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/propertyErrors.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QVERIFY(rect != 0); + + QCOMPARE(rect->color(),QColor("red")); + + QTest::ignoreMessage(QtWarningMsg, fullDataPath("/data/propertyErrors.qml") + ":8:9: QML PropertyChanges: Cannot assign to non-existent property \"colr\""); + QTest::ignoreMessage(QtWarningMsg, fullDataPath("/data/propertyErrors.qml") + ":8:9: QML PropertyChanges: Cannot assign to read-only property \"activeFocus\""); + QDeclarativeItemPrivate::get(rect)->setState("blue"); +} + +void tst_qdeclarativestates::incorrectRestoreBug() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/basicChanges.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QVERIFY(rect != 0); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + QCOMPARE(rect->color(),QColor("red")); + + rectPrivate->setState("blue"); + QCOMPARE(rect->color(),QColor("blue")); + + rectPrivate->setState(""); + QCOMPARE(rect->color(),QColor("red")); + + // make sure if we change the base state value, we then restore to it correctly + rect->setColor(QColor("green")); + + rectPrivate->setState("blue"); + QCOMPARE(rect->color(),QColor("blue")); + + rectPrivate->setState(""); + QCOMPARE(rect->color(),QColor("green")); +} + +void tst_qdeclarativestates::autoStateAtStartupRestoreBug() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent component(&engine, SRCDIR "/data/autoStateAtStartupRestoreBug.qml"); + QObject *obj = component.create(); + + QVERIFY(obj != 0); + QCOMPARE(obj->property("test").toInt(), 3); + + obj->setProperty("input", 2); + + QCOMPARE(obj->property("test").toInt(), 9); + + delete obj; +} + +void tst_qdeclarativestates::deletingChange() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/deleting.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QVERIFY(rect != 0); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + rectPrivate->setState("blue"); + QCOMPARE(rect->color(),QColor("blue")); + QCOMPARE(rect->radius(),qreal(5)); + + rectPrivate->setState(""); + QCOMPARE(rect->color(),QColor("red")); + QCOMPARE(rect->radius(),qreal(0)); + + QDeclarativePropertyChanges *pc = rect->findChild("pc1"); + QVERIFY(pc != 0); + delete pc; + + QDeclarativeState *state = rect->findChild(); + QVERIFY(state != 0); + qmlExecuteDeferred(state); + QCOMPARE(state->operationCount(), 1); + + rectPrivate->setState("blue"); + QCOMPARE(rect->color(),QColor("red")); + QCOMPARE(rect->radius(),qreal(5)); + + delete rect; +} + +void tst_qdeclarativestates::deletingState() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/deletingState.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QVERIFY(rect != 0); + + QDeclarativeStateGroup *sg = rect->findChild(); + QVERIFY(sg != 0); + QVERIFY(sg->findState("blue") != 0); + + sg->setState("blue"); + QCOMPARE(rect->color(),QColor("blue")); + + sg->setState(""); + QCOMPARE(rect->color(),QColor("red")); + + QDeclarativeState *state = rect->findChild(); + QVERIFY(state != 0); + delete state; + + QVERIFY(sg->findState("blue") == 0); + + //### should we warn that state doesn't exist + sg->setState("blue"); + QCOMPARE(rect->color(),QColor("red")); + + delete rect; +} + +void tst_qdeclarativestates::tempState() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/legalTempState.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QVERIFY(rect != 0); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + QTest::ignoreMessage(QtDebugMsg, "entering placed"); + QTest::ignoreMessage(QtDebugMsg, "entering idle"); + rectPrivate->setState("placed"); + QCOMPARE(rectPrivate->state(), QLatin1String("idle")); +} + +void tst_qdeclarativestates::illegalTempState() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/illegalTempState.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QVERIFY(rect != 0); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + QTest::ignoreMessage(QtWarningMsg, ": QML StateGroup: Can't apply a state change as part of a state definition."); + rectPrivate->setState("placed"); + QCOMPARE(rectPrivate->state(), QLatin1String("placed")); +} + +void tst_qdeclarativestates::nonExistantProperty() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent rectComponent(&engine, SRCDIR "/data/nonExistantProp.qml"); + QDeclarativeRectangle *rect = qobject_cast(rectComponent.create()); + QVERIFY(rect != 0); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + QTest::ignoreMessage(QtWarningMsg, fullDataPath("/data/nonExistantProp.qml") + ":9:9: QML PropertyChanges: Cannot assign to non-existent property \"colr\""); + rectPrivate->setState("blue"); + QCOMPARE(rectPrivate->state(), QLatin1String("blue")); +} + +void tst_qdeclarativestates::reset() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent c(&engine, SRCDIR "/data/reset.qml"); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect != 0); + + QDeclarativeImage *image = rect->findChild(); + QVERIFY(image != 0); + QCOMPARE(image->width(), qreal(40.)); + QCOMPARE(image->height(), qreal(20.)); + + QDeclarativeItemPrivate::get(rect)->setState("state1"); + + QCOMPARE(image->width(), 20.0); + QCOMPARE(image->height(), qreal(20.)); +} + +void tst_qdeclarativestates::illegalObjectCreation() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent component(&engine, SRCDIR "/data/illegalObj.qml"); + QList errors = component.errors(); + QVERIFY(errors.count() == 1); + const QDeclarativeError &error = errors.at(0); + QCOMPARE(error.line(), 9); + QCOMPARE(error.column(), 23); + QCOMPARE(error.description().toUtf8().constData(), "PropertyChanges does not support creating state-specific objects."); +} + +void tst_qdeclarativestates::whenOrdering() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent c(&engine, SRCDIR "/data/whenOrdering.qml"); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect != 0); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + + QCOMPARE(rectPrivate->state(), QLatin1String("")); + rect->setProperty("condition2", true); + QCOMPARE(rectPrivate->state(), QLatin1String("state2")); + rect->setProperty("condition1", true); + QCOMPARE(rectPrivate->state(), QLatin1String("state1")); + rect->setProperty("condition2", false); + QCOMPARE(rectPrivate->state(), QLatin1String("state1")); + rect->setProperty("condition2", true); + QCOMPARE(rectPrivate->state(), QLatin1String("state1")); + rect->setProperty("condition1", false); + rect->setProperty("condition2", false); + QCOMPARE(rectPrivate->state(), QLatin1String("")); +} + +void tst_qdeclarativestates::urlResolution() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent c(&engine, SRCDIR "/data/urlResolution.qml"); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect != 0); + + QDeclarativeItem *myType = rect->findChild("MyType"); + QDeclarativeImage *image1 = rect->findChild("image1"); + QDeclarativeImage *image2 = rect->findChild("image2"); + QDeclarativeImage *image3 = rect->findChild("image3"); + QVERIFY(myType != 0 && image1 != 0 && image2 != 0 && image3 != 0); + + QDeclarativeItemPrivate::get(myType)->setState("SetImageState"); + QUrl resolved = QUrl::fromLocalFile(SRCDIR "/data/Implementation/images/qt-logo.png"); + QCOMPARE(image1->source(), resolved); + QCOMPARE(image2->source(), resolved); + QCOMPARE(image3->source(), resolved); +} + +void tst_qdeclarativestates::unnamedWhen() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent c(&engine, SRCDIR "/data/unnamedWhen.qml"); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect != 0); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + + QCOMPARE(rectPrivate->state(), QLatin1String("")); + QCOMPARE(rect->property("stateString").toString(), QLatin1String("")); + rect->setProperty("triggerState", true); + QCOMPARE(rectPrivate->state(), QLatin1String("anonymousState1")); + QCOMPARE(rect->property("stateString").toString(), QLatin1String("inState")); + rect->setProperty("triggerState", false); + QCOMPARE(rectPrivate->state(), QLatin1String("")); + QCOMPARE(rect->property("stateString").toString(), QLatin1String("")); +} + +void tst_qdeclarativestates::returnToBase() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent c(&engine, SRCDIR "/data/returnToBase.qml"); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect != 0); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + + QCOMPARE(rectPrivate->state(), QLatin1String("")); + QCOMPARE(rect->property("stateString").toString(), QLatin1String("")); + rect->setProperty("triggerState", true); + QCOMPARE(rectPrivate->state(), QLatin1String("anonymousState1")); + QCOMPARE(rect->property("stateString").toString(), QLatin1String("inState")); + rect->setProperty("triggerState", false); + QCOMPARE(rectPrivate->state(), QLatin1String("")); + QCOMPARE(rect->property("stateString").toString(), QLatin1String("originalState")); +} + +//QTBUG-12559 +void tst_qdeclarativestates::extendsBug() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent c(&engine, SRCDIR "/data/extendsBug.qml"); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect != 0); + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + QDeclarativeRectangle *greenRect = rect->findChild("greenRect"); + + rectPrivate->setState("b"); + QCOMPARE(greenRect->x(), qreal(100)); + QCOMPARE(greenRect->y(), qreal(100)); +} + +void tst_qdeclarativestates::editProperties() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent c(&engine, SRCDIR "/data/editProperties.qml"); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect != 0); + + QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect); + + QDeclarativeStateGroup *stateGroup = rectPrivate->_states(); + QVERIFY(stateGroup != 0); + qmlExecuteDeferred(stateGroup); + + QDeclarativeState *blueState = stateGroup->findState("blue"); + QVERIFY(blueState != 0); + qmlExecuteDeferred(blueState); + + QDeclarativePropertyChanges *propertyChangesBlue = qobject_cast(blueState->operationAt(0)); + QVERIFY(propertyChangesBlue != 0); + + QDeclarativeState *greenState = stateGroup->findState("green"); + QVERIFY(greenState != 0); + qmlExecuteDeferred(greenState); + + QDeclarativePropertyChanges *propertyChangesGreen = qobject_cast(greenState->operationAt(0)); + QVERIFY(propertyChangesGreen != 0); + + QDeclarativeRectangle *childRect = rect->findChild("rect2"); + QVERIFY(childRect != 0); + QCOMPARE(childRect->width(), qreal(402)); + QVERIFY(QDeclarativePropertyPrivate::binding(QDeclarativeProperty(childRect, "width"))); + QCOMPARE(childRect->height(), qreal(200)); + + rectPrivate->setState("blue"); + QCOMPARE(childRect->width(), qreal(50)); + QCOMPARE(childRect->height(), qreal(40)); + QVERIFY(!QDeclarativePropertyPrivate::binding(QDeclarativeProperty(childRect, "width"))); + QVERIFY(blueState->bindingInRevertList(childRect, "width")); + + + rectPrivate->setState("green"); + QCOMPARE(childRect->width(), qreal(200)); + QCOMPARE(childRect->height(), qreal(100)); + QVERIFY(greenState->bindingInRevertList(childRect, "width")); + + + rectPrivate->setState(""); + + + QCOMPARE(propertyChangesBlue->actions().length(), 2); + QVERIFY(propertyChangesBlue->containsValue("width")); + QVERIFY(!propertyChangesBlue->containsProperty("x")); + QCOMPARE(propertyChangesBlue->value("width").toInt(), 50); + QVERIFY(!propertyChangesBlue->value("x").isValid()); + + propertyChangesBlue->changeValue("width", 60); + QCOMPARE(propertyChangesBlue->value("width").toInt(), 60); + QCOMPARE(propertyChangesBlue->actions().length(), 2); + + + propertyChangesBlue->changeExpression("width", "myRectangle.width / 2"); + QVERIFY(!propertyChangesBlue->containsValue("width")); + QVERIFY(propertyChangesBlue->containsExpression("width")); + QCOMPARE(propertyChangesBlue->value("width").toInt(), 0); + QCOMPARE(propertyChangesBlue->actions().length(), 2); + + propertyChangesBlue->changeValue("width", 50); + QVERIFY(propertyChangesBlue->containsValue("width")); + QVERIFY(!propertyChangesBlue->containsExpression("width")); + QCOMPARE(propertyChangesBlue->value("width").toInt(), 50); + QCOMPARE(propertyChangesBlue->actions().length(), 2); + + QVERIFY(QDeclarativePropertyPrivate::binding(QDeclarativeProperty(childRect, "width"))); + rectPrivate->setState("blue"); + QCOMPARE(childRect->width(), qreal(50)); + QCOMPARE(childRect->height(), qreal(40)); + + propertyChangesBlue->changeValue("width", 60); + QCOMPARE(propertyChangesBlue->value("width").toInt(), 60); + QCOMPARE(propertyChangesBlue->actions().length(), 2); + QCOMPARE(childRect->width(), qreal(60)); + QVERIFY(!QDeclarativePropertyPrivate::binding(QDeclarativeProperty(childRect, "width"))); + + propertyChangesBlue->changeExpression("width", "myRectangle.width / 2"); + QVERIFY(!propertyChangesBlue->containsValue("width")); + QVERIFY(propertyChangesBlue->containsExpression("width")); + QCOMPARE(propertyChangesBlue->value("width").toInt(), 0); + QCOMPARE(propertyChangesBlue->actions().length(), 2); + QVERIFY(QDeclarativePropertyPrivate::binding(QDeclarativeProperty(childRect, "width"))); + QCOMPARE(childRect->width(), qreal(200)); + + propertyChangesBlue->changeValue("width", 50); + QCOMPARE(childRect->width(), qreal(50)); + + rectPrivate->setState(""); + QCOMPARE(childRect->width(), qreal(402)); + QVERIFY(QDeclarativePropertyPrivate::binding(QDeclarativeProperty(childRect, "width"))); + + QCOMPARE(propertyChangesGreen->actions().length(), 2); + rectPrivate->setState("green"); + QCOMPARE(childRect->width(), qreal(200)); + QCOMPARE(childRect->height(), qreal(100)); + QVERIFY(QDeclarativePropertyPrivate::binding(QDeclarativeProperty(childRect, "width"))); + QVERIFY(greenState->bindingInRevertList(childRect, "width")); + QCOMPARE(propertyChangesGreen->actions().length(), 2); + + + propertyChangesGreen->removeProperty("height"); + QVERIFY(!QDeclarativePropertyPrivate::binding(QDeclarativeProperty(childRect, "height"))); + QCOMPARE(childRect->height(), qreal(200)); + + QVERIFY(greenState->bindingInRevertList(childRect, "width")); + QVERIFY(greenState->containsPropertyInRevertList(childRect, "width")); + propertyChangesGreen->removeProperty("width"); + QVERIFY(QDeclarativePropertyPrivate::binding(QDeclarativeProperty(childRect, "width"))); + QCOMPARE(childRect->width(), qreal(402)); + QVERIFY(!greenState->bindingInRevertList(childRect, "width")); + QVERIFY(!greenState->containsPropertyInRevertList(childRect, "width")); + + propertyChangesBlue->removeProperty("width"); + QCOMPARE(childRect->width(), qreal(402)); + + rectPrivate->setState("blue"); + QCOMPARE(childRect->width(), qreal(402)); + QCOMPARE(childRect->height(), qreal(40)); +} + +void tst_qdeclarativestates::QTBUG_14830() +{ + QDeclarativeEngine engine; + + QDeclarativeComponent c(&engine, SRCDIR "/data/QTBUG-14830.qml"); + QDeclarativeRectangle *rect = qobject_cast(c.create()); + QVERIFY(rect != 0); + QDeclarativeItem *item = rect->findChild("area"); + + QCOMPARE(item->width(), qreal(171)); +} + +QTEST_MAIN(tst_qdeclarativestates) + +#include "tst_qdeclarativestates.moc" diff --git a/tests/auto/declarative/qdeclarativestyledtext/qdeclarativestyledtext.pro b/tests/auto/declarative/qdeclarativestyledtext/qdeclarativestyledtext.pro new file mode 100644 index 00000000..87d0e5b5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestyledtext/qdeclarativestyledtext.pro @@ -0,0 +1,11 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +QT += network +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativestyledtext.cpp + +# QMAKE_CXXFLAGS = -fprofile-arcs -ftest-coverage +# LIBS += -lgcov + +CONFIG += parallel_test diff --git a/tests/auto/declarative/qdeclarativestyledtext/tst_qdeclarativestyledtext.cpp b/tests/auto/declarative/qdeclarativestyledtext/tst_qdeclarativestyledtext.cpp new file mode 100644 index 00000000..2b065987 --- /dev/null +++ b/tests/auto/declarative/qdeclarativestyledtext/tst_qdeclarativestyledtext.cpp @@ -0,0 +1,101 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include + +class tst_qdeclarativestyledtext : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativestyledtext() + { + } + +private slots: + void textOutput(); + void textOutput_data(); +}; + +// For malformed input all we test is that we get the expected text out. +// +void tst_qdeclarativestyledtext::textOutput_data() +{ + QTest::addColumn("input"); + QTest::addColumn("output"); + + QTest::newRow("bold") << "bold" << "bold"; + QTest::newRow("italic") << "italic" << "italic"; + QTest::newRow("missing >") << "text") << "text") << "text<" << "text"; + QTest::newRow("missing ") << "text" << "text"; + QTest::newRow("bad nest") << "text italic" << "text italic"; + QTest::newRow("font color") << "red text" << "red text"; + QTest::newRow("font color: single quote") << "red text" << "red text"; + QTest::newRow("font size") << "text" << "text"; + QTest::newRow("font empty") << "text" << "text"; + QTest::newRow("font bad 1") << "text" << "text"; + QTest::newRow("font bad 2") << "text" << ""; + QTest::newRow("extra close") << "text" << "text"; + QTest::newRow("extra space") << "text" << "text"; + QTest::newRow("entities") << "<b>this & that</b>" << "this & that"; + QTest::newRow("newline") << "text
more text" << QLatin1String("text") + QChar(QChar::LineSeparator) + QLatin1String("more text") ; + QTest::newRow("self-closing newline") << "text
more text" << QLatin1String("text") + QChar(QChar::LineSeparator) + QLatin1String("more text") ; + QTest::newRow("empty") << "" << ""; +} + +void tst_qdeclarativestyledtext::textOutput() +{ + QFETCH(QString, input); + QFETCH(QString, output); + + QTextLayout layout; + QDeclarativeStyledText::parse(input, layout); + + QCOMPARE(layout.text(), output); +} + + +QTEST_MAIN(tst_qdeclarativestyledtext) + +#include "tst_qdeclarativestyledtext.moc" diff --git a/tests/auto/declarative/qdeclarativesystempalette/qdeclarativesystempalette.pro b/tests/auto/declarative/qdeclarativesystempalette/qdeclarativesystempalette.pro new file mode 100644 index 00000000..00626884 --- /dev/null +++ b/tests/auto/declarative/qdeclarativesystempalette/qdeclarativesystempalette.pro @@ -0,0 +1,12 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative gui +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativesystempalette.cpp + +!symbian: { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativesystempalette/tst_qdeclarativesystempalette.cpp b/tests/auto/declarative/qdeclarativesystempalette/tst_qdeclarativesystempalette.cpp new file mode 100644 index 00000000..99490c22 --- /dev/null +++ b/tests/auto/declarative/qdeclarativesystempalette/tst_qdeclarativesystempalette.cpp @@ -0,0 +1,192 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include "../../../shared/util.h" + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_qdeclarativesystempalette : public QObject + +{ + Q_OBJECT +public: + tst_qdeclarativesystempalette(); + +private slots: + void activePalette(); + void inactivePalette(); + void disabledPalette(); + void paletteChanged(); + +private: + QDeclarativeEngine engine; +}; + +tst_qdeclarativesystempalette::tst_qdeclarativesystempalette() +{ +} + +void tst_qdeclarativesystempalette::activePalette() +{ + QString componentStr = "import QtQuick 1.0\nSystemPalette { }"; + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeSystemPalette *object = qobject_cast(component.create()); + + QVERIFY(object != 0); + + QPalette palette; + palette.setCurrentColorGroup(QPalette::Active); + QCOMPARE(palette.window().color(), object->window()); + QCOMPARE(palette.windowText().color(), object->windowText()); + QCOMPARE(palette.base().color(), object->base()); + QCOMPARE(palette.text().color(), object->text()); + QCOMPARE(palette.alternateBase().color(), object->alternateBase()); + QCOMPARE(palette.button().color(), object->button()); + QCOMPARE(palette.buttonText().color(), object->buttonText()); + QCOMPARE(palette.light().color(), object->light()); + QCOMPARE(palette.midlight().color(), object->midlight()); + QCOMPARE(palette.dark().color(), object->dark()); + QCOMPARE(palette.mid().color(), object->mid()); + QCOMPARE(palette.shadow().color(), object->shadow()); + QCOMPARE(palette.highlight().color(), object->highlight()); + QCOMPARE(palette.highlightedText().color(), object->highlightedText()); + + delete object; +} + +void tst_qdeclarativesystempalette::inactivePalette() +{ + QString componentStr = "import QtQuick 1.0\nSystemPalette { colorGroup: SystemPalette.Inactive }"; + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeSystemPalette *object = qobject_cast(component.create()); + + QVERIFY(object != 0); + QVERIFY(object->colorGroup() == QDeclarativeSystemPalette::Inactive); + + QPalette palette; + palette.setCurrentColorGroup(QPalette::Inactive); + QCOMPARE(palette.window().color(), object->window()); + QCOMPARE(palette.windowText().color(), object->windowText()); + QCOMPARE(palette.base().color(), object->base()); + QCOMPARE(palette.text().color(), object->text()); + QCOMPARE(palette.alternateBase().color(), object->alternateBase()); + QCOMPARE(palette.button().color(), object->button()); + QCOMPARE(palette.buttonText().color(), object->buttonText()); + QCOMPARE(palette.light().color(), object->light()); + QCOMPARE(palette.midlight().color(), object->midlight()); + QCOMPARE(palette.dark().color(), object->dark()); + QCOMPARE(palette.mid().color(), object->mid()); + QCOMPARE(palette.shadow().color(), object->shadow()); + QCOMPARE(palette.highlight().color(), object->highlight()); + QCOMPARE(palette.highlightedText().color(), object->highlightedText()); + + delete object; +} + +void tst_qdeclarativesystempalette::disabledPalette() +{ + QString componentStr = "import QtQuick 1.0\nSystemPalette { colorGroup: SystemPalette.Disabled }"; + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeSystemPalette *object = qobject_cast(component.create()); + + QVERIFY(object != 0); + QVERIFY(object->colorGroup() == QDeclarativeSystemPalette::Disabled); + + QPalette palette; + palette.setCurrentColorGroup(QPalette::Disabled); + QCOMPARE(palette.window().color(), object->window()); + QCOMPARE(palette.windowText().color(), object->windowText()); + QCOMPARE(palette.base().color(), object->base()); + QCOMPARE(palette.text().color(), object->text()); + QCOMPARE(palette.alternateBase().color(), object->alternateBase()); + QCOMPARE(palette.button().color(), object->button()); + QCOMPARE(palette.buttonText().color(), object->buttonText()); + QCOMPARE(palette.light().color(), object->light()); + QCOMPARE(palette.midlight().color(), object->midlight()); + QCOMPARE(palette.dark().color(), object->dark()); + QCOMPARE(palette.mid().color(), object->mid()); + QCOMPARE(palette.shadow().color(), object->shadow()); + QCOMPARE(palette.highlight().color(), object->highlight()); + QCOMPARE(palette.highlightedText().color(), object->highlightedText()); + + delete object; +} + +void tst_qdeclarativesystempalette::paletteChanged() +{ + QString componentStr = "import QtQuick 1.0\nSystemPalette { }"; + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeSystemPalette *object = qobject_cast(component.create()); + + QVERIFY(object != 0); + + QPalette p; + p.setCurrentColorGroup(QPalette::Active); + p.setColor(QPalette::Active, QPalette::Text, QColor("red")); + p.setColor(QPalette::Active, QPalette::ButtonText, QColor("green")); + p.setColor(QPalette::Active, QPalette::WindowText, QColor("blue")); + + qApp->setPalette(p); + + object->setColorGroup(QDeclarativeSystemPalette::Active); + QTRY_COMPARE(QColor("red"), object->text()); + QTRY_COMPARE(QColor("green"), object->buttonText()); + QTRY_COMPARE(QColor("blue"), object->windowText()); + + delete object; +} + +QTEST_MAIN(tst_qdeclarativesystempalette) + +#include "tst_qdeclarativesystempalette.moc" diff --git a/tests/auto/declarative/qdeclarativetext/data/alignments.qml b/tests/auto/declarative/qdeclarativetext/data/alignments.qml new file mode 100644 index 00000000..25105f67 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetext/data/alignments.qml @@ -0,0 +1,41 @@ +import QtQuick 1.0 + +Rectangle { + id: top + width: 70; height: 70; + + property alias horizontalAlignment: t.horizontalAlignment + property alias verticalAlignment: t.verticalAlignment + property alias wrapMode: t.wrapMode + property alias running: timer.running + property string txt: "Test" + + Rectangle { + anchors.centerIn: parent + width: 40 + height: 40 + color: "green" + + Text { + id: t + + anchors.fill: parent + horizontalAlignment: Text.AlignRight + verticalAlignment: Text.AlignBottom + wrapMode: Text.WordWrap + text: top.txt + } + Timer { + id: timer + + interval: 1 + running: true + repeat: true + onTriggered: { + top.txt = top.txt + "
more " + top.txt.length; + if (top.txt.length > 50) + running = false + } + } + } +} diff --git a/tests/auto/declarative/qdeclarativetext/data/alignments_cb.png b/tests/auto/declarative/qdeclarativetext/data/alignments_cb.png new file mode 100644 index 00000000..cf6199a4 Binary files /dev/null and b/tests/auto/declarative/qdeclarativetext/data/alignments_cb.png differ diff --git a/tests/auto/declarative/qdeclarativetext/data/alignments_cc.png b/tests/auto/declarative/qdeclarativetext/data/alignments_cc.png new file mode 100644 index 00000000..f81ccb42 Binary files /dev/null and b/tests/auto/declarative/qdeclarativetext/data/alignments_cc.png differ diff --git a/tests/auto/declarative/qdeclarativetext/data/alignments_ct.png b/tests/auto/declarative/qdeclarativetext/data/alignments_ct.png new file mode 100644 index 00000000..9ba64125 Binary files /dev/null and b/tests/auto/declarative/qdeclarativetext/data/alignments_ct.png differ diff --git a/tests/auto/declarative/qdeclarativetext/data/alignments_lb.png b/tests/auto/declarative/qdeclarativetext/data/alignments_lb.png new file mode 100644 index 00000000..1b50a81f Binary files /dev/null and b/tests/auto/declarative/qdeclarativetext/data/alignments_lb.png differ diff --git a/tests/auto/declarative/qdeclarativetext/data/alignments_lc.png b/tests/auto/declarative/qdeclarativetext/data/alignments_lc.png new file mode 100644 index 00000000..f041b868 Binary files /dev/null and b/tests/auto/declarative/qdeclarativetext/data/alignments_lc.png differ diff --git a/tests/auto/declarative/qdeclarativetext/data/alignments_lt.png b/tests/auto/declarative/qdeclarativetext/data/alignments_lt.png new file mode 100644 index 00000000..c75e0d15 Binary files /dev/null and b/tests/auto/declarative/qdeclarativetext/data/alignments_lt.png differ diff --git a/tests/auto/declarative/qdeclarativetext/data/alignments_rb.png b/tests/auto/declarative/qdeclarativetext/data/alignments_rb.png new file mode 100644 index 00000000..b06a5da7 Binary files /dev/null and b/tests/auto/declarative/qdeclarativetext/data/alignments_rb.png differ diff --git a/tests/auto/declarative/qdeclarativetext/data/alignments_rc.png b/tests/auto/declarative/qdeclarativetext/data/alignments_rc.png new file mode 100644 index 00000000..e468857c Binary files /dev/null and b/tests/auto/declarative/qdeclarativetext/data/alignments_rc.png differ diff --git a/tests/auto/declarative/qdeclarativetext/data/alignments_rt.png b/tests/auto/declarative/qdeclarativetext/data/alignments_rt.png new file mode 100644 index 00000000..576715ff Binary files /dev/null and b/tests/auto/declarative/qdeclarativetext/data/alignments_rt.png differ diff --git a/tests/auto/declarative/qdeclarativetext/data/elideimplicitwidth.qml b/tests/auto/declarative/qdeclarativetext/data/elideimplicitwidth.qml new file mode 100644 index 00000000..60ae15c4 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetext/data/elideimplicitwidth.qml @@ -0,0 +1,7 @@ +import QtQuick 1.1 + +Text { + text: "Hello World" + elide: Text.ElideRight + width: 30 +} diff --git a/tests/auto/declarative/qdeclarativetext/data/embeddedImagesLocal.qml b/tests/auto/declarative/qdeclarativetext/data/embeddedImagesLocal.qml new file mode 100644 index 00000000..ee9b95a2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetext/data/embeddedImagesLocal.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +Text { + text: "" +} diff --git a/tests/auto/declarative/qdeclarativetext/data/embeddedImagesLocalError.qml b/tests/auto/declarative/qdeclarativetext/data/embeddedImagesLocalError.qml new file mode 100644 index 00000000..4dc0d3e1 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetext/data/embeddedImagesLocalError.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +Text { + text: "" +} diff --git a/tests/auto/declarative/qdeclarativetext/data/embeddedImagesRemote.qml b/tests/auto/declarative/qdeclarativetext/data/embeddedImagesRemote.qml new file mode 100644 index 00000000..438f4a06 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetext/data/embeddedImagesRemote.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +Text { + text: "" +} diff --git a/tests/auto/declarative/qdeclarativetext/data/embeddedImagesRemoteError.qml b/tests/auto/declarative/qdeclarativetext/data/embeddedImagesRemoteError.qml new file mode 100644 index 00000000..c24bf24f --- /dev/null +++ b/tests/auto/declarative/qdeclarativetext/data/embeddedImagesRemoteError.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +Text { + text: "" +} diff --git a/tests/auto/declarative/qdeclarativetext/data/horizontalAlignment_RightToLeft.qml b/tests/auto/declarative/qdeclarativetext/data/horizontalAlignment_RightToLeft.qml new file mode 100644 index 00000000..4f589446 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetext/data/horizontalAlignment_RightToLeft.qml @@ -0,0 +1,23 @@ +import QtQuick 1.0 + +Rectangle { + id: top + width: 200; height: 70; + + property alias horizontalAlignment: text.horizontalAlignment + property string text: "اختبا" + + Rectangle { + anchors.centerIn: parent + width: 180 + height: 20 + color: "green" + + Text { + id: text + objectName: "text" + anchors.fill: parent + text: top.text + } + } +} diff --git a/tests/auto/declarative/qdeclarativetext/data/http/exists.png b/tests/auto/declarative/qdeclarativetext/data/http/exists.png new file mode 100644 index 00000000..399bd0b1 Binary files /dev/null and b/tests/auto/declarative/qdeclarativetext/data/http/exists.png differ diff --git a/tests/auto/declarative/qdeclarativetext/data/lineCount.qml b/tests/auto/declarative/qdeclarativetext/data/lineCount.qml new file mode 100644 index 00000000..63817f6f --- /dev/null +++ b/tests/auto/declarative/qdeclarativetext/data/lineCount.qml @@ -0,0 +1,15 @@ +import QtQuick 1.1 + +Item { + width: 200 + height: 200 + + Text { + id: myText + objectName: "myText" + width: 200 + wrapMode: Text.WordWrap + maximumLineCount: undefined + text: "Testing that maximumLines, visibleLines, and totalLines works properly in the autotests. The quick brown fox jumped over the lazy anything with the letter 'g'." + } +} diff --git a/tests/auto/declarative/qdeclarativetext/data/lineHeight.qml b/tests/auto/declarative/qdeclarativetext/data/lineHeight.qml new file mode 100644 index 00000000..851d8711 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetext/data/lineHeight.qml @@ -0,0 +1,15 @@ +import QtQuick 1.1 + +Item { + width: 200 + height: 200 + + Text { + id: myText + objectName: "myText" + width: 200 + wrapMode: Text.WordWrap + font.pixelSize: 13 + text: "Lorem ipsum sit amet, consectetur adipiscing elit. Integer felis nisl, varius in pretium nec, venenatis non erat. Proin lobortis interdum dictum." + } +} diff --git a/tests/auto/declarative/qdeclarativetext/data/qtbug_14734.qml b/tests/auto/declarative/qdeclarativetext/data/qtbug_14734.qml new file mode 100644 index 00000000..bd07d667 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetext/data/qtbug_14734.qml @@ -0,0 +1,10 @@ +import QtQuick 1.0 + +Rectangle { + width: 640 + height: 480 + + Text { + text: "í " + } +} diff --git a/tests/auto/declarative/qdeclarativetext/data/rotated.qml b/tests/auto/declarative/qdeclarativetext/data/rotated.qml new file mode 100644 index 00000000..1e893b93 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetext/data/rotated.qml @@ -0,0 +1,18 @@ +import QtQuick 1.0 + +Rectangle { + width : 200 + height : 100 + + Text { + objectName: "text" + x: 20 + y: 20 + height : 20 + width : 80 + text : "Something" + rotation : 30 + transformOrigin : Item.TopLeft + } +} + diff --git a/tests/auto/declarative/qdeclarativetext/qdeclarativetext.pro b/tests/auto/declarative/qdeclarativetext/qdeclarativetext.pro new file mode 100644 index 00000000..c0831f70 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetext/qdeclarativetext.pro @@ -0,0 +1,21 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative gui +QT += network +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativetext.cpp + +INCLUDEPATH += ../shared/ +HEADERS += ../shared/testhttpserver.h +SOURCES += ../shared/testhttpserver.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test +CONFIG+=insignificant_test # QTQAINFRA-428 diff --git a/tests/auto/declarative/qdeclarativetext/tst_qdeclarativetext.cpp b/tests/auto/declarative/qdeclarativetext/tst_qdeclarativetext.cpp new file mode 100644 index 00000000..af354166 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetext/tst_qdeclarativetext.cpp @@ -0,0 +1,1340 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../../../shared/util.h" +#include "testhttpserver.h" + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_qdeclarativetext : public QObject + +{ + Q_OBJECT +public: + tst_qdeclarativetext(); + +private slots: + void text(); + void width(); + void wrap(); + void elide(); + void textFormat(); + + void alignments_data(); + void alignments(); + + void embeddedImages_data(); + void embeddedImages(); + + void lineCount(); + void lineHeight(); + + // ### these tests may be trivial + void horizontalAlignment(); + void horizontalAlignment_RightToLeft(); + void verticalAlignment(); + void font(); + void style(); + void color(); + void smooth(); + + // QDeclarativeFontValueType + void weight(); + void underline(); + void overline(); + void strikeout(); + void capitalization(); + void letterSpacing(); + void wordSpacing(); + + void clickLink(); + + void QTBUG_12291(); + void implicitSize_data(); + void implicitSize(); + void testQtQuick11Attributes(); + void testQtQuick11Attributes_data(); + + void qtbug_14734(); +private: + QStringList standard; + QStringList richText; + + QStringList horizontalAlignmentmentStrings; + QStringList verticalAlignmentmentStrings; + + QList verticalAlignmentments; + QList horizontalAlignmentments; + + QStringList styleStrings; + QList styles; + + QStringList colorStrings; + + QDeclarativeEngine engine; + + QDeclarativeView *createView(const QString &filename); +}; + +tst_qdeclarativetext::tst_qdeclarativetext() +{ + standard << "the quick brown fox jumped over the lazy dog" + << "the quick brown fox\n jumped over the lazy dog"; + + richText << "the quick brown fox jumped over the lazy dog" + << "the quick brown fox
jumped over the lazy dog
"; + + horizontalAlignmentmentStrings << "AlignLeft" + << "AlignRight" + << "AlignHCenter"; + + verticalAlignmentmentStrings << "AlignTop" + << "AlignBottom" + << "AlignVCenter"; + + horizontalAlignmentments << Qt::AlignLeft + << Qt::AlignRight + << Qt::AlignHCenter; + + verticalAlignmentments << Qt::AlignTop + << Qt::AlignBottom + << Qt::AlignVCenter; + + styleStrings << "Normal" + << "Outline" + << "Raised" + << "Sunken"; + + styles << QDeclarativeText::Normal + << QDeclarativeText::Outline + << QDeclarativeText::Raised + << QDeclarativeText::Sunken; + + colorStrings << "aliceblue" + << "antiquewhite" + << "aqua" + << "darkkhaki" + << "darkolivegreen" + << "dimgray" + << "palevioletred" + << "lightsteelblue" + << "#000000" + << "#AAAAAA" + << "#FFFFFF" + << "#2AC05F"; + // + // need a different test to do alpha channel test + // << "#AA0011DD" + // << "#00F16B11"; + // +} + +QDeclarativeView *tst_qdeclarativetext::createView(const QString &filename) +{ + QDeclarativeView *canvas = new QDeclarativeView(0); + + canvas->setSource(QUrl::fromLocalFile(filename)); + return canvas; +} + +void tst_qdeclarativetext::text() +{ + { + QDeclarativeComponent textComponent(&engine); + textComponent.setData("import QtQuick 1.0\nText { text: \"\" }", QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + QCOMPARE(textObject->text(), QString("")); + QVERIFY(textObject->width() == 0); + + delete textObject; + } + + for (int i = 0; i < standard.size(); i++) + { + QString componentStr = "import QtQuick 1.0\nText { text: \"" + standard.at(i) + "\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + QCOMPARE(textObject->text(), standard.at(i)); + QVERIFY(textObject->width() > 0); + } + + for (int i = 0; i < richText.size(); i++) + { + QString componentStr = "import QtQuick 1.0\nText { text: \"" + richText.at(i) + "\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + QString expected = richText.at(i); + QCOMPARE(textObject->text(), expected.replace("\\\"", "\"")); + QVERIFY(textObject->width() > 0); + } +} + +void tst_qdeclarativetext::width() +{ + // uses Font metrics to find the width for standard and document to find the width for rich + { + QDeclarativeComponent textComponent(&engine); + textComponent.setData("import QtQuick 1.0\nText { text: \"\" }", QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + QCOMPARE(textObject->width(), 0.); + } + + for (int i = 0; i < standard.size(); i++) + { + QVERIFY(!Qt::mightBeRichText(standard.at(i))); // self-test + + QFont f; + QFontMetricsF fm(f); + qreal metricWidth = fm.size(Qt::TextExpandTabs && Qt::TextShowMnemonic, standard.at(i)).width(); + metricWidth = qCeil(metricWidth); + + QString componentStr = "import QtQuick 1.0\nText { text: \"" + standard.at(i) + "\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + QVERIFY(textObject->boundingRect().width() > 0); + QCOMPARE(textObject->width(), qreal(metricWidth)); + QVERIFY(textObject->textFormat() == QDeclarativeText::AutoText); // setting text doesn't change format + } + + for (int i = 0; i < richText.size(); i++) + { + QVERIFY(Qt::mightBeRichText(richText.at(i))); // self-test + + QTextDocument document; + document.setHtml(richText.at(i)); + document.setDocumentMargin(0); + + int documentWidth = document.idealWidth(); + + QString componentStr = "import QtQuick 1.0\nText { text: \"" + richText.at(i) + "\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + QCOMPARE(textObject->width(), qreal(documentWidth)); + QVERIFY(textObject->textFormat() == QDeclarativeText::AutoText); // setting text doesn't change format + } +} + +void tst_qdeclarativetext::wrap() +{ + int textHeight = 0; + // for specified width and wrap set true + { + QDeclarativeComponent textComponent(&engine); + textComponent.setData("import QtQuick 1.0\nText { text: \"Hello\"; wrapMode: Text.WordWrap; width: 300 }", QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + textHeight = textObject->height(); + + QVERIFY(textObject != 0); + QVERIFY(textObject->wrapMode() == QDeclarativeText::WordWrap); + QCOMPARE(textObject->width(), 300.); + } + + for (int i = 0; i < standard.size(); i++) + { + QString componentStr = "import QtQuick 1.0\nText { wrapMode: Text.WordWrap; width: 30; text: \"" + standard.at(i) + "\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + QCOMPARE(textObject->width(), 30.); + QVERIFY(textObject->height() > textHeight); + + int oldHeight = textObject->height(); + textObject->setWidth(100); + QVERIFY(textObject->height() < oldHeight); + } + + for (int i = 0; i < richText.size(); i++) + { + QString componentStr = "import QtQuick 1.0\nText { wrapMode: Text.WordWrap; width: 30; text: \"" + richText.at(i) + "\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + QCOMPARE(textObject->width(), 30.); + QVERIFY(textObject->height() > textHeight); + + qreal oldHeight = textObject->height(); + textObject->setWidth(100); + QVERIFY(textObject->height() < oldHeight); + } + + // richtext again with a fixed height + for (int i = 0; i < richText.size(); i++) + { + QString componentStr = "import QtQuick 1.0\nText { wrapMode: Text.WordWrap; width: 30; height: 50; text: \"" + richText.at(i) + "\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + QCOMPARE(textObject->width(), 30.); + QVERIFY(textObject->implicitHeight() > textHeight); + + qreal oldHeight = textObject->implicitHeight(); + textObject->setWidth(100); + QVERIFY(textObject->implicitHeight() < oldHeight); + } +} + +void tst_qdeclarativetext::elide() +{ + for (QDeclarativeText::TextElideMode m = QDeclarativeText::ElideLeft; m<=QDeclarativeText::ElideNone; m=QDeclarativeText::TextElideMode(int(m)+1)) { + const char* elidename[]={"ElideLeft", "ElideRight", "ElideMiddle", "ElideNone"}; + QString elide = "elide: Text." + QString(elidename[int(m)]) + ";"; + + // XXX Poor coverage. + + { + QDeclarativeComponent textComponent(&engine); + textComponent.setData(("import QtQuick 1.0\nText { text: \"\"; "+elide+" width: 100 }").toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QCOMPARE(textObject->elideMode(), m); + QCOMPARE(textObject->width(), 100.); + } + + for (int i = 0; i < standard.size(); i++) + { + QString componentStr = "import QtQuick 1.0\nText { "+elide+" width: 100; text: \"" + standard.at(i) + "\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QCOMPARE(textObject->elideMode(), m); + QCOMPARE(textObject->width(), 100.); + } + + // richtext - does nothing + for (int i = 0; i < richText.size(); i++) + { + QString componentStr = "import QtQuick 1.0\nText { "+elide+" width: 100; text: \"" + richText.at(i) + "\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QCOMPARE(textObject->elideMode(), m); + QCOMPARE(textObject->width(), 100.); + } + } + + // QTBUG-18627 + QUrl qmlfile = QUrl::fromLocalFile(SRCDIR "/data/elideimplicitwidth.qml"); + QDeclarativeComponent textComponent(&engine, qmlfile); + QDeclarativeItem *item = qobject_cast(textComponent.create()); + QVERIFY(item != 0); + QVERIFY(item->implicitWidth() > item->width()); +} + +void tst_qdeclarativetext::textFormat() +{ + { + QDeclarativeComponent textComponent(&engine); + textComponent.setData("import QtQuick 1.0\nText { text: \"Hello\"; textFormat: Text.RichText }", QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + QVERIFY(textObject->textFormat() == QDeclarativeText::RichText); + } + { + QDeclarativeComponent textComponent(&engine); + textComponent.setData("import QtQuick 1.0\nText { text: \"Hello\"; textFormat: Text.PlainText }", QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + QVERIFY(textObject->textFormat() == QDeclarativeText::PlainText); + } +} + + +void tst_qdeclarativetext::alignments_data() +{ + QTest::addColumn("hAlign"); + QTest::addColumn("vAlign"); + QTest::addColumn("expectfile"); + + QTest::newRow("LT") << int(Qt::AlignLeft) << int(Qt::AlignTop) << SRCDIR "/data/alignments_lt.png"; + QTest::newRow("RT") << int(Qt::AlignRight) << int(Qt::AlignTop) << SRCDIR "/data/alignments_rt.png"; + QTest::newRow("CT") << int(Qt::AlignHCenter) << int(Qt::AlignTop) << SRCDIR "/data/alignments_ct.png"; + + QTest::newRow("LB") << int(Qt::AlignLeft) << int(Qt::AlignBottom) << SRCDIR "/data/alignments_lb.png"; + QTest::newRow("RB") << int(Qt::AlignRight) << int(Qt::AlignBottom) << SRCDIR "/data/alignments_rb.png"; + QTest::newRow("CB") << int(Qt::AlignHCenter) << int(Qt::AlignBottom) << SRCDIR "/data/alignments_cb.png"; + + QTest::newRow("LC") << int(Qt::AlignLeft) << int(Qt::AlignVCenter) << SRCDIR "/data/alignments_lc.png"; + QTest::newRow("RC") << int(Qt::AlignRight) << int(Qt::AlignVCenter) << SRCDIR "/data/alignments_rc.png"; + QTest::newRow("CC") << int(Qt::AlignHCenter) << int(Qt::AlignVCenter) << SRCDIR "/data/alignments_cc.png"; +} + + +void tst_qdeclarativetext::alignments() +{ + QFETCH(int, hAlign); + QFETCH(int, vAlign); + QFETCH(QString, expectfile); + +#ifdef Q_WS_X11 + // Font-specific, but not likely platform-specific, so only test on one platform + QFont fn; + fn.setRawName("-misc-fixed-medium-r-*-*-8-*-*-*-*-*-*-*"); + QApplication::setFont(fn); +#endif + + QDeclarativeView *canvas = createView(SRCDIR "/data/alignments.qml"); + + canvas->show(); + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(canvas)); + + QObject *ob = canvas->rootObject(); + QVERIFY(ob != 0); + ob->setProperty("horizontalAlignment",hAlign); + ob->setProperty("verticalAlignment",vAlign); + QTRY_COMPARE(ob->property("running").toBool(),false); + QImage actual(canvas->width(), canvas->height(), QImage::Format_RGB32); + actual.fill(qRgb(255,255,255)); + QPainter p(&actual); + canvas->render(&p); + + QImage expect(expectfile); + +#ifdef Q_WS_X11 + // Font-specific, but not likely platform-specific, so only test on one platform + if (QApplicationPrivate::graphics_system_name == "raster" || QApplicationPrivate::graphics_system_name == "") { + QCOMPARE(actual,expect); + } +#endif + + delete canvas; +} + +//the alignment tests may be trivial o.oa +void tst_qdeclarativetext::horizontalAlignment() +{ + //test one align each, and then test if two align fails. + + for (int i = 0; i < standard.size(); i++) + { + for (int j=0; j < horizontalAlignmentmentStrings.size(); j++) + { + QString componentStr = "import QtQuick 1.0\nText { horizontalAlignment: \"" + horizontalAlignmentmentStrings.at(j) + "\"; text: \"" + standard.at(i) + "\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QCOMPARE((int)textObject->hAlign(), (int)horizontalAlignmentments.at(j)); + } + } + + for (int i = 0; i < richText.size(); i++) + { + for (int j=0; j < horizontalAlignmentmentStrings.size(); j++) + { + QString componentStr = "import QtQuick 1.0\nText { horizontalAlignment: \"" + horizontalAlignmentmentStrings.at(j) + "\"; text: \"" + richText.at(i) + "\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QCOMPARE((int)textObject->hAlign(), (int)horizontalAlignmentments.at(j)); + } + } + +} + +void tst_qdeclarativetext::horizontalAlignment_RightToLeft() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/horizontalAlignment_RightToLeft.qml"); + QDeclarativeText *text = canvas->rootObject()->findChild("text"); + QVERIFY(text != 0); + canvas->show(); + + QDeclarativeTextPrivate *textPrivate = QDeclarativeTextPrivate::get(text); + QVERIFY(textPrivate != 0); + + // implicit alignment should follow the reading direction of RTL text + QCOMPARE(text->hAlign(), QDeclarativeText::AlignRight); + QCOMPARE(text->effectiveHAlign(), text->hAlign()); + QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() > canvas->width()/2); + + // explicitly left aligned text + text->setHAlign(QDeclarativeText::AlignLeft); + QCOMPARE(text->hAlign(), QDeclarativeText::AlignLeft); + QCOMPARE(text->effectiveHAlign(), text->hAlign()); + QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() < canvas->width()/2); + + // explicitly right aligned text + text->setHAlign(QDeclarativeText::AlignRight); + QCOMPARE(text->hAlign(), QDeclarativeText::AlignRight); + QCOMPARE(text->effectiveHAlign(), text->hAlign()); + QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() > canvas->width()/2); + + // change to rich text + QString textString = text->text(); + text->setText(QString("") + textString + QString("")); + text->setTextFormat(QDeclarativeText::RichText); + text->resetHAlign(); + + // implicitly aligned rich text should follow the reading direction of text + QCOMPARE(text->hAlign(), QDeclarativeText::AlignRight); + QCOMPARE(text->effectiveHAlign(), text->hAlign()); + QVERIFY(textPrivate->textDocument()->defaultTextOption().alignment() & Qt::AlignLeft); + + // explicitly left aligned rich text + text->setHAlign(QDeclarativeText::AlignLeft); + QCOMPARE(text->hAlign(), QDeclarativeText::AlignLeft); + QCOMPARE(text->effectiveHAlign(), text->hAlign()); + QVERIFY(textPrivate->textDocument()->defaultTextOption().alignment() & Qt::AlignRight); + + // explicitly right aligned rich text + text->setHAlign(QDeclarativeText::AlignRight); + QCOMPARE(text->hAlign(), QDeclarativeText::AlignRight); + QCOMPARE(text->effectiveHAlign(), text->hAlign()); + QVERIFY(textPrivate->textDocument()->defaultTextOption().alignment() & Qt::AlignLeft); + + text->setText(textString); + text->setTextFormat(QDeclarativeText::PlainText); + + // explicitly center aligned + text->setHAlign(QDeclarativeText::AlignHCenter); + QCOMPARE(text->hAlign(), QDeclarativeText::AlignHCenter); + QCOMPARE(text->effectiveHAlign(), text->hAlign()); + QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() < canvas->width()/2); + QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().right() > canvas->width()/2); + + // reseted alignment should go back to following the text reading direction + text->resetHAlign(); + QCOMPARE(text->hAlign(), QDeclarativeText::AlignRight); + QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() > canvas->width()/2); + + // mirror the text item + QDeclarativeItemPrivate::get(text)->setLayoutMirror(true); + + // mirrored implicit alignment should continue to follow the reading direction of the text + QCOMPARE(text->hAlign(), QDeclarativeText::AlignRight); + QCOMPARE(text->effectiveHAlign(), QDeclarativeText::AlignRight); + QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() > canvas->width()/2); + + // mirrored explicitly right aligned behaves as left aligned + text->setHAlign(QDeclarativeText::AlignRight); + QCOMPARE(text->hAlign(), QDeclarativeText::AlignRight); + QCOMPARE(text->effectiveHAlign(), QDeclarativeText::AlignLeft); + QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() < canvas->width()/2); + + // mirrored explicitly left aligned behaves as right aligned + text->setHAlign(QDeclarativeText::AlignLeft); + QCOMPARE(text->hAlign(), QDeclarativeText::AlignLeft); + QCOMPARE(text->effectiveHAlign(), QDeclarativeText::AlignRight); + QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() > canvas->width()/2); + + // disable mirroring + QDeclarativeItemPrivate::get(text)->setLayoutMirror(false); + text->resetHAlign(); + + // English text should be implicitly left aligned + text->setText("Hello world!"); + QCOMPARE(text->hAlign(), QDeclarativeText::AlignLeft); + QVERIFY(textPrivate->layout.lineAt(0).naturalTextRect().left() < canvas->width()/2); + +#ifndef Q_OS_MAC // QTBUG-18040 + // empty text with implicit alignment follows the system locale-based + // keyboard input direction from QApplication::keyboardInputDirection + text->setText(""); + QCOMPARE(text->hAlign(), QApplication::keyboardInputDirection() == Qt::LeftToRight ? + QDeclarativeText::AlignLeft : QDeclarativeText::AlignRight); + text->setHAlign(QDeclarativeText::AlignRight); + QCOMPARE(text->hAlign(), QDeclarativeText::AlignRight); +#endif + + delete canvas; + +#ifndef Q_OS_MAC // QTBUG-18040 + // alignment of Text with no text set to it + QString componentStr = "import QtQuick 1.0\nText {}"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + QCOMPARE(textObject->hAlign(), QApplication::keyboardInputDirection() == Qt::LeftToRight ? + QDeclarativeText::AlignLeft : QDeclarativeText::AlignRight); + delete textObject; +#endif +} + +void tst_qdeclarativetext::verticalAlignment() +{ + //test one align each, and then test if two align fails. + + for (int i = 0; i < standard.size(); i++) + { + for (int j=0; j < verticalAlignmentmentStrings.size(); j++) + { + QString componentStr = "import QtQuick 1.0\nText { verticalAlignment: \"" + verticalAlignmentmentStrings.at(j) + "\"; text: \"" + standard.at(i) + "\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + QCOMPARE((int)textObject->vAlign(), (int)verticalAlignmentments.at(j)); + } + } + + for (int i = 0; i < richText.size(); i++) + { + for (int j=0; j < verticalAlignmentmentStrings.size(); j++) + { + QString componentStr = "import QtQuick 1.0\nText { verticalAlignment: \"" + verticalAlignmentmentStrings.at(j) + "\"; text: \"" + richText.at(i) + "\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + QCOMPARE((int)textObject->vAlign(), (int)verticalAlignmentments.at(j)); + } + } + + //confirm that bounding rect is correctly positioned. + QString componentStr = "import QtQuick 1.0\nText { height: 80; text: \"Hello\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + QVERIFY(textObject != 0); + QRectF br = textObject->boundingRect(); + QVERIFY(br.y() == 0); + + textObject->setVAlign(QDeclarativeText::AlignVCenter); + br = textObject->boundingRect(); + QCOMPARE(qFloor(br.y()), qFloor((80.0 - br.height())/2)); + + textObject->setVAlign(QDeclarativeText::AlignBottom); + br = textObject->boundingRect(); + QCOMPARE(qFloor(br.y()), qFloor(80.0 - br.height())); + + delete textObject; +} + +void tst_qdeclarativetext::font() +{ + //test size, then bold, then italic, then family + { + QString componentStr = "import QtQuick 1.0\nText { font.pointSize: 40; text: \"Hello World\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QCOMPARE(textObject->font().pointSize(), 40); + QCOMPARE(textObject->font().bold(), false); + QCOMPARE(textObject->font().italic(), false); + } + + { + QString componentStr = "import QtQuick 1.0\nText { font.pixelSize: 40; text: \"Hello World\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QCOMPARE(textObject->font().pixelSize(), 40); + QCOMPARE(textObject->font().bold(), false); + QCOMPARE(textObject->font().italic(), false); + } + + { + QString componentStr = "import QtQuick 1.0\nText { font.bold: true; text: \"Hello World\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QCOMPARE(textObject->font().bold(), true); + QCOMPARE(textObject->font().italic(), false); + } + + { + QString componentStr = "import QtQuick 1.0\nText { font.italic: true; text: \"Hello World\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QCOMPARE(textObject->font().italic(), true); + QCOMPARE(textObject->font().bold(), false); + } + + { + QString componentStr = "import QtQuick 1.0\nText { font.family: \"Helvetica\"; text: \"Hello World\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QCOMPARE(textObject->font().family(), QString("Helvetica")); + QCOMPARE(textObject->font().bold(), false); + QCOMPARE(textObject->font().italic(), false); + } + + { + QString componentStr = "import QtQuick 1.0\nText { font.family: \"\"; text: \"Hello World\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QCOMPARE(textObject->font().family(), QString("")); + } +} + +void tst_qdeclarativetext::style() +{ + //test style + for (int i = 0; i < styles.size(); i++) + { + QString componentStr = "import QtQuick 1.0\nText { style: \"" + styleStrings.at(i) + "\"; styleColor: \"white\"; text: \"Hello World\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QCOMPARE((int)textObject->style(), (int)styles.at(i)); + QCOMPARE(textObject->styleColor(), QColor("white")); + } + QString componentStr = "import QtQuick 1.0\nText { text: \"Hello World\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QRectF brPre = textObject->boundingRect(); + textObject->setStyle(QDeclarativeText::Outline); + QRectF brPost = textObject->boundingRect(); + + QVERIFY(brPre.width() < brPost.width()); + QVERIFY(brPre.height() < brPost.height()); +} + +void tst_qdeclarativetext::color() +{ + //test style + for (int i = 0; i < colorStrings.size(); i++) + { + QString componentStr = "import QtQuick 1.0\nText { color: \"" + colorStrings.at(i) + "\"; text: \"Hello World\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QCOMPARE(textObject->color(), QColor(colorStrings.at(i))); + QCOMPARE(textObject->styleColor(), QColor()); + } + + for (int i = 0; i < colorStrings.size(); i++) + { + QString componentStr = "import QtQuick 1.0\nText { styleColor: \"" + colorStrings.at(i) + "\"; text: \"Hello World\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QCOMPARE(textObject->styleColor(), QColor(colorStrings.at(i))); + // default color to black? + QCOMPARE(textObject->color(), QColor("black")); + } + + for (int i = 0; i < colorStrings.size(); i++) + { + for (int j = 0; j < colorStrings.size(); j++) + { + QString componentStr = "import QtQuick 1.0\nText { color: \"" + colorStrings.at(i) + "\"; styleColor: \"" + colorStrings.at(j) + "\"; text: \"Hello World\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QCOMPARE(textObject->color(), QColor(colorStrings.at(i))); + QCOMPARE(textObject->styleColor(), QColor(colorStrings.at(j))); + } + } + { + QString colorStr = "#AA001234"; + QColor testColor("#001234"); + testColor.setAlpha(170); + + QString componentStr = "import QtQuick 1.0\nText { color: \"" + colorStr + "\"; text: \"Hello World\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QCOMPARE(textObject->color(), testColor); + } +} + +void tst_qdeclarativetext::smooth() +{ + for (int i = 0; i < standard.size(); i++) + { + { + QString componentStr = "import QtQuick 1.0\nText { smooth: true; text: \"" + standard.at(i) + "\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + QCOMPARE(textObject->smooth(), true); + } + { + QString componentStr = "import QtQuick 1.0\nText { text: \"" + standard.at(i) + "\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + QCOMPARE(textObject->smooth(), false); + } + } + for (int i = 0; i < richText.size(); i++) + { + { + QString componentStr = "import QtQuick 1.0\nText { smooth: true; text: \"" + richText.at(i) + "\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + QCOMPARE(textObject->smooth(), true); + } + { + QString componentStr = "import QtQuick 1.0\nText { text: \"" + richText.at(i) + "\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + QCOMPARE(textObject->smooth(), false); + } + } +} + +void tst_qdeclarativetext::weight() +{ + { + QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + QCOMPARE((int)textObject->font().weight(), (int)QDeclarativeFontValueType::Normal); + } + { + QString componentStr = "import QtQuick 1.0\nText { font.weight: \"Bold\"; text: \"Hello world!\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + QCOMPARE((int)textObject->font().weight(), (int)QDeclarativeFontValueType::Bold); + } +} + +void tst_qdeclarativetext::underline() +{ + { + QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + QCOMPARE(textObject->font().underline(), false); + } + { + QString componentStr = "import QtQuick 1.0\nText { font.underline: true; text: \"Hello world!\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + QCOMPARE(textObject->font().underline(), true); + } +} + +void tst_qdeclarativetext::overline() +{ + { + QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + QCOMPARE(textObject->font().overline(), false); + } + { + QString componentStr = "import QtQuick 1.0\nText { font.overline: true; text: \"Hello world!\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + QCOMPARE(textObject->font().overline(), true); + } +} + +void tst_qdeclarativetext::strikeout() +{ + { + QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + QCOMPARE(textObject->font().strikeOut(), false); + } + { + QString componentStr = "import QtQuick 1.0\nText { font.strikeout: true; text: \"Hello world!\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + QCOMPARE(textObject->font().strikeOut(), true); + } +} + +void tst_qdeclarativetext::capitalization() +{ + { + QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + QCOMPARE((int)textObject->font().capitalization(), (int)QDeclarativeFontValueType::MixedCase); + } + { + QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.capitalization: \"AllUppercase\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + QCOMPARE((int)textObject->font().capitalization(), (int)QDeclarativeFontValueType::AllUppercase); + } + { + QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.capitalization: \"AllLowercase\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + QCOMPARE((int)textObject->font().capitalization(), (int)QDeclarativeFontValueType::AllLowercase); + } + { + QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.capitalization: \"SmallCaps\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + QCOMPARE((int)textObject->font().capitalization(), (int)QDeclarativeFontValueType::SmallCaps); + } + { + QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.capitalization: \"Capitalize\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + QCOMPARE((int)textObject->font().capitalization(), (int)QDeclarativeFontValueType::Capitalize); + } +} + +void tst_qdeclarativetext::letterSpacing() +{ + { + QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + QCOMPARE(textObject->font().letterSpacing(), 0.0); + } + { + QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.letterSpacing: -2 }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + QCOMPARE(textObject->font().letterSpacing(), -2.); + } + { + QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.letterSpacing: 3 }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + QCOMPARE(textObject->font().letterSpacing(), 3.); + } +} + +void tst_qdeclarativetext::wordSpacing() +{ + { + QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + QCOMPARE(textObject->font().wordSpacing(), 0.0); + } + { + QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.wordSpacing: -50 }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + QCOMPARE(textObject->font().wordSpacing(), -50.); + } + { + QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\"; font.wordSpacing: 200 }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + QCOMPARE(textObject->font().wordSpacing(), 200.); + } +} + +void tst_qdeclarativetext::QTBUG_12291() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/rotated.qml"); + + canvas->show(); + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(canvas)); + + QObject *ob = canvas->rootObject(); + QVERIFY(ob != 0); + + QDeclarativeText *text = ob->findChild("text"); + QVERIFY(text); + QVERIFY(text->boundingRect().isValid()); + + delete canvas; +} + +class EventSender : public QGraphicsItem +{ +public: + void sendEvent(QEvent *event) { sceneEvent(event); } +}; + +class LinkTest : public QObject +{ + Q_OBJECT +public: + LinkTest() {} + + QString link; + +public slots: + void linkClicked(QString l) { link = l; } +}; + +void tst_qdeclarativetext::clickLink() +{ + { + QString componentStr = "import QtQuick 1.0\nText { text: \"Hello world!\" }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + + LinkTest test; + QObject::connect(textObject, SIGNAL(linkActivated(QString)), &test, SLOT(linkClicked(QString))); + + { + QGraphicsSceneMouseEvent me(QEvent::GraphicsSceneMousePress); + me.setPos(QPointF(textObject->x()/2, textObject->y()/2)); + me.setButton(Qt::LeftButton); + static_cast(static_cast(textObject))->sendEvent(&me); + } + + { + QGraphicsSceneMouseEvent me(QEvent::GraphicsSceneMouseRelease); + me.setPos(QPointF(textObject->x()/2, textObject->y()/2)); + me.setButton(Qt::LeftButton); + static_cast(static_cast(textObject))->sendEvent(&me); + } + + QCOMPARE(test.link, QLatin1String("http://qt.nokia.com")); + } +} + +void tst_qdeclarativetext::embeddedImages_data() +{ + QTest::addColumn("qmlfile"); + QTest::addColumn("error"); + QTest::newRow("local") << QUrl::fromLocalFile(SRCDIR "/data/embeddedImagesLocal.qml") << ""; + QTest::newRow("local-error") << QUrl::fromLocalFile(SRCDIR "/data/embeddedImagesLocalError.qml") + << QUrl::fromLocalFile(SRCDIR "/data/embeddedImagesLocalError.qml").toString()+":3:1: QML Text: Cannot open: " + QUrl::fromLocalFile(SRCDIR "/data/http/notexists.png").toString(); + QTest::newRow("remote") << QUrl::fromLocalFile(SRCDIR "/data/embeddedImagesRemote.qml") << ""; + QTest::newRow("remote-error") << QUrl::fromLocalFile(SRCDIR "/data/embeddedImagesRemoteError.qml") + << QUrl::fromLocalFile(SRCDIR "/data/embeddedImagesRemoteError.qml").toString()+":3:1: QML Text: Error downloading http://127.0.0.1:14453/notexists.png - server replied: Not found"; +} + +void tst_qdeclarativetext::embeddedImages() +{ + // Tests QTBUG-9900 + + QFETCH(QUrl, qmlfile); + QFETCH(QString, error); + + TestHTTPServer server(14453); + server.serveDirectory(SRCDIR "/data/http"); + + if (!error.isEmpty()) + QTest::ignoreMessage(QtWarningMsg, error.toLatin1()); + + QDeclarativeComponent textComponent(&engine, qmlfile); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + + QTRY_COMPARE(textObject->resourcesLoading(), 0); + + QPixmap pm(SRCDIR "/data/http/exists.png"); + if (error.isEmpty()) { + QCOMPARE(textObject->width(), double(pm.width())); + QCOMPARE(textObject->height(), double(pm.height())); + } else { + QVERIFY(16 != pm.width()); // check test is effective + QCOMPARE(textObject->width(), 16.0); // default size of QTextDocument broken image icon + QCOMPARE(textObject->height(), 16.0); + } + + delete textObject; +} + +void tst_qdeclarativetext::lineCount() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/lineCount.qml"); + + QDeclarativeText *myText = canvas->rootObject()->findChild("myText"); + QVERIFY(myText != 0); + + QVERIFY(myText->lineCount() > 1); + QVERIFY(!myText->truncated()); + QCOMPARE(myText->maximumLineCount(), INT_MAX); + + myText->setMaximumLineCount(2); + QCOMPARE(myText->lineCount(), 2); + QCOMPARE(myText->truncated(), true); + QCOMPARE(myText->maximumLineCount(), 2); + + myText->resetMaximumLineCount(); + QCOMPARE(myText->maximumLineCount(), INT_MAX); + QCOMPARE(myText->truncated(), false); + + myText->setElideMode(QDeclarativeText::ElideRight); + myText->setMaximumLineCount(2); + QCOMPARE(myText->lineCount(), 2); + QCOMPARE(myText->truncated(), true); + QCOMPARE(myText->maximumLineCount(), 2); + + delete canvas; +} + +void tst_qdeclarativetext::lineHeight() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/lineHeight.qml"); + + QDeclarativeText *myText = canvas->rootObject()->findChild("myText"); + QVERIFY(myText != 0); + + QVERIFY(myText->lineHeight() == 1); + QVERIFY(myText->lineHeightMode() == QDeclarativeText::ProportionalHeight); + + qreal h = myText->height(); + myText->setLineHeight(1.5); + QVERIFY(myText->height() == h * 1.5); + + myText->setLineHeightMode(QDeclarativeText::FixedHeight); + myText->setLineHeight(20); + QCOMPARE(myText->height(), myText->lineCount() * 20.0); + + myText->setText("Lorem ipsum sit amet, consectetur adipiscing elit. Integer felis nisl, varius in pretium nec, venenatis non erat. Proin lobortis interdum dictum."); + myText->setLineHeightMode(QDeclarativeText::ProportionalHeight); + myText->setLineHeight(1.0); + + qreal h2 = myText->height(); + myText->setLineHeight(2.0); + QEXPECT_FAIL("", "QTBUG-17325", Continue); + QVERIFY(myText->height() == h2 * 2.0); + + myText->setLineHeightMode(QDeclarativeText::FixedHeight); + myText->setLineHeight(10); + QEXPECT_FAIL("", "QTBUG-17325", Continue); + QCOMPARE(myText->height(), myText->lineCount() * 10.0); + + delete canvas; +} + +void tst_qdeclarativetext::implicitSize_data() +{ + QTest::addColumn("text"); + QTest::addColumn("wrap"); + QTest::newRow("plain") << "The quick red fox jumped over the lazy brown dog" << "Text.NoWrap"; + QTest::newRow("richtext") << "The quick red fox jumped over the lazy brown dog" << "Text.NoWrap"; + QTest::newRow("plain_wrap") << "The quick red fox jumped over the lazy brown dog" << "Text.Wrap"; + QTest::newRow("richtext_wrap") << "The quick red fox jumped over the lazy brown dog" << "Text.Wrap"; +} + +void tst_qdeclarativetext::implicitSize() +{ + QFETCH(QString, text); + QFETCH(QString, wrap); + QString componentStr = "import QtQuick 1.1\nText { text: \"" + text + "\"; width: 50; wrapMode: " + wrap + " }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeText *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject->width() < textObject->implicitWidth()); + QVERIFY(textObject->height() == textObject->implicitHeight()); + + textObject->resetWidth(); + QVERIFY(textObject->width() == textObject->implicitWidth()); + QVERIFY(textObject->height() == textObject->implicitHeight()); +} + +void tst_qdeclarativetext::testQtQuick11Attributes() +{ + QFETCH(QString, code); + QFETCH(QString, warning); + QFETCH(QString, error); + + QDeclarativeEngine engine; + QObject *obj; + + QDeclarativeComponent valid(&engine); + valid.setData("import QtQuick 1.1; Text { " + code.toUtf8() + " }", QUrl("")); + obj = valid.create(); + QVERIFY(obj); + QVERIFY(valid.errorString().isEmpty()); + delete obj; + + QDeclarativeComponent invalid(&engine); + invalid.setData("import QtQuick 1.0; Text { " + code.toUtf8() + " }", QUrl("")); + QTest::ignoreMessage(QtWarningMsg, warning.toUtf8()); + obj = invalid.create(); + QCOMPARE(invalid.errorString(), error); + delete obj; +} + +void tst_qdeclarativetext::testQtQuick11Attributes_data() +{ + QTest::addColumn("code"); + QTest::addColumn("warning"); + QTest::addColumn("error"); + + QTest::newRow("maximumLineCount") << "maximumLineCount: 4" + << "QDeclarativeComponent: Component is not ready" + << ":1 \"Text.maximumLineCount\" is not available in QtQuick 1.0.\n"; + + QTest::newRow("lineHeight") << "lineHeight: 2" + << "QDeclarativeComponent: Component is not ready" + << ":1 \"Text.lineHeight\" is not available in QtQuick 1.0.\n"; + + QTest::newRow("lineHeightMode") << "lineHeightMode: Text.ProportionalHeight" + << "QDeclarativeComponent: Component is not ready" + << ":1 \"Text.lineHeightMode\" is not available in QtQuick 1.0.\n"; + + QTest::newRow("lineCount") << "property int foo: lineCount" + << ":1: ReferenceError: Can't find variable: lineCount" + << ""; + + QTest::newRow("truncated") << "property bool foo: truncated" + << ":1: ReferenceError: Can't find variable: truncated" + << ""; +} + +void tst_qdeclarativetext::qtbug_14734() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/qtbug_14734.qml"); + QVERIFY(canvas); + + canvas->show(); + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(canvas)); + + delete canvas; +} + +QTEST_MAIN(tst_qdeclarativetext) + +#include "tst_qdeclarativetext.moc" diff --git a/tests/auto/declarative/qdeclarativetextedit/data/CursorRect.qml b/tests/auto/declarative/qdeclarativetextedit/data/CursorRect.qml new file mode 100644 index 00000000..3af03136 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextedit/data/CursorRect.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 + +TextEdit { + focus: true + objectName: "myEdit" + width: 50 + text: "This is a long piece of text" +} diff --git a/tests/auto/declarative/qdeclarativetextedit/data/alignments.qml b/tests/auto/declarative/qdeclarativetextedit/data/alignments.qml new file mode 100644 index 00000000..bc977fc6 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextedit/data/alignments.qml @@ -0,0 +1,41 @@ +import QtQuick 1.0 + +Rectangle { + id: top + width: 70; height: 70; + + property alias horizontalAlignment: t.horizontalAlignment + property alias verticalAlignment: t.verticalAlignment + property alias wrapMode: t.wrapMode + property alias running: timer.running + property string txt: "Test" + + Rectangle { + anchors.centerIn: parent + width: 40 + height: 40 + color: "green" + + TextEdit { + id: t + + anchors.fill: parent + horizontalAlignment: TextEdit.AlignRight + verticalAlignment: TextEdit.AlignBottom + wrapMode: TextEdit.WordWrap + text: top.txt + } + Timer { + id: timer + + interval: 1 + running: true + repeat: true + onTriggered: { + top.txt = top.txt + "
more " + top.txt.length; + if (top.txt.length > 50) + running = false + } + } + } +} diff --git a/tests/auto/declarative/qdeclarativetextedit/data/alignments_cb.png b/tests/auto/declarative/qdeclarativetextedit/data/alignments_cb.png new file mode 100644 index 00000000..99de2192 Binary files /dev/null and b/tests/auto/declarative/qdeclarativetextedit/data/alignments_cb.png differ diff --git a/tests/auto/declarative/qdeclarativetextedit/data/alignments_cc.png b/tests/auto/declarative/qdeclarativetextedit/data/alignments_cc.png new file mode 100644 index 00000000..cb852511 Binary files /dev/null and b/tests/auto/declarative/qdeclarativetextedit/data/alignments_cc.png differ diff --git a/tests/auto/declarative/qdeclarativetextedit/data/alignments_ct.png b/tests/auto/declarative/qdeclarativetextedit/data/alignments_ct.png new file mode 100644 index 00000000..ddca549c Binary files /dev/null and b/tests/auto/declarative/qdeclarativetextedit/data/alignments_ct.png differ diff --git a/tests/auto/declarative/qdeclarativetextedit/data/alignments_lb.png b/tests/auto/declarative/qdeclarativetextedit/data/alignments_lb.png new file mode 100644 index 00000000..1b50a81f Binary files /dev/null and b/tests/auto/declarative/qdeclarativetextedit/data/alignments_lb.png differ diff --git a/tests/auto/declarative/qdeclarativetextedit/data/alignments_lc.png b/tests/auto/declarative/qdeclarativetextedit/data/alignments_lc.png new file mode 100644 index 00000000..f041b868 Binary files /dev/null and b/tests/auto/declarative/qdeclarativetextedit/data/alignments_lc.png differ diff --git a/tests/auto/declarative/qdeclarativetextedit/data/alignments_lt.png b/tests/auto/declarative/qdeclarativetextedit/data/alignments_lt.png new file mode 100644 index 00000000..c75e0d15 Binary files /dev/null and b/tests/auto/declarative/qdeclarativetextedit/data/alignments_lt.png differ diff --git a/tests/auto/declarative/qdeclarativetextedit/data/alignments_rb.png b/tests/auto/declarative/qdeclarativetextedit/data/alignments_rb.png new file mode 100644 index 00000000..b06a5da7 Binary files /dev/null and b/tests/auto/declarative/qdeclarativetextedit/data/alignments_rb.png differ diff --git a/tests/auto/declarative/qdeclarativetextedit/data/alignments_rc.png b/tests/auto/declarative/qdeclarativetextedit/data/alignments_rc.png new file mode 100644 index 00000000..e468857c Binary files /dev/null and b/tests/auto/declarative/qdeclarativetextedit/data/alignments_rc.png differ diff --git a/tests/auto/declarative/qdeclarativetextedit/data/alignments_rt.png b/tests/auto/declarative/qdeclarativetextedit/data/alignments_rt.png new file mode 100644 index 00000000..576715ff Binary files /dev/null and b/tests/auto/declarative/qdeclarativetextedit/data/alignments_rt.png differ diff --git a/tests/auto/declarative/qdeclarativetextedit/data/cursorTest.qml b/tests/auto/declarative/qdeclarativetextedit/data/cursorTest.qml new file mode 100644 index 00000000..f7fb3e7c --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextedit/data/cursorTest.qml @@ -0,0 +1,9 @@ +import QtQuick 1.0 + +Rectangle { width: 300; height: 300; color: "white" + TextEdit { text: "Hello world!"; id: textEditObject; objectName: "textEditObject" + anchors.fill: parent + resources: [ Component { id:cursor; Item { id:cursorInstance; objectName: "cursorInstance" } } ] + cursorDelegate: cursor + } +} diff --git a/tests/auto/declarative/qdeclarativetextedit/data/geometrySignals.qml b/tests/auto/declarative/qdeclarativetextedit/data/geometrySignals.qml new file mode 100644 index 00000000..fe2ae122 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextedit/data/geometrySignals.qml @@ -0,0 +1,12 @@ +import QtQuick 1.0 + +Item { + width: 400; height: 500; + property int bindingWidth: text.width + property int bindingHeight: text.height + + TextInput { + id: text + anchors.fill: parent + } +} diff --git a/tests/auto/declarative/qdeclarativetextedit/data/horizontalAlignment_RightToLeft.qml b/tests/auto/declarative/qdeclarativetextedit/data/horizontalAlignment_RightToLeft.qml new file mode 100644 index 00000000..6e739bf2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextedit/data/horizontalAlignment_RightToLeft.qml @@ -0,0 +1,24 @@ +import QtQuick 1.0 + +Rectangle { + id: top + width: 200; height: 70; + + property alias horizontalAlignment: text.horizontalAlignment + property string text: "اختبا" + + Rectangle { + anchors.centerIn: parent + width: 200 + height: 20 + color: "green" + + TextEdit { + id: text + objectName: "text" + anchors.fill: parent + text: top.text + focus: true + } + } +} diff --git a/tests/auto/declarative/qdeclarativetextedit/data/http/ErrItem.qml b/tests/auto/declarative/qdeclarativetextedit/data/http/ErrItem.qml new file mode 100644 index 00000000..fa7dbd10 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextedit/data/http/ErrItem.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +Item{ + Fungus{ + palatable: false; + } +} diff --git a/tests/auto/declarative/qdeclarativetextedit/data/http/NormItem.qml b/tests/auto/declarative/qdeclarativetextedit/data/http/NormItem.qml new file mode 100644 index 00000000..49891935 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextedit/data/http/NormItem.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +Item { + objectName: "delegateOkay" + Rectangle { } +} diff --git a/tests/auto/declarative/qdeclarativetextedit/data/http/cursorHttpTest.qml b/tests/auto/declarative/qdeclarativetextedit/data/http/cursorHttpTest.qml new file mode 100644 index 00000000..724c058d --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextedit/data/http/cursorHttpTest.qml @@ -0,0 +1,22 @@ +import QtQuick 1.0 + +Rectangle { width: 300; height: 300; color: "white" + resources: [ + Component { id:cursorFail; FailItem { objectName: "delegateFail" } }, + Component { id:cursorWait; WaitItem { objectName: "delegateSlow" } }, + Component { id:cursorNorm; NormItem { objectName: "delegateOkay" } }, + Component { id:cursorErr; ErrItem { objectName: "delegateErrorA" } } + ] + TextEdit { + cursorDelegate: cursorFail + } + TextEdit { + cursorDelegate: cursorWait + } + TextEdit { + cursorDelegate: cursorNorm + } + TextEdit { + cursorDelegate: cursorErr + } +} diff --git a/tests/auto/declarative/qdeclarativetextedit/data/http/cursorHttpTestFail1.qml b/tests/auto/declarative/qdeclarativetextedit/data/http/cursorHttpTestFail1.qml new file mode 100644 index 00000000..6dcf7855 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextedit/data/http/cursorHttpTestFail1.qml @@ -0,0 +1,18 @@ +import QtQuick 1.0 + +Rectangle { width: 300; height: 300; color: "white" + resources: [ + Component { id:cursorFail; FailItem { objectName: "delegateFail" } }, + Component { id:cursorWait; WaitItem { objectName: "delegateSlow" } }, + Component { id:cursorNorm; NormItem { objectName: "delegateOkay" } } + ] + TextEdit { + cursorDelegate: cursorFail + } + TextEdit { + cursorDelegate: cursorWait + } + TextEdit { + cursorDelegate: cursorNorm + } +} diff --git a/tests/auto/declarative/qdeclarativetextedit/data/http/cursorHttpTestFail2.qml b/tests/auto/declarative/qdeclarativetextedit/data/http/cursorHttpTestFail2.qml new file mode 100644 index 00000000..5f441d0d --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextedit/data/http/cursorHttpTestFail2.qml @@ -0,0 +1,18 @@ +import QtQuick 1.0 + +Rectangle { width: 300; height: 300; color: "white" + resources: [ + Component { id:cursorWait; WaitItem { objectName: "delegateSlow" } }, + Component { id:cursorNorm; NormItem { objectName: "delegateOkay" } }, + Component { id:cursorErr; ErrItem { objectName: "delegateErrorA" } } + ] + TextEdit { + cursorDelegate: cursorWait + } + TextEdit { + cursorDelegate: cursorNorm + } + TextEdit { + cursorDelegate: cursorErr + } +} diff --git a/tests/auto/declarative/qdeclarativetextedit/data/http/cursorHttpTestPass.qml b/tests/auto/declarative/qdeclarativetextedit/data/http/cursorHttpTestPass.qml new file mode 100644 index 00000000..95f5d87e --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextedit/data/http/cursorHttpTestPass.qml @@ -0,0 +1,18 @@ +import QtQuick 1.0 + +Rectangle { width: 300; height: 300; color: "white" + resources: [ + Component { id:cursorWait; WaitItem { objectName: "delegateSlow" } }, + Component { id:cursorNorm; NormItem { objectName: "delegateOkay" } } + ] + TextEdit { + cursorDelegate: cursorWait + text: "Hello" + } + TextEdit { + objectName: "textEditObject" + cursorDelegate: cursorNorm + focus: true; + text: "Hello" + } +} diff --git a/tests/auto/declarative/qdeclarativetextedit/data/http/qmldir b/tests/auto/declarative/qdeclarativetextedit/data/http/qmldir new file mode 100644 index 00000000..886e6ffe --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextedit/data/http/qmldir @@ -0,0 +1,4 @@ +ErrItem ErrItem.qml +NormItem NormItem.qml +FailItem FailItem.qml +WaitItem WaitItem.qml diff --git a/tests/auto/declarative/qdeclarativetextedit/data/httpfail/FailItem.qml b/tests/auto/declarative/qdeclarativetextedit/data/httpfail/FailItem.qml new file mode 100644 index 00000000..466eb9d2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextedit/data/httpfail/FailItem.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +Item { + Rectangle { } +} diff --git a/tests/auto/declarative/qdeclarativetextedit/data/httpslow/WaitItem.qml b/tests/auto/declarative/qdeclarativetextedit/data/httpslow/WaitItem.qml new file mode 100644 index 00000000..466eb9d2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextedit/data/httpslow/WaitItem.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +Item { + Rectangle { } +} diff --git a/tests/auto/declarative/qdeclarativetextedit/data/inputmethodhints.qml b/tests/auto/declarative/qdeclarativetextedit/data/inputmethodhints.qml new file mode 100644 index 00000000..7df17f21 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextedit/data/inputmethodhints.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +TextEdit { + text: "Hello world!" + inputMethodHints: Qt.ImhNoPredictiveText +} diff --git a/tests/auto/declarative/qdeclarativetextedit/data/mouseselection_default.qml b/tests/auto/declarative/qdeclarativetextedit/data/mouseselection_default.qml new file mode 100644 index 00000000..22a98713 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextedit/data/mouseselection_default.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +TextEdit { + focus: true + text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + selectByMouse: false +} diff --git a/tests/auto/declarative/qdeclarativetextedit/data/mouseselection_false.qml b/tests/auto/declarative/qdeclarativetextedit/data/mouseselection_false.qml new file mode 100644 index 00000000..22a98713 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextedit/data/mouseselection_false.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +TextEdit { + focus: true + text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + selectByMouse: false +} diff --git a/tests/auto/declarative/qdeclarativetextedit/data/mouseselection_false_readonly.qml b/tests/auto/declarative/qdeclarativetextedit/data/mouseselection_false_readonly.qml new file mode 100644 index 00000000..4aea6116 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextedit/data/mouseselection_false_readonly.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 + +TextEdit { + focus: true + text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + selectByMouse: false + readOnly: true +} diff --git a/tests/auto/declarative/qdeclarativetextedit/data/mouseselection_false_words.qml b/tests/auto/declarative/qdeclarativetextedit/data/mouseselection_false_words.qml new file mode 100644 index 00000000..f8d2e4e2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextedit/data/mouseselection_false_words.qml @@ -0,0 +1,8 @@ +import QtQuick 1.1 + +TextEdit { + focus: true + text: "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ" + selectByMouse: false + mouseSelectionMode: TextEdit.SelectWords +} diff --git a/tests/auto/declarative/qdeclarativetextedit/data/mouseselection_multiline.qml b/tests/auto/declarative/qdeclarativetextedit/data/mouseselection_multiline.qml new file mode 100644 index 00000000..af23f6d9 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextedit/data/mouseselection_multiline.qml @@ -0,0 +1,8 @@ +import QtQuick 1.1 + +TextEdit { + focus: true + text: "0123456789ABCDEFGHIJKLMNOPQRS\nTUVWXYZ" + selectByMouse: true + mouseSelectionMode: TextInput.SelectWords +} diff --git a/tests/auto/declarative/qdeclarativetextedit/data/mouseselection_true.qml b/tests/auto/declarative/qdeclarativetextedit/data/mouseselection_true.qml new file mode 100644 index 00000000..d61da46f --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextedit/data/mouseselection_true.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +TextEdit { + focus: true + text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + selectByMouse: true +} diff --git a/tests/auto/declarative/qdeclarativetextedit/data/mouseselection_true_readonly.qml b/tests/auto/declarative/qdeclarativetextedit/data/mouseselection_true_readonly.qml new file mode 100644 index 00000000..959e6837 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextedit/data/mouseselection_true_readonly.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 + +TextEdit { + focus: true + text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + selectByMouse: true + readOnly: true +} diff --git a/tests/auto/declarative/qdeclarativetextedit/data/mouseselection_true_words.qml b/tests/auto/declarative/qdeclarativetextedit/data/mouseselection_true_words.qml new file mode 100644 index 00000000..f58fd458 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextedit/data/mouseselection_true_words.qml @@ -0,0 +1,8 @@ +import QtQuick 1.1 + +TextEdit { + focus: true + text: "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ" + selectByMouse: true + mouseSelectionMode: TextEdit.SelectWords +} diff --git a/tests/auto/declarative/qdeclarativetextedit/data/mouseselectionmode_characters.qml b/tests/auto/declarative/qdeclarativetextedit/data/mouseselectionmode_characters.qml new file mode 100644 index 00000000..5784e196 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextedit/data/mouseselectionmode_characters.qml @@ -0,0 +1,8 @@ +import QtQuick 1.1 + +TextEdit { + focus: true + text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + selectByMouse: true + mouseSelectionMode: TextEdit.SelectCharacters +} diff --git a/tests/auto/declarative/qdeclarativetextedit/data/mouseselectionmode_default.qml b/tests/auto/declarative/qdeclarativetextedit/data/mouseselectionmode_default.qml new file mode 100644 index 00000000..1e5f4aac --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextedit/data/mouseselectionmode_default.qml @@ -0,0 +1,7 @@ +import QtQuick 1.1 + +TextEdit { + focus: true + text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + selectByMouse: true +} diff --git a/tests/auto/declarative/qdeclarativetextedit/data/mouseselectionmode_words.qml b/tests/auto/declarative/qdeclarativetextedit/data/mouseselectionmode_words.qml new file mode 100644 index 00000000..4b25f2f8 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextedit/data/mouseselectionmode_words.qml @@ -0,0 +1,8 @@ +import QtQuick 1.1 + +TextEdit { + focus: true + text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + selectByMouse: true + mouseSelectionMode: TextEdit.SelectWords +} diff --git a/tests/auto/declarative/qdeclarativetextedit/data/navigation.qml b/tests/auto/declarative/qdeclarativetextedit/data/navigation.qml new file mode 100644 index 00000000..0e1caf6e --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextedit/data/navigation.qml @@ -0,0 +1,24 @@ +import QtQuick 1.0 + +Rectangle { + property variant myInput: input + + width: 800; height: 600; color: "blue" + + Item { + id: firstItem; + KeyNavigation.right: input + } + + TextEdit { id: input; focus: true + KeyNavigation.left: firstItem + KeyNavigation.right: lastItem + KeyNavigation.up: firstItem + KeyNavigation.down: lastItem + text: "a" + } + Item { + id: lastItem + KeyNavigation.left: input + } +} diff --git a/tests/auto/declarative/qdeclarativetextedit/data/positionAt.qml b/tests/auto/declarative/qdeclarativetextedit/data/positionAt.qml new file mode 100644 index 00000000..e0101356 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextedit/data/positionAt.qml @@ -0,0 +1,9 @@ +import QtQuick 1.0 + +TextEdit { + focus: true + objectName: "myInput" + width: 50 + height: 25 + text: "This is\n a long piece of text" +} diff --git a/tests/auto/declarative/qdeclarativetextedit/data/readOnly.qml b/tests/auto/declarative/qdeclarativetextedit/data/readOnly.qml new file mode 100644 index 00000000..36177d3b --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextedit/data/readOnly.qml @@ -0,0 +1,12 @@ +import QtQuick 1.0 + +Rectangle { + property variant myInput: input + + width: 800; height: 600; color: "blue" + + TextEdit { id: input; focus: true + readOnly: true + text: "I am the very model of a modern major general.\n" + } +} diff --git a/tests/auto/declarative/qdeclarativetextedit/qdeclarativetextedit.pro b/tests/auto/declarative/qdeclarativetextedit/qdeclarativetextedit.pro new file mode 100644 index 00000000..aaf753e6 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextedit/qdeclarativetextedit.pro @@ -0,0 +1,14 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative gui network +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativetextedit.cpp ../shared/testhttpserver.cpp +HEADERS += ../shared/testhttpserver.h + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} diff --git a/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp b/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp new file mode 100644 index 00000000..31da8323 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextedit/tst_qdeclarativetextedit.cpp @@ -0,0 +1,2819 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include "../../../shared/util.h" +#include "../shared/testhttpserver.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +Q_DECLARE_METATYPE(QDeclarativeTextEdit::SelectionMode) + +QString createExpectedFileIfNotFound(const QString& filebasename, const QImage& actual) +{ + // XXX This will be replaced by some clever persistent platform image store. + QString persistent_dir = SRCDIR "/data"; + QString arch = "unknown-architecture"; // QTest needs to help with this. + + QString expectfile = persistent_dir + QDir::separator() + filebasename + "-" + arch + ".png"; + + if (!QFile::exists(expectfile)) { + actual.save(expectfile); + qWarning() << "created" << expectfile; + } + + return expectfile; +} + + +class tst_qdeclarativetextedit : public QObject + +{ + Q_OBJECT +public: + tst_qdeclarativetextedit(); + +private slots: + void text(); + void width(); + void wrap(); + void textFormat(); + void alignments(); + void alignments_data(); + + // ### these tests may be trivial + void hAlign(); + void hAlign_RightToLeft(); + void vAlign(); + void font(); + void color(); + void textMargin(); + void persistentSelection(); + void focusOnPress(); + void selection(); + void isRightToLeft_data(); + void isRightToLeft(); + void keySelection(); + void moveCursorSelection_data(); + void moveCursorSelection(); + void moveCursorSelectionSequence_data(); + void moveCursorSelectionSequence(); + void mouseSelection_data(); + void mouseSelection(); + void multilineMouseSelection(); + void deferEnableSelectByMouse_data(); + void deferEnableSelectByMouse(); + void deferDisableSelectByMouse_data(); + void deferDisableSelectByMouse(); + void mouseSelectionMode_data(); + void mouseSelectionMode(); + void dragMouseSelection(); + void inputMethodHints(); + + void positionAt(); + + void cursorDelegate(); + void cursorVisible(); + void delegateLoading_data(); + void delegateLoading(); + void navigation(); + void readOnly(); + void copyAndPaste(); + void canPaste(); + void canPasteEmpty(); + void textInput(); + void openInputPanelOnClick(); + void openInputPanelOnFocus(); + void geometrySignals(); + void pastingRichText_QTBUG_14003(); + void implicitSize_data(); + void implicitSize(); + void implicitSizePreedit_data(); + void implicitSizePreedit(); + void testQtQuick11Attributes(); + void testQtQuick11Attributes_data(); + + void preeditMicroFocus(); + void inputContextMouseHandler(); + void inputMethodComposing(); + void cursorRectangleSize(); + void deselect(); + +private: + void simulateKey(QDeclarativeView *, int key, Qt::KeyboardModifiers modifiers = 0); + QDeclarativeView *createView(const QString &filename); + + QStringList standard; + QStringList richText; + + QStringList hAlignmentStrings; + QStringList vAlignmentStrings; + + QList vAlignments; + QList hAlignments; + + QStringList colorStrings; + + QDeclarativeEngine engine; +}; + +tst_qdeclarativetextedit::tst_qdeclarativetextedit() +{ + standard << "the quick brown fox jumped over the lazy dog" + << "the quick brown fox\n jumped over the lazy dog" + << "Hello, world!" + << "!dlrow ,olleH"; + + richText << "the quick brown fox jumped over the lazy dog" + << "the quick brown fox
jumped over the lazy dog
"; + + hAlignmentStrings << "AlignLeft" + << "AlignRight" + << "AlignHCenter"; + + vAlignmentStrings << "AlignTop" + << "AlignBottom" + << "AlignVCenter"; + + hAlignments << Qt::AlignLeft + << Qt::AlignRight + << Qt::AlignHCenter; + + vAlignments << Qt::AlignTop + << Qt::AlignBottom + << Qt::AlignVCenter; + + colorStrings << "aliceblue" + << "antiquewhite" + << "aqua" + << "darkkhaki" + << "darkolivegreen" + << "dimgray" + << "palevioletred" + << "lightsteelblue" + << "#000000" + << "#AAAAAA" + << "#FFFFFF" + << "#2AC05F"; + // + // need a different test to do alpha channel test + // << "#AA0011DD" + // << "#00F16B11"; + // +} + +void tst_qdeclarativetextedit::text() +{ + { + QDeclarativeComponent texteditComponent(&engine); + texteditComponent.setData("import QtQuick 1.0\nTextEdit { text: \"\" }", QUrl()); + QDeclarativeTextEdit *textEditObject = qobject_cast(texteditComponent.create()); + + QVERIFY(textEditObject != 0); + QCOMPARE(textEditObject->text(), QString("")); + } + + for (int i = 0; i < standard.size(); i++) + { + QString componentStr = "import QtQuick 1.0\nTextEdit { text: \"" + standard.at(i) + "\" }"; + QDeclarativeComponent texteditComponent(&engine); + texteditComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextEdit *textEditObject = qobject_cast(texteditComponent.create()); + + QVERIFY(textEditObject != 0); + QCOMPARE(textEditObject->text(), standard.at(i)); + } + + for (int i = 0; i < richText.size(); i++) + { + QString componentStr = "import QtQuick 1.0\nTextEdit { text: \"" + richText.at(i) + "\" }"; + QDeclarativeComponent texteditComponent(&engine); + texteditComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextEdit *textEditObject = qobject_cast(texteditComponent.create()); + + QVERIFY(textEditObject != 0); + QString actual = textEditObject->text(); + QString expected = richText.at(i); + actual.replace(QRegExp(".*]*>"),""); + actual.replace(QRegExp("(<[^>]*>)+"),"<>"); + expected.replace(QRegExp("(<[^>]*>)+"),"<>"); + QCOMPARE(actual.simplified(),expected.simplified()); + } +} + +void tst_qdeclarativetextedit::width() +{ + // uses Font metrics to find the width for standard and document to find the width for rich + { + QDeclarativeComponent texteditComponent(&engine); + texteditComponent.setData("import QtQuick 1.0\nTextEdit { text: \"\" }", QUrl()); + QDeclarativeTextEdit *textEditObject = qobject_cast(texteditComponent.create()); + + QVERIFY(textEditObject != 0); + QCOMPARE(textEditObject->width(), 0.0); + } + + for (int i = 0; i < standard.size(); i++) + { + QFont f; + QFontMetricsF fm(f); + qreal metricWidth = fm.size(Qt::TextExpandTabs && Qt::TextShowMnemonic, standard.at(i)).width(); + metricWidth = ceil(metricWidth); + + QString componentStr = "import QtQuick 1.0\nTextEdit { text: \"" + standard.at(i) + "\" }"; + QDeclarativeComponent texteditComponent(&engine); + texteditComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextEdit *textEditObject = qobject_cast(texteditComponent.create()); + + QVERIFY(textEditObject != 0); + QCOMPARE(textEditObject->width(), qreal(metricWidth)); + } + + for (int i = 0; i < richText.size(); i++) + { + QTextDocument document; + document.setHtml(richText.at(i)); + document.setDocumentMargin(0); + + int documentWidth = ceil(document.idealWidth()); + + QString componentStr = "import QtQuick 1.0\nTextEdit { text: \"" + richText.at(i) + "\" }"; + QDeclarativeComponent texteditComponent(&engine); + texteditComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextEdit *textEditObject = qobject_cast(texteditComponent.create()); + + QVERIFY(textEditObject != 0); + QCOMPARE(textEditObject->width(), qreal(documentWidth)); + } +} + +void tst_qdeclarativetextedit::wrap() +{ + // for specified width and wrap set true + { + QDeclarativeComponent texteditComponent(&engine); + texteditComponent.setData("import QtQuick 1.0\nTextEdit { text: \"\"; wrapMode: TextEdit.WordWrap; width: 300 }", QUrl()); + QDeclarativeTextEdit *textEditObject = qobject_cast(texteditComponent.create()); + + QVERIFY(textEditObject != 0); + QCOMPARE(textEditObject->width(), 300.); + } + + for (int i = 0; i < standard.size(); i++) + { + QString componentStr = "import QtQuick 1.0\nTextEdit { wrapMode: TextEdit.WordWrap; width: 300; text: \"" + standard.at(i) + "\" }"; + QDeclarativeComponent texteditComponent(&engine); + texteditComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextEdit *textEditObject = qobject_cast(texteditComponent.create()); + + QVERIFY(textEditObject != 0); + QCOMPARE(textEditObject->width(), 300.); + } + + for (int i = 0; i < richText.size(); i++) + { + QString componentStr = "import QtQuick 1.0\nTextEdit { wrapMode: TextEdit.WordWrap; width: 300; text: \"" + richText.at(i) + "\" }"; + QDeclarativeComponent texteditComponent(&engine); + texteditComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextEdit *textEditObject = qobject_cast(texteditComponent.create()); + + QVERIFY(textEditObject != 0); + QCOMPARE(textEditObject->width(), 300.); + } + +} + +void tst_qdeclarativetextedit::textFormat() +{ + { + QDeclarativeComponent textComponent(&engine); + textComponent.setData("import QtQuick 1.0\nTextEdit { text: \"Hello\"; textFormat: Text.RichText }", QUrl::fromLocalFile("")); + QDeclarativeTextEdit *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + QVERIFY(textObject->textFormat() == QDeclarativeTextEdit::RichText); + } + { + QDeclarativeComponent textComponent(&engine); + textComponent.setData("import QtQuick 1.0\nTextEdit { text: \"Hello\"; textFormat: Text.PlainText }", QUrl::fromLocalFile("")); + QDeclarativeTextEdit *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject != 0); + QVERIFY(textObject->textFormat() == QDeclarativeTextEdit::PlainText); + } +} + +void tst_qdeclarativetextedit::alignments_data() +{ + QTest::addColumn("hAlign"); + QTest::addColumn("vAlign"); + QTest::addColumn("expectfile"); + + QTest::newRow("LT") << int(Qt::AlignLeft) << int(Qt::AlignTop) << "alignments_lt"; + QTest::newRow("RT") << int(Qt::AlignRight) << int(Qt::AlignTop) << "alignments_rt"; + QTest::newRow("CT") << int(Qt::AlignHCenter) << int(Qt::AlignTop) << "alignments_ct"; + + QTest::newRow("LB") << int(Qt::AlignLeft) << int(Qt::AlignBottom) << "alignments_lb"; + QTest::newRow("RB") << int(Qt::AlignRight) << int(Qt::AlignBottom) << "alignments_rb"; + QTest::newRow("CB") << int(Qt::AlignHCenter) << int(Qt::AlignBottom) << "alignments_cb"; + + QTest::newRow("LC") << int(Qt::AlignLeft) << int(Qt::AlignVCenter) << "alignments_lc"; + QTest::newRow("RC") << int(Qt::AlignRight) << int(Qt::AlignVCenter) << "alignments_rc"; + QTest::newRow("CC") << int(Qt::AlignHCenter) << int(Qt::AlignVCenter) << "alignments_cc"; +} + + +void tst_qdeclarativetextedit::alignments() +{ + QFETCH(int, hAlign); + QFETCH(int, vAlign); + QFETCH(QString, expectfile); + + QDeclarativeView *canvas = createView(SRCDIR "/data/alignments.qml"); + + canvas->show(); + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(canvas)); + + QObject *ob = canvas->rootObject(); + QVERIFY(ob != 0); + ob->setProperty("horizontalAlignment",hAlign); + ob->setProperty("verticalAlignment",vAlign); + QTRY_COMPARE(ob->property("running").toBool(),false); + QImage actual(canvas->width(), canvas->height(), QImage::Format_RGB32); + actual.fill(qRgb(255,255,255)); + QPainter p(&actual); + canvas->render(&p); + + expectfile = createExpectedFileIfNotFound(expectfile, actual); + + QImage expect(expectfile); + + QCOMPARE(actual,expect); + + delete canvas; +} + + +//the alignment tests may be trivial o.oa +void tst_qdeclarativetextedit::hAlign() +{ + //test one align each, and then test if two align fails. + + for (int i = 0; i < standard.size(); i++) + { + for (int j=0; j < hAlignmentStrings.size(); j++) + { + QString componentStr = "import QtQuick 1.0\nTextEdit { horizontalAlignment: \"" + hAlignmentStrings.at(j) + "\"; text: \"" + standard.at(i) + "\" }"; + QDeclarativeComponent texteditComponent(&engine); + texteditComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextEdit *textEditObject = qobject_cast(texteditComponent.create()); + + QVERIFY(textEditObject != 0); + QCOMPARE((int)textEditObject->hAlign(), (int)hAlignments.at(j)); + } + } + + for (int i = 0; i < richText.size(); i++) + { + for (int j=0; j < hAlignmentStrings.size(); j++) + { + QString componentStr = "import QtQuick 1.0\nTextEdit { horizontalAlignment: \"" + hAlignmentStrings.at(j) + "\"; text: \"" + richText.at(i) + "\" }"; + QDeclarativeComponent texteditComponent(&engine); + texteditComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextEdit *textEditObject = qobject_cast(texteditComponent.create()); + + QVERIFY(textEditObject != 0); + QCOMPARE((int)textEditObject->hAlign(), (int)hAlignments.at(j)); + } + } + +} + +void tst_qdeclarativetextedit::hAlign_RightToLeft() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/horizontalAlignment_RightToLeft.qml"); + QDeclarativeTextEdit *textEdit = canvas->rootObject()->findChild("text"); + QVERIFY(textEdit != 0); + canvas->show(); + + const QString rtlText = textEdit->text(); + + // implicit alignment should follow the reading direction of text + QCOMPARE(textEdit->hAlign(), QDeclarativeTextEdit::AlignRight); + QVERIFY(textEdit->positionToRectangle(0).x() > canvas->width()/2); + + // explicitly left aligned + textEdit->setHAlign(QDeclarativeTextEdit::AlignLeft); + QCOMPARE(textEdit->hAlign(), QDeclarativeTextEdit::AlignLeft); + QVERIFY(textEdit->positionToRectangle(0).x() < canvas->width()/2); + + // explicitly right aligned + textEdit->setHAlign(QDeclarativeTextEdit::AlignRight); + QCOMPARE(textEdit->hAlign(), QDeclarativeTextEdit::AlignRight); + QVERIFY(textEdit->positionToRectangle(0).x() > canvas->width()/2); + + QString textString = textEdit->text(); + textEdit->setText(QString("") + textString + QString("")); + textEdit->resetHAlign(); + + // implicitly aligned rich text should follow the reading direction of RTL text + QCOMPARE(textEdit->hAlign(), QDeclarativeTextEdit::AlignRight); + QCOMPARE(textEdit->effectiveHAlign(), textEdit->hAlign()); + QVERIFY(textEdit->positionToRectangle(0).x() > canvas->width()/2); + + // explicitly left aligned rich text + textEdit->setHAlign(QDeclarativeTextEdit::AlignLeft); + QCOMPARE(textEdit->hAlign(), QDeclarativeTextEdit::AlignLeft); + QCOMPARE(textEdit->effectiveHAlign(), textEdit->hAlign()); + QVERIFY(textEdit->positionToRectangle(0).x() < canvas->width()/2); + + // explicitly right aligned rich text + textEdit->setHAlign(QDeclarativeTextEdit::AlignRight); + QCOMPARE(textEdit->hAlign(), QDeclarativeTextEdit::AlignRight); + QCOMPARE(textEdit->effectiveHAlign(), textEdit->hAlign()); + QVERIFY(textEdit->positionToRectangle(0).x() > canvas->width()/2); + + textEdit->setText(textString); + + // explicitly center aligned + textEdit->setHAlign(QDeclarativeTextEdit::AlignHCenter); + QCOMPARE(textEdit->hAlign(), QDeclarativeTextEdit::AlignHCenter); + QVERIFY(textEdit->positionToRectangle(0).x() > canvas->width()/2); + + // reseted alignment should go back to following the text reading direction + textEdit->resetHAlign(); + QCOMPARE(textEdit->hAlign(), QDeclarativeTextEdit::AlignRight); + QVERIFY(textEdit->positionToRectangle(0).x() > canvas->width()/2); + + // mirror the text item + QDeclarativeItemPrivate::get(textEdit)->setLayoutMirror(true); + + // mirrored implicit alignment should continue to follow the reading direction of the text + QCOMPARE(textEdit->hAlign(), QDeclarativeTextEdit::AlignRight); + QCOMPARE(textEdit->effectiveHAlign(), QDeclarativeTextEdit::AlignRight); + QVERIFY(textEdit->positionToRectangle(0).x() > canvas->width()/2); + + // mirrored explicitly right aligned behaves as left aligned + textEdit->setHAlign(QDeclarativeTextEdit::AlignRight); + QCOMPARE(textEdit->hAlign(), QDeclarativeTextEdit::AlignRight); + QCOMPARE(textEdit->effectiveHAlign(), QDeclarativeTextEdit::AlignLeft); + QVERIFY(textEdit->positionToRectangle(0).x() < canvas->width()/2); + + // mirrored explicitly left aligned behaves as right aligned + textEdit->setHAlign(QDeclarativeTextEdit::AlignLeft); + QCOMPARE(textEdit->hAlign(), QDeclarativeTextEdit::AlignLeft); + QCOMPARE(textEdit->effectiveHAlign(), QDeclarativeTextEdit::AlignRight); + QVERIFY(textEdit->positionToRectangle(0).x() > canvas->width()/2); + + // disable mirroring + QDeclarativeItemPrivate::get(textEdit)->setLayoutMirror(false); + textEdit->resetHAlign(); + + // English text should be implicitly left aligned + textEdit->setText("Hello world!"); + QCOMPARE(textEdit->hAlign(), QDeclarativeTextEdit::AlignLeft); + QVERIFY(textEdit->positionToRectangle(0).x() < canvas->width()/2); + + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(canvas)); + + textEdit->setText(QString()); + { QInputMethodEvent ev(rtlText, QList()); QApplication::sendEvent(canvas, &ev); } + QCOMPARE(textEdit->hAlign(), QDeclarativeTextEdit::AlignRight); + { QInputMethodEvent ev("Hello world!", QList()); QApplication::sendEvent(canvas, &ev); } + QCOMPARE(textEdit->hAlign(), QDeclarativeTextEdit::AlignLeft); + +#ifndef Q_OS_MAC // QTBUG-18040 + // empty text with implicit alignment follows the system locale-based + // keyboard input direction from QApplication::keyboardInputDirection + textEdit->setText(""); + QCOMPARE(textEdit->hAlign(), QApplication::keyboardInputDirection() == Qt::LeftToRight ? + QDeclarativeTextEdit::AlignLeft : QDeclarativeTextEdit::AlignRight); + if (QApplication::keyboardInputDirection() == Qt::LeftToRight) + QVERIFY(textEdit->positionToRectangle(0).x() < canvas->width()/2); + else + QVERIFY(textEdit->positionToRectangle(0).x() > canvas->width()/2); + textEdit->setHAlign(QDeclarativeTextEdit::AlignRight); + QCOMPARE(textEdit->hAlign(), QDeclarativeTextEdit::AlignRight); + QVERIFY(textEdit->positionToRectangle(0).x() > canvas->width()/2); +#endif + + delete canvas; + +#ifndef Q_OS_MAC // QTBUG-18040 + // alignment of TextEdit with no text set to it + QString componentStr = "import QtQuick 1.0\nTextEdit {}"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeTextEdit *textObject = qobject_cast(textComponent.create()); + QCOMPARE(textObject->hAlign(), QApplication::keyboardInputDirection() == Qt::LeftToRight ? + QDeclarativeTextEdit::AlignLeft : QDeclarativeTextEdit::AlignRight); + delete textObject; +#endif +} + +void tst_qdeclarativetextedit::vAlign() +{ + //test one align each, and then test if two align fails. + + for (int i = 0; i < standard.size(); i++) + { + for (int j=0; j < vAlignmentStrings.size(); j++) + { + QString componentStr = "import QtQuick 1.0\nTextEdit { verticalAlignment: \"" + vAlignmentStrings.at(j) + "\"; text: \"" + standard.at(i) + "\" }"; + QDeclarativeComponent texteditComponent(&engine); + texteditComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextEdit *textEditObject = qobject_cast(texteditComponent.create()); + + QVERIFY(textEditObject != 0); + QCOMPARE((int)textEditObject->vAlign(), (int)vAlignments.at(j)); + } + } + + for (int i = 0; i < richText.size(); i++) + { + for (int j=0; j < vAlignmentStrings.size(); j++) + { + QString componentStr = "import QtQuick 1.0\nTextEdit { verticalAlignment: \"" + vAlignmentStrings.at(j) + "\"; text: \"" + richText.at(i) + "\" }"; + QDeclarativeComponent texteditComponent(&engine); + texteditComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextEdit *textEditObject = qobject_cast(texteditComponent.create()); + + QVERIFY(textEditObject != 0); + QCOMPARE((int)textEditObject->vAlign(), (int)vAlignments.at(j)); + } + } + +} + +void tst_qdeclarativetextedit::font() +{ + //test size, then bold, then italic, then family + { + QString componentStr = "import QtQuick 1.0\nTextEdit { font.pointSize: 40; text: \"Hello World\" }"; + QDeclarativeComponent texteditComponent(&engine); + texteditComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextEdit *textEditObject = qobject_cast(texteditComponent.create()); + + QVERIFY(textEditObject != 0); + QCOMPARE(textEditObject->font().pointSize(), 40); + QCOMPARE(textEditObject->font().bold(), false); + QCOMPARE(textEditObject->font().italic(), false); + } + + { + QString componentStr = "import QtQuick 1.0\nTextEdit { font.bold: true; text: \"Hello World\" }"; + QDeclarativeComponent texteditComponent(&engine); + texteditComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextEdit *textEditObject = qobject_cast(texteditComponent.create()); + + QVERIFY(textEditObject != 0); + QCOMPARE(textEditObject->font().bold(), true); + QCOMPARE(textEditObject->font().italic(), false); + } + + { + QString componentStr = "import QtQuick 1.0\nTextEdit { font.italic: true; text: \"Hello World\" }"; + QDeclarativeComponent texteditComponent(&engine); + texteditComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextEdit *textEditObject = qobject_cast(texteditComponent.create()); + + QVERIFY(textEditObject != 0); + QCOMPARE(textEditObject->font().italic(), true); + QCOMPARE(textEditObject->font().bold(), false); + } + + { + QString componentStr = "import QtQuick 1.0\nTextEdit { font.family: \"Helvetica\"; text: \"Hello World\" }"; + QDeclarativeComponent texteditComponent(&engine); + texteditComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextEdit *textEditObject = qobject_cast(texteditComponent.create()); + + QVERIFY(textEditObject != 0); + QCOMPARE(textEditObject->font().family(), QString("Helvetica")); + QCOMPARE(textEditObject->font().bold(), false); + QCOMPARE(textEditObject->font().italic(), false); + } + + { + QString componentStr = "import QtQuick 1.0\nTextEdit { font.family: \"\"; text: \"Hello World\" }"; + QDeclarativeComponent texteditComponent(&engine); + texteditComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextEdit *textEditObject = qobject_cast(texteditComponent.create()); + + QVERIFY(textEditObject != 0); + QCOMPARE(textEditObject->font().family(), QString("")); + } +} + +void tst_qdeclarativetextedit::color() +{ + //test initial color + { + QString componentStr = "import QtQuick 1.0\nTextEdit { text: \"Hello World\" }"; + QDeclarativeComponent texteditComponent(&engine); + texteditComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextEdit *textEditObject = qobject_cast(texteditComponent.create()); + + QDeclarativeTextEditPrivate *textEditPrivate = static_cast(QDeclarativeItemPrivate::get(textEditObject)); + + QVERIFY(textEditObject); + QVERIFY(textEditPrivate); + QVERIFY(textEditPrivate->control); + + QPalette pal = textEditPrivate->control->palette(); + QCOMPARE(textEditPrivate->color, QColor("black")); + QCOMPARE(textEditPrivate->color, pal.color(QPalette::Text)); + } + //test normal + for (int i = 0; i < colorStrings.size(); i++) + { + QString componentStr = "import QtQuick 1.0\nTextEdit { color: \"" + colorStrings.at(i) + "\"; text: \"Hello World\" }"; + QDeclarativeComponent texteditComponent(&engine); + texteditComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextEdit *textEditObject = qobject_cast(texteditComponent.create()); + //qDebug() << "textEditObject: " << textEditObject->color() << "vs. " << QColor(colorStrings.at(i)); + QVERIFY(textEditObject != 0); + QCOMPARE(textEditObject->color(), QColor(colorStrings.at(i))); + } + + //test selection + for (int i = 0; i < colorStrings.size(); i++) + { + QString componentStr = "import QtQuick 1.0\nTextEdit { selectionColor: \"" + colorStrings.at(i) + "\"; text: \"Hello World\" }"; + QDeclarativeComponent texteditComponent(&engine); + texteditComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextEdit *textEditObject = qobject_cast(texteditComponent.create()); + QVERIFY(textEditObject != 0); + QCOMPARE(textEditObject->selectionColor(), QColor(colorStrings.at(i))); + } + + //test selected text + for (int i = 0; i < colorStrings.size(); i++) + { + QString componentStr = "import QtQuick 1.0\nTextEdit { selectedTextColor: \"" + colorStrings.at(i) + "\"; text: \"Hello World\" }"; + QDeclarativeComponent texteditComponent(&engine); + texteditComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextEdit *textEditObject = qobject_cast(texteditComponent.create()); + QVERIFY(textEditObject != 0); + QCOMPARE(textEditObject->selectedTextColor(), QColor(colorStrings.at(i))); + } + + { + QString colorStr = "#AA001234"; + QColor testColor("#001234"); + testColor.setAlpha(170); + + QString componentStr = "import QtQuick 1.0\nTextEdit { color: \"" + colorStr + "\"; text: \"Hello World\" }"; + QDeclarativeComponent texteditComponent(&engine); + texteditComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextEdit *textEditObject = qobject_cast(texteditComponent.create()); + + QVERIFY(textEditObject != 0); + QCOMPARE(textEditObject->color(), testColor); + } +} + +void tst_qdeclarativetextedit::textMargin() +{ + for(qreal i=0; i<=10; i+=0.3){ + QString componentStr = "import QtQuick 1.0\nTextEdit { textMargin: " + QString::number(i) + "; text: \"Hello World\" }"; + QDeclarativeComponent texteditComponent(&engine); + texteditComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextEdit *textEditObject = qobject_cast(texteditComponent.create()); + QVERIFY(textEditObject != 0); + QCOMPARE(textEditObject->textMargin(), i); + } +} + +void tst_qdeclarativetextedit::persistentSelection() +{ + { + QString componentStr = "import QtQuick 1.0\nTextEdit { persistentSelection: true; text: \"Hello World\" }"; + QDeclarativeComponent texteditComponent(&engine); + texteditComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextEdit *textEditObject = qobject_cast(texteditComponent.create()); + QVERIFY(textEditObject != 0); + QCOMPARE(textEditObject->persistentSelection(), true); + } + + { + QString componentStr = "import QtQuick 1.0\nTextEdit { persistentSelection: false; text: \"Hello World\" }"; + QDeclarativeComponent texteditComponent(&engine); + texteditComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextEdit *textEditObject = qobject_cast(texteditComponent.create()); + QVERIFY(textEditObject != 0); + QCOMPARE(textEditObject->persistentSelection(), false); + } +} + +void tst_qdeclarativetextedit::focusOnPress() +{ + { + QString componentStr = "import QtQuick 1.0\nTextEdit { activeFocusOnPress: true; text: \"Hello World\" }"; + QDeclarativeComponent texteditComponent(&engine); + texteditComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextEdit *textEditObject = qobject_cast(texteditComponent.create()); + QVERIFY(textEditObject != 0); + QCOMPARE(textEditObject->focusOnPress(), true); + } + + { + QString componentStr = "import QtQuick 1.0\nTextEdit { activeFocusOnPress: false; text: \"Hello World\" }"; + QDeclarativeComponent texteditComponent(&engine); + texteditComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextEdit *textEditObject = qobject_cast(texteditComponent.create()); + QVERIFY(textEditObject != 0); + QCOMPARE(textEditObject->focusOnPress(), false); + } +} + +void tst_qdeclarativetextedit::selection() +{ + QString testStr = standard[0];//TODO: What should happen for multiline/rich text? + QString componentStr = "import QtQuick 1.0\nTextEdit { text: \""+ testStr +"\"; }"; + QDeclarativeComponent texteditComponent(&engine); + texteditComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextEdit *textEditObject = qobject_cast(texteditComponent.create()); + QVERIFY(textEditObject != 0); + + + //Test selection follows cursor + for(int i=0; i<= testStr.size(); i++) { + textEditObject->setCursorPosition(i); + QCOMPARE(textEditObject->cursorPosition(), i); + QCOMPARE(textEditObject->selectionStart(), i); + QCOMPARE(textEditObject->selectionEnd(), i); + QVERIFY(textEditObject->selectedText().isNull()); + } + //Test cursor follows selection + for(int i=0; i<= testStr.size(); i++) { + textEditObject->select(i,i); + QCOMPARE(textEditObject->cursorPosition(), i); + QCOMPARE(textEditObject->selectionStart(), i); + QCOMPARE(textEditObject->selectionEnd(), i); + } + + + textEditObject->setCursorPosition(0); + QVERIFY(textEditObject->cursorPosition() == 0); + QVERIFY(textEditObject->selectionStart() == 0); + QVERIFY(textEditObject->selectionEnd() == 0); + QVERIFY(textEditObject->selectedText().isNull()); + + // Verify invalid positions are ignored. + textEditObject->setCursorPosition(-1); + QVERIFY(textEditObject->cursorPosition() == 0); + QVERIFY(textEditObject->selectionStart() == 0); + QVERIFY(textEditObject->selectionEnd() == 0); + QVERIFY(textEditObject->selectedText().isNull()); + + textEditObject->setCursorPosition(textEditObject->text().count()+1); + QVERIFY(textEditObject->cursorPosition() == 0); + QVERIFY(textEditObject->selectionStart() == 0); + QVERIFY(textEditObject->selectionEnd() == 0); + QVERIFY(textEditObject->selectedText().isNull()); + + //Test selection + for(int i=0; i<= testStr.size(); i++) { + textEditObject->select(0,i); + QCOMPARE(testStr.mid(0,i), textEditObject->selectedText()); + QCOMPARE(textEditObject->cursorPosition(), i); + } + for(int i=0; i<= testStr.size(); i++) { + textEditObject->select(i,testStr.size()); + QCOMPARE(testStr.mid(i,testStr.size()-i), textEditObject->selectedText()); + QCOMPARE(textEditObject->cursorPosition(), testStr.size()); + } + + textEditObject->setCursorPosition(0); + QVERIFY(textEditObject->cursorPosition() == 0); + QVERIFY(textEditObject->selectionStart() == 0); + QVERIFY(textEditObject->selectionEnd() == 0); + QVERIFY(textEditObject->selectedText().isNull()); + + //Test Error Ignoring behaviour + textEditObject->setCursorPosition(0); + QVERIFY(textEditObject->selectedText().isNull()); + textEditObject->select(-10,0); + QVERIFY(textEditObject->selectedText().isNull()); + textEditObject->select(100,101); + QVERIFY(textEditObject->selectedText().isNull()); + textEditObject->select(0,-10); + QVERIFY(textEditObject->selectedText().isNull()); + textEditObject->select(0,100); + QVERIFY(textEditObject->selectedText().isNull()); + textEditObject->select(0,10); + QVERIFY(textEditObject->selectedText().size() == 10); + textEditObject->select(-10,0); + QVERIFY(textEditObject->selectedText().size() == 10); + textEditObject->select(100,101); + QVERIFY(textEditObject->selectedText().size() == 10); + textEditObject->select(0,-10); + QVERIFY(textEditObject->selectedText().size() == 10); + textEditObject->select(0,100); + QVERIFY(textEditObject->selectedText().size() == 10); + + textEditObject->deselect(); + QVERIFY(textEditObject->selectedText().isNull()); + textEditObject->select(0,10); + QVERIFY(textEditObject->selectedText().size() == 10); + textEditObject->deselect(); + QVERIFY(textEditObject->selectedText().isNull()); +} + +void tst_qdeclarativetextedit::isRightToLeft_data() +{ + QTest::addColumn("text"); + QTest::addColumn("emptyString"); + QTest::addColumn("firstCharacter"); + QTest::addColumn("lastCharacter"); + QTest::addColumn("middleCharacter"); + QTest::addColumn("startString"); + QTest::addColumn("midString"); + QTest::addColumn("endString"); + + const quint16 arabic_str[] = { 0x0638, 0x0643, 0x00646, 0x0647, 0x0633, 0x0638, 0x0643, 0x00646, 0x0647, 0x0633, 0x0647}; + QTest::newRow("Empty") << "" << false << false << false << false << false << false << false; + QTest::newRow("Neutral") << "23244242" << false << false << false << false << false << false << false; + QTest::newRow("LTR") << "Hello world" << false << false << false << false << false << false << false; + QTest::newRow("RTL") << QString::fromUtf16(arabic_str, 11) << false << true << true << true << true << true << true; + QTest::newRow("Bidi RTL + LTR + RTL") << QString::fromUtf16(arabic_str, 11) + QString("Hello world") + QString::fromUtf16(arabic_str, 11) << false << true << true << false << true << true << true; + QTest::newRow("Bidi LTR + RTL + LTR") << QString("Hello world") + QString::fromUtf16(arabic_str, 11) + QString("Hello world") << false << false << false << true << false << false << false; +} + +void tst_qdeclarativetextedit::isRightToLeft() +{ + QFETCH(QString, text); + QFETCH(bool, emptyString); + QFETCH(bool, firstCharacter); + QFETCH(bool, lastCharacter); + QFETCH(bool, middleCharacter); + QFETCH(bool, startString); + QFETCH(bool, midString); + QFETCH(bool, endString); + + QDeclarativeTextEdit textEdit; + textEdit.setText(text); + + // first test that the right string is delivered to the QString::isRightToLeft() + QCOMPARE(textEdit.isRightToLeft(0,0), text.mid(0,0).isRightToLeft()); + QCOMPARE(textEdit.isRightToLeft(0,1), text.mid(0,1).isRightToLeft()); + QCOMPARE(textEdit.isRightToLeft(text.count()-2, text.count()-1), text.mid(text.count()-2, text.count()-1).isRightToLeft()); + QCOMPARE(textEdit.isRightToLeft(text.count()/2, text.count()/2 + 1), text.mid(text.count()/2, text.count()/2 + 1).isRightToLeft()); + QCOMPARE(textEdit.isRightToLeft(0,text.count()/4), text.mid(0,text.count()/4).isRightToLeft()); + QCOMPARE(textEdit.isRightToLeft(text.count()/4,3*text.count()/4), text.mid(text.count()/4,3*text.count()/4).isRightToLeft()); + if (text.isEmpty()) + QTest::ignoreMessage(QtWarningMsg, ": QML TextEdit: isRightToLeft(start, end) called with the end property being smaller than the start."); + QCOMPARE(textEdit.isRightToLeft(3*text.count()/4,text.count()-1), text.mid(3*text.count()/4,text.count()-1).isRightToLeft()); + + // then test that the feature actually works + QCOMPARE(textEdit.isRightToLeft(0,0), emptyString); + QCOMPARE(textEdit.isRightToLeft(0,1), firstCharacter); + QCOMPARE(textEdit.isRightToLeft(text.count()-2, text.count()-1), lastCharacter); + QCOMPARE(textEdit.isRightToLeft(text.count()/2, text.count()/2 + 1), middleCharacter); + QCOMPARE(textEdit.isRightToLeft(0,text.count()/4), startString); + QCOMPARE(textEdit.isRightToLeft(text.count()/4,3*text.count()/4), midString); + if (text.isEmpty()) + QTest::ignoreMessage(QtWarningMsg, ": QML TextEdit: isRightToLeft(start, end) called with the end property being smaller than the start."); + QCOMPARE(textEdit.isRightToLeft(3*text.count()/4,text.count()-1), endString); +} + +void tst_qdeclarativetextedit::keySelection() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/navigation.qml"); + canvas->show(); + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(canvas)); + canvas->setFocus(); + + QVERIFY(canvas->rootObject() != 0); + + QDeclarativeTextEdit *input = qobject_cast(qvariant_cast(canvas->rootObject()->property("myInput"))); + + QVERIFY(input != 0); + QTRY_VERIFY(input->hasActiveFocus() == true); + + QSignalSpy spy(input, SIGNAL(selectionChanged())); + + simulateKey(canvas, Qt::Key_Right, Qt::ShiftModifier); + QVERIFY(input->hasActiveFocus() == true); + QCOMPARE(input->selectedText(), QString("a")); + QCOMPARE(spy.count(), 1); + simulateKey(canvas, Qt::Key_Right); + QVERIFY(input->hasActiveFocus() == true); + QCOMPARE(input->selectedText(), QString()); + QCOMPARE(spy.count(), 2); + simulateKey(canvas, Qt::Key_Right); + QVERIFY(input->hasActiveFocus() == false); + QCOMPARE(input->selectedText(), QString()); + QCOMPARE(spy.count(), 2); + + simulateKey(canvas, Qt::Key_Left); + QVERIFY(input->hasActiveFocus() == true); + QCOMPARE(spy.count(), 2); + simulateKey(canvas, Qt::Key_Left, Qt::ShiftModifier); + QVERIFY(input->hasActiveFocus() == true); + QCOMPARE(input->selectedText(), QString("a")); + QCOMPARE(spy.count(), 3); + simulateKey(canvas, Qt::Key_Left); + QVERIFY(input->hasActiveFocus() == true); + QCOMPARE(input->selectedText(), QString()); + QCOMPARE(spy.count(), 4); + simulateKey(canvas, Qt::Key_Left); + QVERIFY(input->hasActiveFocus() == false); + QCOMPARE(input->selectedText(), QString()); + QCOMPARE(spy.count(), 4); + + delete canvas; +} + +void tst_qdeclarativetextedit::moveCursorSelection_data() +{ + QTest::addColumn("testStr"); + QTest::addColumn("cursorPosition"); + QTest::addColumn("movePosition"); + QTest::addColumn("mode"); + QTest::addColumn("selectionStart"); + QTest::addColumn("selectionEnd"); + QTest::addColumn("reversible"); + + QTest::newRow("(t)he|characters") + << standard[0] << 0 << 1 << QDeclarativeTextEdit::SelectCharacters << 0 << 1 << true; + QTest::newRow("do(g)|characters") + << standard[0] << 43 << 44 << QDeclarativeTextEdit::SelectCharacters << 43 << 44 << true; + QTest::newRow("jum(p)ed|characters") + << standard[0] << 23 << 24 << QDeclarativeTextEdit::SelectCharacters << 23 << 24 << true; + QTest::newRow("jumped( )over|characters") + << standard[0] << 26 << 27 << QDeclarativeTextEdit::SelectCharacters << 26 << 27 << true; + QTest::newRow("(the )|characters") + << standard[0] << 0 << 4 << QDeclarativeTextEdit::SelectCharacters << 0 << 4 << true; + QTest::newRow("( dog)|characters") + << standard[0] << 40 << 44 << QDeclarativeTextEdit::SelectCharacters << 40 << 44 << true; + QTest::newRow("( jumped )|characters") + << standard[0] << 19 << 27 << QDeclarativeTextEdit::SelectCharacters << 19 << 27 << true; + QTest::newRow("th(e qu)ick|characters") + << standard[0] << 2 << 6 << QDeclarativeTextEdit::SelectCharacters << 2 << 6 << true; + QTest::newRow("la(zy d)og|characters") + << standard[0] << 38 << 42 << QDeclarativeTextEdit::SelectCharacters << 38 << 42 << true; + QTest::newRow("jum(ped ov)er|characters") + << standard[0] << 23 << 29 << QDeclarativeTextEdit::SelectCharacters << 23 << 29 << true; + QTest::newRow("()the|characters") + << standard[0] << 0 << 0 << QDeclarativeTextEdit::SelectCharacters << 0 << 0 << true; + QTest::newRow("dog()|characters") + << standard[0] << 44 << 44 << QDeclarativeTextEdit::SelectCharacters << 44 << 44 << true; + QTest::newRow("jum()ped|characters") + << standard[0] << 23 << 23 << QDeclarativeTextEdit::SelectCharacters << 23 << 23 << true; + + QTest::newRow("<(t)he>|words") + << standard[0] << 0 << 1 << QDeclarativeTextEdit::SelectWords << 0 << 3 << true; + QTest::newRow("|words") + << standard[0] << 43 << 44 << QDeclarativeTextEdit::SelectWords << 41 << 44 << true; + QTest::newRow("|words") + << standard[0] << 23 << 24 << QDeclarativeTextEdit::SelectWords << 20 << 26 << true; + QTest::newRow("over|words") + << standard[0] << 26 << 27 << QDeclarativeTextEdit::SelectWords << 20 << 27 << false; + QTest::newRow("jumped<( )over>|words,reversed") + << standard[0] << 27 << 26 << QDeclarativeTextEdit::SelectWords << 26 << 31 << false; + QTest::newRow("<(the )>quick|words") + << standard[0] << 0 << 4 << QDeclarativeTextEdit::SelectWords << 0 << 4 << false; + QTest::newRow("<(the )quick>|words,reversed") + << standard[0] << 4 << 0 << QDeclarativeTextEdit::SelectWords << 0 << 9 << false; + QTest::newRow("|words") + << standard[0] << 40 << 44 << QDeclarativeTextEdit::SelectWords << 36 << 44 << false; + QTest::newRow("lazy<( dog)>|words,reversed") + << standard[0] << 44 << 40 << QDeclarativeTextEdit::SelectWords << 40 << 44 << false; + QTest::newRow("over|words") + << standard[0] << 19 << 27 << QDeclarativeTextEdit::SelectWords << 16 << 27 << false; + QTest::newRow("fox<( jumped )over>|words,reversed") + << standard[0] << 27 << 19 << QDeclarativeTextEdit::SelectWords << 19 << 31 << false; + QTest::newRow("|words") + << standard[0] << 2 << 6 << QDeclarativeTextEdit::SelectWords << 0 << 9 << true; + QTest::newRow("") + << standard[0] << 38 << 42 << QDeclarativeTextEdit::SelectWords << 36 << 44 << true; + QTest::newRow("|words") + << standard[0] << 23 << 29 << QDeclarativeTextEdit::SelectWords << 20 << 31 << true; + QTest::newRow("<()>the|words") + << standard[0] << 0 << 0 << QDeclarativeTextEdit::SelectWords << 0 << 0 << true; + QTest::newRow("dog<()>|words") + << standard[0] << 44 << 44 << QDeclarativeTextEdit::SelectWords << 44 << 44 << true; + QTest::newRow("jum<()>ped|words") + << standard[0] << 23 << 23 << QDeclarativeTextEdit::SelectWords << 23 << 23 << true; + + QTest::newRow("Hello<(,)> |words") + << standard[2] << 5 << 6 << QDeclarativeTextEdit::SelectWords << 5 << 6 << true; + QTest::newRow("Hello<(, )>world|words") + << standard[2] << 5 << 7 << QDeclarativeTextEdit::SelectWords << 5 << 7 << false; + QTest::newRow("Hello<(, )world>|words,reversed") + << standard[2] << 7 << 5 << QDeclarativeTextEdit::SelectWords << 5 << 12 << false; + QTest::newRow("world|words") + << standard[2] << 3 << 7 << QDeclarativeTextEdit::SelectWords << 0 << 7 << false; + QTest::newRow("|words,reversed") + << standard[2] << 7 << 3 << QDeclarativeTextEdit::SelectWords << 0 << 12 << false; + QTest::newRow(",|words") + << standard[2] << 3 << 5 << QDeclarativeTextEdit::SelectWords << 0 << 5 << true; + QTest::newRow("Hello<()>,|words") + << standard[2] << 5 << 5 << QDeclarativeTextEdit::SelectWords << 5 << 5 << true; + QTest::newRow("Hello,<()>|words") + << standard[2] << 6 << 6 << QDeclarativeTextEdit::SelectWords << 6 << 6 << true; + QTest::newRow("Hello<,( )>world|words") + << standard[2] << 6 << 7 << QDeclarativeTextEdit::SelectWords << 5 << 7 << false; + QTest::newRow("Hello,<( )world>|words,reversed") + << standard[2] << 7 << 6 << QDeclarativeTextEdit::SelectWords << 6 << 12 << false; + QTest::newRow("Hello<,( world)>|words") + << standard[2] << 6 << 12 << QDeclarativeTextEdit::SelectWords << 5 << 12 << false; + QTest::newRow("Hello,<( world)>|words,reversed") + << standard[2] << 12 << 6 << QDeclarativeTextEdit::SelectWords << 6 << 12 << false; + QTest::newRow("Hello<,( world!)>|words") + << standard[2] << 6 << 13 << QDeclarativeTextEdit::SelectWords << 5 << 13 << false; + QTest::newRow("Hello,<( world!)>|words,reversed") + << standard[2] << 13 << 6 << QDeclarativeTextEdit::SelectWords << 6 << 13 << false; + QTest::newRow("Hello<(, world!)>|words") + << standard[2] << 5 << 13 << QDeclarativeTextEdit::SelectWords << 5 << 13 << true; + QTest::newRow("world<(!)>|words") + << standard[2] << 12 << 13 << QDeclarativeTextEdit::SelectWords << 12 << 13 << true; + QTest::newRow("world!<()>)|words") + << standard[2] << 13 << 13 << QDeclarativeTextEdit::SelectWords << 13 << 13 << true; + QTest::newRow("world<()>!)|words") + << standard[2] << 12 << 12 << QDeclarativeTextEdit::SelectWords << 12 << 12 << true; + + QTest::newRow("<(,)>olleH |words") + << standard[3] << 7 << 8 << QDeclarativeTextEdit::SelectWords << 7 << 8 << true; + QTest::newRow("olleH|words") + << standard[3] << 6 << 8 << QDeclarativeTextEdit::SelectWords << 1 << 8 << false; + QTest::newRow("dlrow<( ,)>olleH|words,reversed") + << standard[3] << 8 << 6 << QDeclarativeTextEdit::SelectWords << 6 << 8 << false; + QTest::newRow("|words") + << standard[3] << 6 << 10 << QDeclarativeTextEdit::SelectWords << 1 << 13 << false; + QTest::newRow("dlrow<( ,ol)leH>|words,reversed") + << standard[3] << 10 << 6 << QDeclarativeTextEdit::SelectWords << 6 << 13 << false; + QTest::newRow(",<(ol)leH>,|words") + << standard[3] << 8 << 10 << QDeclarativeTextEdit::SelectWords << 8 << 13 << true; + QTest::newRow(",<()>olleH|words") + << standard[3] << 8 << 8 << QDeclarativeTextEdit::SelectWords << 8 << 8 << true; + QTest::newRow("<()>,olleH|words") + << standard[3] << 7 << 7 << QDeclarativeTextEdit::SelectWords << 7 << 7 << true; + QTest::newRow(",olleH|words") + << standard[3] << 6 << 7 << QDeclarativeTextEdit::SelectWords << 1 << 7 << false; + QTest::newRow("dlrow<( ),>olleH|words,reversed") + << standard[3] << 7 << 6 << QDeclarativeTextEdit::SelectWords << 6 << 8 << false; + QTest::newRow("<(dlrow )>,olleH|words") + << standard[3] << 1 << 7 << QDeclarativeTextEdit::SelectWords << 1 << 7 << false; + QTest::newRow("<(dlrow ),>olleH|words,reversed") + << standard[3] << 7 << 1 << QDeclarativeTextEdit::SelectWords << 1 << 8 << false; + QTest::newRow("<(!dlrow )>,olleH|words") + << standard[3] << 0 << 7 << QDeclarativeTextEdit::SelectWords << 0 << 7 << false; + QTest::newRow("<(!dlrow ),>olleH|words,reversed") + << standard[3] << 7 << 0 << QDeclarativeTextEdit::SelectWords << 0 << 8 << false; + QTest::newRow("(!dlrow ,)olleH|words") + << standard[3] << 0 << 8 << QDeclarativeTextEdit::SelectWords << 0 << 8 << true; + QTest::newRow("<(!)>dlrow|words") + << standard[3] << 0 << 1 << QDeclarativeTextEdit::SelectWords << 0 << 1 << true; + QTest::newRow("<()>!dlrow|words") + << standard[3] << 0 << 0 << QDeclarativeTextEdit::SelectWords << 0 << 0 << true; + QTest::newRow("!<()>dlrow|words") + << standard[3] << 1 << 1 << QDeclarativeTextEdit::SelectWords << 1 << 1 << true; +} + +void tst_qdeclarativetextedit::moveCursorSelection() +{ + QFETCH(QString, testStr); + QFETCH(int, cursorPosition); + QFETCH(int, movePosition); + QFETCH(QDeclarativeTextEdit::SelectionMode, mode); + QFETCH(int, selectionStart); + QFETCH(int, selectionEnd); + QFETCH(bool, reversible); + + QString componentStr = "import QtQuick 1.1\nTextEdit { text: \""+ testStr +"\"; }"; + QDeclarativeComponent textinputComponent(&engine); + textinputComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextEdit *texteditObject = qobject_cast(textinputComponent.create()); + QVERIFY(texteditObject != 0); + + texteditObject->setCursorPosition(cursorPosition); + texteditObject->moveCursorSelection(movePosition, mode); + + QCOMPARE(texteditObject->selectedText(), testStr.mid(selectionStart, selectionEnd - selectionStart)); + QCOMPARE(texteditObject->selectionStart(), selectionStart); + QCOMPARE(texteditObject->selectionEnd(), selectionEnd); + + if (reversible) { + texteditObject->setCursorPosition(movePosition); + texteditObject->moveCursorSelection(cursorPosition, mode); + + QCOMPARE(texteditObject->selectedText(), testStr.mid(selectionStart, selectionEnd - selectionStart)); + QCOMPARE(texteditObject->selectionStart(), selectionStart); + QCOMPARE(texteditObject->selectionEnd(), selectionEnd); + } +} + +void tst_qdeclarativetextedit::moveCursorSelectionSequence_data() +{ + QTest::addColumn("testStr"); + QTest::addColumn("cursorPosition"); + QTest::addColumn("movePosition1"); + QTest::addColumn("movePosition2"); + QTest::addColumn("selection1Start"); + QTest::addColumn("selection1End"); + QTest::addColumn("selection2Start"); + QTest::addColumn("selection2End"); + + QTest::newRow("the { f^ox} jumped|ltr") + << standard[0] + << 9 << 13 << 17 + << 4 << 15 + << 4 << 19; + QTest::newRow("the quick<( {bro)wn> f^ox} jumped|rtl") + << standard[0] + << 13 << 9 << 17 + << 9 << 15 + << 10 << 19; + QTest::newRow("the { ^}fox jumped|ltr") + << standard[0] + << 9 << 13 << 16 + << 4 << 15 + << 4 << 16; + QTest::newRow("the quick<( {bro)wn> ^}fox jumped|rtl") + << standard[0] + << 13 << 9 << 16 + << 9 << 15 + << 10 << 16; + QTest::newRow("the {} fox jumped|ltr") + << standard[0] + << 9 << 13 << 15 + << 4 << 15 + << 4 << 15; + QTest::newRow("the quick<( {bro)wn^>} f^ox jumped|rtl") + << standard[0] + << 13 << 9 << 15 + << 9 << 15 + << 10 << 15; + QTest::newRow("the { fox|ltr") + << standard[0] + << 9 << 13 << 10 + << 4 << 15 + << 4 << 10; + QTest::newRow("the quick<(^ {^bro)wn>} fox|rtl") + << standard[0] + << 13 << 9 << 10 + << 9 << 15 + << 10 << 15; + QTest::newRow("the { fox|ltr") + << standard[0] + << 9 << 13 << 9 + << 4 << 15 + << 4 << 9; + QTest::newRow("the quick{<(^ bro)wn>} fox|rtl") + << standard[0] + << 13 << 9 << 9 + << 9 << 15 + << 9 << 15; + QTest::newRow("the { fox|ltr") + << standard[0] + << 9 << 13 << 7 + << 4 << 15 + << 4 << 9; + QTest::newRow("the { fox|rtl") + << standard[0] + << 13 << 9 << 7 + << 9 << 15 + << 4 << 15; + QTest::newRow("the {<^quick}( bro)wn> fox|ltr") + << standard[0] + << 9 << 13 << 4 + << 4 << 15 + << 4 << 9; + QTest::newRow("the {<^quick}( bro)wn> fox|rtl") + << standard[0] + << 13 << 9 << 4 + << 9 << 15 + << 4 << 15; + QTest::newRow("the{^ fox|ltr") + << standard[0] + << 9 << 13 << 3 + << 4 << 15 + << 3 << 9; + QTest::newRow("the{^ fox|rtl") + << standard[0] + << 13 << 9 << 3 + << 9 << 15 + << 3 << 15; + QTest::newRow("{t^he fox|ltr") + << standard[0] + << 9 << 13 << 1 + << 4 << 15 + << 0 << 9; + QTest::newRow("{t^he fox|rtl") + << standard[0] + << 13 << 9 << 1 + << 9 << 15 + << 0 << 15; + + QTest::newRow("{, w^orld}!|ltr") + << standard[2] + << 2 << 4 << 8 + << 0 << 5 + << 0 << 12; + QTest::newRow("{, w^orld}!|rtl") + << standard[2] + << 4 << 2 << 8 + << 0 << 5 + << 0 << 12; + + QTest::newRow("!{dlro^w ,}|ltr") + << standard[3] + << 9 << 11 << 5 + << 8 << 13 + << 1 << 13; + QTest::newRow("!{dlro^w ,}|rtl") + << standard[3] + << 11 << 9 << 5 + << 8 << 13 + << 1 << 13; +} + +void tst_qdeclarativetextedit::moveCursorSelectionSequence() +{ + QFETCH(QString, testStr); + QFETCH(int, cursorPosition); + QFETCH(int, movePosition1); + QFETCH(int, movePosition2); + QFETCH(int, selection1Start); + QFETCH(int, selection1End); + QFETCH(int, selection2Start); + QFETCH(int, selection2End); + + QString componentStr = "import QtQuick 1.1\nTextEdit { text: \""+ testStr +"\"; }"; + QDeclarativeComponent texteditComponent(&engine); + texteditComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextEdit *texteditObject = qobject_cast(texteditComponent.create()); + QVERIFY(texteditObject != 0); + + texteditObject->setCursorPosition(cursorPosition); + + texteditObject->moveCursorSelection(movePosition1, QDeclarativeTextEdit::SelectWords); + QCOMPARE(texteditObject->selectedText(), testStr.mid(selection1Start, selection1End - selection1Start)); + QCOMPARE(texteditObject->selectionStart(), selection1Start); + QCOMPARE(texteditObject->selectionEnd(), selection1End); + + texteditObject->moveCursorSelection(movePosition2, QDeclarativeTextEdit::SelectWords); + QCOMPARE(texteditObject->selectedText(), testStr.mid(selection2Start, selection2End - selection2Start)); + QCOMPARE(texteditObject->selectionStart(), selection2Start); + QCOMPARE(texteditObject->selectionEnd(), selection2End); +} + + +void tst_qdeclarativetextedit::mouseSelection_data() +{ + QTest::addColumn("qmlfile"); + QTest::addColumn("from"); + QTest::addColumn("to"); + QTest::addColumn("selectedText"); + + // import installed + QTest::newRow("on") << SRCDIR "/data/mouseselection_true.qml" << 4 << 9 << "45678"; + QTest::newRow("off") << SRCDIR "/data/mouseselection_false.qml" << 4 << 9 << QString(); + QTest::newRow("default") << SRCDIR "/data/mouseselection_default.qml" << 4 << 9 << QString(); + QTest::newRow("off word selection") << SRCDIR "/data/mouseselection_false_words.qml" << 4 << 9 << QString(); + QTest::newRow("on word selection (4,9)") << SRCDIR "/data/mouseselection_true_words.qml" << 4 << 9 << "0123456789"; + QTest::newRow("on word selection (2,13)") << SRCDIR "/data/mouseselection_true_words.qml" << 2 << 13 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + QTest::newRow("on word selection (2,30)") << SRCDIR "/data/mouseselection_true_words.qml" << 2 << 30 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + QTest::newRow("on word selection (9,13)") << SRCDIR "/data/mouseselection_true_words.qml" << 9 << 13 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + QTest::newRow("on word selection (9,30)") << SRCDIR "/data/mouseselection_true_words.qml" << 9 << 30 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + QTest::newRow("on word selection (13,2)") << SRCDIR "/data/mouseselection_true_words.qml" << 13 << 2 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + QTest::newRow("on word selection (20,2)") << SRCDIR "/data/mouseselection_true_words.qml" << 20 << 2 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + QTest::newRow("on word selection (12,9)") << SRCDIR "/data/mouseselection_true_words.qml" << 12 << 9 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + QTest::newRow("on word selection (30,9)") << SRCDIR "/data/mouseselection_true_words.qml" << 30 << 9 << "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ"; +} + +void tst_qdeclarativetextedit::mouseSelection() +{ + QFETCH(QString, qmlfile); + QFETCH(int, from); + QFETCH(int, to); + QFETCH(QString, selectedText); + + QDeclarativeView *canvas = createView(qmlfile); + + canvas->show(); + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(canvas)); + + QVERIFY(canvas->rootObject() != 0); + QDeclarativeTextEdit *textEditObject = qobject_cast(canvas->rootObject()); + QVERIFY(textEditObject != 0); + + // press-and-drag-and-release from x1 to x2 + QPoint p1 = canvas->mapFromScene(textEditObject->positionToRectangle(from).center()); + QPoint p2 = canvas->mapFromScene(textEditObject->positionToRectangle(to).center()); + QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, p1); + //QTest::mouseMove(canvas->viewport(), canvas->mapFromScene(QPoint(x2,y))); // doesn't work + QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(p2), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(canvas->viewport(), &mv); + QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, p2); + QCOMPARE(textEditObject->selectedText(), selectedText); + + // Clicking and shift to clicking between the same points should select the same text. + textEditObject->setCursorPosition(0); + QTest::mouseClick(canvas->viewport(), Qt::LeftButton, Qt::NoModifier, p1); + QTest::mouseClick(canvas->viewport(), Qt::LeftButton, Qt::ShiftModifier, p2); + QCOMPARE(textEditObject->selectedText(), selectedText); + + delete canvas; +} + +void tst_qdeclarativetextedit::multilineMouseSelection() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/mouseselection_multiline.qml"); + + canvas->show(); + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(canvas)); + + QVERIFY(canvas->rootObject() != 0); + QDeclarativeTextEdit *textEditObject = qobject_cast(canvas->rootObject()); + QVERIFY(textEditObject != 0); + + // press-and-drag from x1,y1 to x2,y1 + int x1 = 10; + int x2 = textEditObject->width() - 10; + int y1 = textEditObject->height() / 4; + int y2 = textEditObject->height() * 3 / 4; + QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x1,y1))); + QMouseEvent mv1(QEvent::MouseMove, canvas->mapFromScene(QPoint(x2,y1)), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(canvas->viewport(), &mv1); + QString str1 = textEditObject->selectedText(); + QVERIFY(str1.length() > 3); // don't reallly care *what* was selected (and it's too sensitive to platform) + + // drag-and-release from x2,y1 to x2,y2 + QMouseEvent mv2(QEvent::MouseMove, canvas->mapFromScene(QPoint(x2,y2)), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(canvas->viewport(), &mv2); + QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x2,y2))); + QString str2 = textEditObject->selectedText(); + QVERIFY(str1 != str2); + QVERIFY(str2.length() > 3); + + delete canvas; +} + +void tst_qdeclarativetextedit::deferEnableSelectByMouse_data() +{ + QTest::addColumn("qmlfile"); + + QTest::newRow("writable") << SRCDIR "/data/mouseselection_false.qml"; + QTest::newRow("read only") << SRCDIR "/data/mouseselection_false_readonly.qml"; +} + +void tst_qdeclarativetextedit::deferEnableSelectByMouse() +{ + // Verify text isn't selected if selectByMouse is enabled after the mouse button has been pressed. + QFETCH(QString, qmlfile); + + QDeclarativeView *canvas = createView(qmlfile); + + canvas->show(); + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(canvas)); + + QVERIFY(canvas->rootObject() != 0); + QDeclarativeTextEdit *textEditObject = qobject_cast(canvas->rootObject()); + QVERIFY(textEditObject != 0); + + // press-and-drag-and-release from x1 to x2 + int x1 = 10; + int x2 = 70; + int y = textEditObject->height()/2; + + QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x1,y))); + textEditObject->setSelectByMouse(true); + //QTest::mouseMove(canvas->viewport(), canvas->mapFromScene(QPoint(x2,y))); // doesn't work + QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(QPoint(x2,y)), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(canvas->viewport(), &mv); + QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x2,y))); + QVERIFY(textEditObject->selectedText().isEmpty()); + + delete canvas; +} + +void tst_qdeclarativetextedit::deferDisableSelectByMouse_data() +{ + QTest::addColumn("qmlfile"); + + QTest::newRow("writable") << SRCDIR "/data/mouseselection_true.qml"; + QTest::newRow("read only") << SRCDIR "/data/mouseselection_true_readonly.qml"; +} + +void tst_qdeclarativetextedit::deferDisableSelectByMouse() +{ + // Verify text isn't selected if selectByMouse is enabled after the mouse button has been pressed. + QFETCH(QString, qmlfile); + + QDeclarativeView *canvas = createView(qmlfile); + + canvas->show(); + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(canvas)); + + QVERIFY(canvas->rootObject() != 0); + QDeclarativeTextEdit *textEditObject = qobject_cast(canvas->rootObject()); + QVERIFY(textEditObject != 0); + + // press-and-drag-and-release from x1 to x2 + int x1 = 10; + int x2 = 70; + int y = textEditObject->height()/2; + + QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x1,y))); + textEditObject->setSelectByMouse(false); + //QTest::mouseMove(canvas->viewport(), canvas->mapFromScene(QPoint(x2,y))); // doesn't work + QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(QPoint(x2,y)), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(canvas->viewport(), &mv); + QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x2,y))); + QVERIFY(textEditObject->selectedText().length() > 3); + + delete canvas; +} + +void tst_qdeclarativetextedit::dragMouseSelection() +{ + QString qmlfile = SRCDIR "/data/mouseselection_true.qml"; + + QDeclarativeView *canvas = createView(qmlfile); + + canvas->show(); + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(canvas)); + + QVERIFY(canvas->rootObject() != 0); + QDeclarativeTextEdit *textEditObject = qobject_cast(canvas->rootObject()); + QVERIFY(textEditObject != 0); + + textEditObject->setAcceptDrops(true); + + // press-and-drag-and-release from x1 to x2 + int x1 = 10; + int x2 = 70; + int y = textEditObject->height()/2; + QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x1,y))); + { + QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(QPoint(x2,y)), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(canvas->viewport(), &mv); + } + QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x2,y))); + QString str1 = textEditObject->selectedText(); + QVERIFY(str1.length() > 3); + + // press and drag the current selection. + x1 = 40; + x2 = 100; + QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x1,y))); + { + QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(QPoint(x2,y)), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(canvas->viewport(), &mv); + } + QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x2,y))); + QString str2 = textEditObject->selectedText(); + QVERIFY(str2.length() > 3); + + QVERIFY(str1 != str2); // Verify the second press and drag is a new selection and doesn't not the first moved. + + delete canvas; +} + +void tst_qdeclarativetextedit::mouseSelectionMode_data() +{ + QTest::addColumn("qmlfile"); + QTest::addColumn("selectWords"); + + // import installed + QTest::newRow("SelectWords") << SRCDIR "/data/mouseselectionmode_words.qml" << true; + QTest::newRow("SelectCharacters") << SRCDIR "/data/mouseselectionmode_characters.qml" << false; + QTest::newRow("default") << SRCDIR "/data/mouseselectionmode_default.qml" << false; +} + +void tst_qdeclarativetextedit::mouseSelectionMode() +{ + QFETCH(QString, qmlfile); + QFETCH(bool, selectWords); + + QString text = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + QDeclarativeView *canvas = createView(qmlfile); + + canvas->show(); + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(canvas)); + + QVERIFY(canvas->rootObject() != 0); + QDeclarativeTextEdit *textEditObject = qobject_cast(canvas->rootObject()); + QVERIFY(textEditObject != 0); + + // press-and-drag-and-release from x1 to x2 + int x1 = 10; + int x2 = 70; + int y = textEditObject->height()/2; + QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x1,y))); + //QTest::mouseMove(canvas->viewport(), canvas->mapFromScene(QPoint(x2,y))); // doesn't work + QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(QPoint(x2,y)), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(canvas->viewport(), &mv); + QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x2,y))); + QString str = textEditObject->selectedText(); + if (selectWords) { + QCOMPARE(str, text); + } else { + QVERIFY(str.length() > 3); + QVERIFY(str != text); + } + + // Clicking and shift to clicking between the same points should select the same text. + textEditObject->setCursorPosition(0); + QTest::mouseClick(canvas->viewport(), Qt::LeftButton, Qt::NoModifier, canvas->mapFromScene(QPoint(x1,y))); + QTest::mouseClick(canvas->viewport(), Qt::LeftButton, Qt::ShiftModifier, canvas->mapFromScene(QPoint(x2,y))); + QCOMPARE(textEditObject->selectedText(), str); + + delete canvas; +} + +void tst_qdeclarativetextedit::inputMethodHints() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/inputmethodhints.qml"); + canvas->show(); + canvas->setFocus(); + + QVERIFY(canvas->rootObject() != 0); + QDeclarativeTextEdit *textEditObject = qobject_cast(canvas->rootObject()); + QVERIFY(textEditObject != 0); + QVERIFY(textEditObject->inputMethodHints() & Qt::ImhNoPredictiveText); + textEditObject->setInputMethodHints(Qt::ImhUppercaseOnly); + QVERIFY(textEditObject->inputMethodHints() & Qt::ImhUppercaseOnly); + + delete canvas; +} + +void tst_qdeclarativetextedit::positionAt() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/positionAt.qml"); + QVERIFY(canvas->rootObject() != 0); + canvas->show(); + canvas->setFocus(); + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + + QDeclarativeTextEdit *texteditObject = qobject_cast(canvas->rootObject()); + QVERIFY(texteditObject != 0); + + QFontMetrics fm(texteditObject->font()); + const int y0 = fm.height() / 2; + const int y1 = fm.height() * 3 / 2; + + int pos = texteditObject->positionAt(texteditObject->width()/2, y0); + int diff = abs(int(fm.width(texteditObject->text().left(pos))-texteditObject->width()/2)); + + // some tollerance for different fonts. +#ifdef Q_OS_LINUX + QVERIFY(diff < 2); +#else + QVERIFY(diff < 5); +#endif + + const qreal x0 = texteditObject->positionToRectangle(pos).x(); + const qreal x1 = texteditObject->positionToRectangle(pos + 1).x(); + + QString preeditText = texteditObject->text().mid(0, pos); + texteditObject->setText(texteditObject->text().mid(pos)); + texteditObject->setCursorPosition(0); + + QInputMethodEvent inputEvent(preeditText, QList()); + QApplication::sendEvent(canvas, &inputEvent); + + // Check all points within the preedit text return the same position. + QCOMPARE(texteditObject->positionAt(0, y0), 0); + QCOMPARE(texteditObject->positionAt(x0 / 2, y0), 0); + QCOMPARE(texteditObject->positionAt(x0, y0), 0); + + // Verify positioning returns to normal after the preedit text. + QCOMPARE(texteditObject->positionAt(x1, y0), 1); + QCOMPARE(texteditObject->positionToRectangle(1).x(), x1); + + QVERIFY(texteditObject->positionAt(x0 / 2, y1) > 0); + + delete canvas; +} + +void tst_qdeclarativetextedit::cursorDelegate() +{ + QDeclarativeView* view = createView(SRCDIR "/data/cursorTest.qml"); + view->show(); + view->setFocus(); + QDeclarativeTextEdit *textEditObject = view->rootObject()->findChild("textEditObject"); + QVERIFY(textEditObject != 0); + QVERIFY(textEditObject->findChild("cursorInstance")); + //Test Delegate gets created + textEditObject->setFocus(true); + QDeclarativeItem* delegateObject = textEditObject->findChild("cursorInstance"); + QVERIFY(delegateObject); + //Test Delegate gets moved + for(int i=0; i<= textEditObject->text().length(); i++){ + textEditObject->setCursorPosition(i); + QCOMPARE(textEditObject->cursorRectangle().x(), qRound(delegateObject->x())); + QCOMPARE(textEditObject->cursorRectangle().y(), qRound(delegateObject->y())); + } + const QString preedit = "preedit"; + for (int i = 0; i <= preedit.length(); i++) { + QInputMethodEvent event(preedit, QList() + << QInputMethodEvent::Attribute(QInputMethodEvent::Cursor, i, 1, QVariant())); + QApplication::sendEvent(view, &event); + + QCOMPARE(textEditObject->cursorRectangle().x(), qRound(delegateObject->x())); + QCOMPARE(textEditObject->cursorRectangle().y(), qRound(delegateObject->y())); + } + // Clear preedit text; + QInputMethodEvent event; + QApplication::sendEvent(view, &event); + + + // Test delegate gets moved on mouse press. + textEditObject->setSelectByMouse(true); + textEditObject->setCursorPosition(0); + const QPoint point1 = view->mapFromScene(textEditObject->positionToRectangle(5).center()); + QTest::mouseClick(view->viewport(), Qt::LeftButton, 0, point1); + QVERIFY(textEditObject->cursorPosition() != 0); + QCOMPARE(textEditObject->cursorRectangle().x(), qRound(delegateObject->x())); + QCOMPARE(textEditObject->cursorRectangle().y(), qRound(delegateObject->y())); + + // Test delegate gets moved on mouse drag + textEditObject->setCursorPosition(0); + const QPoint point2 = view->mapFromScene(textEditObject->positionToRectangle(10).center()); + QTest::mousePress(view->viewport(), Qt::LeftButton, 0, point1); + QMouseEvent mv(QEvent::MouseMove, point2, Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(view->viewport(), &mv); + QTest::mouseRelease(view->viewport(), Qt::LeftButton, 0, point2); + QCOMPARE(textEditObject->cursorRectangle().x(), qRound(delegateObject->x())); + QCOMPARE(textEditObject->cursorRectangle().y(), qRound(delegateObject->y())); + + textEditObject->setReadOnly(true); + textEditObject->setCursorPosition(0); + QTest::mouseClick(view->viewport(), Qt::LeftButton, 0, view->mapFromScene(textEditObject->positionToRectangle(5).center())); + QVERIFY(textEditObject->cursorPosition() != 0); + QCOMPARE(textEditObject->cursorRectangle().x(), qRound(delegateObject->x())); + QCOMPARE(textEditObject->cursorRectangle().y(), qRound(delegateObject->y())); + + textEditObject->setCursorPosition(0); + QTest::mouseClick(view->viewport(), Qt::LeftButton, 0, view->mapFromScene(textEditObject->positionToRectangle(5).center())); + QVERIFY(textEditObject->cursorPosition() != 0); + QCOMPARE(textEditObject->cursorRectangle().x(), qRound(delegateObject->x())); + QCOMPARE(textEditObject->cursorRectangle().y(), qRound(delegateObject->y())); + + textEditObject->setCursorPosition(0); + QCOMPARE(textEditObject->cursorRectangle().x(), qRound(delegateObject->x())); + QCOMPARE(textEditObject->cursorRectangle().y(), qRound(delegateObject->y())); + QVERIFY(textEditObject->cursorRectangle().y() >= 0); + QVERIFY(textEditObject->cursorRectangle().y() < textEditObject->cursorRectangle().height()); + textEditObject->setVAlign(QDeclarativeTextEdit::AlignVCenter); + QCOMPARE(textEditObject->cursorRectangle().x(), qRound(delegateObject->x())); + QCOMPARE(textEditObject->cursorRectangle().y(), qRound(delegateObject->y())); + QVERIFY(textEditObject->cursorRectangle().y() > (textEditObject->height() / 2) - textEditObject->cursorRectangle().height()); + QVERIFY(textEditObject->cursorRectangle().y() < (textEditObject->height() / 2) + textEditObject->cursorRectangle().height()); + textEditObject->setVAlign(QDeclarativeTextEdit::AlignBottom); + QCOMPARE(textEditObject->cursorRectangle().x(), qRound(delegateObject->x())); + QCOMPARE(textEditObject->cursorRectangle().y(), qRound(delegateObject->y())); + QVERIFY(textEditObject->cursorRectangle().y() > textEditObject->height() - (textEditObject->cursorRectangle().height() * 2)); + QVERIFY(textEditObject->cursorRectangle().y() < textEditObject->height()); + + //Test Delegate gets deleted + textEditObject->setCursorDelegate(0); + QVERIFY(!textEditObject->findChild("cursorInstance")); + + delete view; +} + +void tst_qdeclarativetextedit::cursorVisible() +{ + QGraphicsScene scene; + QGraphicsView view(&scene); + view.show(); + QApplication::setActiveWindow(&view); + QTest::qWaitForWindowShown(&view); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(&view)); + view.setFocus(); + + QDeclarativeTextEdit edit; + QSignalSpy spy(&edit, SIGNAL(cursorVisibleChanged(bool))); + + QCOMPARE(edit.isCursorVisible(), false); + + edit.setCursorVisible(true); + QCOMPARE(edit.isCursorVisible(), true); + QCOMPARE(spy.count(), 1); + + edit.setCursorVisible(false); + QCOMPARE(edit.isCursorVisible(), false); + QCOMPARE(spy.count(), 2); + + edit.setFocus(true); + QCOMPARE(edit.isCursorVisible(), false); + QCOMPARE(spy.count(), 2); + + scene.addItem(&edit); + QCOMPARE(edit.isCursorVisible(), true); + QCOMPARE(spy.count(), 3); + + edit.setFocus(false); + QCOMPARE(edit.isCursorVisible(), false); + QCOMPARE(spy.count(), 4); + + edit.setFocus(true); + QCOMPARE(edit.isCursorVisible(), true); + QCOMPARE(spy.count(), 5); + + scene.clearFocus(); + QCOMPARE(edit.isCursorVisible(), false); + QCOMPARE(spy.count(), 6); + + scene.setFocus(); + QCOMPARE(edit.isCursorVisible(), true); + QCOMPARE(spy.count(), 7); + + view.clearFocus(); + QCOMPARE(edit.isCursorVisible(), false); + QCOMPARE(spy.count(), 8); + + view.setFocus(); + QCOMPARE(edit.isCursorVisible(), true); + QCOMPARE(spy.count(), 9); + + // on mac, setActiveWindow(0) on mac does not deactivate the current application + // (you have to switch to a different app or hide the current app to trigger this) +#if !defined(Q_WS_MAC) + QApplication::setActiveWindow(0); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(0)); + QCOMPARE(edit.isCursorVisible(), false); + QCOMPARE(spy.count(), 10); + + QApplication::setActiveWindow(&view); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(&view)); + QCOMPARE(edit.isCursorVisible(), true); + QCOMPARE(spy.count(), 11); +#endif +} + +void tst_qdeclarativetextedit::delegateLoading_data() +{ + QTest::addColumn("qmlfile"); + QTest::addColumn("error"); + + // import installed + QTest::newRow("pass") << "cursorHttpTestPass.qml" << ""; + QTest::newRow("fail1") << "cursorHttpTestFail1.qml" << "http://localhost:42332/FailItem.qml: Remote host closed the connection "; + QTest::newRow("fail2") << "cursorHttpTestFail2.qml" << "http://localhost:42332/ErrItem.qml:4:5: Fungus is not a type "; +} + +void tst_qdeclarativetextedit::delegateLoading() +{ + QFETCH(QString, qmlfile); + QFETCH(QString, error); + + TestHTTPServer server(42332); + server.serveDirectory(SRCDIR "/data/httpfail", TestHTTPServer::Disconnect); + server.serveDirectory(SRCDIR "/data/httpslow", TestHTTPServer::Delay); + server.serveDirectory(SRCDIR "/data/http"); + + QDeclarativeView* view = new QDeclarativeView(0); + + view->setSource(QUrl(QLatin1String("http://localhost:42332/") + qmlfile)); + view->show(); + view->setFocus(); + + if (!error.isEmpty()) { + QTest::ignoreMessage(QtWarningMsg, error.toUtf8()); + QTRY_VERIFY(view->status()==QDeclarativeView::Error); + QTRY_VERIFY(!view->rootObject()); // there is fail item inside this test + } else { + QTRY_VERIFY(view->rootObject());//Wait for loading to finish. + QDeclarativeTextEdit *textEditObject = view->rootObject()->findChild("textEditObject"); + // view->rootObject()->dumpObjectTree(); + QVERIFY(textEditObject != 0); + textEditObject->setFocus(true); + QDeclarativeItem *delegate; + delegate = view->rootObject()->findChild("delegateOkay"); + QVERIFY(delegate); + delegate = view->rootObject()->findChild("delegateSlow"); + QVERIFY(delegate); + + delete delegate; + } + + + //A test should be added here with a component which is ready but component.create() returns null + //Not sure how to accomplish this with QDeclarativeTextEdits cursor delegate + //###This was only needed for code coverage, and could be a case of overzealous defensive programming + //delegate = view->rootObject()->findChild("delegateErrorB"); + //QVERIFY(!delegate); + + delete view; +} + +/* +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_qdeclarativetextedit::navigation() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/navigation.qml"); + canvas->show(); + canvas->setFocus(); + + QVERIFY(canvas->rootObject() != 0); + + QDeclarativeItem *input = qobject_cast(qvariant_cast(canvas->rootObject()->property("myInput"))); + + QVERIFY(input != 0); + QTRY_VERIFY(input->hasActiveFocus() == true); + simulateKey(canvas, Qt::Key_Left); + QVERIFY(input->hasActiveFocus() == false); + simulateKey(canvas, Qt::Key_Right); + QVERIFY(input->hasActiveFocus() == true); + simulateKey(canvas, Qt::Key_Right); + QVERIFY(input->hasActiveFocus() == true); + simulateKey(canvas, Qt::Key_Right); + QVERIFY(input->hasActiveFocus() == false); + simulateKey(canvas, Qt::Key_Left); + QVERIFY(input->hasActiveFocus() == true); + + delete canvas; +} + +void tst_qdeclarativetextedit::copyAndPaste() { +#ifndef QT_NO_CLIPBOARD + +#ifdef Q_WS_MAC + { + PasteboardRef pasteboard; + OSStatus status = PasteboardCreate(0, &pasteboard); + if (status == noErr) + CFRelease(pasteboard); + else + QSKIP("This machine doesn't support the clipboard", SkipAll); + } +#endif + + QString componentStr = "import QtQuick 1.0\nTextEdit { text: \"Hello world!\" }"; + QDeclarativeComponent textEditComponent(&engine); + textEditComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextEdit *textEdit = qobject_cast(textEditComponent.create()); + QVERIFY(textEdit != 0); + + // copy and paste + QCOMPARE(textEdit->text().length(), 12); + textEdit->select(0, textEdit->text().length());; + textEdit->copy(); + QCOMPARE(textEdit->selectedText(), QString("Hello world!")); + QCOMPARE(textEdit->selectedText().length(), 12); + textEdit->setCursorPosition(0); + QVERIFY(textEdit->canPaste()); + textEdit->paste(); + QCOMPARE(textEdit->text(), QString("Hello world!Hello world!")); + QCOMPARE(textEdit->text().length(), 24); + + // canPaste + QVERIFY(textEdit->canPaste()); + textEdit->setReadOnly(true); + QVERIFY(!textEdit->canPaste()); + textEdit->setReadOnly(false); + QVERIFY(textEdit->canPaste()); + + // QTBUG-12339 + // test that document and internal text attribute are in sync + QDeclarativeItemPrivate* pri = QDeclarativeItemPrivate::get(textEdit); + QDeclarativeTextEditPrivate *editPrivate = static_cast(pri); + QCOMPARE(textEdit->text(), editPrivate->text); + + // select word + textEdit->setCursorPosition(0); + textEdit->selectWord(); + QCOMPARE(textEdit->selectedText(), QString("Hello")); + + // select all and cut + textEdit->selectAll(); + textEdit->cut(); + QCOMPARE(textEdit->text().length(), 0); + textEdit->paste(); + QCOMPARE(textEdit->text(), QString("Hello world!Hello world!")); + QCOMPARE(textEdit->text().length(), 24); +#endif +} + +void tst_qdeclarativetextedit::canPaste() { +#ifndef QT_NO_CLIPBOARD + + QApplication::clipboard()->setText("Some text"); + + QString componentStr = "import QtQuick 1.0\nTextEdit { text: \"Hello world!\" }"; + QDeclarativeComponent textEditComponent(&engine); + textEditComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextEdit *textEdit = qobject_cast(textEditComponent.create()); + QVERIFY(textEdit != 0); + + // check initial value - QTBUG-17765 + QTextControl tc; + QCOMPARE(textEdit->canPaste(), tc.canPaste()); + +#endif +} + +void tst_qdeclarativetextedit::canPasteEmpty() { +#ifndef QT_NO_CLIPBOARD + + QApplication::clipboard()->clear(); + + QString componentStr = "import QtQuick 1.0\nTextEdit { text: \"Hello world!\" }"; + QDeclarativeComponent textEditComponent(&engine); + textEditComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextEdit *textEdit = qobject_cast(textEditComponent.create()); + QVERIFY(textEdit != 0); + + // check initial value - QTBUG-17765 + QTextControl tc; + QCOMPARE(textEdit->canPaste(), tc.canPaste()); + +#endif +} + +void tst_qdeclarativetextedit::readOnly() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/readOnly.qml"); + canvas->show(); + canvas->setFocus(); + + QVERIFY(canvas->rootObject() != 0); + + QDeclarativeTextEdit *edit = qobject_cast(qvariant_cast(canvas->rootObject()->property("myInput"))); + + QVERIFY(edit != 0); + QTRY_VERIFY(edit->hasActiveFocus() == true); + QVERIFY(edit->isReadOnly() == true); + QString initial = edit->text(); + for(int k=Qt::Key_0; k<=Qt::Key_Z; k++) + simulateKey(canvas, k); + simulateKey(canvas, Qt::Key_Return); + simulateKey(canvas, Qt::Key_Space); + simulateKey(canvas, Qt::Key_Escape); + QCOMPARE(edit->text(), initial); + + delete canvas; +} + +void tst_qdeclarativetextedit::simulateKey(QDeclarativeView *view, int key, Qt::KeyboardModifiers modifiers) +{ + QKeyEvent press(QKeyEvent::KeyPress, key, modifiers); + QKeyEvent release(QKeyEvent::KeyRelease, key, modifiers); + + QApplication::sendEvent(view, &press); + QApplication::sendEvent(view, &release); +} + +QDeclarativeView *tst_qdeclarativetextedit::createView(const QString &filename) +{ + QDeclarativeView *canvas = new QDeclarativeView(0); + + canvas->setSource(QUrl::fromLocalFile(filename)); + return canvas; +} + +class MyInputContext : public QInputContext +{ +public: + MyInputContext() : openInputPanelReceived(false), closeInputPanelReceived(false), updateReceived(false), eventType(QEvent::None) {} + ~MyInputContext() {} + + QString identifierName() { return QString(); } + QString language() { return QString(); } + + void reset() {} + + bool isComposing() const { return false; } + + bool filterEvent( const QEvent *event ) + { + if (event->type() == QEvent::RequestSoftwareInputPanel) + openInputPanelReceived = true; + if (event->type() == QEvent::CloseSoftwareInputPanel) + closeInputPanelReceived = true; + return QInputContext::filterEvent(event); + } + + void update() { updateReceived = true; } + + void sendPreeditText(const QString &text, int cursor) + { + QList attributes; + attributes.append(QInputMethodEvent::Attribute( + QInputMethodEvent::Cursor, cursor, text.length(), QVariant())); + + QInputMethodEvent event(text, attributes); + sendEvent(event); + } + + void mouseHandler(int x, QMouseEvent *event) + { + cursor = x; + eventType = event->type(); + eventPosition = event->pos(); + eventGlobalPosition = event->globalPos(); + eventButton = event->button(); + eventButtons = event->buttons(); + eventModifiers = event->modifiers(); + } + + bool openInputPanelReceived; + bool closeInputPanelReceived; + bool updateReceived; + int cursor; + QEvent::Type eventType; + QPoint eventPosition; + QPoint eventGlobalPosition; + Qt::MouseButton eventButton; + Qt::MouseButtons eventButtons; + Qt::KeyboardModifiers eventModifiers; +}; + +void tst_qdeclarativetextedit::textInput() +{ + QGraphicsScene scene; + QGraphicsView view(&scene); + QDeclarativeTextEdit edit; + QDeclarativeItemPrivate* pri = QDeclarativeItemPrivate::get(&edit); + QDeclarativeTextEditPrivate *editPrivate = static_cast(pri); + edit.setPos(0, 0); + scene.addItem(&edit); + view.show(); + QApplication::setActiveWindow(&view); + QTest::qWaitForWindowShown(&view); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(&view)); + edit.setFocus(true); + QVERIFY(edit.hasActiveFocus() == true); + + // test that input method event is committed + QInputMethodEvent event; + event.setCommitString( "Hello world!", 0, 0); + QApplication::sendEvent(&view, &event); + QCOMPARE(edit.text(), QString("Hello world!")); + + // QTBUG-12339 + // test that document and internal text attribute are in sync + QCOMPARE(editPrivate->text, QString("Hello world!")); +} + +void tst_qdeclarativetextedit::openInputPanelOnClick() +{ + QGraphicsScene scene; + QGraphicsView view(&scene); + MyInputContext ic; + view.setInputContext(&ic); + QDeclarativeTextEdit edit; + QSignalSpy focusOnPressSpy(&edit, SIGNAL(activeFocusOnPressChanged(bool))); + edit.setText("Hello world"); + edit.setPos(0, 0); + scene.addItem(&edit); + view.show(); + qApp->setAutoSipEnabled(true); + QApplication::setActiveWindow(&view); + QTest::qWaitForWindowShown(&view); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(&view)); + + QDeclarativeItemPrivate* pri = QDeclarativeItemPrivate::get(&edit); + QDeclarativeTextEditPrivate *editPrivate = static_cast(pri); + + // input panel on click + editPrivate->showInputPanelOnFocus = false; + + QStyle::RequestSoftwareInputPanel behavior = QStyle::RequestSoftwareInputPanel( + view.style()->styleHint(QStyle::SH_RequestSoftwareInputPanel)); + QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, view.mapFromScene(edit.scenePos())); + QApplication::processEvents(); + if (behavior == QStyle::RSIP_OnMouseClickAndAlreadyFocused) { + QCOMPARE(ic.openInputPanelReceived, false); + QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, view.mapFromScene(edit.scenePos())); + QApplication::processEvents(); + QCOMPARE(ic.openInputPanelReceived, true); + } else if (behavior == QStyle::RSIP_OnMouseClick) { + QCOMPARE(ic.openInputPanelReceived, true); + } + ic.openInputPanelReceived = false; + + // focus should not cause input panels to open or close + edit.setFocus(false); + edit.setFocus(true); + edit.setFocus(false); + edit.setFocus(true); + edit.setFocus(false); + QApplication::processEvents(); + QCOMPARE(ic.openInputPanelReceived, false); + QCOMPARE(ic.closeInputPanelReceived, false); +} + +void tst_qdeclarativetextedit::openInputPanelOnFocus() +{ + QGraphicsScene scene; + QGraphicsView view(&scene); + MyInputContext ic; + view.setInputContext(&ic); + QDeclarativeTextEdit edit; + QSignalSpy focusOnPressSpy(&edit, SIGNAL(activeFocusOnPressChanged(bool))); + edit.setText("Hello world"); + edit.setPos(0, 0); + scene.addItem(&edit); + view.show(); + qApp->setAutoSipEnabled(true); + QApplication::setActiveWindow(&view); + QTest::qWaitForWindowShown(&view); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(&view)); + + QDeclarativeItemPrivate* pri = QDeclarativeItemPrivate::get(&edit); + QDeclarativeTextEditPrivate *editPrivate = static_cast(pri); + editPrivate->showInputPanelOnFocus = true; + + // test default values + QVERIFY(edit.focusOnPress()); + QCOMPARE(ic.openInputPanelReceived, false); + QCOMPARE(ic.closeInputPanelReceived, false); + + // focus on press, input panel on focus + QTest::mousePress(view.viewport(), Qt::LeftButton, 0, view.mapFromScene(edit.scenePos())); + QApplication::processEvents(); + QVERIFY(edit.hasActiveFocus()); + QCOMPARE(ic.openInputPanelReceived, true); + ic.openInputPanelReceived = false; + + // no events on release + QTest::mouseRelease(view.viewport(), Qt::LeftButton, 0, view.mapFromScene(edit.scenePos())); + QCOMPARE(ic.openInputPanelReceived, false); + ic.openInputPanelReceived = false; + + // if already focused, input panel can be opened on press + QVERIFY(edit.hasActiveFocus()); + QTest::mousePress(view.viewport(), Qt::LeftButton, 0, view.mapFromScene(edit.scenePos())); + QApplication::processEvents(); + QCOMPARE(ic.openInputPanelReceived, true); + ic.openInputPanelReceived = false; + + // input method should stay enabled if focus + // is lost to an item that also accepts inputs + QDeclarativeTextEdit anotherEdit; + scene.addItem(&anotherEdit); + anotherEdit.setFocus(true); + QApplication::processEvents(); + QCOMPARE(ic.openInputPanelReceived, true); + ic.openInputPanelReceived = false; + QCOMPARE(view.inputContext(), (QInputContext*)&ic); + QVERIFY(view.testAttribute(Qt::WA_InputMethodEnabled)); + + // input method should be disabled if focus + // is lost to an item that doesn't accept inputs + QDeclarativeItem item; + scene.addItem(&item); + item.setFocus(true); + QApplication::processEvents(); + QCOMPARE(ic.openInputPanelReceived, false); + QVERIFY(view.inputContext() == 0); + QVERIFY(!view.testAttribute(Qt::WA_InputMethodEnabled)); + + // no automatic input panel events should + // be sent if activeFocusOnPress is false + edit.setFocusOnPress(false); + QCOMPARE(focusOnPressSpy.count(),1); + edit.setFocusOnPress(false); + QCOMPARE(focusOnPressSpy.count(),1); + edit.setFocus(false); + edit.setFocus(true); + QTest::mousePress(view.viewport(), Qt::LeftButton, 0, view.mapFromScene(edit.scenePos())); + QTest::mouseRelease(view.viewport(), Qt::LeftButton, 0, view.mapFromScene(edit.scenePos())); + QApplication::processEvents(); + QCOMPARE(ic.openInputPanelReceived, false); + QCOMPARE(ic.closeInputPanelReceived, false); + + // one show input panel event should + // be set when openSoftwareInputPanel is called + edit.openSoftwareInputPanel(); + QCOMPARE(ic.openInputPanelReceived, true); + QCOMPARE(ic.closeInputPanelReceived, false); + ic.openInputPanelReceived = false; + + // one close input panel event should + // be sent when closeSoftwareInputPanel is called + edit.closeSoftwareInputPanel(); + QCOMPARE(ic.openInputPanelReceived, false); + QCOMPARE(ic.closeInputPanelReceived, true); + ic.closeInputPanelReceived = false; + + // set activeFocusOnPress back to true + edit.setFocusOnPress(true); + QCOMPARE(focusOnPressSpy.count(),2); + edit.setFocusOnPress(true); + QCOMPARE(focusOnPressSpy.count(),2); + edit.setFocus(false); + QApplication::processEvents(); + QCOMPARE(ic.openInputPanelReceived, false); + QCOMPARE(ic.closeInputPanelReceived, false); + ic.closeInputPanelReceived = false; + + // input panel should not re-open + // if focus has already been set + edit.setFocus(true); + QCOMPARE(ic.openInputPanelReceived, true); + ic.openInputPanelReceived = false; + edit.setFocus(true); + QCOMPARE(ic.openInputPanelReceived, false); + + // input method should be disabled + // if TextEdit loses focus + edit.setFocus(false); + QApplication::processEvents(); + QVERIFY(view.inputContext() == 0); + QVERIFY(!view.testAttribute(Qt::WA_InputMethodEnabled)); + + // input method should not be enabled + // if TextEdit is read only. + edit.setReadOnly(true); + ic.openInputPanelReceived = false; + edit.setFocus(true); + QApplication::processEvents(); + QCOMPARE(ic.openInputPanelReceived, false); + QVERIFY(view.inputContext() == 0); + QVERIFY(!view.testAttribute(Qt::WA_InputMethodEnabled)); +} + +void tst_qdeclarativetextedit::geometrySignals() +{ + QDeclarativeComponent component(&engine, SRCDIR "/data/geometrySignals.qml"); + QObject *o = component.create(); + QVERIFY(o); + QCOMPARE(o->property("bindingWidth").toInt(), 400); + QCOMPARE(o->property("bindingHeight").toInt(), 500); + delete o; +} + +void tst_qdeclarativetextedit::pastingRichText_QTBUG_14003() +{ +#ifndef QT_NO_CLIPBOARD + QString componentStr = "import QtQuick 1.0\nTextEdit { textFormat: TextEdit.PlainText }"; + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeTextEdit *obj = qobject_cast(component.create()); + + QTRY_VERIFY(obj != 0); + QTRY_VERIFY(obj->textFormat() == QDeclarativeTextEdit::PlainText); + + QMimeData *mData = new QMimeData; + mData->setHtml("Hello"); + QApplication::clipboard()->setMimeData(mData); + + obj->paste(); + QTRY_VERIFY(obj->text() == ""); + QTRY_VERIFY(obj->textFormat() == QDeclarativeTextEdit::PlainText); +#endif +} + +void tst_qdeclarativetextedit::implicitSize_data() +{ + QTest::addColumn("text"); + QTest::addColumn("wrap"); + QTest::newRow("plain") << "The quick red fox jumped over the lazy brown dog" << "TextEdit.NoWrap"; + QTest::newRow("richtext") << "The quick red fox jumped over the lazy brown dog" << "TextEdit.NoWrap"; + QTest::newRow("plain_wrap") << "The quick red fox jumped over the lazy brown dog" << "TextEdit.Wrap"; + QTest::newRow("richtext_wrap") << "The quick red fox jumped over the lazy brown dog" << "TextEdit.Wrap"; +} + +void tst_qdeclarativetextedit::implicitSize() +{ + QFETCH(QString, text); + QFETCH(QString, wrap); + QString componentStr = "import QtQuick 1.1\nTextEdit { text: \"" + text + "\"; width: 50; wrapMode: " + wrap + " }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeTextEdit *textObject = qobject_cast(textComponent.create()); + + QVERIFY(textObject->width() < textObject->implicitWidth()); + QVERIFY(textObject->height() == textObject->implicitHeight()); + + textObject->resetWidth(); + QVERIFY(textObject->width() == textObject->implicitWidth()); + QVERIFY(textObject->height() == textObject->implicitHeight()); +} + +void tst_qdeclarativetextedit::implicitSizePreedit_data() +{ + QTest::addColumn("text"); + QTest::addColumn("wrap"); + QTest::addColumn("wrapped"); + QTest::newRow("plain") << "The quick red fox jumped over the lazy brown dog" << "TextEdit.NoWrap" << false; + QTest::newRow("plain_wrap") << "The quick red fox jumped over the lazy brown dog" << "TextEdit.Wrap" << true; + +} + +void tst_qdeclarativetextedit::implicitSizePreedit() +{ + QFETCH(QString, text); + QFETCH(QString, wrap); + QFETCH(bool, wrapped); + + QString componentStr = "import QtQuick 1.1\nTextEdit { focus: true; width: 50; wrapMode: " + wrap + " }"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeTextEdit *textObject = qobject_cast(textComponent.create()); + + QGraphicsScene scene; + QGraphicsView view(&scene); + scene.addItem(textObject); + view.show(); + QApplication::setActiveWindow(&view); + QTest::qWaitForWindowShown(&view); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(&view)); + + QInputMethodEvent event(text, QList()); + QCoreApplication::sendEvent(&view, &event); + + QVERIFY(textObject->width() < textObject->implicitWidth()); + QVERIFY(textObject->height() == textObject->implicitHeight()); + qreal wrappedHeight = textObject->height(); + + textObject->resetWidth(); + QVERIFY(textObject->width() == textObject->implicitWidth()); + QVERIFY(textObject->height() == textObject->implicitHeight()); + QCOMPARE(textObject->height() < wrappedHeight, wrapped); +} + +void tst_qdeclarativetextedit::testQtQuick11Attributes() +{ + QFETCH(QString, code); + QFETCH(QString, warning); + QFETCH(QString, error); + + QDeclarativeEngine engine; + QObject *obj; + + QDeclarativeComponent valid(&engine); + valid.setData("import QtQuick 1.1; TextEdit { " + code.toUtf8() + " }", QUrl("")); + obj = valid.create(); + QVERIFY(obj); + QVERIFY(valid.errorString().isEmpty()); + delete obj; + + QDeclarativeComponent invalid(&engine); + invalid.setData("import QtQuick 1.0; TextEdit { " + code.toUtf8() + " }", QUrl("")); + QTest::ignoreMessage(QtWarningMsg, warning.toUtf8()); + obj = invalid.create(); + QCOMPARE(invalid.errorString(), error); + delete obj; +} + +void tst_qdeclarativetextedit::testQtQuick11Attributes_data() +{ + QTest::addColumn("code"); + QTest::addColumn("warning"); + QTest::addColumn("error"); + + QTest::newRow("canPaste") << "property bool foo: canPaste" + << ":1: ReferenceError: Can't find variable: canPaste" + << ""; + + QTest::newRow("lineCount") << "property int foo: lineCount" + << ":1: ReferenceError: Can't find variable: lineCount" + << ""; + + QTest::newRow("moveCursorSelection") << "Component.onCompleted: moveCursorSelection(0, TextEdit.SelectCharacters)" + << ":1: ReferenceError: Can't find variable: moveCursorSelection" + << ""; + + QTest::newRow("deselect") << "Component.onCompleted: deselect()" + << ":1: ReferenceError: Can't find variable: deselect" + << ""; + + QTest::newRow("onLinkActivated") << "onLinkActivated: {}" + << "QDeclarativeComponent: Component is not ready" + << ":1 \"TextEdit.onLinkActivated\" is not available in QtQuick 1.0.\n"; +} + +void tst_qdeclarativetextedit::preeditMicroFocus() +{ + QString preeditText = "super"; + + QGraphicsScene scene; + QGraphicsView view(&scene); + MyInputContext ic; + view.setInputContext(&ic); + QDeclarativeTextEdit edit; + edit.setFocus(true); + scene.addItem(&edit); + view.show(); + QApplication::setActiveWindow(&view); + QTest::qWaitForWindowShown(&view); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(&view)); + + QSignalSpy cursorRectangleSpy(&edit, SIGNAL(cursorRectangleChanged())); + + QRect currentRect; + QRect previousRect = edit.inputMethodQuery(Qt::ImMicroFocus).toRect(); + + // Verify that the micro focus rect is positioned the same for position 0 as + // it would be if there was no preedit text. + ic.updateReceived = false; + ic.sendPreeditText(preeditText, 0); + currentRect = edit.inputMethodQuery(Qt::ImMicroFocus).toRect(); + QCOMPARE(currentRect, previousRect); +#if defined(Q_WS_X11) || defined(Q_WS_QWS) || defined(Q_OS_SYMBIAN) + QCOMPARE(ic.updateReceived, false); // The cursor position hasn't changed. +#endif + QCOMPARE(cursorRectangleSpy.count(), 0); + + // Verify that the micro focus rect moves to the left as the cursor position + // is incremented. + for (int i = 1; i <= 5; ++i) { + ic.updateReceived = false; + ic.sendPreeditText(preeditText, i); + currentRect = edit.inputMethodQuery(Qt::ImMicroFocus).toRect(); + QVERIFY(previousRect.left() < currentRect.left()); +#if defined(Q_WS_X11) || defined(Q_WS_QWS) || defined(Q_OS_SYMBIAN) + QCOMPARE(ic.updateReceived, true); +#endif + QVERIFY(cursorRectangleSpy.count() > 0); + cursorRectangleSpy.clear(); + previousRect = currentRect; + } + + // Verify that if there is no preedit cursor then the micro focus rect is the + // same as it would be if it were positioned at the end of the preedit text. + ic.sendPreeditText(preeditText, 0); + ic.updateReceived = false; + ic.sendEvent(QInputMethodEvent(preeditText, QList())); + currentRect = edit.inputMethodQuery(Qt::ImMicroFocus).toRect(); + QCOMPARE(currentRect, previousRect); +#if defined(Q_WS_X11) || defined(Q_WS_QWS) || defined(Q_OS_SYMBIAN) + QCOMPARE(ic.updateReceived, true); +#endif + QVERIFY(cursorRectangleSpy.count() > 0); +} + +void tst_qdeclarativetextedit::inputContextMouseHandler() +{ + QString text = "supercalifragisiticexpialidocious!"; + + QGraphicsScene scene; + QGraphicsView view(&scene); + MyInputContext ic; + view.setInputContext(&ic); + QDeclarativeTextEdit edit; + edit.setPos(0, 0); + edit.setWidth(200); + edit.setText(text.mid(0, 12)); + edit.setPos(0, 0); + edit.setCursorPosition(12); + edit.setFocus(true); + scene.addItem(&edit); + view.show(); + QApplication::setActiveWindow(&view); + QTest::qWaitForWindowShown(&view); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(&view)); + view.setFocus(); + + QFontMetricsF fm(edit.font()); + const qreal y = fm.height() / 2; + + QPoint position2 = view.mapFromScene(edit.mapToScene(QPointF(fm.width(text.mid(0, 2)), y))); + QPoint position8 = view.mapFromScene(edit.mapToScene(QPointF(fm.width(text.mid(0, 8)), y))); + QPoint position20 = view.mapFromScene(edit.mapToScene(QPointF(fm.width(text.mid(0, 20)), y))); + QPoint position27 = view.mapFromScene(edit.mapToScene(QPointF(fm.width(text.mid(0, 27)), y))); + QPoint globalPosition2 = view.viewport()->mapToGlobal(position2); + QPoint globalposition8 = view.viewport()->mapToGlobal(position8); + QPoint globalposition20 = view.viewport()->mapToGlobal(position20); + QPoint globalposition27 = view.viewport()->mapToGlobal(position27); + + ic.sendEvent(QInputMethodEvent(text.mid(12), QList())); + + QTest::mouseDClick(view.viewport(), Qt::LeftButton, Qt::NoModifier, position2); + QCOMPARE(ic.eventType, QEvent::MouseButtonDblClick); + QCOMPARE(ic.eventPosition, position2); + QCOMPARE(ic.eventGlobalPosition, globalPosition2); + QCOMPARE(ic.eventButton, Qt::LeftButton); + QCOMPARE(ic.eventModifiers, Qt::NoModifier); + QVERIFY(ic.cursor < 0); + ic.eventType = QEvent::None; + + QTest::mousePress(view.viewport(), Qt::LeftButton, Qt::NoModifier, position2); + QCOMPARE(ic.eventType, QEvent::MouseButtonPress); + QCOMPARE(ic.eventPosition, position2); + QCOMPARE(ic.eventGlobalPosition, globalPosition2); + QCOMPARE(ic.eventButton, Qt::LeftButton); + QCOMPARE(ic.eventModifiers, Qt::NoModifier); + QVERIFY(ic.cursor < 0); + ic.eventType = QEvent::None; + + { QMouseEvent mv(QEvent::MouseMove, position8, globalposition8, Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(view.viewport(), &mv); } + QCOMPARE(ic.eventType, QEvent::None); + + { QMouseEvent mv(QEvent::MouseMove, position27, globalposition27, Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(view.viewport(), &mv); } + QCOMPARE(ic.eventType, QEvent::MouseMove); + QCOMPARE(ic.eventPosition, position27); + QCOMPARE(ic.eventGlobalPosition, globalposition27); + QCOMPARE(ic.eventButton, Qt::LeftButton); + QCOMPARE(ic.eventModifiers, Qt::NoModifier); + QVERIFY(ic.cursor >= 14 && ic.cursor <= 16); // 15 is expected but some platforms may be off by one. + ic.eventType = QEvent::None; + + QTest::mouseRelease(view.viewport(), Qt::LeftButton, Qt::NoModifier, position27); + QCOMPARE(ic.eventType, QEvent::MouseButtonRelease); + QCOMPARE(ic.eventPosition, position27); + QCOMPARE(ic.eventGlobalPosition, globalposition27); + QCOMPARE(ic.eventButton, Qt::LeftButton); + QCOMPARE(ic.eventModifiers, Qt::NoModifier); + QVERIFY(ic.cursor >= 14 && ic.cursor <= 16); + ic.eventType = QEvent::None; + + // And in the other direction. + QTest::mouseDClick(view.viewport(), Qt::LeftButton, Qt::ControlModifier, position27); + QCOMPARE(ic.eventType, QEvent::MouseButtonDblClick); + QCOMPARE(ic.eventPosition, position27); + QCOMPARE(ic.eventGlobalPosition, globalposition27); + QCOMPARE(ic.eventButton, Qt::LeftButton); + QCOMPARE(ic.eventModifiers, Qt::ControlModifier); + QVERIFY(ic.cursor >= 14 && ic.cursor <= 16); + ic.eventType = QEvent::None; + + QTest::mousePress(view.viewport(), Qt::RightButton, Qt::ControlModifier, position27); + QCOMPARE(ic.eventType, QEvent::MouseButtonPress); + QCOMPARE(ic.eventPosition, position27); + QCOMPARE(ic.eventGlobalPosition, globalposition27); + QCOMPARE(ic.eventButton, Qt::RightButton); + QCOMPARE(ic.eventModifiers, Qt::ControlModifier); + QVERIFY(ic.cursor >= 14 && ic.cursor <= 16); + ic.eventType = QEvent::None; + + { QMouseEvent mv(QEvent::MouseMove, position20, globalposition20, Qt::RightButton, Qt::RightButton,Qt::ControlModifier); + QApplication::sendEvent(view.viewport(), &mv); } + QCOMPARE(ic.eventType, QEvent::MouseMove); + QCOMPARE(ic.eventPosition, position20); + QCOMPARE(ic.eventGlobalPosition, globalposition20); + QCOMPARE(ic.eventButton, Qt::RightButton); + QCOMPARE(ic.eventModifiers, Qt::ControlModifier); + QVERIFY(ic.cursor >= 7 && ic.cursor <= 9); + ic.eventType = QEvent::None; + + { QMouseEvent mv(QEvent::MouseMove, position2, globalPosition2, Qt::RightButton, Qt::RightButton,Qt::ControlModifier); + QApplication::sendEvent(view.viewport(), &mv); } + QCOMPARE(ic.eventType, QEvent::None); + + QTest::mouseRelease(view.viewport(), Qt::RightButton, Qt::ControlModifier, position2); + QCOMPARE(ic.eventType, QEvent::MouseButtonRelease); + QCOMPARE(ic.eventPosition, position2); + QCOMPARE(ic.eventGlobalPosition, globalPosition2); + QCOMPARE(ic.eventButton, Qt::RightButton); + QCOMPARE(ic.eventModifiers, Qt::ControlModifier); + QVERIFY(ic.cursor < 0); + ic.eventType = QEvent::None; +} + +void tst_qdeclarativetextedit::inputMethodComposing() +{ + QString text = "supercalifragisiticexpialidocious!"; + + QGraphicsScene scene; + QGraphicsView view(&scene); + MyInputContext ic; + view.setInputContext(&ic); + QDeclarativeTextEdit edit; + edit.setWidth(200); + edit.setText(text.mid(0, 12)); + edit.setCursorPosition(12); + edit.setPos(0, 0); + edit.setFocus(true); + scene.addItem(&edit); + view.show(); + QApplication::setActiveWindow(&view); + QTest::qWaitForWindowShown(&view); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(&view)); + + QSignalSpy spy(&edit, SIGNAL(inputMethodComposingChanged())); + + QCOMPARE(edit.isInputMethodComposing(), false); + + ic.sendEvent(QInputMethodEvent(text.mid(3), QList())); + QCOMPARE(edit.isInputMethodComposing(), true); + QCOMPARE(spy.count(), 1); + + ic.sendEvent(QInputMethodEvent(text.mid(12), QList())); + QCOMPARE(edit.isInputMethodComposing(), true); + QCOMPARE(spy.count(), 1); + + ic.sendEvent(QInputMethodEvent()); + QCOMPARE(edit.isInputMethodComposing(), false); + QCOMPARE(spy.count(), 2); +} + +void tst_qdeclarativetextedit::cursorRectangleSize() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/CursorRect.qml"); + QVERIFY(canvas->rootObject() != 0); + canvas->show(); + canvas->setFocus(); + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + + QDeclarativeTextEdit *textEdit = qobject_cast(canvas->rootObject()); + QVERIFY(textEdit != 0); + textEdit->setFocus(Qt::OtherFocusReason); + QRectF cursorRect = textEdit->positionToRectangle(textEdit->cursorPosition()); + QRectF microFocusFromScene = canvas->scene()->inputMethodQuery(Qt::ImMicroFocus).toRectF(); + QRectF microFocusFromApp= QApplication::focusWidget()->inputMethodQuery(Qt::ImMicroFocus).toRectF(); + + QCOMPARE(microFocusFromScene.size(), cursorRect.size()); + QCOMPARE(microFocusFromApp.size(), cursorRect.size()); +} + +void tst_qdeclarativetextedit::deselect() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/CursorRect.qml"); + QVERIFY(canvas->rootObject() != 0); + canvas->show(); + canvas->setFocus(); + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + + QDeclarativeTextEdit *textEdit = qobject_cast(canvas->rootObject()); + QVERIFY(textEdit != 0); + + textEdit->setText("Select"); + + QSignalSpy selectionStartSpy(textEdit, SIGNAL(selectionStartChanged())); + QSignalSpy selectionEndSpy(textEdit, SIGNAL(selectionEndChanged())); + QSignalSpy selectionSpy(textEdit, SIGNAL(selectionChanged())); + + textEdit->select(5, 6); + + QCOMPARE(selectionStartSpy.count(), 1); + QCOMPARE(selectionEndSpy.count(), 1); + QCOMPARE(selectionSpy.count(), 1); + QCOMPARE(textEdit->selectionStart(), 5); + QCOMPARE(textEdit->selectionEnd(), 6); + QCOMPARE(textEdit->selectedText(), QLatin1String("t")); + QCOMPARE(textEdit->cursorPosition(), 6); + + textEdit->deselect(); + + QCOMPARE(selectionStartSpy.count(), 2); + QCOMPARE(selectionEndSpy.count(), 1); + QCOMPARE(selectionSpy.count(), 2); + QCOMPARE(textEdit->selectionStart(), textEdit->cursorPosition()); + QCOMPARE(textEdit->selectionEnd(), textEdit->cursorPosition()); + QCOMPARE(textEdit->selectedText(), QLatin1String("")); + QCOMPARE(textEdit->cursorPosition(), 6); + + textEdit->select(5, 6); + + QCOMPARE(selectionStartSpy.count(), 3); + QCOMPARE(selectionEndSpy.count(), 1); + QCOMPARE(selectionSpy.count(), 3); + QCOMPARE(textEdit->selectionStart(), 5); + QCOMPARE(textEdit->selectionEnd(), 6); + QCOMPARE(textEdit->selectedText(), QLatin1String("t")); + QCOMPARE(textEdit->cursorPosition(), 6); + + QKeyEvent leftArrowPress(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier); + QKeyEvent leftArrowRelese(QEvent::KeyRelease, Qt::Key_Left, Qt::NoModifier); + QApplication::sendEvent(canvas, &leftArrowPress); + QApplication::sendEvent(canvas, &leftArrowRelese); + + QCOMPARE(selectionStartSpy.count(), 3); + QCOMPARE(selectionEndSpy.count(), 2); + QCOMPARE(selectionSpy.count(), 4); + QCOMPARE(textEdit->selectionStart(), textEdit->cursorPosition()); + QCOMPARE(textEdit->selectionEnd(), textEdit->cursorPosition()); + QCOMPARE(textEdit->selectedText(), QLatin1String("")); + QCOMPARE(textEdit->cursorPosition(), 5); + + textEdit->select(5, 6); + + QCOMPARE(selectionStartSpy.count(), 3); + QCOMPARE(selectionEndSpy.count(), 3); + QCOMPARE(selectionSpy.count(), 5); + QCOMPARE(textEdit->selectionStart(), 5); + QCOMPARE(textEdit->selectionEnd(), 6); + QCOMPARE(textEdit->selectedText(), QLatin1String("t")); + QCOMPARE(textEdit->cursorPosition(), 6); + + QList attributes; + attributes << QInputMethodEvent::Attribute(QInputMethodEvent::Selection, 0, 0, QVariant()); + QInputMethodEvent event(QLatin1String(""), attributes); + QApplication::sendEvent(canvas, &event); + + QCOMPARE(selectionStartSpy.count(), 4); + QCOMPARE(selectionEndSpy.count(), 4); + QCOMPARE(selectionSpy.count(), 6); + QCOMPARE(textEdit->selectionStart(), textEdit->cursorPosition()); + QCOMPARE(textEdit->selectionEnd(), textEdit->cursorPosition()); + QCOMPARE(textEdit->selectedText(), QLatin1String("")); + QCOMPARE(textEdit->cursorPosition(), 0); + + textEdit->setCursorPosition(1); + + QCOMPARE(selectionStartSpy.count(), 5); + QCOMPARE(selectionEndSpy.count(), 5); + QCOMPARE(selectionSpy.count(), 6); + + QKeyEvent leftArrowShiftPress(QEvent::KeyPress, Qt::Key_Left, Qt::ShiftModifier); + QKeyEvent leftArrowShiftRelese(QEvent::KeyRelease, Qt::Key_Left, Qt::ShiftModifier); + QApplication::sendEvent(canvas, &leftArrowShiftPress); + QApplication::sendEvent(canvas, &leftArrowShiftRelese); + + QCOMPARE(selectionStartSpy.count(), 6); + QCOMPARE(selectionEndSpy.count(), 5); + QCOMPARE(selectionSpy.count(), 7); + QCOMPARE(textEdit->selectionStart(), 0); + QCOMPARE(textEdit->selectionEnd(), 1); + QCOMPARE(textEdit->selectedText(), QLatin1String("S")); + QCOMPARE(textEdit->cursorPosition(), 0); + + QApplication::sendEvent(canvas, &event); + + QCOMPARE(selectionStartSpy.count(), 6); + QCOMPARE(selectionEndSpy.count(), 6); + QCOMPARE(selectionSpy.count(), 8); + QCOMPARE(textEdit->selectionStart(), textEdit->cursorPosition()); + QCOMPARE(textEdit->selectionEnd(), textEdit->cursorPosition()); + QCOMPARE(textEdit->selectedText(), QLatin1String("")); + QCOMPARE(textEdit->cursorPosition(), 0); +} +QTEST_MAIN(tst_qdeclarativetextedit) + +#include "tst_qdeclarativetextedit.moc" diff --git a/tests/auto/declarative/qdeclarativetextinput/data/cursorTest.qml b/tests/auto/declarative/qdeclarativetextinput/data/cursorTest.qml new file mode 100644 index 00000000..73085c17 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextinput/data/cursorTest.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 + +Rectangle { width: 300; height: 300; color: "white" + TextInput { text: "Hello world!"; id: textInputObject; objectName: "textInputObject" + resources: [ Component { id:cursor; Item { id:cursorInstance; objectName: "cursorInstance";} } ] + cursorDelegate: cursor + } +} diff --git a/tests/auto/declarative/qdeclarativetextinput/data/echoMode.qml b/tests/auto/declarative/qdeclarativetextinput/data/echoMode.qml new file mode 100644 index 00000000..0320872b --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextinput/data/echoMode.qml @@ -0,0 +1,11 @@ +import QtQuick 1.0 + +Rectangle { + property QtObject myInput: input + + width: 400; height: 200; color: "green" + + TextInput { id: input; focus: true + text: "ABCDefgh" + } +} diff --git a/tests/auto/declarative/qdeclarativetextinput/data/geometrySignals.qml b/tests/auto/declarative/qdeclarativetextinput/data/geometrySignals.qml new file mode 100644 index 00000000..353d0e2f --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextinput/data/geometrySignals.qml @@ -0,0 +1,12 @@ +import QtQuick 1.0 + +Item { + width: 400; height: 500; + property int bindingWidth: text.width + property int bindingHeight: text.height + + TextEdit { + id: text + anchors.fill: parent + } +} diff --git a/tests/auto/declarative/qdeclarativetextinput/data/halign_center.png b/tests/auto/declarative/qdeclarativetextinput/data/halign_center.png new file mode 100644 index 00000000..53e09a8e Binary files /dev/null and b/tests/auto/declarative/qdeclarativetextinput/data/halign_center.png differ diff --git a/tests/auto/declarative/qdeclarativetextinput/data/halign_left.png b/tests/auto/declarative/qdeclarativetextinput/data/halign_left.png new file mode 100644 index 00000000..247acbc9 Binary files /dev/null and b/tests/auto/declarative/qdeclarativetextinput/data/halign_left.png differ diff --git a/tests/auto/declarative/qdeclarativetextinput/data/halign_right.png b/tests/auto/declarative/qdeclarativetextinput/data/halign_right.png new file mode 100644 index 00000000..691bc75c Binary files /dev/null and b/tests/auto/declarative/qdeclarativetextinput/data/halign_right.png differ diff --git a/tests/auto/declarative/qdeclarativetextinput/data/horizontalAlignment.qml b/tests/auto/declarative/qdeclarativetextinput/data/horizontalAlignment.qml new file mode 100644 index 00000000..3114c482 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextinput/data/horizontalAlignment.qml @@ -0,0 +1,22 @@ +import QtQuick 1.0 + +Rectangle { + id: top + width: 70; height: 70; + + property alias horizontalAlignment: text.horizontalAlignment + property string text: "Test" + + Rectangle { + anchors.centerIn: parent + width: 60 + height: 20 + color: "green" + + TextInput { + id: text + anchors.fill: parent + text: top.text + } + } +} diff --git a/tests/auto/declarative/qdeclarativetextinput/data/horizontalAlignment_RightToLeft.qml b/tests/auto/declarative/qdeclarativetextinput/data/horizontalAlignment_RightToLeft.qml new file mode 100644 index 00000000..7f27bbe5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextinput/data/horizontalAlignment_RightToLeft.qml @@ -0,0 +1,24 @@ +import QtQuick 1.0 + +Rectangle { + id: top + width: 200; height: 70; + + property alias horizontalAlignment: text.horizontalAlignment + property string text: "اختبا" + + Rectangle { + anchors.centerIn: parent + width: 180 + height: 20 + color: "green" + + TextInput { + id: text + objectName: "text" + anchors.fill: parent + text: top.text + focus: true + } + } +} diff --git a/tests/auto/declarative/qdeclarativetextinput/data/inputmethods.qml b/tests/auto/declarative/qdeclarativetextinput/data/inputmethods.qml new file mode 100644 index 00000000..50638923 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextinput/data/inputmethods.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +TextInput { + text: "Hello world!" + inputMethodHints: Qt.ImhNoPredictiveText + Keys.onLeftPressed: {} +} diff --git a/tests/auto/declarative/qdeclarativetextinput/data/masks.qml b/tests/auto/declarative/qdeclarativetextinput/data/masks.qml new file mode 100644 index 00000000..c75764af --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextinput/data/masks.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +TextInput{ + focus: true + objectName: "myInput" + inputMask: "HHHHhhhh; " +} diff --git a/tests/auto/declarative/qdeclarativetextinput/data/maxLength.qml b/tests/auto/declarative/qdeclarativetextinput/data/maxLength.qml new file mode 100644 index 00000000..95902bb6 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextinput/data/maxLength.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +TextInput{ + focus: true + objectName: "myInput" + maximumLength: 10 +} diff --git a/tests/auto/declarative/qdeclarativetextinput/data/mouseselection_default.qml b/tests/auto/declarative/qdeclarativetextinput/data/mouseselection_default.qml new file mode 100644 index 00000000..eea83ed0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextinput/data/mouseselection_default.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +TextInput { + focus: true + text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + selectByMouse: false +} diff --git a/tests/auto/declarative/qdeclarativetextinput/data/mouseselection_false.qml b/tests/auto/declarative/qdeclarativetextinput/data/mouseselection_false.qml new file mode 100644 index 00000000..eea83ed0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextinput/data/mouseselection_false.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +TextInput { + focus: true + text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + selectByMouse: false +} diff --git a/tests/auto/declarative/qdeclarativetextinput/data/mouseselection_false_readonly.qml b/tests/auto/declarative/qdeclarativetextinput/data/mouseselection_false_readonly.qml new file mode 100644 index 00000000..36a95634 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextinput/data/mouseselection_false_readonly.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 + +TextInput { + focus: true + text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + selectByMouse: false + readOnly: true +} diff --git a/tests/auto/declarative/qdeclarativetextinput/data/mouseselection_false_words.qml b/tests/auto/declarative/qdeclarativetextinput/data/mouseselection_false_words.qml new file mode 100644 index 00000000..eea83ed0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextinput/data/mouseselection_false_words.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +TextInput { + focus: true + text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + selectByMouse: false +} diff --git a/tests/auto/declarative/qdeclarativetextinput/data/mouseselection_true.qml b/tests/auto/declarative/qdeclarativetextinput/data/mouseselection_true.qml new file mode 100644 index 00000000..8115ba05 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextinput/data/mouseselection_true.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +TextInput { + focus: true + text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + selectByMouse: true +} diff --git a/tests/auto/declarative/qdeclarativetextinput/data/mouseselection_true_readonly.qml b/tests/auto/declarative/qdeclarativetextinput/data/mouseselection_true_readonly.qml new file mode 100644 index 00000000..678a89aa --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextinput/data/mouseselection_true_readonly.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 + +TextInput { + focus: true + text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + selectByMouse: true + readOnly: true +} diff --git a/tests/auto/declarative/qdeclarativetextinput/data/mouseselection_true_words.qml b/tests/auto/declarative/qdeclarativetextinput/data/mouseselection_true_words.qml new file mode 100644 index 00000000..8115ba05 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextinput/data/mouseselection_true_words.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +TextInput { + focus: true + text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + selectByMouse: true +} diff --git a/tests/auto/declarative/qdeclarativetextinput/data/mouseselectionmode_characters.qml b/tests/auto/declarative/qdeclarativetextinput/data/mouseselectionmode_characters.qml new file mode 100644 index 00000000..0ffc6ff2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextinput/data/mouseselectionmode_characters.qml @@ -0,0 +1,8 @@ +import QtQuick 1.1 + +TextInput { + focus: true + text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + selectByMouse: true + mouseSelectionMode: TextInput.SelectCharacters +} diff --git a/tests/auto/declarative/qdeclarativetextinput/data/mouseselectionmode_default.qml b/tests/auto/declarative/qdeclarativetextinput/data/mouseselectionmode_default.qml new file mode 100644 index 00000000..87c174be --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextinput/data/mouseselectionmode_default.qml @@ -0,0 +1,7 @@ +import QtQuick 1.1 + +TextInput { + focus: true + text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + selectByMouse: true +} diff --git a/tests/auto/declarative/qdeclarativetextinput/data/mouseselectionmode_words.qml b/tests/auto/declarative/qdeclarativetextinput/data/mouseselectionmode_words.qml new file mode 100644 index 00000000..df69a7d0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextinput/data/mouseselectionmode_words.qml @@ -0,0 +1,8 @@ +import QtQuick 1.1 + +TextInput { + focus: true + text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + selectByMouse: true + mouseSelectionMode: TextInput.SelectWords +} diff --git a/tests/auto/declarative/qdeclarativetextinput/data/navigation.qml b/tests/auto/declarative/qdeclarativetextinput/data/navigation.qml new file mode 100644 index 00000000..af1b1409 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextinput/data/navigation.qml @@ -0,0 +1,24 @@ +import QtQuick 1.0 + +Rectangle { + property variant myInput: input + + width: 800; height: 600; color: "blue" + + Item { + id: firstItem; + KeyNavigation.right: input + } + + TextInput { id: input; focus: true + text: "Needs some text" + KeyNavigation.left: firstItem + KeyNavigation.right: lastItem + KeyNavigation.up: firstItem + KeyNavigation.down: lastItem + } + Item { + id: lastItem + KeyNavigation.left: input + } +} diff --git a/tests/auto/declarative/qdeclarativetextinput/data/positionAt.qml b/tests/auto/declarative/qdeclarativetextinput/data/positionAt.qml new file mode 100644 index 00000000..cbbf33d9 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextinput/data/positionAt.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 + +TextInput{ + focus: true + objectName: "myInput" + width: 50 + text: "This is a long piece of text" +} diff --git a/tests/auto/declarative/qdeclarativetextinput/data/readOnly.qml b/tests/auto/declarative/qdeclarativetextinput/data/readOnly.qml new file mode 100644 index 00000000..f173649e --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextinput/data/readOnly.qml @@ -0,0 +1,12 @@ +import QtQuick 1.0 + +Rectangle { + property variant myInput: input + + width: 800; height: 600; color: "blue" + + TextInput { id: input; focus: true + readOnly: true + text: "I am the very model of a modern major general.\n" + } +} diff --git a/tests/auto/declarative/qdeclarativetextinput/data/validators.qml b/tests/auto/declarative/qdeclarativetextinput/data/validators.qml new file mode 100644 index 00000000..e26bcb30 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextinput/data/validators.qml @@ -0,0 +1,22 @@ +import QtQuick 1.0 + +Item { + property variant intInput: intInput + property variant dblInput: dblInput + property variant strInput: strInput + + width: 800; height: 600; + + Column{ + TextInput { id: intInput; + validator: IntValidator{top: 11; bottom: 2} + } + TextInput { id: dblInput; + validator: DoubleValidator{top: 12.12; bottom: 2.93; decimals: 2; notation: DoubleValidator.StandardNotation} + } + TextInput { id: strInput; + validator: RegExpValidator { regExp: /[a-zA-z]{2,4}/ } + } + } + +} diff --git a/tests/auto/declarative/qdeclarativetextinput/qdeclarativetextinput.pro b/tests/auto/declarative/qdeclarativetextinput/qdeclarativetextinput.pro new file mode 100644 index 00000000..0fee1c93 --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextinput/qdeclarativetextinput.pro @@ -0,0 +1,14 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative gui +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativetextinput.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + diff --git a/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp b/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp new file mode 100644 index 00000000..df598bea --- /dev/null +++ b/tests/auto/declarative/qdeclarativetextinput/tst_qdeclarativetextinput.cpp @@ -0,0 +1,2935 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include "../../../shared/util.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "qplatformdefs.h" + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +Q_DECLARE_METATYPE(QDeclarativeTextInput::SelectionMode) + +QString createExpectedFileIfNotFound(const QString& filebasename, const QImage& actual) +{ + // XXX This will be replaced by some clever persistent platform image store. + QString persistent_dir = SRCDIR "/data"; + QString arch = "unknown-architecture"; // QTest needs to help with this. + + QString expectfile = persistent_dir + QDir::separator() + filebasename + "-" + arch + ".png"; + + if (!QFile::exists(expectfile)) { + actual.save(expectfile); + qWarning() << "created" << expectfile; + } + + return expectfile; +} + +class tst_qdeclarativetextinput : public QObject + +{ + Q_OBJECT +public: + tst_qdeclarativetextinput(); + +private slots: + + void text(); + void width(); + void font(); + void color(); + void selection(); + void isRightToLeft_data(); + void isRightToLeft(); + void moveCursorSelection_data(); + void moveCursorSelection(); + void moveCursorSelectionSequence_data(); + void moveCursorSelectionSequence(); + void mouseSelection_data(); + void mouseSelection(); + void deferEnableSelectByMouse_data(); + void deferEnableSelectByMouse(); + void deferDisableSelectByMouse_data(); + void deferDisableSelectByMouse(); + void dragMouseSelection(); + void mouseSelectionMode_data(); + void mouseSelectionMode(); + + void horizontalAlignment_data(); + void horizontalAlignment(); + void horizontalAlignment_RightToLeft(); + + void positionAt(); + + void maxLength(); + void masks(); + void validators(); + void inputMethods(); + + void passwordCharacter(); + void cursorDelegate(); + void cursorVisible(); + void cursorRectangle(); + void navigation(); + void navigation_RTL(); + void copyAndPaste(); + void canPasteEmpty(); + void canPaste(); + void readOnly(); + + void openInputPanelOnClick(); + void openInputPanelOnFocus(); + void setHAlignClearCache(); + void focusOutClearSelection(); + + void echoMode(); +#ifdef QT_GUI_PASSWORD_ECHO_DELAY + void passwordEchoDelay(); +#endif + void geometrySignals(); + void testQtQuick11Attributes(); + void testQtQuick11Attributes_data(); + + void preeditAutoScroll(); + void preeditMicroFocus(); + void inputContextMouseHandler(); + void inputMethodComposing(); + void cursorRectangleSize(); + void deselect(); + +private: + void simulateKey(QDeclarativeView *, int key); + QDeclarativeView *createView(const QString &filename); + + QDeclarativeEngine engine; + QStringList standard; + QStringList colorStrings; +}; + +tst_qdeclarativetextinput::tst_qdeclarativetextinput() +{ + standard << "the quick brown fox jumped over the lazy dog" + << "It's supercalifragisiticexpialidocious!" + << "Hello, world!" + << "!dlrow ,olleH" + << " spacey text "; + + colorStrings << "aliceblue" + << "antiquewhite" + << "aqua" + << "darkkhaki" + << "darkolivegreen" + << "dimgray" + << "palevioletred" + << "lightsteelblue" + << "#000000" + << "#AAAAAA" + << "#FFFFFF" + << "#2AC05F"; +} + +void tst_qdeclarativetextinput::text() +{ + { + QDeclarativeComponent textinputComponent(&engine); + textinputComponent.setData("import QtQuick 1.0\nTextInput { text: \"\" }", QUrl()); + QDeclarativeTextInput *textinputObject = qobject_cast(textinputComponent.create()); + + QVERIFY(textinputObject != 0); + QCOMPARE(textinputObject->text(), QString("")); + + delete textinputObject; + } + + for (int i = 0; i < standard.size(); i++) + { + QString componentStr = "import QtQuick 1.0\nTextInput { text: \"" + standard.at(i) + "\" }"; + QDeclarativeComponent textinputComponent(&engine); + textinputComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextInput *textinputObject = qobject_cast(textinputComponent.create()); + + QVERIFY(textinputObject != 0); + QCOMPARE(textinputObject->text(), standard.at(i)); + + delete textinputObject; + } + +} + +void tst_qdeclarativetextinput::width() +{ + // uses Font metrics to find the width for standard + { + QDeclarativeComponent textinputComponent(&engine); + textinputComponent.setData("import QtQuick 1.0\nTextInput { text: \"\" }", QUrl()); + QDeclarativeTextInput *textinputObject = qobject_cast(textinputComponent.create()); + + QVERIFY(textinputObject != 0); + QCOMPARE(textinputObject->width(), 0.0); + + delete textinputObject; + } + + for (int i = 0; i < standard.size(); i++) + { + QFont f; + QFontMetricsF fm(f); + qreal metricWidth = fm.width(standard.at(i)); + + QString componentStr = "import QtQuick 1.0\nTextInput { text: \"" + standard.at(i) + "\" }"; + QDeclarativeComponent textinputComponent(&engine); + textinputComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextInput *textinputObject = qobject_cast(textinputComponent.create()); + + QVERIFY(textinputObject != 0); + int delta = abs(int(int(textinputObject->width()) - metricWidth)); + QVERIFY(delta <= 3.0); // As best as we can hope for cross-platform. + + delete textinputObject; + } +} + +void tst_qdeclarativetextinput::font() +{ + //test size, then bold, then italic, then family + { + QString componentStr = "import QtQuick 1.0\nTextInput { font.pointSize: 40; text: \"Hello World\" }"; + QDeclarativeComponent textinputComponent(&engine); + textinputComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextInput *textinputObject = qobject_cast(textinputComponent.create()); + + QVERIFY(textinputObject != 0); + QCOMPARE(textinputObject->font().pointSize(), 40); + QCOMPARE(textinputObject->font().bold(), false); + QCOMPARE(textinputObject->font().italic(), false); + + delete textinputObject; + } + + { + QString componentStr = "import QtQuick 1.0\nTextInput { font.bold: true; text: \"Hello World\" }"; + QDeclarativeComponent textinputComponent(&engine); + textinputComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextInput *textinputObject = qobject_cast(textinputComponent.create()); + + QVERIFY(textinputObject != 0); + QCOMPARE(textinputObject->font().bold(), true); + QCOMPARE(textinputObject->font().italic(), false); + + delete textinputObject; + } + + { + QString componentStr = "import QtQuick 1.0\nTextInput { font.italic: true; text: \"Hello World\" }"; + QDeclarativeComponent textinputComponent(&engine); + textinputComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextInput *textinputObject = qobject_cast(textinputComponent.create()); + + QVERIFY(textinputObject != 0); + QCOMPARE(textinputObject->font().italic(), true); + QCOMPARE(textinputObject->font().bold(), false); + + delete textinputObject; + } + + { + QString componentStr = "import QtQuick 1.0\nTextInput { font.family: \"Helvetica\"; text: \"Hello World\" }"; + QDeclarativeComponent textinputComponent(&engine); + textinputComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextInput *textinputObject = qobject_cast(textinputComponent.create()); + + QVERIFY(textinputObject != 0); + QCOMPARE(textinputObject->font().family(), QString("Helvetica")); + QCOMPARE(textinputObject->font().bold(), false); + QCOMPARE(textinputObject->font().italic(), false); + + delete textinputObject; + } + + { + QString componentStr = "import QtQuick 1.0\nTextInput { font.family: \"\"; text: \"Hello World\" }"; + QDeclarativeComponent textinputComponent(&engine); + textinputComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextInput *textinputObject = qobject_cast(textinputComponent.create()); + + QVERIFY(textinputObject != 0); + QCOMPARE(textinputObject->font().family(), QString("")); + + delete textinputObject; + } +} + +void tst_qdeclarativetextinput::color() +{ + //test color + for (int i = 0; i < colorStrings.size(); i++) + { + QString componentStr = "import QtQuick 1.0\nTextInput { color: \"" + colorStrings.at(i) + "\"; text: \"Hello World\" }"; + QDeclarativeComponent textinputComponent(&engine); + textinputComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextInput *textinputObject = qobject_cast(textinputComponent.create()); + QVERIFY(textinputObject != 0); + QCOMPARE(textinputObject->color(), QColor(colorStrings.at(i))); + + delete textinputObject; + } + + //test selection color + for (int i = 0; i < colorStrings.size(); i++) + { + QString componentStr = "import QtQuick 1.0\nTextInput { selectionColor: \"" + colorStrings.at(i) + "\"; text: \"Hello World\" }"; + QDeclarativeComponent textinputComponent(&engine); + textinputComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextInput *textinputObject = qobject_cast(textinputComponent.create()); + QVERIFY(textinputObject != 0); + QCOMPARE(textinputObject->selectionColor(), QColor(colorStrings.at(i))); + + delete textinputObject; + } + + //test selected text color + for (int i = 0; i < colorStrings.size(); i++) + { + QString componentStr = "import QtQuick 1.0\nTextInput { selectedTextColor: \"" + colorStrings.at(i) + "\"; text: \"Hello World\" }"; + QDeclarativeComponent textinputComponent(&engine); + textinputComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextInput *textinputObject = qobject_cast(textinputComponent.create()); + QVERIFY(textinputObject != 0); + QCOMPARE(textinputObject->selectedTextColor(), QColor(colorStrings.at(i))); + + delete textinputObject; + } + + { + QString colorStr = "#AA001234"; + QColor testColor("#001234"); + testColor.setAlpha(170); + + QString componentStr = "import QtQuick 1.0\nTextInput { color: \"" + colorStr + "\"; text: \"Hello World\" }"; + QDeclarativeComponent textinputComponent(&engine); + textinputComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextInput *textinputObject = qobject_cast(textinputComponent.create()); + + QVERIFY(textinputObject != 0); + QCOMPARE(textinputObject->color(), testColor); + + delete textinputObject; + } +} + +void tst_qdeclarativetextinput::selection() +{ + QString testStr = standard[0]; + QString componentStr = "import QtQuick 1.0\nTextInput { text: \""+ testStr +"\"; }"; + QDeclarativeComponent textinputComponent(&engine); + textinputComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextInput *textinputObject = qobject_cast(textinputComponent.create()); + QVERIFY(textinputObject != 0); + + + //Test selection follows cursor + for(int i=0; i<= testStr.size(); i++) { + textinputObject->setCursorPosition(i); + QCOMPARE(textinputObject->cursorPosition(), i); + QCOMPARE(textinputObject->selectionStart(), i); + QCOMPARE(textinputObject->selectionEnd(), i); + QVERIFY(textinputObject->selectedText().isNull()); + } + //Test cursor follows selection + for(int i=0; i<= testStr.size(); i++) { + textinputObject->select(i,i); + QCOMPARE(textinputObject->cursorPosition(), i); + QCOMPARE(textinputObject->selectionStart(), i); + QCOMPARE(textinputObject->selectionEnd(), i); + } + + textinputObject->setCursorPosition(0); + QVERIFY(textinputObject->cursorPosition() == 0); + QVERIFY(textinputObject->selectionStart() == 0); + QVERIFY(textinputObject->selectionEnd() == 0); + QVERIFY(textinputObject->selectedText().isNull()); + + // Verify invalid positions are ignored. + textinputObject->setCursorPosition(-1); + QVERIFY(textinputObject->cursorPosition() == 0); + QVERIFY(textinputObject->selectionStart() == 0); + QVERIFY(textinputObject->selectionEnd() == 0); + QVERIFY(textinputObject->selectedText().isNull()); + + textinputObject->setCursorPosition(textinputObject->text().count()+1); + QVERIFY(textinputObject->cursorPosition() == 0); + QVERIFY(textinputObject->selectionStart() == 0); + QVERIFY(textinputObject->selectionEnd() == 0); + QVERIFY(textinputObject->selectedText().isNull()); + + //Test selection + for(int i=0; i<= testStr.size(); i++) { + textinputObject->select(0,i); + QCOMPARE(testStr.mid(0,i), textinputObject->selectedText()); + QCOMPARE(textinputObject->cursorPosition(), i); + } + for(int i=0; i<= testStr.size(); i++) { + textinputObject->select(i,testStr.size()); + QCOMPARE(testStr.mid(i,testStr.size()-i), textinputObject->selectedText()); + QCOMPARE(textinputObject->cursorPosition(), testStr.size()); + } + + textinputObject->setCursorPosition(0); + QVERIFY(textinputObject->cursorPosition() == 0); + QVERIFY(textinputObject->selectionStart() == 0); + QVERIFY(textinputObject->selectionEnd() == 0); + QVERIFY(textinputObject->selectedText().isNull()); + + //Test Error Ignoring behaviour + textinputObject->setCursorPosition(0); + QVERIFY(textinputObject->selectedText().isNull()); + textinputObject->select(-10,0); + QVERIFY(textinputObject->selectedText().isNull()); + textinputObject->select(100,110); + QVERIFY(textinputObject->selectedText().isNull()); + textinputObject->select(0,-10); + QVERIFY(textinputObject->selectedText().isNull()); + textinputObject->select(0,100); + QVERIFY(textinputObject->selectedText().isNull()); + textinputObject->select(0,10); + QVERIFY(textinputObject->selectedText().size() == 10); + textinputObject->select(-10,10); + QVERIFY(textinputObject->selectedText().size() == 10); + textinputObject->select(100,101); + QVERIFY(textinputObject->selectedText().size() == 10); + textinputObject->select(0,-10); + QVERIFY(textinputObject->selectedText().size() == 10); + textinputObject->select(0,100); + QVERIFY(textinputObject->selectedText().size() == 10); + + textinputObject->deselect(); + QVERIFY(textinputObject->selectedText().isNull()); + textinputObject->select(0,10); + QVERIFY(textinputObject->selectedText().size() == 10); + textinputObject->deselect(); + QVERIFY(textinputObject->selectedText().isNull()); + + delete textinputObject; +} + +void tst_qdeclarativetextinput::isRightToLeft_data() +{ + QTest::addColumn("text"); + QTest::addColumn("emptyString"); + QTest::addColumn("firstCharacter"); + QTest::addColumn("lastCharacter"); + QTest::addColumn("middleCharacter"); + QTest::addColumn("startString"); + QTest::addColumn("midString"); + QTest::addColumn("endString"); + + const quint16 arabic_str[] = { 0x0638, 0x0643, 0x00646, 0x0647, 0x0633, 0x0638, 0x0643, 0x00646, 0x0647, 0x0633, 0x0647}; + QTest::newRow("Empty") << "" << false << false << false << false << false << false << false; + QTest::newRow("Neutral") << "23244242" << false << false << false << false << false << false << false; + QTest::newRow("LTR") << "Hello world" << false << false << false << false << false << false << false; + QTest::newRow("RTL") << QString::fromUtf16(arabic_str, 11) << false << true << true << true << true << true << true; + QTest::newRow("Bidi RTL + LTR + RTL") << QString::fromUtf16(arabic_str, 11) + QString("Hello world") + QString::fromUtf16(arabic_str, 11) << false << true << true << false << true << true << true; + QTest::newRow("Bidi LTR + RTL + LTR") << QString("Hello world") + QString::fromUtf16(arabic_str, 11) + QString("Hello world") << false << false << false << true << false << false << false; +} + +void tst_qdeclarativetextinput::isRightToLeft() +{ + QFETCH(QString, text); + QFETCH(bool, emptyString); + QFETCH(bool, firstCharacter); + QFETCH(bool, lastCharacter); + QFETCH(bool, middleCharacter); + QFETCH(bool, startString); + QFETCH(bool, midString); + QFETCH(bool, endString); + + QDeclarativeTextInput textInput; + textInput.setText(text); + + // first test that the right string is delivered to the QString::isRightToLeft() + QCOMPARE(textInput.isRightToLeft(0,0), text.mid(0,0).isRightToLeft()); + QCOMPARE(textInput.isRightToLeft(0,1), text.mid(0,1).isRightToLeft()); + QCOMPARE(textInput.isRightToLeft(text.count()-2, text.count()-1), text.mid(text.count()-2, text.count()-1).isRightToLeft()); + QCOMPARE(textInput.isRightToLeft(text.count()/2, text.count()/2 + 1), text.mid(text.count()/2, text.count()/2 + 1).isRightToLeft()); + QCOMPARE(textInput.isRightToLeft(0,text.count()/4), text.mid(0,text.count()/4).isRightToLeft()); + QCOMPARE(textInput.isRightToLeft(text.count()/4,3*text.count()/4), text.mid(text.count()/4,3*text.count()/4).isRightToLeft()); + if (text.isEmpty()) + QTest::ignoreMessage(QtWarningMsg, ": QML TextInput: isRightToLeft(start, end) called with the end property being smaller than the start."); + QCOMPARE(textInput.isRightToLeft(3*text.count()/4,text.count()-1), text.mid(3*text.count()/4,text.count()-1).isRightToLeft()); + + // then test that the feature actually works + QCOMPARE(textInput.isRightToLeft(0,0), emptyString); + QCOMPARE(textInput.isRightToLeft(0,1), firstCharacter); + QCOMPARE(textInput.isRightToLeft(text.count()-2, text.count()-1), lastCharacter); + QCOMPARE(textInput.isRightToLeft(text.count()/2, text.count()/2 + 1), middleCharacter); + QCOMPARE(textInput.isRightToLeft(0,text.count()/4), startString); + QCOMPARE(textInput.isRightToLeft(text.count()/4,3*text.count()/4), midString); + if (text.isEmpty()) + QTest::ignoreMessage(QtWarningMsg, ": QML TextInput: isRightToLeft(start, end) called with the end property being smaller than the start."); + QCOMPARE(textInput.isRightToLeft(3*text.count()/4,text.count()-1), endString); +} + +void tst_qdeclarativetextinput::moveCursorSelection_data() +{ + QTest::addColumn("testStr"); + QTest::addColumn("cursorPosition"); + QTest::addColumn("movePosition"); + QTest::addColumn("mode"); + QTest::addColumn("selectionStart"); + QTest::addColumn("selectionEnd"); + QTest::addColumn("reversible"); + + // () contains the text selected by the cursor. + // <> contains the actual selection. + + QTest::newRow("(t)he|characters") + << standard[0] << 0 << 1 << QDeclarativeTextInput::SelectCharacters << 0 << 1 << true; + QTest::newRow("do(g)|characters") + << standard[0] << 43 << 44 << QDeclarativeTextInput::SelectCharacters << 43 << 44 << true; + QTest::newRow("jum(p)ed|characters") + << standard[0] << 23 << 24 << QDeclarativeTextInput::SelectCharacters << 23 << 24 << true; + QTest::newRow("jumped( )over|characters") + << standard[0] << 26 << 27 << QDeclarativeTextInput::SelectCharacters << 26 << 27 << true; + QTest::newRow("(the )|characters") + << standard[0] << 0 << 4 << QDeclarativeTextInput::SelectCharacters << 0 << 4 << true; + QTest::newRow("( dog)|characters") + << standard[0] << 40 << 44 << QDeclarativeTextInput::SelectCharacters << 40 << 44 << true; + QTest::newRow("( jumped )|characters") + << standard[0] << 19 << 27 << QDeclarativeTextInput::SelectCharacters << 19 << 27 << true; + QTest::newRow("th(e qu)ick|characters") + << standard[0] << 2 << 6 << QDeclarativeTextInput::SelectCharacters << 2 << 6 << true; + QTest::newRow("la(zy d)og|characters") + << standard[0] << 38 << 42 << QDeclarativeTextInput::SelectCharacters << 38 << 42 << true; + QTest::newRow("jum(ped ov)er|characters") + << standard[0] << 23 << 29 << QDeclarativeTextInput::SelectCharacters << 23 << 29 << true; + QTest::newRow("()the|characters") + << standard[0] << 0 << 0 << QDeclarativeTextInput::SelectCharacters << 0 << 0 << true; + QTest::newRow("dog()|characters") + << standard[0] << 44 << 44 << QDeclarativeTextInput::SelectCharacters << 44 << 44 << true; + QTest::newRow("jum()ped|characters") + << standard[0] << 23 << 23 << QDeclarativeTextInput::SelectCharacters << 23 << 23 << true; + + QTest::newRow("<(t)he>|words") + << standard[0] << 0 << 1 << QDeclarativeTextInput::SelectWords << 0 << 3 << true; + QTest::newRow("|words") + << standard[0] << 43 << 44 << QDeclarativeTextInput::SelectWords << 41 << 44 << true; + QTest::newRow("|words") + << standard[0] << 23 << 24 << QDeclarativeTextInput::SelectWords << 20 << 26 << true; + QTest::newRow("over|words,ltr") + << standard[0] << 26 << 27 << QDeclarativeTextInput::SelectWords << 20 << 27 << false; + QTest::newRow("jumped<( )over>|words,rtl") + << standard[0] << 27 << 26 << QDeclarativeTextInput::SelectWords << 26 << 31 << false; + QTest::newRow("<(the )>quick|words,ltr") + << standard[0] << 0 << 4 << QDeclarativeTextInput::SelectWords << 0 << 4 << false; + QTest::newRow("<(the )quick>|words,rtl") + << standard[0] << 4 << 0 << QDeclarativeTextInput::SelectWords << 0 << 9 << false; + QTest::newRow("|words,ltr") + << standard[0] << 40 << 44 << QDeclarativeTextInput::SelectWords << 36 << 44 << false; + QTest::newRow("lazy<( dog)>|words,rtl") + << standard[0] << 44 << 40 << QDeclarativeTextInput::SelectWords << 40 << 44 << false; + QTest::newRow("over|words,ltr") + << standard[0] << 19 << 27 << QDeclarativeTextInput::SelectWords << 16 << 27 << false; + QTest::newRow("fox<( jumped )over>|words,rtl") + << standard[0] << 27 << 19 << QDeclarativeTextInput::SelectWords << 19 << 31 << false; + QTest::newRow("|words") + << standard[0] << 2 << 6 << QDeclarativeTextInput::SelectWords << 0 << 9 << true; + QTest::newRow("") + << standard[0] << 38 << 42 << QDeclarativeTextInput::SelectWords << 36 << 44 << true; + QTest::newRow("|words") + << standard[0] << 23 << 29 << QDeclarativeTextInput::SelectWords << 20 << 31 << true; + QTest::newRow("<()>the|words") + << standard[0] << 0 << 0 << QDeclarativeTextInput::SelectWords << 0 << 0 << true; + QTest::newRow("dog<()>|words") + << standard[0] << 44 << 44 << QDeclarativeTextInput::SelectWords << 44 << 44 << true; + QTest::newRow("jum<()>ped|words") + << standard[0] << 23 << 23 << QDeclarativeTextInput::SelectWords << 23 << 23 << true; + + QTest::newRow("Hello<(,)> |words") + << standard[2] << 5 << 6 << QDeclarativeTextInput::SelectWords << 5 << 6 << true; + QTest::newRow("Hello<(, )>world|words,ltr") + << standard[2] << 5 << 7 << QDeclarativeTextInput::SelectWords << 5 << 7 << false; + QTest::newRow("Hello<(, )world>|words,rtl") + << standard[2] << 7 << 5 << QDeclarativeTextInput::SelectWords << 5 << 12 << false; + QTest::newRow("world|words,ltr") + << standard[2] << 3 << 7 << QDeclarativeTextInput::SelectWords << 0 << 7 << false; + QTest::newRow("|words,rtl") + << standard[2] << 7 << 3 << QDeclarativeTextInput::SelectWords << 0 << 12 << false; + QTest::newRow(",|words") + << standard[2] << 3 << 5 << QDeclarativeTextInput::SelectWords << 0 << 5 << true; + QTest::newRow("Hello<()>,|words") + << standard[2] << 5 << 5 << QDeclarativeTextInput::SelectWords << 5 << 5 << true; + QTest::newRow("Hello,<()>|words") + << standard[2] << 6 << 6 << QDeclarativeTextInput::SelectWords << 6 << 6 << true; + QTest::newRow("Hello<,( )>world|words,ltr") + << standard[2] << 6 << 7 << QDeclarativeTextInput::SelectWords << 5 << 7 << false; + QTest::newRow("Hello,<( )world>|words,rtl") + << standard[2] << 7 << 6 << QDeclarativeTextInput::SelectWords << 6 << 12 << false; + QTest::newRow("Hello<,( world)>|words,ltr") + << standard[2] << 6 << 12 << QDeclarativeTextInput::SelectWords << 5 << 12 << false; + QTest::newRow("Hello,<( world)>|words,rtl") + << standard[2] << 12 << 6 << QDeclarativeTextInput::SelectWords << 6 << 12 << false; + QTest::newRow("Hello<,( world!)>|words,ltr") + << standard[2] << 6 << 13 << QDeclarativeTextInput::SelectWords << 5 << 13 << false; + QTest::newRow("Hello,<( world!)>|words,rtl") + << standard[2] << 13 << 6 << QDeclarativeTextInput::SelectWords << 6 << 13 << false; + QTest::newRow("Hello<(, world!)>|words") + << standard[2] << 5 << 13 << QDeclarativeTextInput::SelectWords << 5 << 13 << true; + QTest::newRow("world<(!)>|words") + << standard[2] << 12 << 13 << QDeclarativeTextInput::SelectWords << 12 << 13 << true; + QTest::newRow("world!<()>)|words") + << standard[2] << 13 << 13 << QDeclarativeTextInput::SelectWords << 13 << 13 << true; + QTest::newRow("world<()>!)|words") + << standard[2] << 12 << 12 << QDeclarativeTextInput::SelectWords << 12 << 12 << true; + + QTest::newRow("<(,)>olleH |words") + << standard[3] << 7 << 8 << QDeclarativeTextInput::SelectWords << 7 << 8 << true; + QTest::newRow("olleH|words,ltr") + << standard[3] << 6 << 8 << QDeclarativeTextInput::SelectWords << 1 << 8 << false; + QTest::newRow("dlrow<( ,)>olleH|words,rtl") + << standard[3] << 8 << 6 << QDeclarativeTextInput::SelectWords << 6 << 8 << false; + QTest::newRow("|words,ltr") + << standard[3] << 6 << 10 << QDeclarativeTextInput::SelectWords << 1 << 13 << false; + QTest::newRow("dlrow<( ,ol)leH>|words,rtl") + << standard[3] << 10 << 6 << QDeclarativeTextInput::SelectWords << 6 << 13 << false; + QTest::newRow(",<(ol)leH>,|words") + << standard[3] << 8 << 10 << QDeclarativeTextInput::SelectWords << 8 << 13 << true; + QTest::newRow(",<()>olleH|words") + << standard[3] << 8 << 8 << QDeclarativeTextInput::SelectWords << 8 << 8 << true; + QTest::newRow("<()>,olleH|words") + << standard[3] << 7 << 7 << QDeclarativeTextInput::SelectWords << 7 << 7 << true; + QTest::newRow(",olleH|words,ltr") + << standard[3] << 6 << 7 << QDeclarativeTextInput::SelectWords << 1 << 7 << false; + QTest::newRow("dlrow<( ),>olleH|words,rtl") + << standard[3] << 7 << 6 << QDeclarativeTextInput::SelectWords << 6 << 8 << false; + QTest::newRow("<(dlrow )>,olleH|words,ltr") + << standard[3] << 1 << 7 << QDeclarativeTextInput::SelectWords << 1 << 7 << false; + QTest::newRow("<(dlrow ),>olleH|words,rtl") + << standard[3] << 7 << 1 << QDeclarativeTextInput::SelectWords << 1 << 8 << false; + QTest::newRow("<(!dlrow )>,olleH|words,ltr") + << standard[3] << 0 << 7 << QDeclarativeTextInput::SelectWords << 0 << 7 << false; + QTest::newRow("<(!dlrow ),>olleH|words,rtl") + << standard[3] << 7 << 0 << QDeclarativeTextInput::SelectWords << 0 << 8 << false; + QTest::newRow("(!dlrow ,)olleH|words") + << standard[3] << 0 << 8 << QDeclarativeTextInput::SelectWords << 0 << 8 << true; + QTest::newRow("<(!)>dlrow|words") + << standard[3] << 0 << 1 << QDeclarativeTextInput::SelectWords << 0 << 1 << true; + QTest::newRow("<()>!dlrow|words") + << standard[3] << 0 << 0 << QDeclarativeTextInput::SelectWords << 0 << 0 << true; + QTest::newRow("!<()>dlrow|words") + << standard[3] << 1 << 1 << QDeclarativeTextInput::SelectWords << 1 << 1 << true; + + QTest::newRow(" text |words") + << standard[4] << 1 << 4 << QDeclarativeTextInput::SelectWords << 1 << 7 << true; + QTest::newRow(" spacey |words") + << standard[4] << 11 << 13 << QDeclarativeTextInput::SelectWords << 10 << 14 << true; + QTest::newRow("<( )>spacey text |words|ltr") + << standard[4] << 0 << 1 << QDeclarativeTextInput::SelectWords << 0 << 1 << false; + QTest::newRow("<( )spacey> text |words|rtl") + << standard[4] << 1 << 0 << QDeclarativeTextInput::SelectWords << 0 << 7 << false; + QTest::newRow("spacey |words|ltr") + << standard[4] << 14 << 15 << QDeclarativeTextInput::SelectWords << 10 << 15 << false; + QTest::newRow("spacey text<( )>|words|rtl") + << standard[4] << 15 << 14 << QDeclarativeTextInput::SelectWords << 14 << 15 << false; + QTest::newRow("<()> spacey text |words") + << standard[4] << 0 << 0 << QDeclarativeTextInput::SelectWords << 0 << 0 << false; + QTest::newRow(" spacey text <()>|words") + << standard[4] << 15 << 15 << QDeclarativeTextInput::SelectWords << 15 << 15 << false; +} + +void tst_qdeclarativetextinput::moveCursorSelection() +{ + QFETCH(QString, testStr); + QFETCH(int, cursorPosition); + QFETCH(int, movePosition); + QFETCH(QDeclarativeTextInput::SelectionMode, mode); + QFETCH(int, selectionStart); + QFETCH(int, selectionEnd); + QFETCH(bool, reversible); + + QString componentStr = "import QtQuick 1.1\nTextInput { text: \""+ testStr +"\"; }"; + QDeclarativeComponent textinputComponent(&engine); + textinputComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextInput *textinputObject = qobject_cast(textinputComponent.create()); + QVERIFY(textinputObject != 0); + + textinputObject->setCursorPosition(cursorPosition); + textinputObject->moveCursorSelection(movePosition, mode); + + QCOMPARE(textinputObject->selectedText(), testStr.mid(selectionStart, selectionEnd - selectionStart)); + QCOMPARE(textinputObject->selectionStart(), selectionStart); + QCOMPARE(textinputObject->selectionEnd(), selectionEnd); + + if (reversible) { + textinputObject->setCursorPosition(movePosition); + textinputObject->moveCursorSelection(cursorPosition, mode); + + QCOMPARE(textinputObject->selectedText(), testStr.mid(selectionStart, selectionEnd - selectionStart)); + QCOMPARE(textinputObject->selectionStart(), selectionStart); + QCOMPARE(textinputObject->selectionEnd(), selectionEnd); + } +} + +void tst_qdeclarativetextinput::moveCursorSelectionSequence_data() +{ + QTest::addColumn("testStr"); + QTest::addColumn("cursorPosition"); + QTest::addColumn("movePosition1"); + QTest::addColumn("movePosition2"); + QTest::addColumn("selection1Start"); + QTest::addColumn("selection1End"); + QTest::addColumn("selection2Start"); + QTest::addColumn("selection2End"); + + // () contains the text selected by the cursor. + // <> contains the actual selection. + // ^ is the revised cursor position. + // {} contains the revised selection. + + QTest::newRow("the { f^ox} jumped|ltr") + << standard[0] + << 9 << 13 << 17 + << 4 << 15 + << 4 << 19; + QTest::newRow("the quick<( {bro)wn> f^ox} jumped|rtl") + << standard[0] + << 13 << 9 << 17 + << 9 << 15 + << 10 << 19; + QTest::newRow("the { ^}fox jumped|ltr") + << standard[0] + << 9 << 13 << 16 + << 4 << 15 + << 4 << 16; + QTest::newRow("the quick<( {bro)wn> ^}fox jumped|rtl") + << standard[0] + << 13 << 9 << 16 + << 9 << 15 + << 10 << 16; + QTest::newRow("the {} fox jumped|ltr") + << standard[0] + << 9 << 13 << 15 + << 4 << 15 + << 4 << 15; + QTest::newRow("the quick<( {bro)wn^>} f^ox jumped|rtl") + << standard[0] + << 13 << 9 << 15 + << 9 << 15 + << 10 << 15; + QTest::newRow("the { fox|ltr") + << standard[0] + << 9 << 13 << 10 + << 4 << 15 + << 4 << 10; + QTest::newRow("the quick<( {^bro)wn>} fox|rtl") + << standard[0] + << 13 << 9 << 10 + << 9 << 15 + << 10 << 15; + QTest::newRow("the { fox|ltr") + << standard[0] + << 9 << 13 << 9 + << 4 << 15 + << 4 << 9; + QTest::newRow("the quick{<(^ bro)wn>} fox|rtl") + << standard[0] + << 13 << 9 << 9 + << 9 << 15 + << 9 << 15; + QTest::newRow("the { fox|ltr") + << standard[0] + << 9 << 13 << 7 + << 4 << 15 + << 4 << 9; + QTest::newRow("the { fox|rtl") + << standard[0] + << 13 << 9 << 7 + << 9 << 15 + << 4 << 15; + QTest::newRow("the {<^quick}( bro)wn> fox|ltr") + << standard[0] + << 9 << 13 << 4 + << 4 << 15 + << 4 << 9; + QTest::newRow("the {<^quick}( bro)wn> fox|rtl") + << standard[0] + << 13 << 9 << 4 + << 9 << 15 + << 4 << 15; + QTest::newRow("the{^ fox|ltr") + << standard[0] + << 9 << 13 << 3 + << 4 << 15 + << 3 << 9; + QTest::newRow("the{^ fox|rtl") + << standard[0] + << 13 << 9 << 3 + << 9 << 15 + << 3 << 15; + QTest::newRow("{t^he fox|ltr") + << standard[0] + << 9 << 13 << 1 + << 4 << 15 + << 0 << 9; + QTest::newRow("{t^he fox|rtl") + << standard[0] + << 13 << 9 << 1 + << 9 << 15 + << 0 << 15; + + QTest::newRow("{, w^orld}!|ltr") + << standard[2] + << 2 << 4 << 8 + << 0 << 5 + << 0 << 12; + QTest::newRow("{, w^orld}!|rtl") + << standard[2] + << 4 << 2 << 8 + << 0 << 5 + << 0 << 12; + + QTest::newRow("!{dlro^w ,}|ltr") + << standard[3] + << 9 << 11 << 5 + << 8 << 13 + << 1 << 13; + QTest::newRow("!{dlro^w ,}|rtl") + << standard[3] + << 11 << 9 << 5 + << 8 << 13 + << 1 << 13; + + QTest::newRow("{<(^} sp)acey> text |ltr") + << standard[4] + << 0 << 3 << 0 + << 0 << 7 + << 0 << 0; + QTest::newRow("{<( ^}sp)acey> text |ltr") + << standard[4] + << 0 << 3 << 1 + << 0 << 7 + << 0 << 1; + QTest::newRow("<( {s^p)acey>} text |rtl") + << standard[4] + << 3 << 0 << 2 + << 0 << 7 + << 1 << 7; + QTest::newRow("<( {^sp)acey>} text |rtl") + << standard[4] + << 3 << 0 << 1 + << 0 << 7 + << 1 << 7; + + QTest::newRow(" spacey }|rtl") + << standard[4] + << 15 << 12 << 15 + << 10 << 15 + << 15 << 15; + QTest::newRow(" spacey }|rtl") + << standard[4] + << 15 << 12 << 14 + << 10 << 15 + << 14 << 15; + QTest::newRow(" spacey {|ltr") + << standard[4] + << 12 << 15 << 13 + << 10 << 15 + << 10 << 14; + QTest::newRow(" spacey {|ltr") + << standard[4] + << 12 << 15 << 14 + << 10 << 15 + << 10 << 14; +} + +void tst_qdeclarativetextinput::moveCursorSelectionSequence() +{ + QFETCH(QString, testStr); + QFETCH(int, cursorPosition); + QFETCH(int, movePosition1); + QFETCH(int, movePosition2); + QFETCH(int, selection1Start); + QFETCH(int, selection1End); + QFETCH(int, selection2Start); + QFETCH(int, selection2End); + + QString componentStr = "import QtQuick 1.1\nTextInput { text: \""+ testStr +"\"; }"; + QDeclarativeComponent textinputComponent(&engine); + textinputComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextInput *textinputObject = qobject_cast(textinputComponent.create()); + QVERIFY(textinputObject != 0); + + textinputObject->setCursorPosition(cursorPosition); + + textinputObject->moveCursorSelection(movePosition1, QDeclarativeTextInput::SelectWords); + QCOMPARE(textinputObject->selectedText(), testStr.mid(selection1Start, selection1End - selection1Start)); + QCOMPARE(textinputObject->selectionStart(), selection1Start); + QCOMPARE(textinputObject->selectionEnd(), selection1End); + + textinputObject->moveCursorSelection(movePosition2, QDeclarativeTextInput::SelectWords); + QCOMPARE(textinputObject->selectedText(), testStr.mid(selection2Start, selection2End - selection2Start)); + QCOMPARE(textinputObject->selectionStart(), selection2Start); + QCOMPARE(textinputObject->selectionEnd(), selection2End); +} + +void tst_qdeclarativetextinput::mouseSelection_data() +{ + QTest::addColumn("qmlfile"); + QTest::addColumn("expectSelection"); + + // import installed + QTest::newRow("on") << SRCDIR "/data/mouseselection_true.qml" << true; + QTest::newRow("off") << SRCDIR "/data/mouseselection_false.qml" << false; + QTest::newRow("default") << SRCDIR "/data/mouseselection_default.qml" << false; + QTest::newRow("on word selection") << SRCDIR "/data/mouseselection_true_words.qml" << true; + QTest::newRow("off word selection") << SRCDIR "/data/mouseselection_false_words.qml" << false; + QTest::newRow("on read only") << SRCDIR "/data/mouseselection_true_readonly.qml" << true; + QTest::newRow("off read only") << SRCDIR "/data/mouseselection_false_readonly.qml" << false; +} + +void tst_qdeclarativetextinput::mouseSelection() +{ + QFETCH(QString, qmlfile); + QFETCH(bool, expectSelection); + + QDeclarativeView *canvas = createView(qmlfile); + + canvas->show(); + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(canvas)); + + QVERIFY(canvas->rootObject() != 0); + QDeclarativeTextInput *textInputObject = qobject_cast(canvas->rootObject()); + QVERIFY(textInputObject != 0); + + // press-and-drag-and-release from x1 to x2 + int x1 = 10; + int x2 = 70; + int y = textInputObject->height()/2; + QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x1,y))); + //QTest::mouseMove(canvas->viewport(), canvas->mapFromScene(QPoint(x2,y))); // doesn't work + QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(QPoint(x2,y)), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(canvas->viewport(), &mv); + QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x2,y))); + QString str = textInputObject->selectedText(); + if (expectSelection) + QVERIFY(str.length() > 3); // don't reallly care *what* was selected (and it's too sensitive to platform) + else + QVERIFY(str.isEmpty()); + + // Clicking and shift to clicking between the same points should select the same text. + textInputObject->setCursorPosition(0); + QTest::mouseClick(canvas->viewport(), Qt::LeftButton, Qt::NoModifier, canvas->mapFromScene(QPoint(x1,y))); + QTest::mouseClick(canvas->viewport(), Qt::LeftButton, Qt::ShiftModifier, canvas->mapFromScene(QPoint(x2,y))); + QCOMPARE(textInputObject->selectedText(), str); + + delete canvas; +} + +void tst_qdeclarativetextinput::deferEnableSelectByMouse_data() +{ + QTest::addColumn("qmlfile"); + + QTest::newRow("writable") << SRCDIR "/data/mouseselection_false.qml"; + QTest::newRow("read only") << SRCDIR "/data/mouseselection_false_readonly.qml"; +} + +void tst_qdeclarativetextinput::deferEnableSelectByMouse() +{ + // Verify text isn't selected if selectByMouse is enabled after the mouse button has been pressed. + QFETCH(QString, qmlfile); + + QDeclarativeView *canvas = createView(qmlfile); + + canvas->show(); + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(canvas)); + + QVERIFY(canvas->rootObject() != 0); + QDeclarativeTextInput *textInputObject = qobject_cast(canvas->rootObject()); + QVERIFY(textInputObject != 0); + + // press-and-drag-and-release from x1 to x2 + int x1 = 10; + int x2 = 70; + int y = textInputObject->height()/2; + + QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x1,y))); + textInputObject->setSelectByMouse(true); + //QTest::mouseMove(canvas->viewport(), canvas->mapFromScene(QPoint(x2,y))); // doesn't work + QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(QPoint(x2,y)), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(canvas->viewport(), &mv); + QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x2,y))); + QVERIFY(textInputObject->selectedText().isEmpty()); + + delete canvas; +} + +void tst_qdeclarativetextinput::deferDisableSelectByMouse_data() +{ + QTest::addColumn("qmlfile"); + + QTest::newRow("writable") << SRCDIR "/data/mouseselection_true.qml"; + QTest::newRow("read only") << SRCDIR "/data/mouseselection_true_readonly.qml"; +} + +void tst_qdeclarativetextinput::deferDisableSelectByMouse() +{ + // Verify text isn't selected if selectByMouse is enabled after the mouse button has been pressed. + QFETCH(QString, qmlfile); + + QDeclarativeView *canvas = createView(qmlfile); + + canvas->show(); + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(canvas)); + + QVERIFY(canvas->rootObject() != 0); + QDeclarativeTextInput *textInputObject = qobject_cast(canvas->rootObject()); + QVERIFY(textInputObject != 0); + + // press-and-drag-and-release from x1 to x2 + int x1 = 10; + int x2 = 70; + int y = textInputObject->height()/2; + + QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x1,y))); + textInputObject->setSelectByMouse(false); + //QTest::mouseMove(canvas->viewport(), canvas->mapFromScene(QPoint(x2,y))); // doesn't work + QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(QPoint(x2,y)), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(canvas->viewport(), &mv); + QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x2,y))); + QVERIFY(textInputObject->selectedText().length() > 3); + + delete canvas; +} + +void tst_qdeclarativetextinput::dragMouseSelection() +{ + QString qmlfile = SRCDIR "/data/mouseselection_true.qml"; + + QDeclarativeView *canvas = createView(qmlfile); + + canvas->show(); + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(canvas)); + + QVERIFY(canvas->rootObject() != 0); + QDeclarativeTextInput *textInputObject = qobject_cast(canvas->rootObject()); + QVERIFY(textInputObject != 0); + + // press-and-drag-and-release from x1 to x2 + int x1 = 10; + int x2 = 70; + int y = textInputObject->height()/2; + QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x1,y))); + { + QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(QPoint(x2,y)), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(canvas->viewport(), &mv); + } + QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x2,y))); + + QString str1 = textInputObject->selectedText(); + QVERIFY(str1.length() > 3); + + // press and drag the current selection. + x1 = 40; + x2 = 100; + QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x1,y))); + { + QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(QPoint(x2,y)), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(canvas->viewport(), &mv); + } + QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x2,y))); + QString str2 = textInputObject->selectedText(); + QVERIFY(str2.length() > 3); + + QVERIFY(str1 != str2); // Verify the second press and drag is a new selection and doesn't not the first moved. + delete canvas; +} + +void tst_qdeclarativetextinput::mouseSelectionMode_data() +{ + QTest::addColumn("qmlfile"); + QTest::addColumn("selectWords"); + + // import installed + QTest::newRow("SelectWords") << SRCDIR "/data/mouseselectionmode_words.qml" << true; + QTest::newRow("SelectCharacters") << SRCDIR "/data/mouseselectionmode_characters.qml" << false; + QTest::newRow("default") << SRCDIR "/data/mouseselectionmode_default.qml" << false; +} + +void tst_qdeclarativetextinput::mouseSelectionMode() +{ + QFETCH(QString, qmlfile); + QFETCH(bool, selectWords); + + QString text = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + QDeclarativeView *canvas = createView(qmlfile); + + canvas->show(); + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(canvas)); + + QVERIFY(canvas->rootObject() != 0); + QDeclarativeTextInput *textInputObject = qobject_cast(canvas->rootObject()); + QVERIFY(textInputObject != 0); + + // press-and-drag-and-release from x1 to x2 + int x1 = 10; + int x2 = 70; + int y = textInputObject->height()/2; + QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x1,y))); + //QTest::mouseMove(canvas->viewport(), canvas->mapFromScene(QPoint(x2,y))); // doesn't work + QMouseEvent mv(QEvent::MouseMove, canvas->mapFromScene(QPoint(x2,y)), Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(canvas->viewport(), &mv); + QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(x2,y))); + QString str = textInputObject->selectedText(); + if (selectWords) { + QCOMPARE(str, text); + } else { + QVERIFY(str.length() > 3); + QVERIFY(str != text); + } + + delete canvas; +} + +void tst_qdeclarativetextinput::horizontalAlignment_data() +{ + QTest::addColumn("hAlign"); + QTest::addColumn("expectfile"); + + QTest::newRow("L") << int(Qt::AlignLeft) << "halign_left"; + QTest::newRow("R") << int(Qt::AlignRight) << "halign_right"; + QTest::newRow("C") << int(Qt::AlignHCenter) << "halign_center"; +} + +void tst_qdeclarativetextinput::horizontalAlignment() +{ + QFETCH(int, hAlign); + QFETCH(QString, expectfile); + + QDeclarativeView *canvas = createView(SRCDIR "/data/horizontalAlignment.qml"); + + canvas->show(); + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(canvas)); + QObject *ob = canvas->rootObject(); + QVERIFY(ob != 0); + ob->setProperty("horizontalAlignment",hAlign); + QImage actual(canvas->width(), canvas->height(), QImage::Format_RGB32); + actual.fill(qRgb(255,255,255)); + { + QPainter p(&actual); + canvas->render(&p); + } + + expectfile = createExpectedFileIfNotFound(expectfile, actual); + + QImage expect(expectfile); + + QCOMPARE(actual,expect); + + delete canvas; +} + +void tst_qdeclarativetextinput::horizontalAlignment_RightToLeft() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/horizontalAlignment_RightToLeft.qml"); + QDeclarativeTextInput *textInput = canvas->rootObject()->findChild("text"); + QVERIFY(textInput != 0); + canvas->show(); + + const QString rtlText = textInput->text(); + + QDeclarativeTextInputPrivate *textInputPrivate = QDeclarativeTextInputPrivate::get(textInput); + QVERIFY(textInputPrivate != 0); + QVERIFY(-textInputPrivate->hscroll > canvas->width()/2); + + // implicit alignment should follow the reading direction of RTL text + QCOMPARE(textInput->hAlign(), QDeclarativeTextInput::AlignRight); + QCOMPARE(textInput->effectiveHAlign(), textInput->hAlign()); + QVERIFY(-textInputPrivate->hscroll > canvas->width()/2); + + // explicitly left aligned + textInput->setHAlign(QDeclarativeTextInput::AlignLeft); + QCOMPARE(textInput->hAlign(), QDeclarativeTextInput::AlignLeft); + QCOMPARE(textInput->effectiveHAlign(), textInput->hAlign()); + QVERIFY(-textInputPrivate->hscroll < canvas->width()/2); + + // explicitly right aligned + textInput->setHAlign(QDeclarativeTextInput::AlignRight); + QCOMPARE(textInput->effectiveHAlign(), textInput->hAlign()); + QCOMPARE(textInput->hAlign(), QDeclarativeTextInput::AlignRight); + QVERIFY(-textInputPrivate->hscroll > canvas->width()/2); + + // explicitly center aligned + textInput->setHAlign(QDeclarativeTextInput::AlignHCenter); + QCOMPARE(textInput->effectiveHAlign(), textInput->hAlign()); + QCOMPARE(textInput->hAlign(), QDeclarativeTextInput::AlignHCenter); + QVERIFY(-textInputPrivate->hscroll < canvas->width()/2); + QVERIFY(-textInputPrivate->hscroll + textInputPrivate->width() > canvas->width()/2); + + // reseted alignment should go back to following the text reading direction + textInput->resetHAlign(); + QCOMPARE(textInput->hAlign(), QDeclarativeTextInput::AlignRight); + QCOMPARE(textInput->effectiveHAlign(), textInput->hAlign()); + QVERIFY(-textInputPrivate->hscroll > canvas->width()/2); + + // mirror the text item + QDeclarativeItemPrivate::get(textInput)->setLayoutMirror(true); + + // mirrored implicit alignment should continue to follow the reading direction of the text + QCOMPARE(textInput->hAlign(), QDeclarativeTextInput::AlignRight); + QCOMPARE(textInput->effectiveHAlign(), textInput->hAlign()); + QVERIFY(-textInputPrivate->hscroll > canvas->width()/2); + + // explicitly right aligned behaves as left aligned + textInput->setHAlign(QDeclarativeTextInput::AlignRight); + QCOMPARE(textInput->hAlign(), QDeclarativeTextInput::AlignRight); + QCOMPARE(textInput->effectiveHAlign(), QDeclarativeTextInput::AlignLeft); + QVERIFY(-textInputPrivate->hscroll < canvas->width()/2); + + // mirrored explicitly left aligned behaves as right aligned + textInput->setHAlign(QDeclarativeTextInput::AlignLeft); + QCOMPARE(textInput->hAlign(), QDeclarativeTextInput::AlignLeft); + QCOMPARE(textInput->effectiveHAlign(), QDeclarativeTextInput::AlignRight); + QVERIFY(-textInputPrivate->hscroll > canvas->width()/2); + + // disable mirroring + QDeclarativeItemPrivate::get(textInput)->setLayoutMirror(false); + QCOMPARE(textInput->effectiveHAlign(), textInput->hAlign()); + textInput->resetHAlign(); + + // English text should be implicitly left aligned + textInput->setText("Hello world!"); + QCOMPARE(textInput->hAlign(), QDeclarativeTextInput::AlignLeft); + QVERIFY(-textInputPrivate->hscroll < canvas->width()/2); + + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(canvas)); + + // If there is no committed text, the preedit text should determine the alignment. + textInput->setText(QString()); + { QInputMethodEvent ev(rtlText, QList()); QApplication::sendEvent(canvas, &ev); } + QCOMPARE(textInput->hAlign(), QDeclarativeTextInput::AlignRight); + { QInputMethodEvent ev("Hello world!", QList()); QApplication::sendEvent(canvas, &ev); } + QCOMPARE(textInput->hAlign(), QDeclarativeTextInput::AlignLeft); + +#ifndef Q_OS_MAC // QTBUG-18040 + // empty text with implicit alignment follows the system locale-based + // keyboard input direction from QApplication::keyboardInputDirection + textInput->setText(""); + QCOMPARE(textInput->hAlign(), QApplication::keyboardInputDirection() == Qt::LeftToRight ? + QDeclarativeTextInput::AlignLeft : QDeclarativeTextInput::AlignRight); + if (QApplication::keyboardInputDirection() == Qt::LeftToRight) + QVERIFY(-textInputPrivate->hscroll < canvas->width()/2); + else + QVERIFY(-textInputPrivate->hscroll > canvas->width()/2); + textInput->setHAlign(QDeclarativeTextInput::AlignRight); + QCOMPARE(textInput->hAlign(), QDeclarativeTextInput::AlignRight); + QVERIFY(-textInputPrivate->hscroll > canvas->width()/2); +#endif + + delete canvas; + +#ifndef Q_OS_MAC // QTBUG-18040 + // alignment of TextInput with no text set to it + QString componentStr = "import QtQuick 1.0\nTextInput {}"; + QDeclarativeComponent textComponent(&engine); + textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeTextInput *textObject = qobject_cast(textComponent.create()); + QCOMPARE(textObject->hAlign(), QApplication::keyboardInputDirection() == Qt::LeftToRight ? + QDeclarativeTextInput::AlignLeft : QDeclarativeTextInput::AlignRight); + delete textObject; +#endif +} + +void tst_qdeclarativetextinput::positionAt() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/positionAt.qml"); + QVERIFY(canvas->rootObject() != 0); + canvas->show(); + canvas->setFocus(); + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + + QDeclarativeTextInput *textinputObject = qobject_cast(canvas->rootObject()); + QVERIFY(textinputObject != 0); + + // Check autoscrolled... + QFontMetrics fm(textinputObject->font()); + + int pos = textinputObject->positionAt(textinputObject->width()/2); + int diff = abs(int(fm.width(textinputObject->text()) - (fm.width(textinputObject->text().left(pos))+textinputObject->width()/2))); + + // some tollerance for different fonts. +#ifdef Q_OS_LINUX + QVERIFY(diff < 2); +#else + QVERIFY(diff < 5); +#endif + + int x = textinputObject->positionToRectangle(pos + 1).x() - 1; + QCOMPARE(textinputObject->positionAt(x, QDeclarativeTextInput::CursorBetweenCharacters), pos + 1); + QCOMPARE(textinputObject->positionAt(x, QDeclarativeTextInput::CursorOnCharacter), pos); + + // Check without autoscroll... + textinputObject->setAutoScroll(false); + pos = textinputObject->positionAt(textinputObject->width()/2); + diff = abs(int(fm.width(textinputObject->text().left(pos))-textinputObject->width()/2)); + + // some tollerance for different fonts. +#ifdef Q_OS_LINUX + QVERIFY(diff < 2); +#else + QVERIFY(diff < 5); +#endif + + x = textinputObject->positionToRectangle(pos + 1).x() - 1; + QCOMPARE(textinputObject->positionAt(x, QDeclarativeTextInput::CursorBetweenCharacters), pos + 1); + QCOMPARE(textinputObject->positionAt(x, QDeclarativeTextInput::CursorOnCharacter), pos); + + const qreal x0 = textinputObject->positionToRectangle(pos).x(); + const qreal x1 = textinputObject->positionToRectangle(pos + 1).x(); + + QString preeditText = textinputObject->text().mid(0, pos); + textinputObject->setText(textinputObject->text().mid(pos)); + textinputObject->setCursorPosition(0); + + QInputMethodEvent inputEvent(preeditText, QList()); + QApplication::sendEvent(canvas, &inputEvent); + + // Check all points within the preedit text return the same position. + QCOMPARE(textinputObject->positionAt(0), 0); + QCOMPARE(textinputObject->positionAt(x0 / 2), 0); + QCOMPARE(textinputObject->positionAt(x0), 0); + + // Verify positioning returns to normal after the preedit text. + QCOMPARE(textinputObject->positionAt(x1), 1); + QCOMPARE(textinputObject->positionToRectangle(1).x(), x1); + + delete canvas; +} + +void tst_qdeclarativetextinput::maxLength() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/maxLength.qml"); + QVERIFY(canvas->rootObject() != 0); + canvas->show(); + canvas->setFocus(); + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + + QDeclarativeTextInput *textinputObject = qobject_cast(canvas->rootObject()); + QVERIFY(textinputObject != 0); + QVERIFY(textinputObject->text().isEmpty()); + QVERIFY(textinputObject->maxLength() == 10); + foreach(const QString &str, standard){ + QVERIFY(textinputObject->text().length() <= 10); + textinputObject->setText(str); + QVERIFY(textinputObject->text().length() <= 10); + } + + textinputObject->setText(""); + QTRY_VERIFY(textinputObject->hasActiveFocus() == true); + for(int i=0; i<20; i++){ + QCOMPARE(textinputObject->text().length(), qMin(i,10)); + //simulateKey(canvas, Qt::Key_A); + QTest::keyPress(canvas, Qt::Key_A); + QTest::keyRelease(canvas, Qt::Key_A, Qt::NoModifier ,10); + } + + delete canvas; +} + +void tst_qdeclarativetextinput::masks() +{ + //Not a comprehensive test of the possible masks, that's done elsewhere (QLineEdit) + //QString componentStr = "import QtQuick 1.0\nTextInput { inputMask: 'HHHHhhhh'; }"; + QDeclarativeView *canvas = createView(SRCDIR "/data/masks.qml"); + canvas->show(); + canvas->setFocus(); + QVERIFY(canvas->rootObject() != 0); + QDeclarativeTextInput *textinputObject = qobject_cast(canvas->rootObject()); + QVERIFY(textinputObject != 0); + QTRY_VERIFY(textinputObject->hasActiveFocus() == true); + QVERIFY(textinputObject->text().length() == 0); + QCOMPARE(textinputObject->inputMask(), QString("HHHHhhhh; ")); + for(int i=0; i<10; i++){ + QCOMPARE(qMin(i,8), textinputObject->text().length()); + QCOMPARE(i>=4, textinputObject->hasAcceptableInput()); + //simulateKey(canvas, Qt::Key_A); + QTest::keyPress(canvas, Qt::Key_A); + QTest::keyRelease(canvas, Qt::Key_A, Qt::NoModifier ,10); + } + + delete canvas; +} + +void tst_qdeclarativetextinput::validators() +{ + // Note that this test assumes that the validators are working properly + // so you may need to run their tests first. All validators are checked + // here to ensure that their exposure to QML is working. + + QDeclarativeView *canvas = createView(SRCDIR "/data/validators.qml"); + canvas->show(); + canvas->setFocus(); + + QVERIFY(canvas->rootObject() != 0); + + QDeclarativeTextInput *intInput = qobject_cast(qvariant_cast(canvas->rootObject()->property("intInput"))); + QVERIFY(intInput); + intInput->setFocus(true); + QTRY_VERIFY(intInput->hasActiveFocus()); + QTest::keyPress(canvas, Qt::Key_1); + QTest::keyRelease(canvas, Qt::Key_1, Qt::NoModifier ,10); + QCOMPARE(intInput->text(), QLatin1String("1")); + QCOMPARE(intInput->hasAcceptableInput(), false); + QTest::keyPress(canvas, Qt::Key_2); + QTest::keyRelease(canvas, Qt::Key_2, Qt::NoModifier ,10); + QCOMPARE(intInput->text(), QLatin1String("1")); + QCOMPARE(intInput->hasAcceptableInput(), false); + QTest::keyPress(canvas, Qt::Key_1); + QTest::keyRelease(canvas, Qt::Key_1, Qt::NoModifier ,10); + QCOMPARE(intInput->text(), QLatin1String("11")); + QCOMPARE(intInput->hasAcceptableInput(), true); + QTest::keyPress(canvas, Qt::Key_0); + QTest::keyRelease(canvas, Qt::Key_0, Qt::NoModifier ,10); + QCOMPARE(intInput->text(), QLatin1String("11")); + QCOMPARE(intInput->hasAcceptableInput(), true); + + QDeclarativeTextInput *dblInput = qobject_cast(qvariant_cast(canvas->rootObject()->property("dblInput"))); + QTRY_VERIFY(dblInput); + dblInput->setFocus(true); + QVERIFY(dblInput->hasActiveFocus() == true); + QTest::keyPress(canvas, Qt::Key_1); + QTest::keyRelease(canvas, Qt::Key_1, Qt::NoModifier ,10); + QCOMPARE(dblInput->text(), QLatin1String("1")); + QCOMPARE(dblInput->hasAcceptableInput(), false); + QTest::keyPress(canvas, Qt::Key_2); + QTest::keyRelease(canvas, Qt::Key_2, Qt::NoModifier ,10); + QCOMPARE(dblInput->text(), QLatin1String("12")); + QCOMPARE(dblInput->hasAcceptableInput(), true); + QTest::keyPress(canvas, Qt::Key_Period); + QTest::keyRelease(canvas, Qt::Key_Period, Qt::NoModifier ,10); + QCOMPARE(dblInput->text(), QLatin1String("12.")); + QCOMPARE(dblInput->hasAcceptableInput(), true); + QTest::keyPress(canvas, Qt::Key_1); + QTest::keyRelease(canvas, Qt::Key_1, Qt::NoModifier ,10); + QCOMPARE(dblInput->text(), QLatin1String("12.1")); + QCOMPARE(dblInput->hasAcceptableInput(), true); + QTest::keyPress(canvas, Qt::Key_1); + QTest::keyRelease(canvas, Qt::Key_1, Qt::NoModifier ,10); + QCOMPARE(dblInput->text(), QLatin1String("12.11")); + QCOMPARE(dblInput->hasAcceptableInput(), true); + QTest::keyPress(canvas, Qt::Key_1); + QTest::keyRelease(canvas, Qt::Key_1, Qt::NoModifier ,10); + QCOMPARE(dblInput->text(), QLatin1String("12.11")); + QCOMPARE(dblInput->hasAcceptableInput(), true); + + QDeclarativeTextInput *strInput = qobject_cast(qvariant_cast(canvas->rootObject()->property("strInput"))); + QTRY_VERIFY(strInput); + strInput->setFocus(true); + QVERIFY(strInput->hasActiveFocus() == true); + QTest::keyPress(canvas, Qt::Key_1); + QTest::keyRelease(canvas, Qt::Key_1, Qt::NoModifier ,10); + QCOMPARE(strInput->text(), QLatin1String("")); + QCOMPARE(strInput->hasAcceptableInput(), false); + QTest::keyPress(canvas, Qt::Key_A); + QTest::keyRelease(canvas, Qt::Key_A, Qt::NoModifier ,10); + QCOMPARE(strInput->text(), QLatin1String("a")); + QCOMPARE(strInput->hasAcceptableInput(), false); + QTest::keyPress(canvas, Qt::Key_A); + QTest::keyRelease(canvas, Qt::Key_A, Qt::NoModifier ,10); + QCOMPARE(strInput->text(), QLatin1String("aa")); + QCOMPARE(strInput->hasAcceptableInput(), true); + QTest::keyPress(canvas, Qt::Key_A); + QTest::keyRelease(canvas, Qt::Key_A, Qt::NoModifier ,10); + QCOMPARE(strInput->text(), QLatin1String("aaa")); + QCOMPARE(strInput->hasAcceptableInput(), true); + QTest::keyPress(canvas, Qt::Key_A); + QTest::keyRelease(canvas, Qt::Key_A, Qt::NoModifier ,10); + QCOMPARE(strInput->text(), QLatin1String("aaaa")); + QCOMPARE(strInput->hasAcceptableInput(), true); + QTest::keyPress(canvas, Qt::Key_A); + QTest::keyRelease(canvas, Qt::Key_A, Qt::NoModifier ,10); + QCOMPARE(strInput->text(), QLatin1String("aaaa")); + QCOMPARE(strInput->hasAcceptableInput(), true); + + delete canvas; +} + +void tst_qdeclarativetextinput::inputMethods() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/inputmethods.qml"); + canvas->show(); + canvas->setFocus(); + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + + // test input method hints + QVERIFY(canvas->rootObject() != 0); + QDeclarativeTextInput *input = qobject_cast(canvas->rootObject()); + QVERIFY(input != 0); + QVERIFY(input->imHints() & Qt::ImhNoPredictiveText); + QVERIFY(input->inputMethodHints() & Qt::ImhNoPredictiveText); + input->setIMHints(Qt::ImhUppercaseOnly); + QVERIFY(input->imHints() & Qt::ImhUppercaseOnly); + QVERIFY(input->inputMethodHints() & Qt::ImhUppercaseOnly); + + QVERIFY(canvas->rootObject() != 0); + + input->setFocus(true); + QVERIFY(input->hasActiveFocus() == true); + // test that input method event is committed + QInputMethodEvent event; + event.setCommitString( "My ", -12, 0); + QApplication::sendEvent(canvas, &event); + QCOMPARE(input->text(), QString("My Hello world!")); + + input->setCursorPosition(2); + event.setCommitString("Your", -2, 2); + QApplication::sendEvent(canvas, &event); + QCOMPARE(input->text(), QString("Your Hello world!")); + QCOMPARE(input->cursorPosition(), 4); + + input->setCursorPosition(7); + event.setCommitString("Goodbye", -2, 5); + QApplication::sendEvent(canvas, &event); + QCOMPARE(input->text(), QString("Your Goodbye world!")); + QCOMPARE(input->cursorPosition(), 12); + + input->setCursorPosition(8); + event.setCommitString("Our", -8, 4); + QApplication::sendEvent(canvas, &event); + QCOMPARE(input->text(), QString("Our Goodbye world!")); + QCOMPARE(input->cursorPosition(), 7); + + delete canvas; +} + +/* +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_qdeclarativetextinput::navigation() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/navigation.qml"); + canvas->show(); + canvas->setFocus(); + + QVERIFY(canvas->rootObject() != 0); + + QDeclarativeTextInput *input = qobject_cast(qvariant_cast(canvas->rootObject()->property("myInput"))); + + QVERIFY(input != 0); + input->setCursorPosition(0); + QTRY_VERIFY(input->hasActiveFocus() == true); + simulateKey(canvas, Qt::Key_Left); + QVERIFY(input->hasActiveFocus() == false); + simulateKey(canvas, Qt::Key_Right); + QVERIFY(input->hasActiveFocus() == true); + //QT-2944: If text is selected, ensure we deselect upon cursor motion + input->setCursorPosition(input->text().length()); + input->select(0,input->text().length()); + QVERIFY(input->selectionStart() != input->selectionEnd()); + simulateKey(canvas, Qt::Key_Right); + QVERIFY(input->selectionStart() == input->selectionEnd()); + QVERIFY(input->selectionStart() == input->text().length()); + QVERIFY(input->hasActiveFocus() == true); + simulateKey(canvas, Qt::Key_Right); + QVERIFY(input->hasActiveFocus() == false); + simulateKey(canvas, Qt::Key_Left); + QVERIFY(input->hasActiveFocus() == true); + + // Up and Down should NOT do Home/End, even on Mac OS X (QTBUG-10438). + input->setCursorPosition(2); + QCOMPARE(input->cursorPosition(),2); + simulateKey(canvas, Qt::Key_Up); + QCOMPARE(input->cursorPosition(),2); + simulateKey(canvas, Qt::Key_Down); + QCOMPARE(input->cursorPosition(),2); + + delete canvas; +} + +void tst_qdeclarativetextinput::navigation_RTL() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/navigation.qml"); + canvas->show(); + canvas->setFocus(); + + QVERIFY(canvas->rootObject() != 0); + + QDeclarativeTextInput *input = qobject_cast(qvariant_cast(canvas->rootObject()->property("myInput"))); + + QVERIFY(input != 0); + const quint16 arabic_str[] = { 0x0638, 0x0643, 0x00646, 0x0647, 0x0633, 0x0638, 0x0643, 0x00646, 0x0647, 0x0633, 0x0647}; + input->setText(QString::fromUtf16(arabic_str, 11)); + + input->setCursorPosition(0); + QTRY_VERIFY(input->hasActiveFocus() == true); + + // move off + simulateKey(canvas, Qt::Key_Right); + QVERIFY(input->hasActiveFocus() == false); + + // move back + simulateKey(canvas, Qt::Key_Left); + QVERIFY(input->hasActiveFocus() == true); + + input->setCursorPosition(input->text().length()); + QVERIFY(input->hasActiveFocus() == true); + + // move off + simulateKey(canvas, Qt::Key_Left); + QVERIFY(input->hasActiveFocus() == false); + + // move back + simulateKey(canvas, Qt::Key_Right); + QVERIFY(input->hasActiveFocus() == true); + + delete canvas; +} + +void tst_qdeclarativetextinput::copyAndPaste() { +#ifndef QT_NO_CLIPBOARD + +#ifdef Q_WS_MAC + { + PasteboardRef pasteboard; + OSStatus status = PasteboardCreate(0, &pasteboard); + if (status == noErr) + CFRelease(pasteboard); + else + QSKIP("This machine doesn't support the clipboard", SkipAll); + } +#endif + + QString componentStr = "import QtQuick 1.0\nTextInput { text: \"Hello world!\" }"; + QDeclarativeComponent textInputComponent(&engine); + textInputComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextInput *textInput = qobject_cast(textInputComponent.create()); + QVERIFY(textInput != 0); + + // copy and paste + QCOMPARE(textInput->text().length(), 12); + textInput->select(0, textInput->text().length());; + textInput->copy(); + QCOMPARE(textInput->selectedText(), QString("Hello world!")); + QCOMPARE(textInput->selectedText().length(), 12); + textInput->setCursorPosition(0); + QVERIFY(textInput->canPaste()); + textInput->paste(); + QCOMPARE(textInput->text(), QString("Hello world!Hello world!")); + QCOMPARE(textInput->text().length(), 24); + + // can paste + QVERIFY(textInput->canPaste()); + textInput->setReadOnly(true); + QVERIFY(!textInput->canPaste()); + textInput->setReadOnly(false); + QVERIFY(textInput->canPaste()); + + // select word + textInput->setCursorPosition(0); + textInput->selectWord(); + QCOMPARE(textInput->selectedText(), QString("Hello")); + + // select all and cut + textInput->selectAll(); + textInput->cut(); + QCOMPARE(textInput->text().length(), 0); + textInput->paste(); + QCOMPARE(textInput->text(), QString("Hello world!Hello world!")); + QCOMPARE(textInput->text().length(), 24); + + // clear copy buffer + QClipboard *clipboard = QApplication::clipboard(); + QVERIFY(clipboard); + clipboard->clear(); + QVERIFY(!textInput->canPaste()); + + // test that copy functionality is disabled + // when echo mode is set to hide text/password mode + int index = 0; + while (index < 4) { + QDeclarativeTextInput::EchoMode echoMode = QDeclarativeTextInput::EchoMode(index); + textInput->setEchoMode(echoMode); + textInput->setText("My password"); + textInput->select(0, textInput->text().length());; + textInput->copy(); + if (echoMode == QDeclarativeTextInput::Normal) { + QVERIFY(!clipboard->text().isEmpty()); + QCOMPARE(clipboard->text(), QString("My password")); + clipboard->clear(); + } else { + QVERIFY(clipboard->text().isEmpty()); + } + index++; + } +#endif +} + +void tst_qdeclarativetextinput::canPasteEmpty() { +#ifndef QT_NO_CLIPBOARD + + QApplication::clipboard()->clear(); + + QString componentStr = "import QtQuick 1.0\nTextInput { text: \"Hello world!\" }"; + QDeclarativeComponent textInputComponent(&engine); + textInputComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextInput *textInput = qobject_cast(textInputComponent.create()); + QVERIFY(textInput != 0); + + QLineControl lc; + bool cp = !lc.isReadOnly() && QApplication::clipboard()->text().length() != 0; + QCOMPARE(textInput->canPaste(), cp); + +#endif +} + +void tst_qdeclarativetextinput::canPaste() { +#ifndef QT_NO_CLIPBOARD + + QApplication::clipboard()->setText("Some text"); + + QString componentStr = "import QtQuick 1.0\nTextInput { text: \"Hello world!\" }"; + QDeclarativeComponent textInputComponent(&engine); + textInputComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextInput *textInput = qobject_cast(textInputComponent.create()); + QVERIFY(textInput != 0); + + QLineControl lc; + bool cp = !lc.isReadOnly() && QApplication::clipboard()->text().length() != 0; + QCOMPARE(textInput->canPaste(), cp); + +#endif +} + +void tst_qdeclarativetextinput::passwordCharacter() +{ + QString componentStr = "import QtQuick 1.0\nTextInput { text: \"Hello world!\"; font.family: \"Helvetica\"; echoMode: TextInput.Password }"; + QDeclarativeComponent textInputComponent(&engine); + textInputComponent.setData(componentStr.toLatin1(), QUrl()); + QDeclarativeTextInput *textInput = qobject_cast(textInputComponent.create()); + QVERIFY(textInput != 0); + + textInput->setPasswordCharacter("X"); + QSize contentsSize = textInput->contentsSize(); + textInput->setPasswordCharacter("."); + // QTBUG-12383 content is updated and redrawn + QVERIFY(contentsSize != textInput->contentsSize()); +} + +void tst_qdeclarativetextinput::cursorDelegate() +{ + QDeclarativeView* view = createView(SRCDIR "/data/cursorTest.qml"); + view->show(); + view->setFocus(); + QDeclarativeTextInput *textInputObject = view->rootObject()->findChild("textInputObject"); + QVERIFY(textInputObject != 0); + QVERIFY(textInputObject->findChild("cursorInstance")); + //Test Delegate gets created + textInputObject->setFocus(true); + QDeclarativeItem* delegateObject = textInputObject->findChild("cursorInstance"); + QVERIFY(delegateObject); + //Test Delegate gets moved + for(int i=0; i<= textInputObject->text().length(); i++){ + textInputObject->setCursorPosition(i); + QCOMPARE(textInputObject->cursorRectangle().x(), qRound(delegateObject->x())); + QCOMPARE(textInputObject->cursorRectangle().y(), qRound(delegateObject->y())); + } + const QString preedit = "preedit"; + for (int i = 0; i <= preedit.length(); i++) { + QInputMethodEvent event(preedit, QList() + << QInputMethodEvent::Attribute(QInputMethodEvent::Cursor, i, 1, QVariant())); + QApplication::sendEvent(view, &event); + + QCOMPARE(textInputObject->cursorRectangle().x(), qRound(delegateObject->x())); + QCOMPARE(textInputObject->cursorRectangle().y(), qRound(delegateObject->y())); + } + textInputObject->setCursorPosition(0); + QCOMPARE(textInputObject->cursorRectangle().x(), qRound(delegateObject->x())); + QCOMPARE(textInputObject->cursorRectangle().y(), qRound(delegateObject->y())); + //Test Delegate gets deleted + textInputObject->setCursorDelegate(0); + QVERIFY(!textInputObject->findChild("cursorInstance")); + + delete view; +} + +void tst_qdeclarativetextinput::cursorVisible() +{ + QGraphicsScene scene; + QGraphicsView view(&scene); + view.show(); + QApplication::setActiveWindow(&view); + QTest::qWaitForWindowShown(&view); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(&view)); + + QDeclarativeTextInput input; + QSignalSpy spy(&input, SIGNAL(cursorVisibleChanged(bool))); + + QCOMPARE(input.isCursorVisible(), false); + + input.setCursorVisible(true); + QCOMPARE(input.isCursorVisible(), true); + QCOMPARE(spy.count(), 1); + + input.setCursorVisible(false); + QCOMPARE(input.isCursorVisible(), false); + QCOMPARE(spy.count(), 2); + + input.setFocus(true); + QCOMPARE(input.isCursorVisible(), false); + QCOMPARE(spy.count(), 2); + + scene.addItem(&input); + QCOMPARE(input.isCursorVisible(), true); + QCOMPARE(spy.count(), 3); + + input.setFocus(false); + QCOMPARE(input.isCursorVisible(), false); + QCOMPARE(spy.count(), 4); + + input.setFocus(true); + QCOMPARE(input.isCursorVisible(), true); + QCOMPARE(spy.count(), 5); + + scene.clearFocus(); + QCOMPARE(input.isCursorVisible(), false); + QCOMPARE(spy.count(), 6); + + scene.setFocus(); + QCOMPARE(input.isCursorVisible(), true); + QCOMPARE(spy.count(), 7); + + view.clearFocus(); + QCOMPARE(input.isCursorVisible(), false); + QCOMPARE(spy.count(), 8); + + view.setFocus(); + QCOMPARE(input.isCursorVisible(), true); + QCOMPARE(spy.count(), 9); + + // on mac, setActiveWindow(0) on mac does not deactivate the current application + // (you have to switch to a different app or hide the current app to trigger this) +#if !defined(Q_WS_MAC) + QApplication::setActiveWindow(0); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(0)); + QCOMPARE(input.isCursorVisible(), false); + QCOMPARE(spy.count(), 10); + + QApplication::setActiveWindow(&view); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(&view)); + QCOMPARE(input.isCursorVisible(), true); + QCOMPARE(spy.count(), 11); +#endif +} + +void tst_qdeclarativetextinput::cursorRectangle() +{ + QString text = "Hello World!"; + + QDeclarativeTextInput input; + input.setText(text); + QFontMetricsF fm(input.font()); + input.setWidth(fm.width(text.mid(0, 5))); + + QRect r; + + // some tolerance for different fonts. +#ifdef Q_OS_LINUX + const int error = 2; +#else + const int error = 5; +#endif + + for (int i = 0; i <= 5; ++i) { + input.setCursorPosition(i); + r = input.cursorRectangle(); + int textWidth = fm.width(text.mid(0, i)); + + QVERIFY(r.left() < textWidth + error); + QVERIFY(r.right() > textWidth - error); + QCOMPARE(input.inputMethodQuery(Qt::ImMicroFocus).toRect(), r); + } + + // Check the cursor rectangle remains within the input bounding rect when auto scrolling. + QVERIFY(r.left() < input.boundingRect().width()); + QVERIFY(r.right() >= input.width() - error); + + for (int i = 6; i < text.length(); ++i) { + input.setCursorPosition(i); + QCOMPARE(r, input.cursorRectangle()); + QCOMPARE(input.inputMethodQuery(Qt::ImMicroFocus).toRect(), r); + } + + for (int i = text.length() - 2; i >= 0; --i) { + input.setCursorPosition(i); + r = input.cursorRectangle(); + QVERIFY(r.right() >= 0); + QCOMPARE(input.inputMethodQuery(Qt::ImMicroFocus).toRect(), r); + } +} + +void tst_qdeclarativetextinput::readOnly() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/readOnly.qml"); + canvas->show(); + canvas->setFocus(); + + QVERIFY(canvas->rootObject() != 0); + + QDeclarativeTextInput *input = qobject_cast(qvariant_cast(canvas->rootObject()->property("myInput"))); + + QVERIFY(input != 0); + QTRY_VERIFY(input->hasActiveFocus() == true); + QVERIFY(input->isReadOnly() == true); + QString initial = input->text(); + for(int k=Qt::Key_0; k<=Qt::Key_Z; k++) + simulateKey(canvas, k); + simulateKey(canvas, Qt::Key_Return); + simulateKey(canvas, Qt::Key_Space); + simulateKey(canvas, Qt::Key_Escape); + QCOMPARE(input->text(), initial); + + delete canvas; +} + +void tst_qdeclarativetextinput::echoMode() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/echoMode.qml"); + canvas->show(); + canvas->setFocus(); + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(canvas)); + + QVERIFY(canvas->rootObject() != 0); + + QDeclarativeTextInput *input = qobject_cast(qvariant_cast(canvas->rootObject()->property("myInput"))); + + QVERIFY(input != 0); + QTRY_VERIFY(input->hasActiveFocus() == true); + QString initial = input->text(); + Qt::InputMethodHints ref; + QCOMPARE(initial, QLatin1String("ABCDefgh")); + QCOMPARE(input->echoMode(), QDeclarativeTextInput::Normal); + QCOMPARE(input->displayText(), input->text()); + //Normal + ref &= ~Qt::ImhHiddenText; + ref &= ~(Qt::ImhNoAutoUppercase | Qt::ImhNoPredictiveText); + QCOMPARE(input->inputMethodHints(), ref); + QCOMPARE(input->imHints(), Qt::ImhNone); + input->setEchoMode(QDeclarativeTextInput::NoEcho); + QCOMPARE(input->text(), initial); + QCOMPARE(input->displayText(), QLatin1String("")); + QCOMPARE(input->passwordCharacter(), QLatin1String("*")); + //NoEcho + ref |= Qt::ImhHiddenText; + ref |= (Qt::ImhNoAutoUppercase | Qt::ImhNoPredictiveText); + QCOMPARE(input->inputMethodHints(), ref); + QCOMPARE(input->imHints(), Qt::ImhNone); + input->setEchoMode(QDeclarativeTextInput::Password); + //Password + ref |= Qt::ImhHiddenText; + ref |= (Qt::ImhNoAutoUppercase | Qt::ImhNoPredictiveText); + QCOMPARE(input->text(), initial); + QCOMPARE(input->displayText(), QLatin1String("********")); + QCOMPARE(input->inputMethodHints(), ref); + QCOMPARE(input->imHints(), Qt::ImhNone); + input->setPasswordCharacter(QChar('Q')); + QCOMPARE(input->passwordCharacter(), QLatin1String("Q")); + QCOMPARE(input->text(), initial); + QCOMPARE(input->displayText(), QLatin1String("QQQQQQQQ")); + input->setEchoMode(QDeclarativeTextInput::PasswordEchoOnEdit); + //PasswordEchoOnEdit + ref &= ~Qt::ImhHiddenText; + ref |= (Qt::ImhNoAutoUppercase | Qt::ImhNoPredictiveText); + QCOMPARE(input->inputMethodHints(), ref); + QCOMPARE(input->imHints(), Qt::ImhNone); + QCOMPARE(input->text(), initial); + QCOMPARE(input->displayText(), QLatin1String("QQQQQQQQ")); + QCOMPARE(input->inputMethodQuery(Qt::ImSurroundingText).toString(), QLatin1String("QQQQQQQQ")); + QTest::keyPress(canvas, Qt::Key_A);//Clearing previous entry is part of PasswordEchoOnEdit + QTest::keyRelease(canvas, Qt::Key_A, Qt::NoModifier ,10); + QCOMPARE(input->text(), QLatin1String("a")); + QCOMPARE(input->displayText(), QLatin1String("a")); + QCOMPARE(input->inputMethodQuery(Qt::ImSurroundingText).toString(), QLatin1String("a")); + input->setFocus(false); + QVERIFY(input->hasActiveFocus() == false); + QCOMPARE(input->displayText(), QLatin1String("Q")); + QCOMPARE(input->inputMethodQuery(Qt::ImSurroundingText).toString(), QLatin1String("Q")); + input->setFocus(true); + QInputMethodEvent inputEvent; + inputEvent.setCommitString(initial); + QApplication::sendEvent(canvas, &inputEvent); + QCOMPARE(input->text(), initial); + QCOMPARE(input->displayText(), initial); + QCOMPARE(input->inputMethodQuery(Qt::ImSurroundingText).toString(), initial); + + // Test echo mode doesn't override imHints. + input->setIMHints(Qt::ImhHiddenText | Qt::ImhDialableCharactersOnly); + ref |= Qt::ImhDialableCharactersOnly; + //Normal + input->setEchoMode(QDeclarativeTextInput::Normal); + ref |= Qt::ImhHiddenText; + ref &= ~(Qt::ImhNoAutoUppercase | Qt::ImhNoPredictiveText); + QCOMPARE(input->inputMethodHints(), ref); + QCOMPARE(input->imHints(), Qt::ImhHiddenText | Qt::ImhDialableCharactersOnly); + //NoEcho + input->setEchoMode(QDeclarativeTextInput::NoEcho); + ref |= Qt::ImhHiddenText; + ref |= (Qt::ImhNoAutoUppercase | Qt::ImhNoPredictiveText); + QCOMPARE(input->inputMethodHints(), ref); + QCOMPARE(input->imHints(), Qt::ImhHiddenText | Qt::ImhDialableCharactersOnly); + //Password + input->setEchoMode(QDeclarativeTextInput::Password); + ref |= Qt::ImhHiddenText; + ref |= (Qt::ImhNoAutoUppercase | Qt::ImhNoPredictiveText); + QCOMPARE(input->inputMethodHints(), ref); + QCOMPARE(input->imHints(), Qt::ImhHiddenText | Qt::ImhDialableCharactersOnly); + //PasswordEchoOnEdit + input->setEchoMode(QDeclarativeTextInput::PasswordEchoOnEdit); + ref &= ~Qt::ImhHiddenText; + ref |= (Qt::ImhNoAutoUppercase | Qt::ImhNoPredictiveText); + QCOMPARE(input->inputMethodHints(), ref); + QCOMPARE(input->imHints(), Qt::ImhHiddenText | Qt::ImhDialableCharactersOnly); + //Normal + input->setEchoMode(QDeclarativeTextInput::Normal); + ref |= Qt::ImhHiddenText; + ref &= ~(Qt::ImhNoAutoUppercase | Qt::ImhNoPredictiveText); + QCOMPARE(input->inputMethodHints(), ref); + QCOMPARE(input->imHints(), Qt::ImhHiddenText | Qt::ImhDialableCharactersOnly); + + delete canvas; +} + + +#ifdef QT_GUI_PASSWORD_ECHO_DELAY +void tst_qdeclarativetextinput::passwordEchoDelay() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/echoMode.qml"); + canvas->show(); + canvas->setFocus(); + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(canvas)); + + QVERIFY(canvas->rootObject() != 0); + + QDeclarativeTextInput *input = qobject_cast(qvariant_cast(canvas->rootObject()->property("myInput"))); + + QChar fillChar = QLatin1Char('*'); + + input->setEchoMode(QDeclarativeTextInput::Password); + QCOMPARE(input->displayText(), QString(8, fillChar)); + input->setText(QString()); + QCOMPARE(input->displayText(), QString()); + + QTest::keyPress(canvas, '0'); + QTest::keyPress(canvas, '1'); + QTest::keyPress(canvas, '2'); + QCOMPARE(input->displayText(), QString(2, fillChar) + QLatin1Char('2')); + QTest::keyPress(canvas, '3'); + QTest::keyPress(canvas, '4'); + QCOMPARE(input->displayText(), QString(4, fillChar) + QLatin1Char('4')); + QTest::keyPress(canvas, Qt::Key_Backspace); + QCOMPARE(input->displayText(), QString(4, fillChar)); + QTest::keyPress(canvas, '4'); + QCOMPARE(input->displayText(), QString(4, fillChar) + QLatin1Char('4')); + QTest::qWait(QT_GUI_PASSWORD_ECHO_DELAY); + QTRY_COMPARE(input->displayText(), QString(5, fillChar)); + QTest::keyPress(canvas, '5'); + QCOMPARE(input->displayText(), QString(5, fillChar) + QLatin1Char('5')); + input->setFocus(false); + QVERIFY(!input->hasFocus()); + QCOMPARE(input->displayText(), QString(6, fillChar)); + input->setFocus(true); + QTRY_VERIFY(input->hasFocus()); + QCOMPARE(input->displayText(), QString(6, fillChar)); + QTest::keyPress(canvas, '6'); + QCOMPARE(input->displayText(), QString(6, fillChar) + QLatin1Char('6')); + + QInputMethodEvent ev; + ev.setCommitString(QLatin1String("7")); + QApplication::sendEvent(canvas, &ev); + QCOMPARE(input->displayText(), QString(7, fillChar) + QLatin1Char('7')); + + delete canvas; +} +#endif + + +void tst_qdeclarativetextinput::simulateKey(QDeclarativeView *view, int key) +{ + QKeyEvent press(QKeyEvent::KeyPress, key, 0); + QKeyEvent release(QKeyEvent::KeyRelease, key, 0); + + QApplication::sendEvent(view, &press); + QApplication::sendEvent(view, &release); +} + +QDeclarativeView *tst_qdeclarativetextinput::createView(const QString &filename) +{ + QDeclarativeView *canvas = new QDeclarativeView(0); + + canvas->setSource(QUrl::fromLocalFile(filename)); + + return canvas; +} +class MyInputContext : public QInputContext +{ +public: + MyInputContext() : openInputPanelReceived(false), closeInputPanelReceived(false), updateReceived(false), eventType(QEvent::None) {} + ~MyInputContext() {} + + QString identifierName() { return QString(); } + QString language() { return QString(); } + + void reset() {} + + bool isComposing() const { return false; } + + bool filterEvent( const QEvent *event ) + { + if (event->type() == QEvent::RequestSoftwareInputPanel) + openInputPanelReceived = true; + if (event->type() == QEvent::CloseSoftwareInputPanel) + closeInputPanelReceived = true; + return QInputContext::filterEvent(event); + } + + void update() { updateReceived = true; } + + void mouseHandler(int x, QMouseEvent *event) + { + cursor = x; + eventType = event->type(); + eventPosition = event->pos(); + eventGlobalPosition = event->globalPos(); + eventButton = event->button(); + eventButtons = event->buttons(); + eventModifiers = event->modifiers(); + } + + void sendPreeditText(const QString &text, int cursor) + { + QList attributes; + attributes.append(QInputMethodEvent::Attribute( + QInputMethodEvent::Cursor, cursor, text.length(), QVariant())); + + QInputMethodEvent event(text, attributes); + sendEvent(event); + } + + bool openInputPanelReceived; + bool closeInputPanelReceived; + bool updateReceived; + int cursor; + QEvent::Type eventType; + QPoint eventPosition; + QPoint eventGlobalPosition; + Qt::MouseButton eventButton; + Qt::MouseButtons eventButtons; + Qt::KeyboardModifiers eventModifiers; +}; + +void tst_qdeclarativetextinput::openInputPanelOnClick() +{ + QGraphicsScene scene; + QGraphicsView view(&scene); + MyInputContext ic; + view.setInputContext(&ic); + QDeclarativeTextInput input; + QSignalSpy focusOnPressSpy(&input, SIGNAL(activeFocusOnPressChanged(bool))); + input.setText("Hello world"); + input.setPos(0, 0); + scene.addItem(&input); + view.show(); + qApp->setAutoSipEnabled(true); + QApplication::setActiveWindow(&view); + QTest::qWaitForWindowShown(&view); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(&view)); + + QDeclarativeItemPrivate* pri = QDeclarativeItemPrivate::get(&input); + QDeclarativeTextInputPrivate *inputPrivate = static_cast(pri); + + // input panel on click + inputPrivate->showInputPanelOnFocus = false; + + QStyle::RequestSoftwareInputPanel behavior = QStyle::RequestSoftwareInputPanel( + view.style()->styleHint(QStyle::SH_RequestSoftwareInputPanel)); + QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, view.mapFromScene(input.scenePos())); + QApplication::processEvents(); + if (behavior == QStyle::RSIP_OnMouseClickAndAlreadyFocused) { + QCOMPARE(ic.openInputPanelReceived, false); + QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, view.mapFromScene(input.scenePos())); + QApplication::processEvents(); + QCOMPARE(ic.openInputPanelReceived, true); + } else if (behavior == QStyle::RSIP_OnMouseClick) { + QCOMPARE(ic.openInputPanelReceived, true); + } + ic.openInputPanelReceived = false; + + // focus should not cause input panels to open or close + input.setFocus(false); + input.setFocus(true); + input.setFocus(false); + input.setFocus(true); + input.setFocus(false); + QCOMPARE(ic.openInputPanelReceived, false); + QCOMPARE(ic.closeInputPanelReceived, false); +} + +void tst_qdeclarativetextinput::openInputPanelOnFocus() +{ + QGraphicsScene scene; + QGraphicsView view(&scene); + MyInputContext ic; + view.setInputContext(&ic); + QDeclarativeTextInput input; + QSignalSpy focusOnPressSpy(&input, SIGNAL(activeFocusOnPressChanged(bool))); + input.setText("Hello world"); + input.setPos(0, 0); + scene.addItem(&input); + view.show(); + qApp->setAutoSipEnabled(true); + QApplication::setActiveWindow(&view); + QTest::qWaitForWindowShown(&view); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(&view)); + + QDeclarativeItemPrivate* pri = QDeclarativeItemPrivate::get(&input); + QDeclarativeTextInputPrivate *inputPrivate = static_cast(pri); + inputPrivate->showInputPanelOnFocus = true; + + // test default values + QVERIFY(input.focusOnPress()); + QCOMPARE(ic.openInputPanelReceived, false); + QCOMPARE(ic.closeInputPanelReceived, false); + + // focus on press, input panel on focus + QTest::mousePress(view.viewport(), Qt::LeftButton, 0, view.mapFromScene(input.scenePos())); + QApplication::processEvents(); + QVERIFY(input.hasActiveFocus()); + QCOMPARE(ic.openInputPanelReceived, true); + ic.openInputPanelReceived = false; + + // no events on release + QTest::mouseRelease(view.viewport(), Qt::LeftButton, 0, view.mapFromScene(input.scenePos())); + QCOMPARE(ic.openInputPanelReceived, false); + ic.openInputPanelReceived = false; + + // if already focused, input panel can be opened on press + QVERIFY(input.hasActiveFocus()); + QTest::mousePress(view.viewport(), Qt::LeftButton, 0, view.mapFromScene(input.scenePos())); + QApplication::processEvents(); + QCOMPARE(ic.openInputPanelReceived, true); + ic.openInputPanelReceived = false; + + // input method should stay enabled if focus + // is lost to an item that also accepts inputs + QDeclarativeTextInput anotherInput; + scene.addItem(&anotherInput); + anotherInput.setFocus(true); + QApplication::processEvents(); + QCOMPARE(ic.openInputPanelReceived, true); + ic.openInputPanelReceived = false; + QCOMPARE(view.inputContext(), (QInputContext*)&ic); + QVERIFY(view.testAttribute(Qt::WA_InputMethodEnabled)); + + // input method should be disabled if focus + // is lost to an item that doesn't accept inputs + QDeclarativeItem item; + scene.addItem(&item); + item.setFocus(true); + QApplication::processEvents(); + QCOMPARE(ic.openInputPanelReceived, false); + QVERIFY(view.inputContext() == 0); + QVERIFY(!view.testAttribute(Qt::WA_InputMethodEnabled)); + + // no automatic input panel events should + // be sent if activeFocusOnPress is false + input.setFocusOnPress(false); + QCOMPARE(focusOnPressSpy.count(),1); + input.setFocusOnPress(false); + QCOMPARE(focusOnPressSpy.count(),1); + input.setFocus(false); + input.setFocus(true); + QTest::mousePress(view.viewport(), Qt::LeftButton, 0, view.mapFromScene(input.scenePos())); + QTest::mouseRelease(view.viewport(), Qt::LeftButton, 0, view.mapFromScene(input.scenePos())); + QApplication::processEvents(); + QCOMPARE(ic.openInputPanelReceived, false); + QCOMPARE(ic.closeInputPanelReceived, false); + + // one show input panel event should + // be set when openSoftwareInputPanel is called + input.openSoftwareInputPanel(); + QCOMPARE(ic.openInputPanelReceived, true); + QCOMPARE(ic.closeInputPanelReceived, false); + ic.openInputPanelReceived = false; + + // one close input panel event should + // be sent when closeSoftwareInputPanel is called + input.closeSoftwareInputPanel(); + QCOMPARE(ic.openInputPanelReceived, false); + QCOMPARE(ic.closeInputPanelReceived, true); + ic.closeInputPanelReceived = false; + + // set activeFocusOnPress back to true + input.setFocusOnPress(true); + QCOMPARE(focusOnPressSpy.count(),2); + input.setFocusOnPress(true); + QCOMPARE(focusOnPressSpy.count(),2); + input.setFocus(false); + QApplication::processEvents(); + QCOMPARE(ic.openInputPanelReceived, false); + QCOMPARE(ic.closeInputPanelReceived, false); + ic.closeInputPanelReceived = false; + + // input panel should not re-open + // if focus has already been set + input.setFocus(true); + QCOMPARE(ic.openInputPanelReceived, true); + ic.openInputPanelReceived = false; + input.setFocus(true); + QCOMPARE(ic.openInputPanelReceived, false); + + // input method should be disabled + // if TextInput loses focus + input.setFocus(false); + QApplication::processEvents(); + QVERIFY(view.inputContext() == 0); + QVERIFY(!view.testAttribute(Qt::WA_InputMethodEnabled)); + + // input method should not be enabled + // if TextInput is read only. + input.setReadOnly(true); + ic.openInputPanelReceived = false; + input.setFocus(true); + QApplication::processEvents(); + QCOMPARE(ic.openInputPanelReceived, false); + QVERIFY(view.inputContext() == 0); + QVERIFY(!view.testAttribute(Qt::WA_InputMethodEnabled)); +} + +class MyTextInput : public QDeclarativeTextInput +{ +public: + MyTextInput(QDeclarativeItem *parent = 0) : QDeclarativeTextInput(parent) + { + nbPaint = 0; + } + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) + { + nbPaint++; + QDeclarativeTextInput::paint(painter, option, widget); + } + int nbPaint; +}; + +void tst_qdeclarativetextinput::setHAlignClearCache() +{ + QGraphicsScene scene; + QGraphicsView view(&scene); + MyTextInput input; + input.setText("Hello world"); + scene.addItem(&input); + view.show(); + QApplication::setActiveWindow(&view); + QTest::qWaitForWindowShown(&view); + QTRY_COMPARE(input.nbPaint, 1); + input.setHAlign(QDeclarativeTextInput::AlignRight); + QApplication::processEvents(); + //Changing the alignment should trigger a repaint + QCOMPARE(input.nbPaint, 2); +} + +void tst_qdeclarativetextinput::focusOutClearSelection() +{ + QGraphicsScene scene; + QGraphicsView view(&scene); + QDeclarativeTextInput input; + QDeclarativeTextInput input2; + input.setText(QLatin1String("Hello world")); + input.setFocus(true); + scene.addItem(&input2); + scene.addItem(&input); + view.show(); + QApplication::setActiveWindow(&view); + QTest::qWaitForWindowShown(&view); + input.select(2,5); + //The selection should work + QTRY_COMPARE(input.selectedText(), QLatin1String("llo")); + input2.setFocus(true); + QApplication::processEvents(); + //The input lost the focus selection should be cleared + QTRY_COMPARE(input.selectedText(), QLatin1String("")); +} + +void tst_qdeclarativetextinput::geometrySignals() +{ + QDeclarativeComponent component(&engine, SRCDIR "/data/geometrySignals.qml"); + QObject *o = component.create(); + QVERIFY(o); + QCOMPARE(o->property("bindingWidth").toInt(), 400); + QCOMPARE(o->property("bindingHeight").toInt(), 500); + delete o; +} + +void tst_qdeclarativetextinput::testQtQuick11Attributes() +{ + QFETCH(QString, code); + QFETCH(QString, warning); + QFETCH(QString, error); + + QDeclarativeEngine engine; + QObject *obj; + + QDeclarativeComponent valid(&engine); + valid.setData("import QtQuick 1.1; TextInput { " + code.toUtf8() + " }", QUrl("")); + obj = valid.create(); + QVERIFY(obj); + QVERIFY(valid.errorString().isEmpty()); + delete obj; + + QDeclarativeComponent invalid(&engine); + invalid.setData("import QtQuick 1.0; TextInput { " + code.toUtf8() + " }", QUrl("")); + QTest::ignoreMessage(QtWarningMsg, warning.toUtf8()); + obj = invalid.create(); + QCOMPARE(invalid.errorString(), error); + delete obj; +} + +void tst_qdeclarativetextinput::testQtQuick11Attributes_data() +{ + QTest::addColumn("code"); + QTest::addColumn("warning"); + QTest::addColumn("error"); + + QTest::newRow("canPaste") << "property bool foo: canPaste" + << ":1: ReferenceError: Can't find variable: canPaste" + << ""; + + QTest::newRow("moveCursorSelection") << "Component.onCompleted: moveCursorSelection(0, TextEdit.SelectCharacters)" + << ":1: ReferenceError: Can't find variable: moveCursorSelection" + << ""; + + QTest::newRow("deselect") << "Component.onCompleted: deselect()" + << ":1: ReferenceError: Can't find variable: deselect" + << ""; +} + +void tst_qdeclarativetextinput::preeditAutoScroll() +{ + QString committedText = "super"; + QString preeditText = "califragisiticexpialidocious!"; + + QGraphicsScene scene; + QGraphicsView view(&scene); + MyInputContext ic; + view.setInputContext(&ic); + QDeclarativeTextInput input; + QFontMetricsF fm(input.font()); + input.setWidth(fm.width(committedText)); + input.setText(committedText); + input.setPos(0, 0); + input.setFocus(true); + scene.addItem(&input); + view.show(); + QApplication::setActiveWindow(&view); + QTest::qWaitForWindowShown(&view); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(&view)); + + QSignalSpy cursorRectangleSpy(&input, SIGNAL(cursorRectangleChanged())); + int cursorRectangleChanges = 0; + + // test the text is scrolled so the preedit is visible. + ic.sendPreeditText(preeditText.mid(0, 3), 1); + QVERIFY(input.positionAt(0) != 0); + QVERIFY(input.cursorRectangle().left() < input.boundingRect().width()); + QCOMPARE(cursorRectangleSpy.count(), ++cursorRectangleChanges); + + // test the text is scrolled back when the preedit is removed. + ic.sendEvent(QInputMethodEvent()); + QCOMPARE(input.positionAt(0), 0); + QCOMPARE(input.positionAt(input.width()), 5); + QCOMPARE(cursorRectangleSpy.count(), ++cursorRectangleChanges); + + // some tolerance for different fonts. +#ifdef Q_OS_LINUX + const int error = 2; +#else + const int error = 5; +#endif + + // test if the preedit is larger than the text input that the + // character preceding the cursor is still visible. + qreal x = input.positionToRectangle(0).x(); + for (int i = 0; i < 3; ++i) { + ic.sendPreeditText(preeditText, i + 1); + QVERIFY(input.cursorRectangle().right() >= fm.width(preeditText.at(i)) - error); + QVERIFY(input.positionToRectangle(0).x() < x); + QCOMPARE(cursorRectangleSpy.count(), ++cursorRectangleChanges); + x = input.positionToRectangle(0).x(); + } + for (int i = 1; i >= 0; --i) { + ic.sendPreeditText(preeditText, i + 1); + QVERIFY(input.cursorRectangle().right() >= fm.width(preeditText.at(i)) - error); + QVERIFY(input.positionToRectangle(0).x() > x); + QCOMPARE(cursorRectangleSpy.count(), ++cursorRectangleChanges); + x = input.positionToRectangle(0).x(); + } + + // Test incrementing the preedit cursor doesn't cause further + // scrolling when right most text is visible. + ic.sendPreeditText(preeditText, preeditText.length() - 3); + QCOMPARE(cursorRectangleSpy.count(), ++cursorRectangleChanges); + x = input.positionToRectangle(0).x(); + for (int i = 2; i >= 0; --i) { + ic.sendPreeditText(preeditText, preeditText.length() - i); + QCOMPARE(input.positionToRectangle(0).x(), x); + QCOMPARE(cursorRectangleSpy.count(), ++cursorRectangleChanges); + } + for (int i = 1; i < 3; ++i) { + ic.sendPreeditText(preeditText, preeditText.length() - i); + QCOMPARE(input.positionToRectangle(0).x(), x); + QCOMPARE(cursorRectangleSpy.count(), ++cursorRectangleChanges); + } + + // Test disabling auto scroll. + ic.sendEvent(QInputMethodEvent()); + + input.setAutoScroll(false); + ic.sendPreeditText(preeditText.mid(0, 3), 1); + QCOMPARE(input.positionAt(0), 0); + QCOMPARE(input.positionAt(input.width()), 5); + + ic.sendEvent(QInputMethodEvent()); + input.setAutoScroll(true); + // Test committing pre-edit text at the start of the string. QTBUG-18789 + input.setCursorPosition(0); + ic.sendPreeditText(input.text(), 5); + QCOMPARE(input.positionAt(0), 0); + + QInputMethodEvent event; + event.setCommitString(input.text()); + ic.sendEvent(event); + + QCOMPARE(input.positionAt(0), 0); + QCOMPARE(input.positionAt(input.width()), 5); +} + +void tst_qdeclarativetextinput::preeditMicroFocus() +{ + QString preeditText = "super"; + + QGraphicsScene scene; + QGraphicsView view(&scene); + MyInputContext ic; + view.setInputContext(&ic); + QDeclarativeTextInput input; + input.setPos(0, 0); + input.setAutoScroll(false); + input.setFocus(true); + scene.addItem(&input); + view.show(); + QApplication::setActiveWindow(&view); + QTest::qWaitForWindowShown(&view); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(&view)); + + QRect currentRect; + QRect previousRect = input.inputMethodQuery(Qt::ImMicroFocus).toRect(); + + // Verify that the micro focus rect is positioned the same for position 0 as + // it would be if there was no preedit text. + ic.updateReceived = false; + ic.sendPreeditText(preeditText, 0); + currentRect = input.inputMethodQuery(Qt::ImMicroFocus).toRect(); + QCOMPARE(currentRect, previousRect); +#if defined(Q_WS_X11) || defined(Q_WS_QWS) || defined(Q_OS_SYMBIAN) + QCOMPARE(ic.updateReceived, true); +#endif + + // Verify that the micro focus rect moves to the left as the cursor position + // is incremented. + for (int i = 1; i <= 5; ++i) { + ic.updateReceived = false; + ic.sendPreeditText(preeditText, i); + currentRect = input.inputMethodQuery(Qt::ImMicroFocus).toRect(); + QVERIFY(previousRect.left() < currentRect.left()); +#if defined(Q_WS_X11) || defined(Q_WS_QWS) || defined(Q_OS_SYMBIAN) + QCOMPARE(ic.updateReceived, true); +#endif + previousRect = currentRect; + } + + // Verify that if there is no preedit cursor then the micro focus rect is the + // same as it would be if it were positioned at the end of the preedit text. + ic.sendPreeditText(preeditText, 0); + ic.updateReceived = false; + ic.sendEvent(QInputMethodEvent(preeditText, QList())); + currentRect = input.inputMethodQuery(Qt::ImMicroFocus).toRect(); + QCOMPARE(currentRect, previousRect); +#if defined(Q_WS_X11) || defined(Q_WS_QWS) || defined(Q_OS_SYMBIAN) + QCOMPARE(ic.updateReceived, true); +#endif +} + +void tst_qdeclarativetextinput::inputContextMouseHandler() +{ + QString text = "supercalifragisiticexpialidocious!"; + + QGraphicsScene scene; + QGraphicsView view(&scene); + MyInputContext ic; + view.setInputContext(&ic); + QDeclarativeTextInput input; + input.setWidth(200); + input.setText(text.mid(0, 12)); + input.setCursorPosition(12); + input.setPos(0, 0); + input.setFocus(true); + scene.addItem(&input); + view.show(); + QApplication::setActiveWindow(&view); + QTest::qWaitForWindowShown(&view); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(&view)); + + QFontMetricsF fm(input.font()); + const qreal y = fm.height() / 2; + + QPoint position2 = view.mapFromScene(input.mapToScene(QPointF(fm.width(text.mid(0, 2)), y))); + QPoint position8 = view.mapFromScene(input.mapToScene(QPointF(fm.width(text.mid(0, 8)), y))); + QPoint position20 = view.mapFromScene(input.mapToScene(QPointF(fm.width(text.mid(0, 20)), y))); + QPoint position27 = view.mapFromScene(input.mapToScene(QPointF(fm.width(text.mid(0, 27)), y))); + QPoint globalPosition2 = view.viewport()->mapToGlobal(position2); + QPoint globalposition8 = view.viewport()->mapToGlobal(position8); + QPoint globalposition20 = view.viewport()->mapToGlobal(position20); + QPoint globalposition27 = view.viewport()->mapToGlobal(position27); + + ic.sendEvent(QInputMethodEvent(text.mid(12), QList())); + + QTest::mouseDClick(view.viewport(), Qt::LeftButton, Qt::NoModifier, position2); + QCOMPARE(ic.eventType, QEvent::MouseButtonDblClick); + QCOMPARE(ic.eventPosition, position2); + QCOMPARE(ic.eventGlobalPosition, globalPosition2); + QCOMPARE(ic.eventButton, Qt::LeftButton); + QCOMPARE(ic.eventModifiers, Qt::NoModifier); + QVERIFY(ic.cursor < 0); + ic.eventType = QEvent::None; + + QTest::mousePress(view.viewport(), Qt::LeftButton, Qt::NoModifier, position2); + QCOMPARE(ic.eventType, QEvent::MouseButtonPress); + QCOMPARE(ic.eventPosition, position2); + QCOMPARE(ic.eventGlobalPosition, globalPosition2); + QCOMPARE(ic.eventButton, Qt::LeftButton); + QCOMPARE(ic.eventModifiers, Qt::NoModifier); + QVERIFY(ic.cursor < 0); + ic.eventType = QEvent::None; + + { QMouseEvent mv(QEvent::MouseMove, position8, globalposition8, Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(view.viewport(), &mv); } + QCOMPARE(ic.eventType, QEvent::None); + + { QMouseEvent mv(QEvent::MouseMove, position27, globalposition27, Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QApplication::sendEvent(view.viewport(), &mv); } + QCOMPARE(ic.eventType, QEvent::MouseMove); + QCOMPARE(ic.eventPosition, position27); + QCOMPARE(ic.eventGlobalPosition, globalposition27); + QCOMPARE(ic.eventButton, Qt::LeftButton); + QCOMPARE(ic.eventModifiers, Qt::NoModifier); + QVERIFY(ic.cursor >= 14 && ic.cursor <= 16); // 15 is expected but some platforms may be off by one. + ic.eventType = QEvent::None; + + QTest::mouseRelease(view.viewport(), Qt::LeftButton, Qt::NoModifier, position27); + QCOMPARE(ic.eventType, QEvent::MouseButtonRelease); + QCOMPARE(ic.eventPosition, position27); + QCOMPARE(ic.eventGlobalPosition, globalposition27); + QCOMPARE(ic.eventButton, Qt::LeftButton); + QCOMPARE(ic.eventModifiers, Qt::NoModifier); + QVERIFY(ic.cursor >= 14 && ic.cursor <= 16); + ic.eventType = QEvent::None; + + // And in the other direction. + QTest::mouseDClick(view.viewport(), Qt::LeftButton, Qt::ControlModifier, position27); + QCOMPARE(ic.eventType, QEvent::MouseButtonDblClick); + QCOMPARE(ic.eventPosition, position27); + QCOMPARE(ic.eventGlobalPosition, globalposition27); + QCOMPARE(ic.eventButton, Qt::LeftButton); + QCOMPARE(ic.eventModifiers, Qt::ControlModifier); + QVERIFY(ic.cursor >= 14 && ic.cursor <= 16); + ic.eventType = QEvent::None; + + QTest::mousePress(view.viewport(), Qt::RightButton, Qt::ControlModifier, position27); + QCOMPARE(ic.eventType, QEvent::MouseButtonPress); + QCOMPARE(ic.eventPosition, position27); + QCOMPARE(ic.eventGlobalPosition, globalposition27); + QCOMPARE(ic.eventButton, Qt::RightButton); + QCOMPARE(ic.eventModifiers, Qt::ControlModifier); + QVERIFY(ic.cursor >= 14 && ic.cursor <= 16); + ic.eventType = QEvent::None; + + { QMouseEvent mv(QEvent::MouseMove, position20, globalposition20, Qt::RightButton, Qt::RightButton,Qt::ControlModifier); + QApplication::sendEvent(view.viewport(), &mv); } + QCOMPARE(ic.eventType, QEvent::MouseMove); + QCOMPARE(ic.eventPosition, position20); + QCOMPARE(ic.eventGlobalPosition, globalposition20); + QCOMPARE(ic.eventButton, Qt::RightButton); + QCOMPARE(ic.eventModifiers, Qt::ControlModifier); + QVERIFY(ic.cursor >= 7 && ic.cursor <= 9); + ic.eventType = QEvent::None; + + { QMouseEvent mv(QEvent::MouseMove, position2, globalPosition2, Qt::RightButton, Qt::RightButton,Qt::ControlModifier); + QApplication::sendEvent(view.viewport(), &mv); } + QCOMPARE(ic.eventType, QEvent::None); + + QTest::mouseRelease(view.viewport(), Qt::RightButton, Qt::ControlModifier, position2); + QCOMPARE(ic.eventType, QEvent::MouseButtonRelease); + QCOMPARE(ic.eventPosition, position2); + QCOMPARE(ic.eventGlobalPosition, globalPosition2); + QCOMPARE(ic.eventButton, Qt::RightButton); + QCOMPARE(ic.eventModifiers, Qt::ControlModifier); + QVERIFY(ic.cursor < 0); + ic.eventType = QEvent::None; +} + +void tst_qdeclarativetextinput::inputMethodComposing() +{ + QString text = "supercalifragisiticexpialidocious!"; + + QGraphicsScene scene; + QGraphicsView view(&scene); + MyInputContext ic; + view.setInputContext(&ic); + QDeclarativeTextInput input; + input.setWidth(200); + input.setText(text.mid(0, 12)); + input.setCursorPosition(12); + input.setPos(0, 0); + input.setFocus(true); + scene.addItem(&input); + view.show(); + QApplication::setActiveWindow(&view); + QTest::qWaitForWindowShown(&view); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(&view)); + + QSignalSpy spy(&input, SIGNAL(inputMethodComposingChanged())); + + QCOMPARE(input.isInputMethodComposing(), false); + + ic.sendEvent(QInputMethodEvent(text.mid(3), QList())); + QCOMPARE(input.isInputMethodComposing(), true); + QCOMPARE(spy.count(), 1); + + ic.sendEvent(QInputMethodEvent(text.mid(12), QList())); + QCOMPARE(input.isInputMethodComposing(), true); + QCOMPARE(spy.count(), 1); + + ic.sendEvent(QInputMethodEvent()); + QCOMPARE(input.isInputMethodComposing(), false); + QCOMPARE(spy.count(), 2); +} + +void tst_qdeclarativetextinput::cursorRectangleSize() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/positionAt.qml"); + QVERIFY(canvas->rootObject() != 0); + canvas->show(); + canvas->setFocus(); + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + + QDeclarativeTextInput *textInput = qobject_cast(canvas->rootObject()); + QVERIFY(textInput != 0); + textInput->setFocus(Qt::OtherFocusReason); + QRectF cursorRect = textInput->positionToRectangle(textInput->cursorPosition()); + QRectF microFocusFromScene = canvas->scene()->inputMethodQuery(Qt::ImMicroFocus).toRectF(); + QRectF microFocusFromApp= QApplication::focusWidget()->inputMethodQuery(Qt::ImMicroFocus).toRectF(); + + QCOMPARE(microFocusFromScene.size(), cursorRect.size()); + QCOMPARE(microFocusFromApp.size(), cursorRect.size()); +} + +void tst_qdeclarativetextinput::deselect() +{ + QDeclarativeView *canvas = createView(SRCDIR "/data/positionAt.qml"); + QVERIFY(canvas->rootObject() != 0); + canvas->show(); + canvas->setFocus(); + QApplication::setActiveWindow(canvas); + QTest::qWaitForWindowShown(canvas); + + QDeclarativeTextInput *textInput = qobject_cast(canvas->rootObject()); + QVERIFY(textInput != 0); + + textInput->setText("Select"); + + QSignalSpy selectionStartSpy(textInput, SIGNAL(selectionStartChanged())); + QSignalSpy selectionEndSpy(textInput, SIGNAL(selectionEndChanged())); + QSignalSpy selectedTextSpy(textInput, SIGNAL(selectedTextChanged())); + + textInput->select(5, 6); + + QCOMPARE(selectionStartSpy.count(), 1); + QCOMPARE(selectionEndSpy.count(), 0); + QCOMPARE(selectedTextSpy.count(), 1); + QCOMPARE(textInput->selectionStart(), 5); + QCOMPARE(textInput->selectionEnd(), 6); + QCOMPARE(textInput->selectedText(), QLatin1String("t")); + QCOMPARE(textInput->cursorPosition(), 6); + + textInput->deselect(); + + QCOMPARE(selectionStartSpy.count(), 2); + QCOMPARE(selectionEndSpy.count(), 1); + QCOMPARE(selectedTextSpy.count(), 2); + QCOMPARE(textInput->selectionStart(), textInput->cursorPosition()); + QCOMPARE(textInput->selectionEnd(), textInput->cursorPosition()); + QCOMPARE(textInput->selectedText(), QLatin1String("")); + QCOMPARE(textInput->cursorPosition(), 6); + + textInput->select(5, 6); + + QCOMPARE(selectionStartSpy.count(), 3); + QCOMPARE(selectionEndSpy.count(), 1); + QCOMPARE(selectedTextSpy.count(), 3); + QCOMPARE(textInput->selectionStart(), 5); + QCOMPARE(textInput->selectionEnd(), 6); + QCOMPARE(textInput->selectedText(), QLatin1String("t")); + QCOMPARE(textInput->cursorPosition(), 6); + + QKeyEvent leftArrowPress(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier); + QKeyEvent leftArrowRelese(QEvent::KeyRelease, Qt::Key_Left, Qt::NoModifier); + QApplication::sendEvent(canvas, &leftArrowPress); + QApplication::sendEvent(canvas, &leftArrowRelese); + + QCOMPARE(selectionStartSpy.count(), 4); + QCOMPARE(selectionEndSpy.count(), 2); + QCOMPARE(selectedTextSpy.count(), 4); + QCOMPARE(textInput->selectionStart(), textInput->cursorPosition()); + QCOMPARE(textInput->selectionEnd(), textInput->cursorPosition()); + QCOMPARE(textInput->selectedText(), QLatin1String("")); + QCOMPARE(textInput->cursorPosition(), 5); + + textInput->select(5, 6); + + QCOMPARE(selectionStartSpy.count(), 4); + QCOMPARE(selectionEndSpy.count(), 3); + QCOMPARE(selectedTextSpy.count(), 5); + QCOMPARE(textInput->selectionStart(), 5); + QCOMPARE(textInput->selectionEnd(), 6); + QCOMPARE(textInput->selectedText(), QLatin1String("t")); + QCOMPARE(textInput->cursorPosition(), 6); + + QList attributes; + attributes << QInputMethodEvent::Attribute(QInputMethodEvent::Selection, 0, 0, QVariant()); + QInputMethodEvent event(QLatin1String(""), attributes); + QApplication::sendEvent(canvas, &event); + + QCOMPARE(selectionStartSpy.count(), 5); + QCOMPARE(selectionEndSpy.count(), 4); + QCOMPARE(selectedTextSpy.count(), 6); + QCOMPARE(textInput->selectionStart(), textInput->cursorPosition()); + QCOMPARE(textInput->selectionEnd(), textInput->cursorPosition()); + QCOMPARE(textInput->selectedText(), QLatin1String("")); + QCOMPARE(textInput->cursorPosition(), 0); + + textInput->setCursorPosition(1); + + QCOMPARE(selectionStartSpy.count(), 6); + QCOMPARE(selectionEndSpy.count(), 5); + QCOMPARE(selectedTextSpy.count(), 6); + + QKeyEvent leftArrowShiftPress(QEvent::KeyPress, Qt::Key_Left, Qt::ShiftModifier); + QKeyEvent leftArrowShiftRelese(QEvent::KeyRelease, Qt::Key_Left, Qt::ShiftModifier); + QApplication::sendEvent(canvas, &leftArrowShiftPress); + QApplication::sendEvent(canvas, &leftArrowShiftRelese); + + QCOMPARE(selectionStartSpy.count(), 7); + QCOMPARE(selectionEndSpy.count(), 5); + QCOMPARE(selectedTextSpy.count(), 7); + QCOMPARE(textInput->selectionStart(), 0); + QCOMPARE(textInput->selectionEnd(), 1); + QCOMPARE(textInput->selectedText(), QLatin1String("S")); + QCOMPARE(textInput->cursorPosition(), 0); + + QApplication::sendEvent(canvas, &event); + + QCOMPARE(selectionStartSpy.count(), 8); + QCOMPARE(selectionEndSpy.count(), 6); + QCOMPARE(selectedTextSpy.count(), 8); + QCOMPARE(textInput->selectionStart(), textInput->cursorPosition()); + QCOMPARE(textInput->selectionEnd(), textInput->cursorPosition()); + QCOMPARE(textInput->selectedText(), QLatin1String("")); + QCOMPARE(textInput->cursorPosition(), 0); +} + +QTEST_MAIN(tst_qdeclarativetextinput) + +#include "tst_qdeclarativetextinput.moc" diff --git a/tests/auto/declarative/qdeclarativetimer/qdeclarativetimer.pro b/tests/auto/declarative/qdeclarativetimer/qdeclarativetimer.pro new file mode 100644 index 00000000..5a9e7f7a --- /dev/null +++ b/tests/auto/declarative/qdeclarativetimer/qdeclarativetimer.pro @@ -0,0 +1,13 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative gui +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativetimer.cpp + +!symbian: { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + +CONFIG+=insignificant_test # QTQAINFRA-428 diff --git a/tests/auto/declarative/qdeclarativetimer/tst_qdeclarativetimer.cpp b/tests/auto/declarative/qdeclarativetimer/tst_qdeclarativetimer.cpp new file mode 100644 index 00000000..15d6319b --- /dev/null +++ b/tests/auto/declarative/qdeclarativetimer/tst_qdeclarativetimer.cpp @@ -0,0 +1,344 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_qdeclarativetimer : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativetimer(); + +private slots: + void notRepeating(); + void notRepeatingStart(); + void repeat(); + void noTriggerIfNotRunning(); + void triggeredOnStart(); + void triggeredOnStartRepeat(); + void changeDuration(); + void restart(); + void parentProperty(); +}; + +class TimerHelper : public QObject +{ + Q_OBJECT +public: + TimerHelper() : QObject(), count(0) + { + } + + int count; + +public slots: + void timeout() { + ++count; + } +}; + +#if defined(Q_OS_SYMBIAN) && defined(Q_CC_NOKIAX86) +// Increase wait as emulator startup can cause unexpected delays +#define TIMEOUT_TIMEOUT 2000 +#else +#define TIMEOUT_TIMEOUT 200 +#endif + +tst_qdeclarativetimer::tst_qdeclarativetimer() +{ +} + +void tst_qdeclarativetimer::notRepeating() +{ + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine); + component.setData(QByteArray("import QtQuick 1.0\nTimer { interval: 100; running: true }"), QUrl::fromLocalFile("")); + QDeclarativeTimer *timer = qobject_cast(component.create()); + QVERIFY(timer != 0); + QVERIFY(timer->isRunning()); + QVERIFY(!timer->isRepeating()); + QCOMPARE(timer->interval(), 100); + + TimerHelper helper; + connect(timer, SIGNAL(triggered()), &helper, SLOT(timeout())); + + QTest::qWait(TIMEOUT_TIMEOUT); + QCOMPARE(helper.count, 1); + QTest::qWait(TIMEOUT_TIMEOUT); + QCOMPARE(helper.count, 1); + QVERIFY(timer->isRunning() == false); +} + +void tst_qdeclarativetimer::notRepeatingStart() +{ + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine); + component.setData(QByteArray("import QtQuick 1.0\nTimer { interval: 100 }"), QUrl::fromLocalFile("")); + QDeclarativeTimer *timer = qobject_cast(component.create()); + QVERIFY(timer != 0); + QVERIFY(!timer->isRunning()); + + TimerHelper helper; + connect(timer, SIGNAL(triggered()), &helper, SLOT(timeout())); + + QTest::qWait(TIMEOUT_TIMEOUT); + QCOMPARE(helper.count, 0); + + timer->start(); + QTest::qWait(TIMEOUT_TIMEOUT); + QCOMPARE(helper.count, 1); + QTest::qWait(TIMEOUT_TIMEOUT); + QCOMPARE(helper.count, 1); + QVERIFY(timer->isRunning() == false); + + delete timer; +} + +void tst_qdeclarativetimer::repeat() +{ + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine); + component.setData(QByteArray("import QtQuick 1.0\nTimer { interval: 100; repeat: true; running: true }"), QUrl::fromLocalFile("")); + QDeclarativeTimer *timer = qobject_cast(component.create()); + QVERIFY(timer != 0); + + TimerHelper helper; + connect(timer, SIGNAL(triggered()), &helper, SLOT(timeout())); + QCOMPARE(helper.count, 0); + + QTest::qWait(TIMEOUT_TIMEOUT); + QVERIFY(helper.count > 0); + int oldCount = helper.count; + + QTest::qWait(TIMEOUT_TIMEOUT); + QVERIFY(helper.count > oldCount); + QVERIFY(timer->isRunning()); + + oldCount = helper.count; + timer->stop(); + + QTest::qWait(TIMEOUT_TIMEOUT); + QVERIFY(helper.count == oldCount); + QVERIFY(timer->isRunning() == false); + + QSignalSpy spy(timer, SIGNAL(repeatChanged())); + + timer->setRepeating(false); + QVERIFY(!timer->isRepeating()); + QCOMPARE(spy.count(),1); + + timer->setRepeating(false); + QCOMPARE(spy.count(),1); + + timer->setRepeating(true); + QCOMPARE(spy.count(),2); + + delete timer; +} + +void tst_qdeclarativetimer::triggeredOnStart() +{ + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine); + component.setData(QByteArray("import QtQuick 1.0\nTimer { interval: 100; running: true; triggeredOnStart: true }"), QUrl::fromLocalFile("")); + QDeclarativeTimer *timer = qobject_cast(component.create()); + QVERIFY(timer != 0); + QVERIFY(timer->triggeredOnStart()); + + TimerHelper helper; + connect(timer, SIGNAL(triggered()), &helper, SLOT(timeout())); + QTest::qWait(1); + QCOMPARE(helper.count, 1); + + QTest::qWait(TIMEOUT_TIMEOUT); + QCOMPARE(helper.count, 2); + QTest::qWait(TIMEOUT_TIMEOUT); + QCOMPARE(helper.count, 2); + QVERIFY(timer->isRunning() == false); + + QSignalSpy spy(timer, SIGNAL(triggeredOnStartChanged())); + + timer->setTriggeredOnStart(false); + QVERIFY(!timer->triggeredOnStart()); + QCOMPARE(spy.count(),1); + + timer->setTriggeredOnStart(false); + QCOMPARE(spy.count(),1); + + timer->setTriggeredOnStart(true); + QCOMPARE(spy.count(),2); + + delete timer; +} + +void tst_qdeclarativetimer::triggeredOnStartRepeat() +{ + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine); + component.setData(QByteArray("import QtQuick 1.0\nTimer { interval: 100; running: true; triggeredOnStart: true; repeat: true }"), QUrl::fromLocalFile("")); + QDeclarativeTimer *timer = qobject_cast(component.create()); + QVERIFY(timer != 0); + + TimerHelper helper; + connect(timer, SIGNAL(triggered()), &helper, SLOT(timeout())); + QTest::qWait(1); + QCOMPARE(helper.count, 1); + + QTest::qWait(TIMEOUT_TIMEOUT); + QVERIFY(helper.count > 1); + int oldCount = helper.count; + QTest::qWait(TIMEOUT_TIMEOUT); + QVERIFY(helper.count > oldCount); + QVERIFY(timer->isRunning()); + + delete timer; +} + +void tst_qdeclarativetimer::noTriggerIfNotRunning() +{ + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine); + component.setData(QByteArray( + "import QtQuick 1.0\n" + "Item { property bool ok: true\n" + "Timer { id: t1; interval: 100; repeat: true; running: true; onTriggered: if (!running) ok=false }" + "Timer { interval: 10; running: true; onTriggered: t1.running=false }" + "}" + ), QUrl::fromLocalFile("")); + QObject *item = component.create(); + QVERIFY(item != 0); + QTest::qWait(TIMEOUT_TIMEOUT); + QCOMPARE(item->property("ok").toBool(), true); + + delete item; +} + +void tst_qdeclarativetimer::changeDuration() +{ + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine); + component.setData(QByteArray("import QtQuick 1.0\nTimer { interval: 200; repeat: true; running: true }"), QUrl::fromLocalFile("")); + QDeclarativeTimer *timer = qobject_cast(component.create()); + QVERIFY(timer != 0); + + TimerHelper helper; + connect(timer, SIGNAL(triggered()), &helper, SLOT(timeout())); + QCOMPARE(helper.count, 0); + + QTest::qWait(500); + QCOMPARE(helper.count, 2); + + timer->setInterval(500); + + QTest::qWait(600); + QCOMPARE(helper.count, 3); + QVERIFY(timer->isRunning()); + + QSignalSpy spy(timer, SIGNAL(intervalChanged())); + + timer->setInterval(200); + QCOMPARE(timer->interval(), 200); + QCOMPARE(spy.count(),1); + + timer->setInterval(200); + QCOMPARE(spy.count(),1); + + timer->setInterval(300); + QCOMPARE(spy.count(),2); + + delete timer; +} + +void tst_qdeclarativetimer::restart() +{ + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine); + component.setData(QByteArray("import QtQuick 1.0\nTimer { interval: 500; repeat: true; running: true }"), QUrl::fromLocalFile("")); + QDeclarativeTimer *timer = qobject_cast(component.create()); + QVERIFY(timer != 0); + + TimerHelper helper; + connect(timer, SIGNAL(triggered()), &helper, SLOT(timeout())); + QCOMPARE(helper.count, 0); + + QTest::qWait(600); + QCOMPARE(helper.count, 1); + + QTest::qWait(300); + + timer->restart(); + + QTest::qWait(700); + + QCOMPARE(helper.count, 2); + QVERIFY(timer->isRunning()); + + delete timer; +} + +void tst_qdeclarativetimer::parentProperty() +{ + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine); + component.setData(QByteArray("import QtQuick 1.0\nItem { Timer { objectName: \"timer\"; running: parent.visible } }"), QUrl::fromLocalFile("")); + QDeclarativeItem *item = qobject_cast(component.create()); + QVERIFY(item != 0); + QDeclarativeTimer *timer = item->findChild("timer"); + QVERIFY(timer != 0); + + QVERIFY(timer->isRunning()); + + delete timer; +} + +QTEST_MAIN(tst_qdeclarativetimer) + +#include "tst_qdeclarativetimer.moc" diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/BindingsSpliceCorrectlyType.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/BindingsSpliceCorrectlyType.qml new file mode 100644 index 00000000..f625d081 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/BindingsSpliceCorrectlyType.qml @@ -0,0 +1,7 @@ +import Test 1.0 + +MyTypeObject { + property bool boldProperty: false + + font.bold: boldProperty +} diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/BindingsSpliceCorrectlyType4.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/BindingsSpliceCorrectlyType4.qml new file mode 100644 index 00000000..0bdccce5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/BindingsSpliceCorrectlyType4.qml @@ -0,0 +1,7 @@ +import Test 1.0 + +MyTypeObject { + property int dataProperty: 7 + + point: Qt.point(dataProperty, dataProperty) +} diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/BindingsSpliceCorrectlyType5.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/BindingsSpliceCorrectlyType5.qml new file mode 100644 index 00000000..151c4997 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/BindingsSpliceCorrectlyType5.qml @@ -0,0 +1,7 @@ +import Test 1.0 + +MyTypeObject { + property int dataProperty: 7 + + point.x: dataProperty +} diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/autoBindingRemoval.2.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/autoBindingRemoval.2.qml new file mode 100644 index 00000000..ce2e82d0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/autoBindingRemoval.2.qml @@ -0,0 +1,9 @@ +import Test 1.0 + +MyTypeObject { + property int value: 10 + rect.x: value + + onRunScript: { rect = Qt.rect(10, 10, 10, 10) } +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/autoBindingRemoval.3.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/autoBindingRemoval.3.qml new file mode 100644 index 00000000..d431b4ae --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/autoBindingRemoval.3.qml @@ -0,0 +1,10 @@ +import Test 1.0 + +MyTypeObject { + property variant value + + rect: value + + onRunScript: { rect.x = 44 } +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/autoBindingRemoval.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/autoBindingRemoval.qml new file mode 100644 index 00000000..a8a72f51 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/autoBindingRemoval.qml @@ -0,0 +1,9 @@ +import Test 1.0 + +MyTypeObject { + property int value: 10 + rect.x: value + + onRunScript: { rect.x = 42; } +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/bindingAssignment.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/bindingAssignment.qml new file mode 100644 index 00000000..a6521866 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/bindingAssignment.qml @@ -0,0 +1,7 @@ +import Test 1.0 + +MyTypeObject { + property int value: 10 + + rect.x: value +} diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/bindingConflict.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/bindingConflict.qml new file mode 100644 index 00000000..fd25c9f0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/bindingConflict.qml @@ -0,0 +1,8 @@ +import Test 1.0 + +MyTypeObject { + property int value: 13 + + rect.x: value + rect: "10,10,10x10" +} diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/bindingRead.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/bindingRead.qml new file mode 100644 index 00000000..538d776f --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/bindingRead.qml @@ -0,0 +1,5 @@ +import Test 1.0 + +MyTypeObject { + property int value: rect.x +} diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/bindingVariantCopy.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/bindingVariantCopy.qml new file mode 100644 index 00000000..3a48c8bd --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/bindingVariantCopy.qml @@ -0,0 +1,13 @@ +import Test 1.0 + +MyTypeObject { + property variant object + object: MyTypeObject { + rect.x: 19 + rect.y: 33 + rect.width: 5 + rect.height: 99 + } + + rect: object.rect +} diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.1.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.1.qml new file mode 100644 index 00000000..70121435 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.1.qml @@ -0,0 +1,29 @@ +import Test 1.0 +import QtQuick 1.0 + +BindingsSpliceCorrectlyType { + property bool test: false + + property bool italicProperty: false + + font.italic: italicProperty + + Component.onCompleted: { + // Test initial state + if (font.italic != false) return; + if (font.bold != false) return; + + // Test italic binding worked + italicProperty = true; + + if (font.italic != true) return; + if (font.bold != false) return; + + // Test bold binding worked + boldProperty = true; + if (font.italic != true) return; + if (font.bold != true) return; + + test = true; + } +} diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.2.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.2.qml new file mode 100644 index 00000000..69dbcab9 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.2.qml @@ -0,0 +1,31 @@ +import Test 1.0 +import QtQuick 1.0 + +BindingsSpliceCorrectlyType { + property bool test: false + + property bool italicProperty: false + + font.italic: italicProperty + font.bold: false + + Component.onCompleted: { + // Test initial state + if (font.italic != false) return; + if (font.bold != false) return; + + // Test italic binding worked + italicProperty = true; + + if (font.italic != true) return; + if (font.bold != false) return; + + // Test bold binding was removed by constant write + boldProperty = true; + if (font.italic != true) return; + if (font.bold != false) return; + + test = true; + } +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.3.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.3.qml new file mode 100644 index 00000000..669feb99 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.3.qml @@ -0,0 +1,36 @@ +import Test 1.0 +import QtQuick 1.0 + +BindingsSpliceCorrectlyType { + property bool test: false + + property bool italicProperty: false + property bool boldProperty2: false + + font.italic: italicProperty + font.bold: boldProperty2 + + Component.onCompleted: { + // Test initial state + if (font.italic != false) return; + if (font.bold != false) return; + + // Test italic binding worked + italicProperty = true; + + if (font.italic != true) return; + if (font.bold != false) return; + + // Test bold binding was overridden + boldProperty = true; + if (font.italic != true) return; + if (font.bold != false) return; + + boldProperty2 = true; + if (font.italic != true) return; + if (font.bold != true) return; + + test = true; + } +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.4.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.4.qml new file mode 100644 index 00000000..f28584f4 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.4.qml @@ -0,0 +1,27 @@ +import Test 1.0 +import QtQuick 1.0 + +BindingsSpliceCorrectlyType4 { + property bool test: false + + property int dataProperty2: 8 + + point.x: dataProperty2 + + Component.onCompleted: { + if (point.x != 8) return; + if (point.y != 4) return; + + dataProperty = 9; + + if (point.x != 8) return; + if (point.y != 4) return; + + dataProperty2 = 13; + + if (point.x != 13) return; + if (point.y != 4) return; + + test = true; + } +} diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.5.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.5.qml new file mode 100644 index 00000000..1214c839 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/bindingsSpliceCorrectly.5.qml @@ -0,0 +1,27 @@ +import Test 1.0 +import QtQuick 1.0 + +BindingsSpliceCorrectlyType5 { + property bool test: false + + property int dataProperty2: 8 + + point: Qt.point(dataProperty2, dataProperty2); + + Component.onCompleted: { + if (point.x != 8) return; + if (point.y != 8) return; + + dataProperty = 9; + + if (point.x != 8) return; + if (point.y != 8) return; + + dataProperty2 = 13; + + if (point.x != 13) return; + if (point.y != 13) return; + + test = true; + } +} diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/conflicting.1.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/conflicting.1.qml new file mode 100644 index 00000000..e2e69627 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/conflicting.1.qml @@ -0,0 +1,42 @@ +import QtQuick 1.0 + +Rectangle { + id: root + + width: 800 + height: 600 + + property alias font: myText.font + + property int myPixelSize: 12 + property int myPixelSize2: 24 + + Text { + id: other + font.pixelSize: 6 + } + + Text { + id: myText + + text: "Hello world!" + font.pixelSize: myPixelSize + } + + states: State { + name: "Swapped" + PropertyChanges { + target: myText + font: other.font + } + } + + function toggle() { + if (root.state == "") root.state = "Swapped"; else root.state = ""; + } + + MouseArea { + anchors.fill: parent + onClicked: { if (root.state == "") root.state = "Swapped"; else root.state = "";} + } +} diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/conflicting.2.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/conflicting.2.qml new file mode 100644 index 00000000..0e09ff95 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/conflicting.2.qml @@ -0,0 +1,42 @@ +import QtQuick 1.0 + +Rectangle { + id: root + + width: 800 + height: 600 + + property alias font: myText.font + + property int myPixelSize: 12 + property int myPixelSize2: 24 + + Text { + id: other + font.pixelSize: 6 + } + + Text { + id: myText + + text: "Hello world!" + font: other.font + } + + states: State { + name: "Swapped" + PropertyChanges { + target: myText + font.pixelSize: myPixelSize + } + } + + function toggle() { + if (root.state == "") root.state = "Swapped"; else root.state = ""; + } + + MouseArea { + anchors.fill: parent + onClicked: { if (root.state == "") root.state = "Swapped"; else root.state = "";} + } +} diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/conflicting.3.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/conflicting.3.qml new file mode 100644 index 00000000..1f6646ea --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/conflicting.3.qml @@ -0,0 +1,42 @@ +import QtQuick 1.0 + +Rectangle { + id: root + + width: 800 + height: 600 + + property alias font: myText.font + + property int myPixelSize: 12 + property int myPixelSize2: 24 + + Text { + id: other + font.pixelSize: 6 + } + + Text { + id: myText + + text: "Hello world!" + font.pixelSize: myPixelSize + } + + states: State { + name: "Swapped" + PropertyChanges { + target: myText + font.pixelSize: myPixelSize2 + } + } + + function toggle() { + if (root.state == "") root.state = "Swapped"; else root.state = ""; + } + + MouseArea { + anchors.fill: parent + onClicked: { if (root.state == "") root.state = "Swapped"; else root.state = "";} + } +} diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/deletedObject.js b/tests/auto/declarative/qdeclarativevaluetypes/data/deletedObject.js new file mode 100644 index 00000000..af298ffb --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/deletedObject.js @@ -0,0 +1,13 @@ +var savedReference; + +function startup() +{ + savedReference = object.rect; + console.log("Test: " + savedReference.x); +} + +function afterDelete() +{ + console.log("Test: " + savedReference.x); +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/deletedObject.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/deletedObject.qml new file mode 100644 index 00000000..391cabaf --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/deletedObject.qml @@ -0,0 +1,11 @@ +import Test 1.0 +import QtQuick 1.0 +import "deletedObject.js" as JS + +MyTypeObject { + property variant object + + object: MyTypeObject {} + Component.onCompleted: JS.startup() + onRunScript: JS.afterDelete() +} diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/enums.1.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/enums.1.qml new file mode 100644 index 00000000..cb01a806 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/enums.1.qml @@ -0,0 +1,6 @@ +import Test 1.0 + +MyTypeObject { + font.capitalization: "AllUppercase" +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/enums.2.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/enums.2.qml new file mode 100644 index 00000000..93f1ed59 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/enums.2.qml @@ -0,0 +1,6 @@ +import Test 1.0 + +MyTypeObject { + font.capitalization: if (1) "AllUppercase" +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/enums.3.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/enums.3.qml new file mode 100644 index 00000000..082aed1d --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/enums.3.qml @@ -0,0 +1,6 @@ +import Test 1.0 +import QtQuick 1.0 + +MyTypeObject { + font.capitalization: Font.AllUppercase +} diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/enums.4.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/enums.4.qml new file mode 100644 index 00000000..e5d9ab2b --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/enums.4.qml @@ -0,0 +1,7 @@ +import Test 1.0 +import QtQuick 1.0 as MyQt + +MyTypeObject { + font.capitalization: MyQt.Font.AllUppercase +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/enums.5.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/enums.5.qml new file mode 100644 index 00000000..8ec508c9 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/enums.5.qml @@ -0,0 +1,10 @@ +import Test 1.0 +import QtQuick 1.0 as MyQt + +MyTypeObject { + MyQt.Component.onCompleted: { + font.capitalization = MyQt.Font.AllUppercase + } +} + + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/font_read.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/font_read.qml new file mode 100644 index 00000000..d73bb132 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/font_read.qml @@ -0,0 +1,18 @@ +import Test 1.0 + +MyTypeObject { + property string f_family: font.family + property bool f_bold: font.bold + property int f_weight: font.weight + property bool f_italic: font.italic + property bool f_underline: font.underline + property bool f_overline: font.overline + property bool f_strikeout: font.strikeout + property real f_pointSize: font.pointSize + property int f_pixelSize: font.pixelSize + property int f_capitalization: font.capitalization + property real f_letterSpacing: font.letterSpacing + property real f_wordSpacing: font.wordSpacing; + property variant copy: font +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/font_write.2.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/font_write.2.qml new file mode 100644 index 00000000..b559389e --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/font_write.2.qml @@ -0,0 +1,6 @@ +import Test 1.0 + +MyTypeObject { + font.pixelSize: 10 +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/font_write.3.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/font_write.3.qml new file mode 100644 index 00000000..913ac507 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/font_write.3.qml @@ -0,0 +1,7 @@ +import Test 1.0 + +MyTypeObject { + font.pixelSize: 10 + font.pointSize: 19 +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/font_write.4.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/font_write.4.qml new file mode 100644 index 00000000..2ec69d72 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/font_write.4.qml @@ -0,0 +1,7 @@ +import Test 1.0 + +MyTypeObject { + font.pointSize: 19 + font.pixelSize: 10 +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/font_write.5.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/font_write.5.qml new file mode 100644 index 00000000..2fdfddb2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/font_write.5.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 +import Test 1.0 + +Item { + MyTypeObject { + objectName: "object1" + font.pixelSize: 19 + } + MyTypeObject { + objectName: "object2" + font.pointSize: 14 + } +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/font_write.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/font_write.qml new file mode 100644 index 00000000..ff4d0a10 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/font_write.qml @@ -0,0 +1,16 @@ +import Test 1.0 + +MyTypeObject { + font.family: if(1) "Helvetica" + font.bold: if(1) false + font.weight: "Normal" + font.italic: if(1) false + font.underline: if(1) false + font.overline: if(1) false + font.strikeout: if(1) false + font.pointSize: if(1) 15 + font.capitalization: "AllLowercase" + font.letterSpacing: if(1) 9.7 + font.wordSpacing: if(1) 11.2 +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/matrix4x4_read.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/matrix4x4_read.qml new file mode 100644 index 00000000..6c4a6825 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/matrix4x4_read.qml @@ -0,0 +1,22 @@ +import Test 1.0 + +MyTypeObject { + property real v_m11: matrix.m11 + property real v_m12: matrix.m12 + property real v_m13: matrix.m13 + property real v_m14: matrix.m14 + property real v_m21: matrix.m21 + property real v_m22: matrix.m22 + property real v_m23: matrix.m23 + property real v_m24: matrix.m24 + property real v_m31: matrix.m31 + property real v_m32: matrix.m32 + property real v_m33: matrix.m33 + property real v_m34: matrix.m34 + property real v_m41: matrix.m41 + property real v_m42: matrix.m42 + property real v_m43: matrix.m43 + property real v_m44: matrix.m44 + property variant copy: matrix +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/matrix4x4_write.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/matrix4x4_write.qml new file mode 100644 index 00000000..2a9f154d --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/matrix4x4_write.qml @@ -0,0 +1,21 @@ +import Test 1.0 + +MyTypeObject { + matrix.m11: if (true) 11 + matrix.m12: if (true) 12 + matrix.m13: if (true) 13 + matrix.m14: if (true) 14 + matrix.m21: if (true) 21 + matrix.m22: if (true) 22 + matrix.m23: if (true) 23 + matrix.m24: if (true) 24 + matrix.m31: if (true) 31 + matrix.m32: if (true) 32 + matrix.m33: if (true) 33 + matrix.m34: if (true) 34 + matrix.m41: if (true) 41 + matrix.m42: if (true) 42 + matrix.m43: if (true) 43 + matrix.m44: if (true) 44 +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/point_read.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/point_read.qml new file mode 100644 index 00000000..4bb6c538 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/point_read.qml @@ -0,0 +1,7 @@ +import Test 1.0 + +MyTypeObject { + property int p_x: point.x + property int p_y: point.y + property variant copy: point +} diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/point_write.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/point_write.qml new file mode 100644 index 00000000..063525a6 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/point_write.qml @@ -0,0 +1,6 @@ +import Test 1.0 + +MyTypeObject { + point.x: if (true) 11 + point.y: if (true) 12 +} diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/pointf_read.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/pointf_read.qml new file mode 100644 index 00000000..0eab6daa --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/pointf_read.qml @@ -0,0 +1,8 @@ +import Test 1.0 + +MyTypeObject { + property real p_x: pointf.x + property real p_y: pointf.y + property variant copy: pointf +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/pointf_write.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/pointf_write.qml new file mode 100644 index 00000000..9ee3fc1b --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/pointf_write.qml @@ -0,0 +1,6 @@ +import Test 1.0 + +MyTypeObject { + pointf.x: if (true) 6.8 + pointf.y: if (true) 9.3 +} diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/quaternion_read.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/quaternion_read.qml new file mode 100644 index 00000000..d1a21dc9 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/quaternion_read.qml @@ -0,0 +1,10 @@ +import Test 1.0 + +MyTypeObject { + property real v_scalar: quaternion.scalar + property real v_x: quaternion.x + property real v_y: quaternion.y + property real v_z: quaternion.z + property variant copy: quaternion +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/quaternion_write.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/quaternion_write.qml new file mode 100644 index 00000000..0c3e5afd --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/quaternion_write.qml @@ -0,0 +1,9 @@ +import Test 1.0 + +MyTypeObject { + quaternion.scalar: if (true) 88.5 + quaternion.x: if (true) -0.3 + quaternion.y: if (true) -12.9 + quaternion.z: if (true) 907.4 +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/rect_read.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/rect_read.qml new file mode 100644 index 00000000..c3b37a70 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/rect_read.qml @@ -0,0 +1,10 @@ +import Test 1.0 + +MyTypeObject { + property int r_x: rect.x + property int r_y: rect.y + property int r_width: rect.width + property int r_height: rect.height + property variant copy: rect +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/rect_write.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/rect_write.qml new file mode 100644 index 00000000..8add4530 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/rect_write.qml @@ -0,0 +1,9 @@ +import Test 1.0 + +MyTypeObject { + rect.x: if (true) 1234 + rect.y: if (true) 7 + rect.width: if (true) 56 + rect.height: if (true) 63 +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/rectf_read.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/rectf_read.qml new file mode 100644 index 00000000..6ff3ce30 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/rectf_read.qml @@ -0,0 +1,10 @@ +import Test 1.0 + +MyTypeObject { + property real r_x: rectf.x + property real r_y: rectf.y + property real r_width: rectf.width + property real r_height: rectf.height + property variant copy: rectf +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/rectf_write.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/rectf_write.qml new file mode 100644 index 00000000..1e6ff4ff --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/rectf_write.qml @@ -0,0 +1,9 @@ +import Test 1.0 + +MyTypeObject { + rectf.x: if (true) 70.1 + rectf.y: if (true) -113.2 + rectf.width: if (true) 80924.8 + rectf.height: if (true) 99.2 +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/returnValues.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/returnValues.qml new file mode 100644 index 00000000..f1c18558 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/returnValues.qml @@ -0,0 +1,17 @@ +import Test 1.0 +import QtQuick 1.0 + +MyTypeObject { + property bool test1: false; + property bool test2: false; + + Component.onCompleted: { + var a = method(); + + test1 = (a.width == 13) + test2 = (a.height == 14) + + size = a; + } +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/scriptAccess.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/scriptAccess.qml new file mode 100644 index 00000000..9299c8b7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/scriptAccess.qml @@ -0,0 +1,9 @@ +import QtQuick 1.0 +import Test 1.0 + +MyTypeObject { + property int valuePre; + property int valuePost; + + Component.onCompleted: { valuePre = rect.x; rect.x = 19; valuePost = rect.x; } +} diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/scriptVariantCopy.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/scriptVariantCopy.qml new file mode 100644 index 00000000..42fccfac --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/scriptVariantCopy.qml @@ -0,0 +1,14 @@ +import Test 1.0 + +MyTypeObject { + property variant object + object: MyTypeObject { + rect.x: 19 + rect.y: 33 + rect.width: 5 + rect.height: 99 + } + + onRunScript: rect = object.rect +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/size_read.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/size_read.qml new file mode 100644 index 00000000..a49fd9f7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/size_read.qml @@ -0,0 +1,8 @@ +import Test 1.0 + +MyTypeObject { + property int s_width: size.width + property int s_height: size.height + property variant copy: size +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/size_write.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/size_write.qml new file mode 100644 index 00000000..2f9d10e4 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/size_write.qml @@ -0,0 +1,7 @@ +import Test 1.0 + +MyTypeObject { + size.width: if (true) 13 + size.height: if (true) 88 +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/sizef_read.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/sizef_read.qml new file mode 100644 index 00000000..96cd425f --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/sizef_read.qml @@ -0,0 +1,9 @@ +import Test 1.0 + +MyTypeObject { + property real s_width: sizef.width + property real s_height: sizef.height + property variant copy: sizef +} + + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/sizef_write.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/sizef_write.qml new file mode 100644 index 00000000..f16f0bdf --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/sizef_write.qml @@ -0,0 +1,6 @@ +import Test 1.0 + +MyTypeObject { + sizef.width: if (true) 44.3 + sizef.height: if (true) 92.8 +} diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/sizereadonly_read.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/sizereadonly_read.qml new file mode 100644 index 00000000..7f708a08 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/sizereadonly_read.qml @@ -0,0 +1,8 @@ +import Test 1.0 + +MyTypeObject { + property int s_width: sizereadonly.width + property int s_height: sizereadonly.height + property variant copy: sizereadonly +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/sizereadonly_writeerror.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/sizereadonly_writeerror.qml new file mode 100644 index 00000000..32545570 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/sizereadonly_writeerror.qml @@ -0,0 +1,6 @@ +import Test 1.0 + +MyTypeObject { + sizereadonly: "13x88" +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/sizereadonly_writeerror2.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/sizereadonly_writeerror2.qml new file mode 100644 index 00000000..656d718b --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/sizereadonly_writeerror2.qml @@ -0,0 +1,7 @@ +import Test 1.0 + +MyTypeObject { + sizereadonly.width: if (true) 13 + sizereadonly.height: if (true) 88 +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/sizereadonly_writeerror3.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/sizereadonly_writeerror3.qml new file mode 100644 index 00000000..b8e3f0d4 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/sizereadonly_writeerror3.qml @@ -0,0 +1,7 @@ +import Test 1.0 + +MyTypeObject { + sizereadonly.width: 13 + sizereadonly.height: 88 +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/sizereadonly_writeerror4.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/sizereadonly_writeerror4.qml new file mode 100644 index 00000000..fc41ecf0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/sizereadonly_writeerror4.qml @@ -0,0 +1,10 @@ +import Test 1.0 +import QtQuick 1.0 + +MyTypeObject { + Component.onCompleted: { + sizereadonly.width = 13; + } +} + + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/staticAssignment.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/staticAssignment.qml new file mode 100644 index 00000000..b687f89e --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/staticAssignment.qml @@ -0,0 +1,5 @@ +import Test 1.0 + +MyTypeObject { + rect.x: 9 +} diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/valueInterceptors.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/valueInterceptors.qml new file mode 100644 index 00000000..0897847d --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/valueInterceptors.qml @@ -0,0 +1,8 @@ +import Test 1.0 + +MyTypeObject { + property int value: 13; + + MyOffsetValueInterceptor on rect.x {} + rect.x: value +} diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/valueSources.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/valueSources.qml new file mode 100644 index 00000000..717f3502 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/valueSources.qml @@ -0,0 +1,5 @@ +import Test 1.0 + +MyTypeObject { + MyConstantValueSource on rect.x {} +} diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/varAssignment.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/varAssignment.qml new file mode 100644 index 00000000..ff80ff84 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/varAssignment.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 + +QtObject { + property int x; + property int y; + property int z; + + Component.onCompleted: { + var vec3 = Qt.vector3d(1, 2, 3); + x = vec3.x; + y = vec3.y; + z = vec3.z; + } +} diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/variant_read.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/variant_read.qml new file mode 100644 index 00000000..a08f3db9 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/variant_read.qml @@ -0,0 +1,9 @@ +import Test 1.0 + +MyTypeObject { + property real s_width: variant.width + property real s_height: variant.height + property variant copy: variant +} + + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/vector2d_read.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/vector2d_read.qml new file mode 100644 index 00000000..fc315f7a --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/vector2d_read.qml @@ -0,0 +1,8 @@ +import Test 1.0 + +MyTypeObject { + property real v_x: vector2.x + property real v_y: vector2.y + property variant copy: vector2 +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/vector2d_write.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/vector2d_write.qml new file mode 100644 index 00000000..f0e35ff2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/vector2d_write.qml @@ -0,0 +1,7 @@ +import Test 1.0 + +MyTypeObject { + vector2.x: if (true) -0.3 + vector2.y: if (true) -12.9 +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/vector3d_read.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/vector3d_read.qml new file mode 100644 index 00000000..f1e876db --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/vector3d_read.qml @@ -0,0 +1,9 @@ +import Test 1.0 + +MyTypeObject { + property real v_x: vector.x + property real v_y: vector.y + property real v_z: vector.z + property variant copy: vector +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/vector3d_write.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/vector3d_write.qml new file mode 100644 index 00000000..9c1bf762 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/vector3d_write.qml @@ -0,0 +1,8 @@ +import Test 1.0 + +MyTypeObject { + vector.x: if (true) -0.3 + vector.y: if (true) -12.9 + vector.z: if (true) 907.4 +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/vector4d_read.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/vector4d_read.qml new file mode 100644 index 00000000..f9d5d605 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/vector4d_read.qml @@ -0,0 +1,10 @@ +import Test 1.0 + +MyTypeObject { + property real v_x: vector4.x + property real v_y: vector4.y + property real v_z: vector4.z + property real v_w: vector4.w + property variant copy: vector4 +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/data/vector4d_write.qml b/tests/auto/declarative/qdeclarativevaluetypes/data/vector4d_write.qml new file mode 100644 index 00000000..54869812 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/data/vector4d_write.qml @@ -0,0 +1,9 @@ +import Test 1.0 + +MyTypeObject { + vector4.x: if (true) -0.3 + vector4.y: if (true) -12.9 + vector4.z: if (true) 907.4 + vector4.w: if (true) 88.5 +} + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/qdeclarativevaluetypes.pro b/tests/auto/declarative/qdeclarativevaluetypes/qdeclarativevaluetypes.pro new file mode 100644 index 00000000..59b35268 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/qdeclarativevaluetypes.pro @@ -0,0 +1,19 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +macx:CONFIG -= app_bundle + +HEADERS += testtypes.h + +SOURCES += tst_qdeclarativevaluetypes.cpp \ + testtypes.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativevaluetypes/testtypes.cpp b/tests/auto/declarative/qdeclarativevaluetypes/testtypes.cpp new file mode 100644 index 00000000..abe3039c --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/testtypes.cpp @@ -0,0 +1,48 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "testtypes.h" + +void registerTypes() +{ + qmlRegisterType("Test", 1, 0, "MyTypeObject"); + qmlRegisterType("Test", 1, 0, "MyConstantValueSource"); + qmlRegisterType("Test", 1, 0, "MyOffsetValueInterceptor"); +} diff --git a/tests/auto/declarative/qdeclarativevaluetypes/testtypes.h b/tests/auto/declarative/qdeclarativevaluetypes/testtypes.h new file mode 100644 index 00000000..f808157a --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/testtypes.h @@ -0,0 +1,190 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef TESTTYPES_H +#define TESTTYPES_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class MyTypeObject : public QObject +{ + Q_OBJECT + + Q_PROPERTY(QPoint point READ point WRITE setPoint NOTIFY changed) + Q_PROPERTY(QPointF pointf READ pointf WRITE setPointf NOTIFY changed) + Q_PROPERTY(QSize size READ size WRITE setSize NOTIFY changed) + Q_PROPERTY(QSizeF sizef READ sizef WRITE setSizef NOTIFY changed) + Q_PROPERTY(QSize sizereadonly READ size NOTIFY changed) + Q_PROPERTY(QRect rect READ rect WRITE setRect NOTIFY changed) + Q_PROPERTY(QRectF rectf READ rectf WRITE setRectf NOTIFY changed) + Q_PROPERTY(QVector2D vector2 READ vector2 WRITE setVector2 NOTIFY changed) + Q_PROPERTY(QVector3D vector READ vector WRITE setVector NOTIFY changed) + Q_PROPERTY(QVector4D vector4 READ vector4 WRITE setVector4 NOTIFY changed) + Q_PROPERTY(QQuaternion quaternion READ quaternion WRITE setQuaternion NOTIFY changed) + Q_PROPERTY(QMatrix4x4 matrix READ matrix WRITE setMatrix NOTIFY changed) + Q_PROPERTY(QFont font READ font WRITE setFont NOTIFY changed) + Q_PROPERTY(QVariant variant READ variant NOTIFY changed) + +public: + MyTypeObject() : + m_point(10, 4), + m_pointf(11.3, -10.9), + m_size(1912, 1913), + m_sizef(0.1, 100923.2), + m_rect(2, 3, 109, 102), + m_rectf(103.8, 99.2, 88.1, 77.6), + m_vector2(32.88, 1.3), + m_vector(23.88, 3.1, 4.3), + m_vector4(54.2, 23.88, 3.1, 4.3), + m_quaternion(4.3, 54.2, 23.88, 3.1), + m_matrix(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16) + { + m_font.setFamily("Arial"); + m_font.setBold(true); + m_font.setWeight(QFont::DemiBold); + m_font.setItalic(true); + m_font.setUnderline(true); + m_font.setOverline(true); + m_font.setStrikeOut(true); + m_font.setPointSize(29); + m_font.setCapitalization(QFont::AllLowercase); + m_font.setLetterSpacing(QFont::AbsoluteSpacing, 10.2); + m_font.setWordSpacing(19.7); + } + + QPoint m_point; + QPoint point() const { return m_point; } + void setPoint(const QPoint &v) { m_point = v; emit changed(); } + + QPointF m_pointf; + QPointF pointf() const { return m_pointf; } + void setPointf(const QPointF &v) { m_pointf = v; emit changed(); } + + QSize m_size; + QSize size() const { return m_size; } + void setSize(const QSize &v) { m_size = v; emit changed(); } + + QSizeF m_sizef; + QSizeF sizef() const { return m_sizef; } + void setSizef(const QSizeF &v) { m_sizef = v; emit changed(); } + + QRect m_rect; + QRect rect() const { return m_rect; } + void setRect(const QRect &v) { m_rect = v; emit changed(); } + + QRectF m_rectf; + QRectF rectf() const { return m_rectf; } + void setRectf(const QRectF &v) { m_rectf = v; emit changed(); } + + QVector2D m_vector2; + QVector2D vector2() const { return m_vector2; } + void setVector2(const QVector2D &v) { m_vector2 = v; emit changed(); } + + QVector3D m_vector; + QVector3D vector() const { return m_vector; } + void setVector(const QVector3D &v) { m_vector = v; emit changed(); } + + QVector4D m_vector4; + QVector4D vector4() const { return m_vector4; } + void setVector4(const QVector4D &v) { m_vector4 = v; emit changed(); } + + QQuaternion m_quaternion; + QQuaternion quaternion() const { return m_quaternion; } + void setQuaternion(const QQuaternion &v) { m_quaternion = v; emit changed(); } + + QMatrix4x4 m_matrix; + QMatrix4x4 matrix() const { return m_matrix; } + void setMatrix(const QMatrix4x4 &v) { m_matrix = v; emit changed(); } + + QFont m_font; + QFont font() const { return m_font; } + void setFont(const QFont &v) { m_font = v; emit changed(); } + + QVariant variant() const { return sizef(); } + + void emitRunScript() { emit runScript(); } + +signals: + void changed(); + void runScript(); + +public slots: + QSize method() { return QSize(13, 14); } +}; + +class MyConstantValueSource : public QObject, public QDeclarativePropertyValueSource +{ + Q_OBJECT + Q_INTERFACES(QDeclarativePropertyValueSource) +public: + virtual void setTarget(const QDeclarativeProperty &p) { p.write(3345); } +}; + +class MyOffsetValueInterceptor : public QObject, public QDeclarativePropertyValueInterceptor +{ + Q_OBJECT + Q_INTERFACES(QDeclarativePropertyValueInterceptor) +public: + virtual void setTarget(const QDeclarativeProperty &p) { prop = p; } + virtual void write(const QVariant &value) { QDeclarativePropertyPrivate::write(prop, value.toInt() + 13, QDeclarativePropertyPrivate::BypassInterceptor); } + +private: + QDeclarativeProperty prop; +}; + +void registerTypes(); + +#endif // TESTTYPES_H diff --git a/tests/auto/declarative/qdeclarativevaluetypes/tst_qdeclarativevaluetypes.cpp b/tests/auto/declarative/qdeclarativevaluetypes/tst_qdeclarativevaluetypes.cpp new file mode 100644 index 00000000..0ddbc87e --- /dev/null +++ b/tests/auto/declarative/qdeclarativevaluetypes/tst_qdeclarativevaluetypes.cpp @@ -0,0 +1,1017 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#include +#include "testtypes.h" + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +QT_BEGIN_NAMESPACE +extern Q_GUI_EXPORT int qt_defaultDpi(); +QT_END_NAMESPACE + +class tst_qdeclarativevaluetypes : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativevaluetypes() {} + +private slots: + void initTestCase(); + + void point(); + void pointf(); + void size(); + void sizef(); + void sizereadonly(); + void rect(); + void rectf(); + void vector2d(); + void vector3d(); + void vector4d(); + void quaternion(); + void matrix4x4(); + void font(); + void variant(); + + void bindingAssignment(); + void bindingRead(); + void staticAssignment(); + void scriptAccess(); + void autoBindingRemoval(); + void valueSources(); + void valueInterceptors(); + void bindingConflict(); + void deletedObject(); + void bindingVariantCopy(); + void scriptVariantCopy(); + void cppClasses(); + void enums(); + void conflictingBindings(); + void returnValues(); + void varAssignment(); + void bindingsSpliceCorrectly(); + +private: + QDeclarativeEngine engine; +}; + +void tst_qdeclarativevaluetypes::initTestCase() +{ + registerTypes(); +} + +inline QUrl TEST_FILE(const QString &filename) +{ + return QUrl::fromLocalFile(QLatin1String(SRCDIR) + QLatin1String("/data/") + filename); +} + +void tst_qdeclarativevaluetypes::point() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("point_read.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->property("p_x").toInt(), 10); + QCOMPARE(object->property("p_y").toInt(), 4); + QCOMPARE(object->property("copy"), QVariant(QPoint(10, 4))); + + delete object; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("point_write.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->point(), QPoint(11, 12)); + + delete object; + } +} + +void tst_qdeclarativevaluetypes::pointf() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("pointf_read.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(float(object->property("p_x").toDouble()), float(11.3)); + QCOMPARE(float(object->property("p_y").toDouble()), float(-10.9)); + QCOMPARE(object->property("copy"), QVariant(QPointF(11.3, -10.9))); + + delete object; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("pointf_write.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->pointf(), QPointF(6.8, 9.3)); + + delete object; + } +} + +void tst_qdeclarativevaluetypes::size() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("size_read.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->property("s_width").toInt(), 1912); + QCOMPARE(object->property("s_height").toInt(), 1913); + QCOMPARE(object->property("copy"), QVariant(QSize(1912, 1913))); + + delete object; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("size_write.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->size(), QSize(13, 88)); + + delete object; + } +} + +void tst_qdeclarativevaluetypes::sizef() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("sizef_read.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(float(object->property("s_width").toDouble()), float(0.1)); + QCOMPARE(float(object->property("s_height").toDouble()), float(100923.2)); + QCOMPARE(object->property("copy"), QVariant(QSizeF(0.1, 100923.2))); + + delete object; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("sizef_write.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->sizef(), QSizeF(44.3, 92.8)); + + delete object; + } +} + +void tst_qdeclarativevaluetypes::variant() +{ + QDeclarativeComponent component(&engine, TEST_FILE("variant_read.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(float(object->property("s_width").toDouble()), float(0.1)); + QCOMPARE(float(object->property("s_height").toDouble()), float(100923.2)); + QCOMPARE(object->property("copy"), QVariant(QSizeF(0.1, 100923.2))); + + delete object; +} + +void tst_qdeclarativevaluetypes::sizereadonly() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("sizereadonly_read.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->property("s_width").toInt(), 1912); + QCOMPARE(object->property("s_height").toInt(), 1913); + QCOMPARE(object->property("copy"), QVariant(QSize(1912, 1913))); + + delete object; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("sizereadonly_writeerror.qml")); + QVERIFY(component.isError()); + QCOMPARE(component.errors().at(0).description(), QLatin1String("Invalid property assignment: \"sizereadonly\" is a read-only property")); + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("sizereadonly_writeerror2.qml")); + QVERIFY(component.isError()); + QCOMPARE(component.errors().at(0).description(), QLatin1String("Invalid property assignment: \"sizereadonly\" is a read-only property")); + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("sizereadonly_writeerror3.qml")); + QVERIFY(component.isError()); + QCOMPARE(component.errors().at(0).description(), QLatin1String("Invalid property assignment: \"sizereadonly\" is a read-only property")); + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("sizereadonly_writeerror4.qml")); + + QObject *object = component.create(); + QVERIFY(object); + + QCOMPARE(object->property("sizereadonly").toSize(), QSize(1912, 1913)); + + delete object; + } +} + +void tst_qdeclarativevaluetypes::rect() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("rect_read.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->property("r_x").toInt(), 2); + QCOMPARE(object->property("r_y").toInt(), 3); + QCOMPARE(object->property("r_width").toInt(), 109); + QCOMPARE(object->property("r_height").toInt(), 102); + QCOMPARE(object->property("copy"), QVariant(QRect(2, 3, 109, 102))); + + delete object; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("rect_write.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->rect(), QRect(1234, 7, 56, 63)); + + delete object; + } +} + +void tst_qdeclarativevaluetypes::rectf() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("rectf_read.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(float(object->property("r_x").toDouble()), float(103.8)); + QCOMPARE(float(object->property("r_y").toDouble()), float(99.2)); + QCOMPARE(float(object->property("r_width").toDouble()), float(88.1)); + QCOMPARE(float(object->property("r_height").toDouble()), float(77.6)); + QCOMPARE(object->property("copy"), QVariant(QRectF(103.8, 99.2, 88.1, 77.6))); + + delete object; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("rectf_write.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->rectf(), QRectF(70.1, -113.2, 80924.8, 99.2)); + + delete object; + } +} + +void tst_qdeclarativevaluetypes::vector2d() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("vector2d_read.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE((float)object->property("v_x").toDouble(), (float)32.88); + QCOMPARE((float)object->property("v_y").toDouble(), (float)1.3); + QCOMPARE(object->property("copy"), QVariant(QVector2D(32.88, 1.3))); + + delete object; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("vector2d_write.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->vector2(), QVector2D(-0.3, -12.9)); + + delete object; + } +} + +void tst_qdeclarativevaluetypes::vector3d() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("vector3d_read.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE((float)object->property("v_x").toDouble(), (float)23.88); + QCOMPARE((float)object->property("v_y").toDouble(), (float)3.1); + QCOMPARE((float)object->property("v_z").toDouble(), (float)4.3); + QCOMPARE(object->property("copy"), QVariant(QVector3D(23.88, 3.1, 4.3))); + + delete object; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("vector3d_write.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->vector(), QVector3D(-0.3, -12.9, 907.4)); + + delete object; + } +} + +void tst_qdeclarativevaluetypes::vector4d() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("vector4d_read.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE((float)object->property("v_x").toDouble(), (float)54.2); + QCOMPARE((float)object->property("v_y").toDouble(), (float)23.88); + QCOMPARE((float)object->property("v_z").toDouble(), (float)3.1); + QCOMPARE((float)object->property("v_w").toDouble(), (float)4.3); + QCOMPARE(object->property("copy"), QVariant(QVector4D(54.2, 23.88, 3.1, 4.3))); + + delete object; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("vector4d_write.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->vector4(), QVector4D(-0.3, -12.9, 907.4, 88.5)); + + delete object; + } +} + +void tst_qdeclarativevaluetypes::quaternion() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("quaternion_read.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE((float)object->property("v_scalar").toDouble(), (float)4.3); + QCOMPARE((float)object->property("v_x").toDouble(), (float)54.2); + QCOMPARE((float)object->property("v_y").toDouble(), (float)23.88); + QCOMPARE((float)object->property("v_z").toDouble(), (float)3.1); + QCOMPARE(object->property("copy"), QVariant(QQuaternion(4.3, 54.2, 23.88, 3.1))); + + delete object; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("quaternion_write.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->quaternion(), QQuaternion(88.5, -0.3, -12.9, 907.4)); + + delete object; + } +} + +void tst_qdeclarativevaluetypes::matrix4x4() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("matrix4x4_read.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE((float)object->property("v_m11").toDouble(), (float)1); + QCOMPARE((float)object->property("v_m12").toDouble(), (float)2); + QCOMPARE((float)object->property("v_m13").toDouble(), (float)3); + QCOMPARE((float)object->property("v_m14").toDouble(), (float)4); + QCOMPARE((float)object->property("v_m21").toDouble(), (float)5); + QCOMPARE((float)object->property("v_m22").toDouble(), (float)6); + QCOMPARE((float)object->property("v_m23").toDouble(), (float)7); + QCOMPARE((float)object->property("v_m24").toDouble(), (float)8); + QCOMPARE((float)object->property("v_m31").toDouble(), (float)9); + QCOMPARE((float)object->property("v_m32").toDouble(), (float)10); + QCOMPARE((float)object->property("v_m33").toDouble(), (float)11); + QCOMPARE((float)object->property("v_m34").toDouble(), (float)12); + QCOMPARE((float)object->property("v_m41").toDouble(), (float)13); + QCOMPARE((float)object->property("v_m42").toDouble(), (float)14); + QCOMPARE((float)object->property("v_m43").toDouble(), (float)15); + QCOMPARE((float)object->property("v_m44").toDouble(), (float)16); + QCOMPARE(object->property("copy"), + QVariant(QMatrix4x4(1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16))); + + delete object; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("matrix4x4_write.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->matrix(), QMatrix4x4(11, 12, 13, 14, + 21, 22, 23, 24, + 31, 32, 33, 34, + 41, 42, 43, 44)); + + delete object; + } +} + +void tst_qdeclarativevaluetypes::font() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("font_read.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->property("f_family").toString(), object->font().family()); + QCOMPARE(object->property("f_bold").toBool(), object->font().bold()); + QCOMPARE(object->property("f_weight").toInt(), object->font().weight()); + QCOMPARE(object->property("f_italic").toBool(), object->font().italic()); + QCOMPARE(object->property("f_underline").toBool(), object->font().underline()); + QCOMPARE(object->property("f_overline").toBool(), object->font().overline()); + QCOMPARE(object->property("f_strikeout").toBool(), object->font().strikeOut()); + QCOMPARE(object->property("f_pointSize").toDouble(), object->font().pointSizeF()); + QCOMPARE(object->property("f_pixelSize").toInt(), int((object->font().pointSizeF() * qt_defaultDpi()) / qreal(72.))); + QCOMPARE(object->property("f_capitalization").toInt(), (int)object->font().capitalization()); + QCOMPARE(object->property("f_letterSpacing").toDouble(), object->font().letterSpacing()); + QCOMPARE(object->property("f_wordSpacing").toDouble(), object->font().wordSpacing()); + + QCOMPARE(object->property("copy"), QVariant(object->font())); + + delete object; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("font_write.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QFont font; + font.setFamily("Helvetica"); + font.setBold(false); + font.setWeight(QFont::Normal); + font.setItalic(false); + font.setUnderline(false); + font.setStrikeOut(false); + font.setPointSize(15); + font.setCapitalization(QFont::AllLowercase); + font.setLetterSpacing(QFont::AbsoluteSpacing, 9.7); + font.setWordSpacing(11.2); + + QFont f = object->font(); + QCOMPARE(f.family(), font.family()); + QCOMPARE(f.bold(), font.bold()); + QCOMPARE(f.weight(), font.weight()); + QCOMPARE(f.italic(), font.italic()); + QCOMPARE(f.underline(), font.underline()); + QCOMPARE(f.strikeOut(), font.strikeOut()); + QCOMPARE(f.pointSize(), font.pointSize()); + QCOMPARE(f.capitalization(), font.capitalization()); + QCOMPARE(f.letterSpacing(), font.letterSpacing()); + QCOMPARE(f.wordSpacing(), font.wordSpacing()); + + delete object; + } + + // Test pixelSize + { + QDeclarativeComponent component(&engine, TEST_FILE("font_write.2.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->font().pixelSize(), 10); + + delete object; + } + + // Test pixelSize and pointSize + { + QDeclarativeComponent component(&engine, TEST_FILE("font_write.3.qml")); + QTest::ignoreMessage(QtWarningMsg, "Both point size and pixel size set. Using pixel size. "); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->font().pixelSize(), 10); + + delete object; + } + { + QDeclarativeComponent component(&engine, TEST_FILE("font_write.4.qml")); + QTest::ignoreMessage(QtWarningMsg, "Both point size and pixel size set. Using pixel size. "); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->font().pixelSize(), 10); + + delete object; + } + { + QDeclarativeComponent component(&engine, TEST_FILE("font_write.5.qml")); + QObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + MyTypeObject *object1 = object->findChild("object1"); + QVERIFY(object1 != 0); + MyTypeObject *object2 = object->findChild("object2"); + QVERIFY(object2 != 0); + + QCOMPARE(object1->font().pixelSize(), 19); + QCOMPARE(object2->font().pointSize(), 14); + + delete object; + } +} + +// Test bindings can write to value types +void tst_qdeclarativevaluetypes::bindingAssignment() +{ + QDeclarativeComponent component(&engine, TEST_FILE("bindingAssignment.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->rect().x(), 10); + + object->setProperty("value", QVariant(92)); + + QCOMPARE(object->rect().x(), 92); + + delete object; +} + +// Test bindings can read from value types +void tst_qdeclarativevaluetypes::bindingRead() +{ + QDeclarativeComponent component(&engine, TEST_FILE("bindingRead.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->property("value").toInt(), 2); + + object->setRect(QRect(19, 3, 88, 2)); + + QCOMPARE(object->property("value").toInt(), 19); + + delete object; +} + +// Test static values can assign to value types +void tst_qdeclarativevaluetypes::staticAssignment() +{ + QDeclarativeComponent component(&engine, TEST_FILE("staticAssignment.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->rect().x(), 9); + + delete object; +} + +// Test scripts can read/write value types +void tst_qdeclarativevaluetypes::scriptAccess() +{ + QDeclarativeComponent component(&engine, TEST_FILE("scriptAccess.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->property("valuePre").toInt(), 2); + QCOMPARE(object->rect().x(), 19); + QCOMPARE(object->property("valuePost").toInt(), 19); + + delete object; +} + +// Test that assigning a constant from script removes any binding +void tst_qdeclarativevaluetypes::autoBindingRemoval() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("autoBindingRemoval.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->rect().x(), 10); + + object->setProperty("value", QVariant(13)); + + QCOMPARE(object->rect().x(), 13); + + object->emitRunScript(); + + QCOMPARE(object->rect().x(), 42); + + object->setProperty("value", QVariant(92)); + + QCOMPARE(object->rect().x(), 42); + + delete object; + } + + /* + { + QDeclarativeComponent component(&engine, TEST_FILE("autoBindingRemoval.2.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->rect().x(), 10); + + object->setProperty("value", QVariant(13)); + + QCOMPARE(object->rect().x(), 13); + + object->emitRunScript(); + + QCOMPARE(object->rect(), QRect(10, 10, 10, 10)); + + object->setProperty("value", QVariant(92)); + + QCOMPARE(object->rect(), QRect(10, 10, 10, 10)); + + delete object; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("autoBindingRemoval.3.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + object->setProperty("value", QVariant(QRect(9, 22, 33, 44))); + + QCOMPARE(object->rect(), QRect(9, 22, 33, 44)); + + object->emitRunScript(); + + QCOMPARE(object->rect(), QRect(44, 22, 33, 44)); + + object->setProperty("value", QVariant(QRect(19, 3, 4, 8))); + + QCOMPARE(object->rect(), QRect(44, 22, 33, 44)); + + delete object; + } +*/ +} + +// Test that property value sources assign to value types +void tst_qdeclarativevaluetypes::valueSources() +{ + QDeclarativeComponent component(&engine, TEST_FILE("valueSources.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->rect().x(), 3345); + + delete object; +} + +static void checkNoErrors(QDeclarativeComponent& component) +{ + QList errors = component.errors(); + if (errors.isEmpty()) + return; + for (int ii = 0; ii < errors.count(); ++ii) { + const QDeclarativeError &error = errors.at(ii); + qWarning("%d:%d:%s",error.line(),error.column(),error.description().toUtf8().constData()); + } +} + +// Test that property value interceptors can be applied to value types +void tst_qdeclarativevaluetypes::valueInterceptors() +{ + QDeclarativeComponent component(&engine, TEST_FILE("valueInterceptors.qml")); + MyTypeObject *object = qobject_cast(component.create()); + checkNoErrors(component); + QVERIFY(object != 0); + + QCOMPARE(object->rect().x(), 13); + + object->setProperty("value", 99); + + QCOMPARE(object->rect().x(), 112); + + delete object; +} + +// Test that you can't assign a binding to the "root" value type, and a sub-property +void tst_qdeclarativevaluetypes::bindingConflict() +{ + QDeclarativeComponent component(&engine, TEST_FILE("bindingConflict.qml")); + QCOMPARE(component.isError(), true); +} + +#define CPP_TEST(type, v) \ +{ \ + type *t = new type; \ + QVariant value(v); \ + t->setValue(value); \ + QCOMPARE(t->value(), value); \ + delete t; \ +} + +// Test that accessing a reference to a valuetype after the owning object is deleted +// doesn't crash +void tst_qdeclarativevaluetypes::deletedObject() +{ + QDeclarativeComponent component(&engine, TEST_FILE("deletedObject.qml")); + QTest::ignoreMessage(QtDebugMsg, "Test: 2"); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QObject *dObject = qvariant_cast(object->property("object")); + QVERIFY(dObject != 0); + delete dObject; + + QTest::ignoreMessage(QtDebugMsg, "Test: undefined"); + object->emitRunScript(); + + delete object; +} + +// Test that value types can be assigned to another value type property in a binding +void tst_qdeclarativevaluetypes::bindingVariantCopy() +{ + QDeclarativeComponent component(&engine, TEST_FILE("bindingVariantCopy.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->rect(), QRect(19, 33, 5, 99)); + + delete object; +} + +// Test that value types can be assigned to another value type property in script +void tst_qdeclarativevaluetypes::scriptVariantCopy() +{ + QDeclarativeComponent component(&engine, TEST_FILE("scriptVariantCopy.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + + QCOMPARE(object->rect(), QRect(2, 3, 109, 102)); + + object->emitRunScript(); + + QCOMPARE(object->rect(), QRect(19, 33, 5, 99)); + + delete object; +} + + +// Test that the value type classes can be used manually +void tst_qdeclarativevaluetypes::cppClasses() +{ + CPP_TEST(QDeclarativePointValueType, QPoint(19, 33)); + CPP_TEST(QDeclarativePointFValueType, QPointF(33.6, -23)); + CPP_TEST(QDeclarativeSizeValueType, QSize(-100, 18)); + CPP_TEST(QDeclarativeSizeFValueType, QSizeF(-100.7, 18.2)); + CPP_TEST(QDeclarativeRectValueType, QRect(13, 39, 10928, 88)); + CPP_TEST(QDeclarativeRectFValueType, QRectF(88.2, -90.1, 103.2, 118)); + CPP_TEST(QDeclarativeVector2DValueType, QVector2D(19.7, 1002)); + CPP_TEST(QDeclarativeVector3DValueType, QVector3D(18.2, 19.7, 1002)); + CPP_TEST(QDeclarativeVector4DValueType, QVector4D(18.2, 19.7, 1002, 54)); + CPP_TEST(QDeclarativeQuaternionValueType, QQuaternion(18.2, 19.7, 1002, 54)); + CPP_TEST(QDeclarativeMatrix4x4ValueType, + QMatrix4x4(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)); + CPP_TEST(QDeclarativeFontValueType, QFont("Helvetica")); + +} + +void tst_qdeclarativevaluetypes::enums() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("enums.1.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QVERIFY(object->font().capitalization() == QFont::AllUppercase); + delete object; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("enums.2.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QVERIFY(object->font().capitalization() == QFont::AllUppercase); + delete object; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("enums.3.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QVERIFY(object->font().capitalization() == QFont::AllUppercase); + delete object; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("enums.4.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QVERIFY(object->font().capitalization() == QFont::AllUppercase); + delete object; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("enums.5.qml")); + MyTypeObject *object = qobject_cast(component.create()); + QVERIFY(object != 0); + QVERIFY(object->font().capitalization() == QFont::AllUppercase); + delete object; + } +} + +// Tests switching between "conflicting" bindings (eg. a binding on the core +// property, to a binding on the value-type sub-property) +void tst_qdeclarativevaluetypes::conflictingBindings() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("conflicting.1.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(qvariant_cast(object->property("font")).pixelSize(), 12); + + QMetaObject::invokeMethod(object, "toggle"); + + QCOMPARE(qvariant_cast(object->property("font")).pixelSize(), 6); + + QMetaObject::invokeMethod(object, "toggle"); + + QCOMPARE(qvariant_cast(object->property("font")).pixelSize(), 12); + + delete object; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("conflicting.2.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(qvariant_cast(object->property("font")).pixelSize(), 6); + + QMetaObject::invokeMethod(object, "toggle"); + + QCOMPARE(qvariant_cast(object->property("font")).pixelSize(), 12); + + QMetaObject::invokeMethod(object, "toggle"); + + QCOMPARE(qvariant_cast(object->property("font")).pixelSize(), 6); + + delete object; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("conflicting.3.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(qvariant_cast(object->property("font")).pixelSize(), 12); + + QMetaObject::invokeMethod(object, "toggle"); + + QCOMPARE(qvariant_cast(object->property("font")).pixelSize(), 24); + + QMetaObject::invokeMethod(object, "toggle"); + + QCOMPARE(qvariant_cast(object->property("font")).pixelSize(), 12); + + delete object; + } +} + +void tst_qdeclarativevaluetypes::returnValues() +{ + QDeclarativeComponent component(&engine, TEST_FILE("returnValues.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("test1").toBool(), true); + QCOMPARE(object->property("test2").toBool(), true); + QCOMPARE(object->property("size").toSize(), QSize(13, 14)); + + delete object; +} + +void tst_qdeclarativevaluetypes::varAssignment() +{ + QDeclarativeComponent component(&engine, TEST_FILE("varAssignment.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("x").toInt(), 1); + QCOMPARE(object->property("y").toInt(), 2); + QCOMPARE(object->property("z").toInt(), 3); + + delete object; +} + +// Test bindings splice together correctly +void tst_qdeclarativevaluetypes::bindingsSpliceCorrectly() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("bindingsSpliceCorrectly.1.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("test").toBool(), true); + + delete object; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("bindingsSpliceCorrectly.2.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("test").toBool(), true); + + delete object; + } + + + { + QDeclarativeComponent component(&engine, TEST_FILE("bindingsSpliceCorrectly.3.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("test").toBool(), true); + + delete object; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("bindingsSpliceCorrectly.4.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("test").toBool(), true); + + delete object; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("bindingsSpliceCorrectly.5.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("test").toBool(), true); + + delete object; + } +} + +QTEST_MAIN(tst_qdeclarativevaluetypes) + +#include "tst_qdeclarativevaluetypes.moc" diff --git a/tests/auto/declarative/qdeclarativeview/data/error1.qml b/tests/auto/declarative/qdeclarativeview/data/error1.qml new file mode 100644 index 00000000..4887ff90 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeview/data/error1.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +Rectangle { + nonExistentProperty: 5 +} diff --git a/tests/auto/declarative/qdeclarativeview/data/resizemodedeclarativeitem.qml b/tests/auto/declarative/qdeclarativeview/data/resizemodedeclarativeitem.qml new file mode 100644 index 00000000..e5501a10 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeview/data/resizemodedeclarativeitem.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 +Item { + width: 200 + height: 200 +} diff --git a/tests/auto/declarative/qdeclarativeview/data/resizemodegraphicswidget.qml b/tests/auto/declarative/qdeclarativeview/data/resizemodegraphicswidget.qml new file mode 100644 index 00000000..f2709088 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeview/data/resizemodegraphicswidget.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 +QGraphicsWidget { + width: 200 + height: 200 +} diff --git a/tests/auto/declarative/qdeclarativeview/qdeclarativeview.pro b/tests/auto/declarative/qdeclarativeview/qdeclarativeview.pro new file mode 100644 index 00000000..fc4790d2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeview/qdeclarativeview.pro @@ -0,0 +1,13 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative gui +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativeview.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} diff --git a/tests/auto/declarative/qdeclarativeview/tst_qdeclarativeview.cpp b/tests/auto/declarative/qdeclarativeview/tst_qdeclarativeview.cpp new file mode 100644 index 00000000..1a2fba24 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeview/tst_qdeclarativeview.cpp @@ -0,0 +1,321 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include "../../../shared/util.h" + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_QDeclarativeView : public QObject + +{ + Q_OBJECT +public: + tst_QDeclarativeView(); + +private slots: + void scene(); + void resizemodedeclarativeitem(); + void resizemodegraphicswidget(); + void errors(); + +private: + template + T *findItem(QGraphicsObject *parent, const QString &objectName); +}; + + +tst_QDeclarativeView::tst_QDeclarativeView() +{ +} + +void tst_QDeclarativeView::scene() +{ + // QTBUG-14771 + QGraphicsScene scene; + scene.setItemIndexMethod(QGraphicsScene::NoIndex); + scene.setStickyFocus(true); + + QDeclarativeView *view = new QDeclarativeView(); + QVERIFY(view); + QVERIFY(view->scene()); + view->setScene(&scene); + QCOMPARE(view->scene(), &scene); + + view->setSource(QUrl::fromLocalFile(SRCDIR "/data/resizemodedeclarativeitem.qml")); + QDeclarativeItem* declarativeItem = qobject_cast(view->rootObject()); + QVERIFY(declarativeItem); + QVERIFY(scene.items().count() > 0); + QCOMPARE(scene.items().at(0), declarativeItem); +} + +void tst_QDeclarativeView::resizemodedeclarativeitem() +{ + QWidget window; + QDeclarativeView *canvas = new QDeclarativeView(&window); + QVERIFY(canvas); + QSignalSpy sceneResizedSpy(canvas, SIGNAL(sceneResized(QSize))); + canvas->setResizeMode(QDeclarativeView::SizeRootObjectToView); + QCOMPARE(QSize(0,0), canvas->initialSize()); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/resizemodedeclarativeitem.qml")); + QDeclarativeItem* declarativeItem = qobject_cast(canvas->rootObject()); + QVERIFY(declarativeItem); + window.show(); + + // initial size from root object + QCOMPARE(declarativeItem->width(), 200.0); + QCOMPARE(declarativeItem->height(), 200.0); + QCOMPARE(canvas->size(), QSize(200, 200)); + QCOMPARE(canvas->size(), canvas->sizeHint()); + QCOMPARE(canvas->size(), canvas->initialSize()); + QCOMPARE(sceneResizedSpy.count(), 1); + + // size update from view + canvas->resize(QSize(80,100)); + QCOMPARE(declarativeItem->width(), 80.0); + QCOMPARE(declarativeItem->height(), 100.0); + QCOMPARE(canvas->size(), QSize(80, 100)); + QCOMPARE(canvas->size(), canvas->sizeHint()); + QCOMPARE(sceneResizedSpy.count(), 2); + + canvas->setResizeMode(QDeclarativeView::SizeViewToRootObject); + + // size update from view disabled + canvas->resize(QSize(60,80)); + QCOMPARE(declarativeItem->width(), 80.0); + QCOMPARE(declarativeItem->height(), 100.0); + QCOMPARE(canvas->size(), QSize(60, 80)); + QCOMPARE(sceneResizedSpy.count(), 3); + + // size update from root object + declarativeItem->setWidth(250); + declarativeItem->setHeight(350); + QCOMPARE(declarativeItem->width(), 250.0); + QCOMPARE(declarativeItem->height(), 350.0); + QTRY_COMPARE(canvas->size(), QSize(250, 350)); + QCOMPARE(canvas->size(), QSize(250, 350)); + QCOMPARE(canvas->size(), canvas->sizeHint()); + QCOMPARE(sceneResizedSpy.count(), 4); + + // reset canvas + window.hide(); + delete canvas; + canvas = new QDeclarativeView(&window); + QVERIFY(canvas); + QSignalSpy sceneResizedSpy2(canvas, SIGNAL(sceneResized(QSize))); + canvas->setResizeMode(QDeclarativeView::SizeViewToRootObject); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/resizemodedeclarativeitem.qml")); + declarativeItem = qobject_cast(canvas->rootObject()); + QVERIFY(declarativeItem); + window.show(); + + // initial size for root object + QCOMPARE(declarativeItem->width(), 200.0); + QCOMPARE(declarativeItem->height(), 200.0); + QCOMPARE(canvas->size(), canvas->sizeHint()); + QCOMPARE(canvas->size(), canvas->initialSize()); + QCOMPARE(sceneResizedSpy2.count(), 1); + + // size update from root object + declarativeItem->setWidth(80); + declarativeItem->setHeight(100); + QCOMPARE(declarativeItem->width(), 80.0); + QCOMPARE(declarativeItem->height(), 100.0); + QTRY_COMPARE(canvas->size(), QSize(80, 100)); + QCOMPARE(canvas->size(), QSize(80, 100)); + QCOMPARE(canvas->size(), canvas->sizeHint()); + QCOMPARE(sceneResizedSpy2.count(), 2); + + // size update from root object disabled + canvas->setResizeMode(QDeclarativeView::SizeRootObjectToView); + declarativeItem->setWidth(60); + declarativeItem->setHeight(80); + QCOMPARE(canvas->width(), 80); + QCOMPARE(canvas->height(), 100); + QCOMPARE(QSize(declarativeItem->width(), declarativeItem->height()), canvas->sizeHint()); + QCOMPARE(sceneResizedSpy2.count(), 2); + + // size update from view + canvas->resize(QSize(200,300)); + QCOMPARE(declarativeItem->width(), 200.0); + QCOMPARE(declarativeItem->height(), 300.0); + QCOMPARE(canvas->size(), QSize(200, 300)); + QCOMPARE(canvas->size(), canvas->sizeHint()); + QCOMPARE(sceneResizedSpy2.count(), 3); + + delete canvas; +} + +void tst_QDeclarativeView::resizemodegraphicswidget() +{ + QWidget window; + QDeclarativeView *canvas = new QDeclarativeView(&window); + QVERIFY(canvas); + QSignalSpy sceneResizedSpy(canvas, SIGNAL(sceneResized(QSize))); + canvas->setResizeMode(QDeclarativeView::SizeRootObjectToView); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/resizemodegraphicswidget.qml")); + QGraphicsWidget* graphicsWidget = qobject_cast(canvas->rootObject()); + QVERIFY(graphicsWidget); + window.show(); + + // initial size from root object + QCOMPARE(graphicsWidget->size(), QSizeF(200.0, 200.0)); + QCOMPARE(canvas->size(), QSize(200, 200)); + QCOMPARE(canvas->size(), QSize(200, 200)); + QCOMPARE(canvas->size(), canvas->sizeHint()); + QCOMPARE(canvas->size(), canvas->initialSize()); + QCOMPARE(sceneResizedSpy.count(), 1); + + // size update from view + canvas->resize(QSize(80,100)); + QCOMPARE(graphicsWidget->size(), QSizeF(80.0,100.0)); + QCOMPARE(canvas->size(), QSize(80,100)); + QCOMPARE(canvas->size(), canvas->sizeHint()); + QCOMPARE(sceneResizedSpy.count(), 2); + + // size update from view disabled + canvas->setResizeMode(QDeclarativeView::SizeViewToRootObject); + canvas->resize(QSize(60,80)); + QCOMPARE(graphicsWidget->size(), QSizeF(80.0,100.0)); + QCOMPARE(canvas->size(), QSize(60, 80)); + QCOMPARE(sceneResizedSpy.count(), 3); + + // size update from root object + graphicsWidget->resize(QSizeF(250.0, 350.0)); + QCOMPARE(graphicsWidget->size(), QSizeF(250.0,350.0)); + QCOMPARE(canvas->size(), QSize(250, 350)); + QCOMPARE(canvas->size(), canvas->sizeHint()); + QCOMPARE(sceneResizedSpy.count(), 4); + + // reset canvas + window.hide(); + delete canvas; + canvas = new QDeclarativeView(&window); + QVERIFY(canvas); + QSignalSpy sceneResizedSpy2(canvas, SIGNAL(sceneResized(QSize))); + canvas->setResizeMode(QDeclarativeView::SizeViewToRootObject); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/resizemodegraphicswidget.qml")); + graphicsWidget = qobject_cast(canvas->rootObject()); + QVERIFY(graphicsWidget); + window.show(); + + // initial size from root object + QCOMPARE(graphicsWidget->size(), QSizeF(200.0, 200.0)); + QCOMPARE(canvas->size(), QSize(200, 200)); + QCOMPARE(canvas->size(), canvas->sizeHint()); + QCOMPARE(canvas->size(), canvas->initialSize()); + QCOMPARE(sceneResizedSpy2.count(), 1); + + // size update from root object + graphicsWidget->resize(QSizeF(80, 100)); + QCOMPARE(graphicsWidget->size(), QSizeF(80.0, 100.0)); + QCOMPARE(canvas->size(), QSize(80, 100)); + QCOMPARE(canvas->size(), canvas->sizeHint()); + QCOMPARE(sceneResizedSpy2.count(), 2); + + // size update from root object disabled + canvas->setResizeMode(QDeclarativeView::SizeRootObjectToView); + graphicsWidget->resize(QSizeF(60,80)); + QCOMPARE(canvas->size(), QSize(80,100)); + QCOMPARE(QSize(graphicsWidget->size().width(), graphicsWidget->size().height()), canvas->sizeHint()); + QCOMPARE(sceneResizedSpy2.count(), 2); + + // size update from view + canvas->resize(QSize(200,300)); + QCOMPARE(graphicsWidget->size(), QSizeF(200.0, 300.0)); + QCOMPARE(canvas->size(), QSize(200, 300)); + QCOMPARE(canvas->size(), canvas->sizeHint()); + QCOMPARE(sceneResizedSpy2.count(), 3); + + window.show(); + delete canvas; +} + +static void silentErrorsMsgHandler(QtMsgType, const char *) +{ +} + +void tst_QDeclarativeView::errors() +{ + QDeclarativeView *canvas = new QDeclarativeView; + QVERIFY(canvas); + QtMsgHandler old = qInstallMsgHandler(silentErrorsMsgHandler); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/error1.qml")); + qInstallMsgHandler(old); + QVERIFY(canvas->status() == QDeclarativeView::Error); + QVERIFY(canvas->errors().count() == 1); + delete canvas; +} + +template +T *tst_QDeclarativeView::findItem(QGraphicsObject *parent, const QString &objectName) +{ + if (!parent) + return 0; + + const QMetaObject &mo = T::staticMetaObject; + //qDebug() << parent->QGraphicsObject::children().count() << "children"; + for (int i = 0; i < parent->childItems().count(); ++i) { + QDeclarativeItem *item = qobject_cast(parent->childItems().at(i)); + if(!item) + continue; + //qDebug() << "try" << item; + if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName)) + return static_cast(item); + item = findItem(item, objectName); + if (item) + return static_cast(item); + } + + return 0; +} + +QTEST_MAIN(tst_QDeclarativeView) + +#include "tst_qdeclarativeview.moc" diff --git a/tests/auto/declarative/qdeclarativeviewer/data/orientation.qml b/tests/auto/declarative/qdeclarativeviewer/data/orientation.qml new file mode 100644 index 00000000..fb343120 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeviewer/data/orientation.qml @@ -0,0 +1,19 @@ +import QtQuick 1.0 +Rectangle { + color: "black" + width: (runtime.orientation == Orientation.Landscape || runtime.orientation == Orientation.LandscapeInverted) ? 300 : 200 + height: (runtime.orientation == Orientation.Landscape || runtime.orientation == Orientation.LandscapeInverted) ? 200 : 300 + Text { + text: { + if (runtime.orientation == Orientation.Portrait) + return "Portrait" + if (runtime.orientation == Orientation.PortraitInverted) + return "PortraitInverted" + if (runtime.orientation == Orientation.Landscape) + return "Landscape" + if (runtime.orientation == Orientation.LandscapeInverted) + return "LandscapeInverted" + } + color: "white" + } +} diff --git a/tests/auto/declarative/qdeclarativeviewer/qdeclarativeviewer.pro b/tests/auto/declarative/qdeclarativeviewer/qdeclarativeviewer.pro new file mode 100644 index 00000000..8d4b4105 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeviewer/qdeclarativeviewer.pro @@ -0,0 +1,19 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative gui +macx:CONFIG -= app_bundle + +include(../../../../tools/qml/qml.pri) + +SOURCES += tst_qdeclarativeviewer.cpp + +include(../symbianlibs.pri) + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test diff --git a/tests/auto/declarative/qdeclarativeviewer/tst_qdeclarativeviewer.cpp b/tests/auto/declarative/qdeclarativeviewer/tst_qdeclarativeviewer.cpp new file mode 100644 index 00000000..6a38ac8d --- /dev/null +++ b/tests/auto/declarative/qdeclarativeviewer/tst_qdeclarativeviewer.cpp @@ -0,0 +1,373 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include "../../../shared/util.h" +#include "qmlruntime.h" +#include "deviceorientation.h" +#include "../../../shared/util.h" + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +#if defined(Q_OS_MAC) || defined(Q_WS_MAEMO_5) || defined(Q_WS_S60) +# define MENUBAR_HEIGHT(mw) 0 +#else +# define MENUBAR_HEIGHT(mw) (mw->menuBar()->height()) +#endif + +class tst_QDeclarativeViewer : public QObject + +{ + Q_OBJECT +public: + tst_QDeclarativeViewer(); + +private slots: + void runtimeContextProperty(); + void loading(); + void fileBrowser(); + void resizing(); + void paths(); + void slowMode(); + +private: + QDeclarativeEngine engine; +}; + +tst_QDeclarativeViewer::tst_QDeclarativeViewer() +{ +} + +#define TEST_INITIAL_SIZES(viewer) { \ + QDeclarativeItem* rootItem = qobject_cast(viewer->view()->rootObject()); \ + QVERIFY(rootItem); \ +\ + QCOMPARE(rootItem->width(), 200.0); \ + QCOMPARE(rootItem->height(), 300.0); \ + QTRY_COMPARE(viewer->view()->size(), QSize(200, 300)); \ + QCOMPARE(viewer->view()->sceneRect().size(), QSizeF(200, 300)); \ + QCOMPARE(viewer->size(), QSize(200, 300 + MENUBAR_HEIGHT(viewer))); \ + QCOMPARE(viewer->size(), viewer->sizeHint()); \ +} + +void tst_QDeclarativeViewer::runtimeContextProperty() +{ + QDeclarativeViewer *viewer = new QDeclarativeViewer(); + QVERIFY(viewer); + viewer->open(SRCDIR "/data/orientation.qml"); + QVERIFY(viewer->view()); + QVERIFY(viewer->menuBar()); + QDeclarativeItem* rootItem = qobject_cast(viewer->view()->rootObject()); + QVERIFY(rootItem); + QObject *runtimeObject = qvariant_cast(viewer->view()->engine()->rootContext()->contextProperty("runtime")); + QVERIFY(runtimeObject); + + // test isActiveWindow property + QVERIFY(!runtimeObject->property("isActiveWindow").toBool()); + + viewer->show(); + QApplication::setActiveWindow(viewer); + QTest::qWaitForWindowShown(viewer); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(viewer)); + + QVERIFY(runtimeObject->property("isActiveWindow").toBool()); + + TEST_INITIAL_SIZES(viewer); + + // test orientation property + QCOMPARE(runtimeObject->property("orientation").toInt(), int(DeviceOrientation::Portrait)); + + viewer->rotateOrientation(); + qApp->processEvents(); + + QCOMPARE(runtimeObject->property("orientation").toInt(), int(DeviceOrientation::Landscape)); + QCOMPARE(rootItem->width(), 300.0); + + QCOMPARE(rootItem->width(), 300.0); + QCOMPARE(rootItem->height(), 200.0); + QTRY_COMPARE(viewer->view()->size(), QSize(300, 200)); + QCOMPARE(viewer->view()->sceneRect().size(), QSizeF(300, 200)); + QCOMPARE(viewer->size(), QSize(300, 200 + MENUBAR_HEIGHT(viewer))); + QCOMPARE(viewer->size(), viewer->sizeHint()); + + viewer->rotateOrientation(); + qApp->processEvents(); + + QCOMPARE(runtimeObject->property("orientation").toInt(), int(DeviceOrientation::PortraitInverted)); + + QCOMPARE(rootItem->width(), 200.0); + QCOMPARE(rootItem->height(), 300.0); + QTRY_COMPARE(viewer->view()->size(), QSize(200, 300)); + QCOMPARE(viewer->view()->sceneRect().size(), QSizeF(200, 300)); + QCOMPARE(viewer->size(), QSize(200, 300 + MENUBAR_HEIGHT(viewer))); + QCOMPARE(viewer->size(), viewer->sizeHint()); + + viewer->rotateOrientation(); + qApp->processEvents(); + + QCOMPARE(runtimeObject->property("orientation").toInt(), int(DeviceOrientation::LandscapeInverted)); + + viewer->rotateOrientation(); + qApp->processEvents(); + + QCOMPARE(runtimeObject->property("orientation").toInt(), int(DeviceOrientation::Portrait)); + + viewer->hide(); + QVERIFY(!runtimeObject->property("isActiveWindow").toBool()); + + delete viewer; +} + +void tst_QDeclarativeViewer::loading() +{ + QDeclarativeViewer *viewer = new QDeclarativeViewer(); + QVERIFY(viewer); + viewer->setSizeToView(true); + viewer->open(SRCDIR "/data/orientation.qml"); + QVERIFY(viewer->view()); + QVERIFY(viewer->menuBar()); + QDeclarativeItem* rootItem = qobject_cast(viewer->view()->rootObject()); + QVERIFY(rootItem); + viewer->show(); + + QApplication::setActiveWindow(viewer); + QTest::qWaitForWindowShown(viewer); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(viewer)); + + TEST_INITIAL_SIZES(viewer); + + viewer->resize(QSize(250, 350)); + qApp->processEvents(); + + // window resized + QTRY_COMPARE(rootItem->width(), 250.0); + QTRY_COMPARE(rootItem->height(), 350.0 - MENUBAR_HEIGHT(viewer)); + QCOMPARE(viewer->view()->size(), QSize(250, 350 - MENUBAR_HEIGHT(viewer))); + QCOMPARE(viewer->view()->initialSize(), QSize(200, 300)); + QCOMPARE(viewer->view()->sceneRect().size(), QSizeF(250, 350 - MENUBAR_HEIGHT(viewer))); + QCOMPARE(viewer->size(), QSize(250, 350)); + QCOMPARE(viewer->size(), viewer->sizeHint()); + + QSignalSpy statusSpy(viewer->view(), SIGNAL(statusChanged(QDeclarativeView::Status))); + viewer->reload(); + QTRY_VERIFY(statusSpy.count() == 1); + rootItem = qobject_cast(viewer->view()->rootObject()); + QVERIFY(rootItem); + + // reload cause the window to return back to initial size + QTRY_COMPARE(rootItem->width(), 200.0); + QTRY_COMPARE(rootItem->height(), 300.0); + QCOMPARE(viewer->view()->size(), QSize(200, 300)); + QCOMPARE(viewer->view()->initialSize(), QSize(200, 300)); + QCOMPARE(viewer->view()->sceneRect().size(), QSizeF(200, 300)); + QCOMPARE(viewer->size(), QSize(200, 300 + MENUBAR_HEIGHT(viewer))); + QCOMPARE(viewer->size(), viewer->sizeHint()); + + viewer->resize(QSize(250, 350)); + qApp->processEvents(); + + // window resized again + QTRY_COMPARE(rootItem->width(), 250.0); + QTRY_COMPARE(rootItem->height(), 350.0 - MENUBAR_HEIGHT(viewer)); + QCOMPARE(viewer->view()->size(), QSize(250, 350 - MENUBAR_HEIGHT(viewer))); + QCOMPARE(viewer->view()->initialSize(), QSize(200, 300)); + QCOMPARE(viewer->view()->sceneRect().size(), QSizeF(250, 350 - MENUBAR_HEIGHT(viewer))); + QCOMPARE(viewer->size(), QSize(250, 350)); + QCOMPARE(viewer->size(), viewer->sizeHint()); + + viewer->open(SRCDIR "/data/orientation.qml"); + rootItem = qobject_cast(viewer->view()->rootObject()); + QVERIFY(rootItem); + + // open also causes the window to return back to initial size + QTRY_COMPARE(rootItem->width(), 200.0); + QTRY_COMPARE(rootItem->height(), 300.0); + QCOMPARE(viewer->view()->size(), QSize(200, 300)); + QCOMPARE(viewer->view()->initialSize(), QSize(200, 300)); + QCOMPARE(viewer->view()->sceneRect().size(), QSizeF(200, 300)); + QCOMPARE(viewer->size(), QSize(200, 300 + MENUBAR_HEIGHT(viewer))); + QCOMPARE(viewer->size(), viewer->sizeHint()); + + delete viewer; +} + +static int numberOfWarnings = 0; +static void checkWarnings(QtMsgType, const char *) +{ + numberOfWarnings++; +} + +void tst_QDeclarativeViewer::fileBrowser() +{ + QtMsgHandler previousMsgHandler = qInstallMsgHandler(checkWarnings); + QDeclarativeViewer *viewer = new QDeclarativeViewer(); + QVERIFY(viewer); + viewer->setUseNativeFileBrowser(false); + viewer->openFile(); + viewer->show(); + QCoreApplication::processEvents(); + qInstallMsgHandler(previousMsgHandler); + + // QTBUG-15720 + QVERIFY(numberOfWarnings == 0); + + QApplication::setActiveWindow(viewer); + QTest::qWaitForWindowShown(viewer); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(viewer)); + + // Browser.qml successfully loaded + QDeclarativeItem* browserItem = qobject_cast(viewer->view()->rootObject()); + QVERIFY(viewer->view()); + QVERIFY(viewer->menuBar()); + QVERIFY(browserItem); + + // load something + viewer->open(SRCDIR "/data/orientation.qml"); + QVERIFY(viewer->view()); + QVERIFY(viewer->menuBar()); + QDeclarativeItem* rootItem = qobject_cast(viewer->view()->rootObject()); + QVERIFY(rootItem); + QVERIFY(browserItem != rootItem); + + // go back to Browser.qml + viewer->openFile(); + browserItem = qobject_cast(viewer->view()->rootObject()); + QVERIFY(viewer->view()); + QVERIFY(viewer->menuBar()); + QVERIFY(browserItem); + + delete viewer; +} + +void tst_QDeclarativeViewer::resizing() +{ + QDeclarativeViewer *viewer = new QDeclarativeViewer(); + QVERIFY(viewer); + viewer->open(SRCDIR "/data/orientation.qml"); + QVERIFY(viewer->view()); + QVERIFY(viewer->menuBar()); + QDeclarativeItem* rootItem = qobject_cast(viewer->view()->rootObject()); + QVERIFY(rootItem); + viewer->show(); + + QApplication::setActiveWindow(viewer); + QTest::qWaitForWindowShown(viewer); + QTRY_COMPARE(QApplication::activeWindow(), static_cast(viewer)); + + TEST_INITIAL_SIZES(viewer); + + viewer->setSizeToView(false); + + // size view to root object + rootItem->setWidth(150); + rootItem->setHeight(200); + qApp->processEvents(); + + QCOMPARE(rootItem->width(), 150.0); + QCOMPARE(rootItem->height(), 200.0); + QTRY_COMPARE(viewer->view()->size(), QSize(150, 200)); + QCOMPARE(viewer->view()->initialSize(), QSize(200, 300)); + QCOMPARE(viewer->view()->sceneRect().size(), QSizeF(150, 200)); + QCOMPARE(viewer->size(), QSize(150, 200 + MENUBAR_HEIGHT(viewer))); + + // do not size root object to view + viewer->resize(QSize(180,250)); + QCOMPARE(rootItem->width(), 150.0); + QCOMPARE(rootItem->height(), 200.0); + + viewer->setSizeToView(true); + + // size root object to view + viewer->resize(QSize(250,350)); + qApp->processEvents(); + + QTRY_COMPARE(rootItem->width(), 250.0); + QTRY_COMPARE(rootItem->height(), 350.0 - MENUBAR_HEIGHT(viewer)); + QTRY_COMPARE(viewer->view()->size(), QSize(250, 350 - MENUBAR_HEIGHT(viewer))); + QCOMPARE(viewer->view()->initialSize(), QSize(200, 300)); + QCOMPARE(viewer->view()->sceneRect().size(), QSizeF(250, 350 - MENUBAR_HEIGHT(viewer))); + QCOMPARE(viewer->size(), QSize(250, 350)); + + // do not size view to root object + rootItem->setWidth(150); + rootItem->setHeight(200); + QTRY_COMPARE(viewer->size(), QSize(250, 350)); + + delete viewer; +} + +void tst_QDeclarativeViewer::paths() +{ + QDeclarativeViewer *viewer = new QDeclarativeViewer(); + QVERIFY(viewer); + + viewer->addLibraryPath("miscImportPath"); + viewer->view()->engine()->importPathList().contains("miscImportPath"); + + viewer->addPluginPath("miscPluginPath"); + viewer->view()->engine()->pluginPathList().contains("miscPluginPath"); + + delete viewer; +} + +void tst_QDeclarativeViewer::slowMode() +{ + QDeclarativeViewer *viewer = new QDeclarativeViewer(); + QVERIFY(viewer); + + viewer->setSlowMode(true); + viewer->setSlowMode(false); + + delete viewer; +} + +QTEST_MAIN(tst_QDeclarativeViewer) + +#include "tst_qdeclarativeviewer.moc" diff --git a/tests/auto/declarative/qdeclarativevisualdatamodel/data/datalist.qml b/tests/auto/declarative/qdeclarativevisualdatamodel/data/datalist.qml new file mode 100644 index 00000000..ebf1eea6 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevisualdatamodel/data/datalist.qml @@ -0,0 +1,19 @@ +import QtQuick 1.0 + +ListView { + width: 100 + height: 100 + anchors.fill: parent + model: VisualDataModel { + id: visualModel + objectName: "visualModel" + model: myModel + delegate: Component { + Rectangle { + height: 25 + width: 100 + Text { objectName: "display"; text: display } + } + } + } +} diff --git a/tests/auto/declarative/qdeclarativevisualdatamodel/data/modelproperties.qml b/tests/auto/declarative/qdeclarativevisualdatamodel/data/modelproperties.qml new file mode 100644 index 00000000..8cd57636 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevisualdatamodel/data/modelproperties.qml @@ -0,0 +1,17 @@ +import QtQuick 1.0 + +ListView { + model: myModel + delegate: Item { + objectName: "delegate" + property variant test1: name + property variant test2: model.name + property variant test3: modelData + property variant test4: model.modelData + property variant test5: modelData.name + property variant test6: model + property variant test7: index + property variant test8: model.index + property variant test9: model.modelData.name + } +} diff --git a/tests/auto/declarative/qdeclarativevisualdatamodel/data/modelproperties2.qml b/tests/auto/declarative/qdeclarativevisualdatamodel/data/modelproperties2.qml new file mode 100644 index 00000000..67721c92 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevisualdatamodel/data/modelproperties2.qml @@ -0,0 +1,17 @@ +import QtQuick 1.0 + +ListView { + model: myModel + delegate: Item { + objectName: "delegate" + property variant test1: display + property variant test2: model.display + property variant test3: modelData + property variant test4: model.modelData + property variant test5: modelData.display + property variant test6: model + property variant test7: index + property variant test8: model.index + property variant test9: model.modelData.display + } +} diff --git a/tests/auto/declarative/qdeclarativevisualdatamodel/data/objectlist.qml b/tests/auto/declarative/qdeclarativevisualdatamodel/data/objectlist.qml new file mode 100644 index 00000000..41342597 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevisualdatamodel/data/objectlist.qml @@ -0,0 +1,19 @@ +import QtQuick 1.0 + +ListView { + width: 100 + height: 100 + anchors.fill: parent + model: myModel + delegate: Component { + Rectangle { + height: 25 + width: 100 + color: model.modelData.color + Text { objectName: "name"; text: name } + Text { objectName: "section"; text: parent.ListView.section } + } + } + section.property: "name" + section.criteria: ViewSection.FullString +} diff --git a/tests/auto/declarative/qdeclarativevisualdatamodel/data/singlerole1.qml b/tests/auto/declarative/qdeclarativevisualdatamodel/data/singlerole1.qml new file mode 100644 index 00000000..d72e128b --- /dev/null +++ b/tests/auto/declarative/qdeclarativevisualdatamodel/data/singlerole1.qml @@ -0,0 +1,11 @@ +import QtQuick 1.0 + +ListView { + width: 100 + height: 100 + anchors.fill: parent + model: myModel + delegate: Component { + Text { objectName: "name"; text: name } + } +} diff --git a/tests/auto/declarative/qdeclarativevisualdatamodel/data/singlerole2.qml b/tests/auto/declarative/qdeclarativevisualdatamodel/data/singlerole2.qml new file mode 100644 index 00000000..b9e666ce --- /dev/null +++ b/tests/auto/declarative/qdeclarativevisualdatamodel/data/singlerole2.qml @@ -0,0 +1,11 @@ +import QtQuick 1.0 + +ListView { + width: 100 + height: 100 + anchors.fill: parent + model: myModel + delegate: Component { + Text { objectName: "name"; text: modelData } + } +} diff --git a/tests/auto/declarative/qdeclarativevisualdatamodel/data/visualdatamodel.qml b/tests/auto/declarative/qdeclarativevisualdatamodel/data/visualdatamodel.qml new file mode 100644 index 00000000..a5c44d01 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevisualdatamodel/data/visualdatamodel.qml @@ -0,0 +1,11 @@ +import QtQuick 1.0 + +VisualDataModel { + function setRoot() { + rootIndex = modelIndex(0); + } + function setRootToParent() { + rootIndex = parentModelIndex(); + } + model: myModel +} diff --git a/tests/auto/declarative/qdeclarativevisualdatamodel/qdeclarativevisualdatamodel.pro b/tests/auto/declarative/qdeclarativevisualdatamodel/qdeclarativevisualdatamodel.pro new file mode 100644 index 00000000..fe3d7946 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevisualdatamodel/qdeclarativevisualdatamodel.pro @@ -0,0 +1,16 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative gui +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativevisualdatamodel.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativevisualdatamodel/tst_qdeclarativevisualdatamodel.cpp b/tests/auto/declarative/qdeclarativevisualdatamodel/tst_qdeclarativevisualdatamodel.cpp new file mode 100644 index 00000000..28de5bd2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativevisualdatamodel/tst_qdeclarativevisualdatamodel.cpp @@ -0,0 +1,606 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "../../../shared/util.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +static void initStandardTreeModel(QStandardItemModel *model) +{ + QStandardItem *item; + item = new QStandardItem(QLatin1String("Row 1 Item")); + model->insertRow(0, item); + + item = new QStandardItem(QLatin1String("Row 2 Item")); + item->setCheckable(true); + model->insertRow(1, item); + + QStandardItem *childItem = new QStandardItem(QLatin1String("Row 2 Child Item")); + item->setChild(0, childItem); + + item = new QStandardItem(QLatin1String("Row 3 Item")); + item->setIcon(QIcon()); + model->insertRow(2, item); +} + +class SingleRoleModel : public QAbstractListModel +{ + Q_OBJECT + +public: + SingleRoleModel(QObject *parent = 0) { + QHash roles; + roles.insert(Qt::DisplayRole , "name"); + setRoleNames(roles); + list << "one" << "two" << "three" << "four"; + } + + void emitMove(int sourceFirst, int sourceLast, int destinationChild) { + emit beginMoveRows(QModelIndex(), sourceFirst, sourceLast, QModelIndex(), destinationChild); + emit endMoveRows(); + } + + QStringList list; + +public slots: + void set(int idx, QString string) { + list[idx] = string; + emit dataChanged(index(idx,0), index(idx,0)); + } + +protected: + int rowCount(const QModelIndex &parent = QModelIndex()) const { + return list.count(); + } + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const { + if (role == Qt::DisplayRole) + return list.at(index.row()); + return QVariant(); + } +}; + + +class tst_qdeclarativevisualdatamodel : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativevisualdatamodel(); + +private slots: + void rootIndex(); + void updateLayout(); + void childChanged(); + void objectListModel(); + void singleRole(); + void modelProperties(); + void noDelegate(); + void qaimRowsMoved(); + void qaimRowsMoved_data(); + +private: + QDeclarativeEngine engine; + template + T *findItem(QGraphicsObject *parent, const QString &objectName, int index); +}; + +class DataObject : public QObject +{ + Q_OBJECT + + Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) + Q_PROPERTY(QString color READ color WRITE setColor NOTIFY colorChanged) + +public: + DataObject(QObject *parent=0) : QObject(parent) {} + DataObject(const QString &name, const QString &color, QObject *parent=0) + : QObject(parent), m_name(name), m_color(color) { } + + + QString name() const { return m_name; } + void setName(const QString &name) { + if (name != m_name) { + m_name = name; + emit nameChanged(); + } + } + + QString color() const { return m_color; } + void setColor(const QString &color) { + if (color != m_color) { + m_color = color; + emit colorChanged(); + } + } + +signals: + void nameChanged(); + void colorChanged(); + +private: + QString m_name; + QString m_color; +}; + +tst_qdeclarativevisualdatamodel::tst_qdeclarativevisualdatamodel() +{ +} + +void tst_qdeclarativevisualdatamodel::rootIndex() +{ + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/visualdatamodel.qml")); + + QStandardItemModel model; + initStandardTreeModel(&model); + + engine.rootContext()->setContextProperty("myModel", &model); + + QDeclarativeVisualDataModel *obj = qobject_cast(c.create()); + QVERIFY(obj != 0); + + QMetaObject::invokeMethod(obj, "setRoot"); + QVERIFY(qvariant_cast(obj->rootIndex()) == model.index(0,0)); + + QMetaObject::invokeMethod(obj, "setRootToParent"); + QVERIFY(qvariant_cast(obj->rootIndex()) == QModelIndex()); + + QMetaObject::invokeMethod(obj, "setRoot"); + QVERIFY(qvariant_cast(obj->rootIndex()) == model.index(0,0)); + model.clear(); // will emit modelReset() + QVERIFY(qvariant_cast(obj->rootIndex()) == QModelIndex()); + + delete obj; +} + +void tst_qdeclarativevisualdatamodel::updateLayout() +{ + QDeclarativeView view; + + QStandardItemModel model; + initStandardTreeModel(&model); + + view.rootContext()->setContextProperty("myModel", &model); + + view.setSource(QUrl::fromLocalFile(SRCDIR "/data/datalist.qml")); + + QDeclarativeListView *listview = qobject_cast(view.rootObject()); + QVERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QVERIFY(contentItem != 0); + + QDeclarativeText *name = findItem(contentItem, "display", 0); + QVERIFY(name); + QCOMPARE(name->text(), QString("Row 1 Item")); + name = findItem(contentItem, "display", 1); + QVERIFY(name); + QCOMPARE(name->text(), QString("Row 2 Item")); + name = findItem(contentItem, "display", 2); + QVERIFY(name); + QCOMPARE(name->text(), QString("Row 3 Item")); + + model.invisibleRootItem()->sortChildren(0, Qt::DescendingOrder); + + name = findItem(contentItem, "display", 0); + QVERIFY(name); + QCOMPARE(name->text(), QString("Row 3 Item")); + name = findItem(contentItem, "display", 1); + QVERIFY(name); + QCOMPARE(name->text(), QString("Row 2 Item")); + name = findItem(contentItem, "display", 2); + QVERIFY(name); + QCOMPARE(name->text(), QString("Row 1 Item")); +} + +void tst_qdeclarativevisualdatamodel::childChanged() +{ + QDeclarativeView view; + + QStandardItemModel model; + initStandardTreeModel(&model); + + view.rootContext()->setContextProperty("myModel", &model); + + view.setSource(QUrl::fromLocalFile(SRCDIR "/data/datalist.qml")); + + QDeclarativeListView *listview = qobject_cast(view.rootObject()); + QVERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QVERIFY(contentItem != 0); + + QDeclarativeVisualDataModel *vdm = listview->findChild("visualModel"); + vdm->setRootIndex(QVariant::fromValue(model.indexFromItem(model.item(1,0)))); + + QDeclarativeText *name = findItem(contentItem, "display", 0); + QVERIFY(name); + QCOMPARE(name->text(), QString("Row 2 Child Item")); + + model.item(1,0)->child(0,0)->setText("Row 2 updated child"); + + name = findItem(contentItem, "display", 0); + QVERIFY(name); + QCOMPARE(name->text(), QString("Row 2 updated child")); + + model.item(1,0)->appendRow(new QStandardItem(QLatin1String("Row 2 Child Item 2"))); + QTest::qWait(300); + + name = findItem(contentItem, "display", 1); + QVERIFY(name != 0); + QCOMPARE(name->text(), QString("Row 2 Child Item 2")); + + model.item(1,0)->takeRow(1); + name = findItem(contentItem, "display", 1); + QVERIFY(name == 0); + + vdm->setRootIndex(QVariant::fromValue(QModelIndex())); + QTest::qWait(300); + name = findItem(contentItem, "display", 0); + QVERIFY(name); + QCOMPARE(name->text(), QString("Row 1 Item")); + name = findItem(contentItem, "display", 1); + QVERIFY(name); + QCOMPARE(name->text(), QString("Row 2 Item")); + name = findItem(contentItem, "display", 2); + QVERIFY(name); + QCOMPARE(name->text(), QString("Row 3 Item")); +} + +void tst_qdeclarativevisualdatamodel::objectListModel() +{ + QDeclarativeView view; + + QList dataList; + dataList.append(new DataObject("Item 1", "red")); + dataList.append(new DataObject("Item 2", "green")); + dataList.append(new DataObject("Item 3", "blue")); + dataList.append(new DataObject("Item 4", "yellow")); + + QDeclarativeContext *ctxt = view.rootContext(); + ctxt->setContextProperty("myModel", QVariant::fromValue(dataList)); + + view.setSource(QUrl::fromLocalFile(SRCDIR "/data/objectlist.qml")); + + QDeclarativeListView *listview = qobject_cast(view.rootObject()); + QVERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QVERIFY(contentItem != 0); + + QDeclarativeText *name = findItem(contentItem, "name", 0); + QCOMPARE(name->text(), QString("Item 1")); + + QDeclarativeText *section = findItem(contentItem, "section", 0); + QCOMPARE(section->text(), QString("Item 1")); + + dataList[0]->setProperty("name", QLatin1String("Changed")); + QCOMPARE(name->text(), QString("Changed")); +} + +void tst_qdeclarativevisualdatamodel::singleRole() +{ + { + QDeclarativeView view; + + SingleRoleModel model; + + QDeclarativeContext *ctxt = view.rootContext(); + ctxt->setContextProperty("myModel", &model); + + view.setSource(QUrl::fromLocalFile(SRCDIR "/data/singlerole1.qml")); + + QDeclarativeListView *listview = qobject_cast(view.rootObject()); + QVERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QVERIFY(contentItem != 0); + + QDeclarativeText *name = findItem(contentItem, "name", 1); + QCOMPARE(name->text(), QString("two")); + + model.set(1, "Changed"); + QCOMPARE(name->text(), QString("Changed")); + } + { + QDeclarativeView view; + + SingleRoleModel model; + + QDeclarativeContext *ctxt = view.rootContext(); + ctxt->setContextProperty("myModel", &model); + + view.setSource(QUrl::fromLocalFile(SRCDIR "/data/singlerole2.qml")); + + QDeclarativeListView *listview = qobject_cast(view.rootObject()); + QVERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QVERIFY(contentItem != 0); + + QDeclarativeText *name = findItem(contentItem, "name", 1); + QCOMPARE(name->text(), QString("two")); + + model.set(1, "Changed"); + QCOMPARE(name->text(), QString("Changed")); + } +} + +void tst_qdeclarativevisualdatamodel::modelProperties() +{ + { + QDeclarativeView view; + + SingleRoleModel model; + + QDeclarativeContext *ctxt = view.rootContext(); + ctxt->setContextProperty("myModel", &model); + + view.setSource(QUrl::fromLocalFile(SRCDIR "/data/modelproperties.qml")); + + QDeclarativeListView *listview = qobject_cast(view.rootObject()); + QVERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QVERIFY(contentItem != 0); + + QDeclarativeItem *delegate = findItem(contentItem, "delegate", 1); + QCOMPARE(delegate->property("test1").toString(),QString("two")); + QCOMPARE(delegate->property("test2").toString(),QString("two")); + QCOMPARE(delegate->property("test3").toString(),QString("two")); + QCOMPARE(delegate->property("test4").toString(),QString("two")); + QVERIFY(!delegate->property("test9").isValid()); + QCOMPARE(delegate->property("test5").toString(),QString("")); + QVERIFY(delegate->property("test6").value() != 0); + QCOMPARE(delegate->property("test7").toInt(),1); + QCOMPARE(delegate->property("test8").toInt(),1); + } + + { + QDeclarativeView view; + + QList dataList; + dataList.append(new DataObject("Item 1", "red")); + dataList.append(new DataObject("Item 2", "green")); + dataList.append(new DataObject("Item 3", "blue")); + dataList.append(new DataObject("Item 4", "yellow")); + + QDeclarativeContext *ctxt = view.rootContext(); + ctxt->setContextProperty("myModel", QVariant::fromValue(dataList)); + + view.setSource(QUrl::fromLocalFile(SRCDIR "/data/modelproperties.qml")); + + QDeclarativeListView *listview = qobject_cast(view.rootObject()); + QVERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QVERIFY(contentItem != 0); + + QDeclarativeItem *delegate = findItem(contentItem, "delegate", 1); + QCOMPARE(delegate->property("test1").toString(),QString("Item 2")); + QEXPECT_FAIL("", "QTBUG-13576", Continue); + QCOMPARE(delegate->property("test2").toString(),QString("Item 2")); + QVERIFY(qobject_cast(delegate->property("test3").value()) != 0); + QVERIFY(qobject_cast(delegate->property("test4").value()) != 0); + QCOMPARE(delegate->property("test5").toString(),QString("Item 2")); + QCOMPARE(delegate->property("test9").toString(),QString("Item 2")); + QVERIFY(delegate->property("test6").value() != 0); + QCOMPARE(delegate->property("test7").toInt(),1); + QCOMPARE(delegate->property("test8").toInt(),1); + } + + { + QDeclarativeView view; + + QStandardItemModel model; + initStandardTreeModel(&model); + + view.rootContext()->setContextProperty("myModel", &model); + + QUrl source(QUrl::fromLocalFile(SRCDIR "/data/modelproperties2.qml")); + + //3 items, 3 warnings each + QTest::ignoreMessage(QtWarningMsg, source.toString().toLatin1() + ":11: ReferenceError: Can't find variable: modelData"); + QTest::ignoreMessage(QtWarningMsg, source.toString().toLatin1() + ":11: ReferenceError: Can't find variable: modelData"); + QTest::ignoreMessage(QtWarningMsg, source.toString().toLatin1() + ":11: ReferenceError: Can't find variable: modelData"); + QTest::ignoreMessage(QtWarningMsg, source.toString().toLatin1() + ":9: ReferenceError: Can't find variable: modelData"); + QTest::ignoreMessage(QtWarningMsg, source.toString().toLatin1() + ":9: ReferenceError: Can't find variable: modelData"); + QTest::ignoreMessage(QtWarningMsg, source.toString().toLatin1() + ":9: ReferenceError: Can't find variable: modelData"); + QTest::ignoreMessage(QtWarningMsg, source.toString().toLatin1() + ":15: TypeError: Result of expression 'model.modelData' [undefined] is not an object."); + QTest::ignoreMessage(QtWarningMsg, source.toString().toLatin1() + ":15: TypeError: Result of expression 'model.modelData' [undefined] is not an object."); + QTest::ignoreMessage(QtWarningMsg, source.toString().toLatin1() + ":15: TypeError: Result of expression 'model.modelData' [undefined] is not an object."); + + view.setSource(source); + + QDeclarativeListView *listview = qobject_cast(view.rootObject()); + QVERIFY(listview != 0); + + QDeclarativeItem *contentItem = listview->contentItem(); + QVERIFY(contentItem != 0); + + QDeclarativeItem *delegate = findItem(contentItem, "delegate", 1); + QCOMPARE(delegate->property("test1").toString(),QString("Row 2 Item")); + QCOMPARE(delegate->property("test2").toString(),QString("Row 2 Item")); + QVERIFY(!delegate->property("test3").isValid()); + QVERIFY(!delegate->property("test4").isValid()); + QVERIFY(!delegate->property("test5").isValid()); + QVERIFY(!delegate->property("test9").isValid()); + QVERIFY(delegate->property("test6").value() != 0); + QCOMPARE(delegate->property("test7").toInt(),1); + QCOMPARE(delegate->property("test8").toInt(),1); + } + + //### should also test QStringList and QVariantList +} + +void tst_qdeclarativevisualdatamodel::noDelegate() +{ + QDeclarativeView view; + + QStandardItemModel model; + initStandardTreeModel(&model); + + view.rootContext()->setContextProperty("myModel", &model); + + view.setSource(QUrl::fromLocalFile(SRCDIR "/data/datalist.qml")); + + QDeclarativeListView *listview = qobject_cast(view.rootObject()); + QVERIFY(listview != 0); + + QDeclarativeVisualDataModel *vdm = listview->findChild("visualModel"); + QVERIFY(vdm != 0); + QCOMPARE(vdm->count(), 3); + + vdm->setDelegate(0); + QCOMPARE(vdm->count(), 0); +} + + +void tst_qdeclarativevisualdatamodel::qaimRowsMoved() +{ + // Test parameters passed in QAIM::rowsMoved() signal are converted correctly + // when translated and emitted as the QListModelInterface::itemsMoved() signal + QFETCH(int, sourceFirst); + QFETCH(int, sourceLast); + QFETCH(int, destinationChild); + QFETCH(int, expectFrom); + QFETCH(int, expectTo); + QFETCH(int, expectCount); + + QDeclarativeEngine engine; + QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/visualdatamodel.qml")); + + SingleRoleModel model; + model.list.clear(); + for (int i=0; i<30; i++) + model.list << ("item " + i); + engine.rootContext()->setContextProperty("myModel", &model); + + QDeclarativeVisualDataModel *obj = qobject_cast(c.create()); + QVERIFY(obj != 0); + + QSignalSpy spy(obj, SIGNAL(itemsMoved(int,int,int))); + model.emitMove(sourceFirst, sourceLast, destinationChild); + QTRY_COMPARE(spy.count(), 1); + + QCOMPARE(spy[0].count(), 3); + QCOMPARE(spy[0][0].toInt(), expectFrom); + QCOMPARE(spy[0][1].toInt(), expectTo); + QCOMPARE(spy[0][2].toInt(), expectCount); + + delete obj; +} + +void tst_qdeclarativevisualdatamodel::qaimRowsMoved_data() +{ + QTest::addColumn("sourceFirst"); + QTest::addColumn("sourceLast"); + QTest::addColumn("destinationChild"); + QTest::addColumn("expectFrom"); + QTest::addColumn("expectTo"); + QTest::addColumn("expectCount"); + + QTest::newRow("move 1 forward") + << 1 << 1 << 6 + << 1 << 5 << 1; + + QTest::newRow("move 1 backwards") + << 4 << 4 << 1 + << 4 << 1 << 1; + + QTest::newRow("move multiple forwards") + << 0 << 2 << 13 + << 0 << 10 << 3; + + QTest::newRow("move multiple forwards, with same to") + << 0 << 1 << 3 + << 0 << 1 << 2; + + QTest::newRow("move multiple backwards") + << 10 << 14 << 1 + << 10 << 1 << 5; +} + + +template +T *tst_qdeclarativevisualdatamodel::findItem(QGraphicsObject *parent, const QString &objectName, int index) +{ + const QMetaObject &mo = T::staticMetaObject; + //qDebug() << parent->childItems().count() << "children"; + for (int i = 0; i < parent->childItems().count(); ++i) { + QDeclarativeItem *item = qobject_cast(parent->childItems().at(i)); + if(!item) + continue; + //qDebug() << "try" << item; + if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName)) { + if (index != -1) { + QDeclarativeExpression e(qmlContext(item), item, "index"); + if (e.evaluate().toInt() == index) + return static_cast(item); + } else { + return static_cast(item); + } + } + item = findItem(item, objectName, index); + if (item) + return static_cast(item); + } + + return 0; +} + +QTEST_MAIN(tst_qdeclarativevisualdatamodel) + +#include "tst_qdeclarativevisualdatamodel.moc" diff --git a/tests/auto/declarative/qdeclarativeworkerscript/data/BaseWorker.qml b/tests/auto/declarative/qdeclarativeworkerscript/data/BaseWorker.qml new file mode 100644 index 00000000..b419c830 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeworkerscript/data/BaseWorker.qml @@ -0,0 +1,24 @@ +import QtQuick 1.0 + +WorkerScript { + id: worker + + property variant response + + signal done() + + function testSend(value) { + worker.sendMessage(value) + } + + function compareLiteralResponse(expected) { + var e = eval('(' + expected + ')') + return JSON.stringify(worker.response) == JSON.stringify(e) + } + + onMessage: { + worker.response = messageObject + worker.done() + } +} + diff --git a/tests/auto/declarative/qdeclarativeworkerscript/data/Global.js b/tests/auto/declarative/qdeclarativeworkerscript/data/Global.js new file mode 100644 index 00000000..6bdb4a56 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeworkerscript/data/Global.js @@ -0,0 +1 @@ +var data = "World" diff --git a/tests/auto/declarative/qdeclarativeworkerscript/data/script.js b/tests/auto/declarative/qdeclarativeworkerscript/data/script.js new file mode 100644 index 00000000..90aae263 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeworkerscript/data/script.js @@ -0,0 +1,4 @@ +WorkerScript.onMessage = function(msg) { + WorkerScript.sendMessage(msg) +} + diff --git a/tests/auto/declarative/qdeclarativeworkerscript/data/script_error_onCall.js b/tests/auto/declarative/qdeclarativeworkerscript/data/script_error_onCall.js new file mode 100644 index 00000000..f589b0ef --- /dev/null +++ b/tests/auto/declarative/qdeclarativeworkerscript/data/script_error_onCall.js @@ -0,0 +1,6 @@ +WorkerScript.onMessage = function(msg) { + var a = 123 + var b = 345 + var f = getData() +} + diff --git a/tests/auto/declarative/qdeclarativeworkerscript/data/script_error_onLoad.js b/tests/auto/declarative/qdeclarativeworkerscript/data/script_error_onLoad.js new file mode 100644 index 00000000..1d6eab22 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeworkerscript/data/script_error_onLoad.js @@ -0,0 +1,5 @@ +WorkerScript.onMessage = function(msg) { + var a = 123 + aoij awef aljfaow eij +} + diff --git a/tests/auto/declarative/qdeclarativeworkerscript/data/script_fixed_return.js b/tests/auto/declarative/qdeclarativeworkerscript/data/script_fixed_return.js new file mode 100644 index 00000000..14f6f178 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeworkerscript/data/script_fixed_return.js @@ -0,0 +1,4 @@ +WorkerScript.onMessage = function(msg) { + WorkerScript.sendMessage('Hello_World') +} + diff --git a/tests/auto/declarative/qdeclarativeworkerscript/data/script_include.js b/tests/auto/declarative/qdeclarativeworkerscript/data/script_include.js new file mode 100644 index 00000000..0385d911 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeworkerscript/data/script_include.js @@ -0,0 +1,5 @@ +WorkerScript.onMessage = function(msg) { + var res = Qt.include("Global.js"); + WorkerScript.sendMessage(msg + " " + data) +} + diff --git a/tests/auto/declarative/qdeclarativeworkerscript/data/script_pragma.js b/tests/auto/declarative/qdeclarativeworkerscript/data/script_pragma.js new file mode 100644 index 00000000..cb3b6d33 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeworkerscript/data/script_pragma.js @@ -0,0 +1,6 @@ +.pragma library + +WorkerScript.onMessage = function(msg) { + WorkerScript.sendMessage(msg) +} + diff --git a/tests/auto/declarative/qdeclarativeworkerscript/data/worker.qml b/tests/auto/declarative/qdeclarativeworkerscript/data/worker.qml new file mode 100644 index 00000000..0c439c49 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeworkerscript/data/worker.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +BaseWorker { + source: "script.js" +} diff --git a/tests/auto/declarative/qdeclarativeworkerscript/data/worker_error_onCall.qml b/tests/auto/declarative/qdeclarativeworkerscript/data/worker_error_onCall.qml new file mode 100644 index 00000000..90c4617f --- /dev/null +++ b/tests/auto/declarative/qdeclarativeworkerscript/data/worker_error_onCall.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +BaseWorker { + source: "script_error_onCall.js" +} + diff --git a/tests/auto/declarative/qdeclarativeworkerscript/data/worker_error_onLoad.qml b/tests/auto/declarative/qdeclarativeworkerscript/data/worker_error_onLoad.qml new file mode 100644 index 00000000..0b9d21dc --- /dev/null +++ b/tests/auto/declarative/qdeclarativeworkerscript/data/worker_error_onLoad.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +BaseWorker { + source: "script_error_onLoad.js" +} + + diff --git a/tests/auto/declarative/qdeclarativeworkerscript/data/worker_include.qml b/tests/auto/declarative/qdeclarativeworkerscript/data/worker_include.qml new file mode 100644 index 00000000..595cb2b5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeworkerscript/data/worker_include.qml @@ -0,0 +1,5 @@ +import QtQuick 1.0 + +BaseWorker { + source: "script_include.js" +} diff --git a/tests/auto/declarative/qdeclarativeworkerscript/data/worker_pragma.qml b/tests/auto/declarative/qdeclarativeworkerscript/data/worker_pragma.qml new file mode 100644 index 00000000..a8800ad0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeworkerscript/data/worker_pragma.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +BaseWorker { + source: "script_pragma.js" +} + diff --git a/tests/auto/declarative/qdeclarativeworkerscript/qdeclarativeworkerscript.pro b/tests/auto/declarative/qdeclarativeworkerscript/qdeclarativeworkerscript.pro new file mode 100644 index 00000000..e20c3e6a --- /dev/null +++ b/tests/auto/declarative/qdeclarativeworkerscript/qdeclarativeworkerscript.pro @@ -0,0 +1,16 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative script +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativeworkerscript.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativeworkerscript/tst_qdeclarativeworkerscript.cpp b/tests/auto/declarative/qdeclarativeworkerscript/tst_qdeclarativeworkerscript.cpp new file mode 100644 index 00000000..0fbdd0ab --- /dev/null +++ b/tests/auto/declarative/qdeclarativeworkerscript/tst_qdeclarativeworkerscript.cpp @@ -0,0 +1,292 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include "../../../shared/util.h" + +Q_DECLARE_METATYPE(QScriptValue) + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +inline QUrl TEST_FILE(const QString &filename) +{ + QFileInfo fileInfo(__FILE__); + return QUrl::fromLocalFile(fileInfo.absoluteDir().filePath(filename)); +} + + +class tst_QDeclarativeWorkerScript : public QObject +{ + Q_OBJECT +public: + tst_QDeclarativeWorkerScript() {} +private slots: + void source(); + void messaging(); + void messaging_data(); + void messaging_sendQObjectList(); + void messaging_sendJsObject(); + void script_with_pragma(); + void script_included(); + void scriptError_onLoad(); + void scriptError_onCall(); + +private: + void waitForEchoMessage(QDeclarativeWorkerScript *worker) { + QEventLoop loop; + QVERIFY(connect(worker, SIGNAL(done()), &loop, SLOT(quit()))); + QTimer timer; + timer.setSingleShot(true); + connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit())); + timer.start(10000); + loop.exec(); + QVERIFY(timer.isActive()); + } + + QDeclarativeEngine m_engine; +}; + +void tst_QDeclarativeWorkerScript::source() +{ + QDeclarativeComponent component(&m_engine, SRCDIR "/data/worker.qml"); + QDeclarativeWorkerScript *worker = qobject_cast(component.create()); + QVERIFY(worker != 0); + const QMetaObject *mo = worker->metaObject(); + + QVariant value(100); + QVERIFY(QMetaObject::invokeMethod(worker, "testSend", Q_ARG(QVariant, value))); + waitForEchoMessage(worker); + QCOMPARE(mo->property(mo->indexOfProperty("response")).read(worker).value(), value); + + QUrl source = QUrl::fromLocalFile(SRCDIR "/data/script_fixed_return.js"); + worker->setSource(source); + QCOMPARE(worker->source(), source); + QVERIFY(QMetaObject::invokeMethod(worker, "testSend", Q_ARG(QVariant, value))); + waitForEchoMessage(worker); + QCOMPARE(mo->property(mo->indexOfProperty("response")).read(worker).value(), qVariantFromValue(QString("Hello_World"))); + + qApp->processEvents(); + delete worker; +} + +void tst_QDeclarativeWorkerScript::messaging() +{ + QFETCH(QVariant, value); + + QDeclarativeComponent component(&m_engine, SRCDIR "/data/worker.qml"); + QDeclarativeWorkerScript *worker = qobject_cast(component.create()); + QVERIFY(worker != 0); + + QVERIFY(QMetaObject::invokeMethod(worker, "testSend", Q_ARG(QVariant, value))); + waitForEchoMessage(worker); + + const QMetaObject *mo = worker->metaObject(); + QCOMPARE(mo->property(mo->indexOfProperty("response")).read(worker).value(), value); + + qApp->processEvents(); + delete worker; +} + +void tst_QDeclarativeWorkerScript::messaging_data() +{ + QTest::addColumn("value"); + + QTest::newRow("invalid") << QVariant(); + QTest::newRow("bool") << qVariantFromValue(true); + QTest::newRow("int") << qVariantFromValue(1001); + QTest::newRow("real") << qVariantFromValue(10334.375); + QTest::newRow("string") << qVariantFromValue(QString("More cheeeese, Gromit!")); + QTest::newRow("variant list") << qVariantFromValue((QVariantList() << "a" << "b" << "c")); + QTest::newRow("date time") << qVariantFromValue(QDateTime::currentDateTime()); +#ifndef QT_NO_REGEXP + // QtScript's QScriptValue -> QRegExp uses RegExp2 pattern syntax + QTest::newRow("regexp") << qVariantFromValue(QRegExp("^\\d\\d?$", Qt::CaseInsensitive, QRegExp::RegExp2)); +#endif +} + +void tst_QDeclarativeWorkerScript::messaging_sendQObjectList() +{ + // Not allowed to send QObjects other than QDeclarativeWorkerListModelAgent + // instances. If objects are sent in a list, they will be sent as 'undefined' + // js values. + + QDeclarativeComponent component(&m_engine, SRCDIR "/data/worker.qml"); + QDeclarativeWorkerScript *worker = qobject_cast(component.create()); + QVERIFY(worker != 0); + + QVariantList objects; + for (int i=0; i<3; i++) + objects << qVariantFromValue(new QObject(this)); + + QVERIFY(QMetaObject::invokeMethod(worker, "testSend", Q_ARG(QVariant, qVariantFromValue(objects)))); + waitForEchoMessage(worker); + + const QMetaObject *mo = worker->metaObject(); + QVariantList result = mo->property(mo->indexOfProperty("response")).read(worker).value(); + QCOMPARE(result, (QVariantList() << QVariant() << QVariant() << QVariant())); + + qApp->processEvents(); + delete worker; +} + +void tst_QDeclarativeWorkerScript::messaging_sendJsObject() +{ + QDeclarativeComponent component(&m_engine, SRCDIR "/data/worker.qml"); + QDeclarativeWorkerScript *worker = qobject_cast(component.create()); + QVERIFY(worker != 0); + + // Properties are in alphabetical order to enable string-based comparison after + // QVariant roundtrip, since the properties will be stored in a QVariantMap. + QString jsObject = "{'haste': 1125, 'name': 'zyz', 'spell power': 3101}"; + + QScriptEngine *engine = QDeclarativeEnginePrivate::getScriptEngine(qmlEngine(worker)); + QScriptValue sv = engine->newObject(); + sv.setProperty("haste", 1125); + sv.setProperty("name", "zyz"); + sv.setProperty("spell power", 3101); + + QVERIFY(QMetaObject::invokeMethod(worker, "testSend", Q_ARG(QVariant, qVariantFromValue(sv)))); + waitForEchoMessage(worker); + + QVariant result = qVariantFromValue(false); + QVERIFY(QMetaObject::invokeMethod(worker, "compareLiteralResponse", Qt::DirectConnection, + Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, jsObject))); + QVERIFY(result.toBool()); + + qApp->processEvents(); + delete worker; +} + +void tst_QDeclarativeWorkerScript::script_with_pragma() +{ + QVariant value(100); + + QDeclarativeComponent component(&m_engine, SRCDIR "/data/worker_pragma.qml"); + QDeclarativeWorkerScript *worker = qobject_cast(component.create()); + QVERIFY(worker != 0); + + QVERIFY(QMetaObject::invokeMethod(worker, "testSend", Q_ARG(QVariant, value))); + waitForEchoMessage(worker); + + const QMetaObject *mo = worker->metaObject(); + QCOMPARE(mo->property(mo->indexOfProperty("response")).read(worker).value(), value); + + qApp->processEvents(); + delete worker; +} + +void tst_QDeclarativeWorkerScript::script_included() +{ + QDeclarativeComponent component(&m_engine, SRCDIR "/data/worker_include.qml"); + QDeclarativeWorkerScript *worker = qobject_cast(component.create()); + QVERIFY(worker != 0); + + QString value("Hello"); + + QVERIFY(QMetaObject::invokeMethod(worker, "testSend", Q_ARG(QVariant, value))); + waitForEchoMessage(worker); + + const QMetaObject *mo = worker->metaObject(); + QCOMPARE(mo->property(mo->indexOfProperty("response")).read(worker).toString(), value + " World"); + + qApp->processEvents(); + delete worker; +} + +static QString qdeclarativeworkerscript_lastWarning; +static void qdeclarativeworkerscript_warningsHandler(QtMsgType type, const char *msg) +{ + if (type == QtWarningMsg) + qdeclarativeworkerscript_lastWarning = QString::fromUtf8(msg); +} + +void tst_QDeclarativeWorkerScript::scriptError_onLoad() +{ + QDeclarativeComponent component(&m_engine, SRCDIR "/data/worker_error_onLoad.qml"); + + QtMsgHandler previousMsgHandler = qInstallMsgHandler(qdeclarativeworkerscript_warningsHandler); + QDeclarativeWorkerScript *worker = qobject_cast(component.create()); + QVERIFY(worker != 0); + + QTRY_COMPARE(qdeclarativeworkerscript_lastWarning, + TEST_FILE("data/script_error_onLoad.js").toString() + QLatin1String(":3: SyntaxError: Parse error")); + + qInstallMsgHandler(previousMsgHandler); + qApp->processEvents(); + delete worker; +} + +void tst_QDeclarativeWorkerScript::scriptError_onCall() +{ + QDeclarativeComponent component(&m_engine, SRCDIR "/data/worker_error_onCall.qml"); + QDeclarativeWorkerScript *worker = qobject_cast(component.create()); + QVERIFY(worker != 0); + + QtMsgHandler previousMsgHandler = qInstallMsgHandler(qdeclarativeworkerscript_warningsHandler); + QVariant value; + QVERIFY(QMetaObject::invokeMethod(worker, "testSend", Q_ARG(QVariant, value))); + + QTRY_COMPARE(qdeclarativeworkerscript_lastWarning, + TEST_FILE("data/script_error_onCall.js").toString() + QLatin1String(":4: ReferenceError: Can't find variable: getData")); + + qInstallMsgHandler(previousMsgHandler); + qApp->processEvents(); + delete worker; +} + + +QTEST_MAIN(tst_QDeclarativeWorkerScript) + +#include "tst_qdeclarativeworkerscript.moc" diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/abort.expect b/tests/auto/declarative/qdeclarativexmlhttprequest/data/abort.expect new file mode 100644 index 00000000..4d211225 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/abort.expect @@ -0,0 +1,10 @@ +PUT /testdocument.html HTTP/1.1 +ACCEPT-LANGUAGE: en-US +Content-Type: text/plain;charset=UTF-8 +Content-Length: 9 +Connection: Keep-Alive +Accept-Encoding: gzip +User-Agent: Mozilla/5.0 +Host: 127.0.0.1:14445 + +Test Data \ No newline at end of file diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/abort.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/abort.qml new file mode 100644 index 00000000..0196586b --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/abort.qml @@ -0,0 +1,44 @@ +import QtQuick 1.0 + +QtObject { + property string urlDummy + property string url + + property bool seenDone: false + property bool didNotSeeUnsent: true + property bool endStateUnsent: false + property bool dataOK: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + x.open("GET", urlDummy); + x.setRequestHeader("Test-header", "TestValue"); + x.setRequestHeader("Accept-Language", "en-US"); + x.send(); + + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.DONE) { + seenDone = true; + } else if (x.readyState == XMLHttpRequest.UNSENT) { + didNotSeeUnsent = false; + } + } + + x.abort(); + + if (x.readyState == XMLHttpRequest.UNSENT) { + endStateUnsent = true; + } + + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.DONE) { + dataOK = (x.responseText == "QML Rocks!\n"); + } + } + x.open("PUT", url); + x.setRequestHeader("Accept-Language", "en-US"); + x.send("Test Data"); + } +} + + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/abort.reply b/tests/auto/declarative/qdeclarativexmlhttprequest/data/abort.reply new file mode 100644 index 00000000..7ae6951f --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/abort.reply @@ -0,0 +1,3 @@ +HTTP/1.0 200 OK +Connection: close +Content-type: text/html; charset=UTF-8 diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/abort_opened.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/abort_opened.qml new file mode 100644 index 00000000..aeea2789 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/abort_opened.qml @@ -0,0 +1,60 @@ +import QtQuick 1.0 + +QtObject { + property string url: "testdocument.html" + + property bool readyState: false + property bool openedState: false + + property bool status: false + property bool statusText: false + property bool responseText: false + property bool responseXML: false + + property bool dataOK: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + x.abort(); + + if (x.readyState == XMLHttpRequest.UNSENT) + readyState = true; + + x.open("PUT", url); + x.setRequestHeader("Accept-Language", "en-US"); + + x.abort(); + + x.open("GET", url); + x.setRequestHeader("Accept-Language", "en-US"); + + if (x.readyState == XMLHttpRequest.OPENED) + openedState = true; + + try { + var a = x.status; + } catch (error) { + if (error.code == DOMException.INVALID_STATE_ERR) + status = true; + } + try { + var a = x.statusText; + } catch (error) { + if (error.code == DOMException.INVALID_STATE_ERR) + statusText = true; + } + responseText = (x.responseText == ""); + responseXML = (x.responseXML == null); + + // Test to the end + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.DONE) { + dataOK = (x.responseText == "QML Rocks!\n"); + } + } + + + x.send() + } +} + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/abort_unsent.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/abort_unsent.qml new file mode 100644 index 00000000..fffc3d9c --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/abort_unsent.qml @@ -0,0 +1,55 @@ +import QtQuick 1.0 + +QtObject { + property string url: "testdocument.html" + + property bool readyState: false + property bool openedState: false + + property bool status: false + property bool statusText: false + property bool responseText: false + property bool responseXML: false + + property bool dataOK: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + x.abort(); + + if (x.readyState == XMLHttpRequest.UNSENT) + readyState = true; + + x.open("GET", url); + x.setRequestHeader("Accept-Language", "en-US"); + + if (x.readyState == XMLHttpRequest.OPENED) + openedState = true; + + try { + var a = x.status; + } catch (error) { + if (error.code == DOMException.INVALID_STATE_ERR) + status = true; + } + try { + var a = x.statusText; + } catch (error) { + if (error.code == DOMException.INVALID_STATE_ERR) + statusText = true; + } + responseText = (x.responseText == ""); + responseXML = (x.responseXML == null); + + // Test to the end + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.DONE) { + dataOK = (x.responseText == "QML Rocks!\n"); + } + } + + + x.send() + } +} + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/attr.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/attr.qml new file mode 100644 index 00000000..5d5dd12f --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/attr.qml @@ -0,0 +1,78 @@ +import QtQuick 1.0 + +QtObject { + property bool xmlTest: false + property bool dataOK: false + + function checkAttr(documentElement, attr) + { + if (attr == null) + return; + + if (attr.name != "attr") + return; + + if (attr.value != "myvalue") + return; + + if (attr.ownerElement.tagName != documentElement.tagName) + return; + + if (attr.nodeName != "attr") + return; + + if (attr.nodeValue != "myvalue") + return; + + if (attr.nodeType != 2) + return; + + if (attr.childNodes.length != 0) + return; + + if (attr.firstChild != null) + return; + + if (attr.lastChild != null) + return; + + if (attr.previousSibling != null) + return; + + if (attr.nextSibling != null) + return; + + if (attr.attributes != null) + return; + + xmlTest = true; + } + + function checkXML(document) + { + checkAttr(document.documentElement, document.documentElement.attributes[0]); + } + + Component.onCompleted: { + var x = new XMLHttpRequest; + + x.open("GET", "attr.xml"); + + // Test to the end + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.DONE) { + + dataOK = true; + + if (x.responseXML != null) + checkXML(x.responseXML); + + } + } + + x.send() + } +} + + + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/attr.xml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/attr.xml new file mode 100644 index 00000000..2aa64a3d --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/attr.xml @@ -0,0 +1 @@ + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/callbackException.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/callbackException.qml new file mode 100644 index 00000000..ec6902dc --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/callbackException.qml @@ -0,0 +1,25 @@ +import QtQuick 1.0 + +QtObject { + id: obj + property string url + property string which + property bool threw: false + + onWhichChanged: { + var x = new XMLHttpRequest; + + x.onreadystatechange = function() { + if (x.readyState == which) { + obj.threw = true + throw(new Error("Exception from Callback")) + } + } + + x.open("GET", url); + x.setRequestHeader("Test-header", "TestValue"); + x.send(); + } +} + + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/cdata.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/cdata.qml new file mode 100644 index 00000000..be60664e --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/cdata.qml @@ -0,0 +1,133 @@ +import QtQuick 1.0 + +QtObject { + property bool xmlTest: false + property bool dataOK: false + + function checkCData(text, whitespacetext) + { + // This is essentially a copy of text.qml/checkText() + + if (text == null) + return; + + if (text.nodeName != "#cdata-section") + return; + + if (text.nodeValue != "Hello world!") + return; + + if (text.nodeType != 4) + return; + + if (text.parentNode.nodeName != "item") + return; + + if (text.childNodes.length != 0) + return; + + if (text.firstChild != null) + return; + + if (text.lastChild != null) + return; + + if (text.previousSibling != null) + return; + + if (text.nextSibling != null) + return; + + if (text.attributes != null) + return; + + if (text.wholeText != "Hello world!") + return; + + if (text.data != "Hello world!") + return; + + if (text.length != 12) + return; + + if (text.isElementContentWhitespace != false) + return; + + if (whitespacetext.nodeName != "#cdata-section") + return; + + if (whitespacetext.nodeValue != " ") + return; + + if (whitespacetext.nodeType != 4) + return; + + if (whitespacetext.parentNode.nodeName != "item") + return; + + if (whitespacetext.childNodes.length != 0) + return; + + if (whitespacetext.firstChild != null) + return; + + if (whitespacetext.lastChild != null) + return; + + if (whitespacetext.previousSibling != null) + return; + + if (whitespacetext.nextSibling != null) + return; + + if (whitespacetext.attributes != null) + return; + + if (whitespacetext.wholeText != " ") + return; + + if (whitespacetext.data != " ") + return; + + if (whitespacetext.length != 3) + return; + + if (whitespacetext.isElementContentWhitespace != true) + return; + + + xmlTest = true; + } + + function checkXML(document) + { + checkCData(document.documentElement.childNodes[0].childNodes[0], + document.documentElement.childNodes[1].childNodes[0]); + + } + + Component.onCompleted: { + var x = new XMLHttpRequest; + + x.open("GET", "cdata.xml"); + + // Test to the end + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.DONE) { + + dataOK = true; + + if (x.responseXML != null) + checkXML(x.responseXML); + + } + } + + x.send() + } +} + + + + + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/cdata.xml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/cdata.xml new file mode 100644 index 00000000..061d37c0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/cdata.xml @@ -0,0 +1,2 @@ + + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/constructor.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/constructor.qml new file mode 100644 index 00000000..0050f919 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/constructor.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 + +QtObject { + property bool calledAsConstructor + property bool calledAsFunction + + Component.onCompleted: { + var x1 = new XMLHttpRequest; + var x2 = XMLHttpRequest(); + + calledAsConstructor = (x1 != null && x1 instanceof XMLHttpRequest); + calledAsFunction = (x2 == undefined); + } +} diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/defaultState.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/defaultState.qml new file mode 100644 index 00000000..77b2b94e --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/defaultState.qml @@ -0,0 +1,30 @@ +import QtQuick 1.0 + +QtObject { + property int readyState + property bool statusIsException: false + property bool statusTextIsException: false + property string responseText + property bool responseXMLIsNull + + Component.onCompleted: { + var xhr = new XMLHttpRequest(); + + readyState = xhr.readyState; + try { + status = xhr.status; + } catch (error) { + if (error.code == DOMException.INVALID_STATE_ERR) + statusIsException = true; + } + try { + statusText = xhr.statusText; + } catch (error) { + if (error.code == DOMException.INVALID_STATE_ERR) + statusTextIsException = true; + } + responseText = xhr.responseText; + responseXMLIsNull = (xhr.responseXML == null); + } +} + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/document.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/document.qml new file mode 100644 index 00000000..faf3af0a --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/document.qml @@ -0,0 +1,56 @@ +import QtQuick 1.0 + +QtObject { + property bool xmlTest: false + property bool dataOK: false + + function checkXML(document) + { + if (document.xmlVersion != "1.0") + return; + + if (document.xmlEncoding != "UTF-8") + return; + + if (document.xmlStandalone != true) + return; + + if (document.documentElement == null) + return; + + if (document.nodeName != "#document") + return; + + if (document.nodeValue != null) + return; + + if (document.parentNode != null) + return; + + // ### Test other node properties + // ### test encoding (what is a valid qt encoding?) + xmlTest = true; + } + + Component.onCompleted: { + var x = new XMLHttpRequest; + + x.open("GET", "document.xml"); + + // Test to the end + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.DONE) { + + dataOK = true; + + if (x.responseXML != null) + checkXML(x.responseXML); + + } + } + + x.send() + } +} + + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/document.xml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/document.xml new file mode 100644 index 00000000..fb693ea1 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/document.xml @@ -0,0 +1,3 @@ + + + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/domExceptionCodes.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/domExceptionCodes.qml new file mode 100644 index 00000000..0f32a64a --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/domExceptionCodes.qml @@ -0,0 +1,60 @@ +import QtQuick 1.0 + +QtObject { + property int index_size_err: DOMException.INDEX_SIZE_ERR + property int domstring_size_err: DOMException.DOMSTRING_SIZE_ERR + property int hierarchy_request_err: DOMException.HIERARCHY_REQUEST_ERR + property int wrong_document_err: DOMException.WRONG_DOCUMENT_ERR + property int invalid_character_err: DOMException.INVALID_CHARACTER_ERR + property int no_data_allowed_err: DOMException.NO_DATA_ALLOWED_ERR + property int no_modification_allowed_err: DOMException.NO_MODIFICATION_ALLOWED_ERR + property int not_found_err: DOMException.NOT_FOUND_ERR + property int not_supported_err: DOMException.NOT_SUPPORTED_ERR + property int inuse_attribute_err: DOMException.INUSE_ATTRIBUTE_ERR + property int invalid_state_err: DOMException.INVALID_STATE_ERR + property int syntax_err: DOMException.SYNTAX_ERR + property int invalid_modification_err: DOMException.INVALID_MODIFICATION_ERR + property int namespace_err: DOMException.NAMESPACE_ERR + property int invalid_access_err: DOMException.INVALID_ACCESS_ERR + property int validation_err: DOMException.VALIDATION_ERR + property int type_mismatch_err: DOMException.TYPE_MISMATCH_ERR + + Component.onCompleted: { + // Attempt to overwrite and delete values + DOMException.INDEX_SIZE_ERR = 44; + DOMException.DOMSTRING_SIZE_ERR = 44; + DOMException.HIERARCHY_REQUEST_ERR = 44; + DOMException.WRONG_DOCUMENT_ERR = 44; + DOMException.INVALID_CHARACTER_ERR = 44; + DOMException.NO_DATA_ALLOWED_ERR = 44; + DOMException.NO_MODIFICATION_ALLOWED_ERR = 44; + DOMException.NOT_FOUND_ERR = 44; + DOMException.NOT_SUPPORTED_ERR = 44; + DOMException.INUSE_ATTRIBUTE_ERR = 44; + DOMException.INVALID_STATE_ERR = 44; + DOMException.SYNTAX_ERR = 44; + DOMException.INVALID_MODIFICATION_ERR = 44; + DOMException.NAMESPACE_ERR = 44; + DOMException.INVALID_ACCESS_ERR = 44; + DOMException.VALIDATION_ERR = 44; + DOMException.TYPE_MISMATCH_ERR = 44; + + delete DOMException.INDEX_SIZE_ERR; + delete DOMException.DOMSTRING_SIZE_ERR; + delete DOMException.HIERARCHY_REQUEST_ERR; + delete DOMException.WRONG_DOCUMENT_ERR; + delete DOMException.INVALID_CHARACTER_ERR; + delete DOMException.NO_DATA_ALLOWED_ERR; + delete DOMException.NO_MODIFICATION_ALLOWED_ERR; + delete DOMException.NOT_FOUND_ERR; + delete DOMException.NOT_SUPPORTED_ERR; + delete DOMException.INUSE_ATTRIBUTE_ERR; + delete DOMException.INVALID_STATE_ERR; + delete DOMException.SYNTAX_ERR; + delete DOMException.INVALID_MODIFICATION_ERR; + delete DOMException.NAMESPACE_ERR; + delete DOMException.INVALID_ACCESS_ERR; + delete DOMException.VALIDATION_ERR; + delete DOMException.TYPE_MISMATCH_ERR; + } +} diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/element.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/element.qml new file mode 100644 index 00000000..daec9503 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/element.qml @@ -0,0 +1,145 @@ +import QtQuick 1.0 + +QtObject { + property bool xmlTest: false + property bool dataOK: false + + function checkElement(e, person, fruit) + { + if (e.tagName != "root") + return; + + if (e.nodeName != "root") + return; + + if (e.nodeValue != null) + return; + + if (e.nodeType != 1) + return; + + var childTagNames = [ "person", "fruit" ]; + + if (e.childNodes.length != childTagNames.length) + return; + + for (var ii = 0; ii < childTagNames.length; ++ii) { + if (e.childNodes[ii].tagName != childTagNames[ii]) + return; + } + + if (e.childNodes[childTagNames.length + 1] != null) + return; + + // Check writing fails + e.childNodes[0] = null; + if (e.childNodes[0] == null) + return; + + e.childNodes[10] = 10; + if (e.childNodes[10] != null) + return; + + if (e.firstChild.tagName != e.childNodes[0].tagName) + return; + + if (e.lastChild.tagName != e.childNodes[1].tagName) + return; + + if (e.previousSibling != null) + return; + + if (e.nextSibling != null) + return; + + if (e.attributes == null) + return; + + if (e.attributes.length != 2) + return; + + var attr1 = e.attributes["attr"]; + if (attr1.nodeValue != "value") + return; + + var attrIdx = e.attributes[0]; + if (attrIdx.nodeValue != "value") + return; + + var attr2 = e.attributes["attr2"]; + if (attr2.nodeValue != "value2") + return; + + var attr3 = e.attributes["attr3"]; + if (attr3 != null) + return; + + var attrIdx2 = e.attributes[11]; + if (attrIdx2 != null) + return; + + // Check writing fails + e.attributes[0] = null; + if (e.attributes[0] == null) + return; + + e.attributes["attr"] = null; + if (e.attributes["attr"] == null) + return; + + e.attributes["attr3"] = 10; + if (e.attributes["attr3"] != null) + return; + + // Check person and fruit sub elements + if (person.parentNode.nodeName != "root") + return; + + if (person.previousSibling != null) + return; + + if (person.nextSibling.nodeName != "fruit") + return; + + if (fruit.parentNode.nodeName != "root") + return; + + if (fruit.previousSibling.nodeName != "person") + return; + + if (fruit.nextSibling != null) + return; + + xmlTest = true; + } + + function checkXML(document) + { + checkElement(document.documentElement, + document.documentElement.childNodes[0], + document.documentElement.childNodes[1]); + } + + Component.onCompleted: { + var x = new XMLHttpRequest; + + x.open("GET", "element.xml"); + + // Test to the end + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.DONE) { + + dataOK = true; + + if (x.responseXML != null) + checkXML(x.responseXML); + + } + } + + x.send() + } +} + + + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/element.xml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/element.xml new file mode 100644 index 00000000..071ffae0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/element.xml @@ -0,0 +1 @@ + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/getAllResponseHeaders.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/getAllResponseHeaders.qml new file mode 100644 index 00000000..686e7e5c --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/getAllResponseHeaders.qml @@ -0,0 +1,66 @@ +import QtQuick 1.0 + +QtObject { + property string url + + property bool unsentException: false + property bool openedException: false + + property bool readyState: false + property bool openedState: false + + property bool headersReceivedState: false + property bool headersReceivedHeader: false + + property bool doneState: false + property bool doneHeader: false + + property bool dataOK: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + + try { + x.getResponseHeader("Test-Header"); + } catch (e) { + if (e.code == DOMException.INVALID_STATE_ERR) + unsentException = true; + } + + if (x.readyState == XMLHttpRequest.UNSENT) + readyState = true; + + x.open("GET", url); + x.setRequestHeader("Accept-Language", "en-US"); + + if (x.readyState == XMLHttpRequest.OPENED) + openedState = true; + + try { + x.getResponseHeader("Test-Header"); + } catch (e) { + if (e.code == DOMException.INVALID_STATE_ERR) + openedException = true; + } + + var headers = "connection: close\r\ncontent-type: text/html; charset=UTF-8\r\ntest-header: TestValue\r\nmultitest-header: TestValue, SecondTestValue\r\ncontent-length: 11"; + + // Test to the end + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.HEADERS_RECEIVED) { + headersReceivedState = true; + + headersReceivedHeader = (x.getAllResponseHeaders() == headers); + } else if (x.readyState == XMLHttpRequest.DONE) { + doneState = headersReceivedState && true; + + doneHeader = (x.getAllResponseHeaders() == headers); + dataOK = (x.responseText == "QML Rocks!\n"); + } + } + + x.send() + } +} + + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/getAllResponseHeaders_args.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/getAllResponseHeaders_args.qml new file mode 100644 index 00000000..e8b7b770 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/getAllResponseHeaders_args.qml @@ -0,0 +1,23 @@ +import QtQuick 1.0 + +QtObject { + property bool exceptionThrown: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + + x.open("GET", "testdocument.html"); + x.send(); + + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.DONE) { + try { + x.getAllResponseHeaders("Test-header"); + } catch (e) { + if (e.code == DOMException.SYNTAX_ERR) + exceptionThrown = true; + } + } + } + } +} diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/getAllResponseHeaders_sent.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/getAllResponseHeaders_sent.qml new file mode 100644 index 00000000..1d4883ea --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/getAllResponseHeaders_sent.qml @@ -0,0 +1,20 @@ +import QtQuick 1.0 + +QtObject { + property bool test: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + + x.open("GET", "testdocument.html"); + x.send(); + + try { + x.getAllResponseHeaders(); + } catch (e) { + if (e.code == DOMException.INVALID_STATE_ERR) + test = true; + } + } +} + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/getAllResponseHeaders_unsent.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/getAllResponseHeaders_unsent.qml new file mode 100644 index 00000000..360286d3 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/getAllResponseHeaders_unsent.qml @@ -0,0 +1,16 @@ +import QtQuick 1.0 + +QtObject { + property bool test: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + + try { + x.getAllResponseHeaders(); + } catch (e) { + if (e.code == DOMException.INVALID_STATE_ERR) + test = true; + } + } +} diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/getResponseHeader.expect b/tests/auto/declarative/qdeclarativexmlhttprequest/data/getResponseHeader.expect new file mode 100644 index 00000000..c6cad706 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/getResponseHeader.expect @@ -0,0 +1,7 @@ +GET /testdocument.html HTTP/1.1 +ACCEPT-LANGUAGE: en-US +Connection: Keep-Alive +Accept-Encoding: gzip +User-Agent: Mozilla/5.0 +Host: 127.0.0.1:14445 + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/getResponseHeader.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/getResponseHeader.qml new file mode 100644 index 00000000..f37545e1 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/getResponseHeader.qml @@ -0,0 +1,76 @@ +import QtQuick 1.0 + +QtObject { + property string url + + property bool unsentException: false + property bool openedException: false + + property bool readyState: false + property bool openedState: false + + property bool headersReceivedState: false + property bool headersReceivedNullHeader: false + property bool headersReceivedValidHeader: false + property bool headersReceivedMultiValidHeader: false + property bool headersReceivedCookieHeader: false + + property bool doneState: false + property bool doneNullHeader: false + property bool doneValidHeader: false + property bool doneMultiValidHeader: false + property bool doneCookieHeader: false + + property bool dataOK: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + + try { + x.getResponseHeader("Test-Header"); + } catch (e) { + if (e.code == DOMException.INVALID_STATE_ERR) + unsentException = true; + } + + if (x.readyState == XMLHttpRequest.UNSENT) + readyState = true; + + x.open("GET", url); + x.setRequestHeader("Accept-Language", "en-US"); + + if (x.readyState == XMLHttpRequest.OPENED) + openedState = true; + + try { + x.getResponseHeader("Test-Header"); + } catch (e) { + if (e.code == DOMException.INVALID_STATE_ERR) + openedException = true; + } + + // Test to the end + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.HEADERS_RECEIVED) { + headersReceivedState = true; + + headersReceivedNullHeader = (x.getResponseHeader("Nonexistant-header") == ""); + headersReceivedValidHeader = (x.getResponseHeader("Test-HEAder") == "TestValue"); + headersReceivedMultiValidHeader = (x.getResponseHeader("MultiTest-HEAder") == "TestValue, SecondTestValue"); + headersReceivedCookieHeader = (x.getResponseHeader("Set-Cookie") == "" && x.getResponseHeader("Set-Cookie2") == ""); + } else if (x.readyState == XMLHttpRequest.DONE) { + doneState = headersReceivedState && true; + + doneNullHeader = (x.getResponseHeader("Nonexistant-header") == ""); + doneValidHeader = (x.getResponseHeader("Test-HEAder") == "TestValue"); + doneMultiValidHeader = (x.getResponseHeader("MultiTest-HEAder") == "TestValue, SecondTestValue"); + doneCookieHeader = (x.getResponseHeader("Set-Cookie") == "" && x.getResponseHeader("Set-Cookie2") == ""); + dataOK = (x.responseText == "QML Rocks!\n"); + } + } + + x.send() + } +} + + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/getResponseHeader.reply b/tests/auto/declarative/qdeclarativexmlhttprequest/data/getResponseHeader.reply new file mode 100644 index 00000000..c4b4bb27 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/getResponseHeader.reply @@ -0,0 +1,8 @@ +HTTP/1.0 200 OK +Connection: close +Content-type: text/html; charset=UTF-8 +Test-Header: TestValue +MultiTest-Header: TestValue +MultiTest-Header: SecondTestValue +Set-Cookie: mycook=Value +Set-Cookie2: mycook=Value diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/getResponseHeader_args.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/getResponseHeader_args.qml new file mode 100644 index 00000000..61ce9c6f --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/getResponseHeader_args.qml @@ -0,0 +1,23 @@ +import QtQuick 1.0 + +QtObject { + property bool exceptionThrown: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + + x.open("GET", "testdocument.html"); + x.send(); + + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.DONE) { + try { + x.getResponseHeader(); + } catch (e) { + if (e.code == DOMException.SYNTAX_ERR) + exceptionThrown = true; + } + } + } + } +} diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/getResponseHeader_sent.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/getResponseHeader_sent.qml new file mode 100644 index 00000000..7cd91a2a --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/getResponseHeader_sent.qml @@ -0,0 +1,20 @@ +import QtQuick 1.0 + +QtObject { + property bool test: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + + x.open("GET", "testdocument.html"); + x.send(); + + try { + x.getResponseHeader("Test-header"); + } catch (e) { + if (e.code == DOMException.INVALID_STATE_ERR) + test = true; + } + } +} + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/getResponseHeader_unsent.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/getResponseHeader_unsent.qml new file mode 100644 index 00000000..983ea1b8 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/getResponseHeader_unsent.qml @@ -0,0 +1,16 @@ +import QtQuick 1.0 + +QtObject { + property bool test: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + + try { + x.getResponseHeader("Test-header"); + } catch (e) { + if (e.code == DOMException.INVALID_STATE_ERR) + test = true; + } + } +} diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/instanceStateValues.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/instanceStateValues.qml new file mode 100644 index 00000000..79e06d48 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/instanceStateValues.qml @@ -0,0 +1,33 @@ +import QtQuick 1.0 + +QtObject { + property int unsent + property int opened + property int headers_received + property int loading + property int done + + Component.onCompleted: { + // Attempt to overwrite and delete values + var x = new XMLHttpRequest(); + + x.UNSENT = 9; + x.OPENED = 9; + x.HEADERS_RECEIVED = 9; + x.LOADING = 9; + x.DONE = 9; + + delete x.UNSENT; + delete x.OPENED; + delete x.HEADERS_RECEIVED; + delete x.LOADING; + delete x.DONE; + + unsent = x.UNSENT + opened = x.OPENED + headers_received = x.HEADERS_RECEIVED + loading = x.LOADING + done = x.DONE + } +} + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/invalidMethodUsage.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/invalidMethodUsage.qml new file mode 100644 index 00000000..68f22f5f --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/invalidMethodUsage.qml @@ -0,0 +1,160 @@ +import QtQuick 1.0 + +QtObject { + property bool onreadystatechange: false + property bool readyState: false + property bool status: false + property bool statusText: false + property bool responseText: false + property bool responseXML: false + + property bool open: false + property bool setRequestHeader: false + property bool send: false + property bool abort: false + property bool getResponseHeader: false + property bool getAllResponseHeaders: false + + Component.onCompleted: { + var o = 10; + + try { + XMLHttpRequest.prototype.onreadystatechange + } catch (e) { + if (!(e instanceof ReferenceError)) + return; + + if (e.message != "Not an XMLHttpRequest object") + return; + + onreadystatechange = true; + } + try { + XMLHttpRequest.prototype.readyState + } catch (e) { + if (!(e instanceof ReferenceError)) + return; + + if (e.message != "Not an XMLHttpRequest object") + return; + + readyState = true; + } + try { + XMLHttpRequest.prototype.status + } catch (e) { + if (!(e instanceof ReferenceError)) + return; + + if (e.message != "Not an XMLHttpRequest object") + return; + + status = true; + } + try { + XMLHttpRequest.prototype.statusText + } catch (e) { + if (!(e instanceof ReferenceError)) + return; + + if (e.message != "Not an XMLHttpRequest object") + return; + + statusText = true; + } + try { + XMLHttpRequest.prototype.responseText + } catch (e) { + if (!(e instanceof ReferenceError)) + return; + + if (e.message != "Not an XMLHttpRequest object") + return; + + responseText = true; + } + try { + XMLHttpRequest.prototype.responseXML + } catch (e) { + if (!(e instanceof ReferenceError)) + return; + + if (e.message != "Not an XMLHttpRequest object") + return; + + responseXML = true; + } + + try { + XMLHttpRequest.prototype.open.call(o); + } catch (e) { + if (!(e instanceof ReferenceError)) + return; + + if (e.message != "Not an XMLHttpRequest object") + return; + + open = true; + } + + try { + XMLHttpRequest.prototype.setRequestHeader.call(o); + } catch (e) { + if (!(e instanceof ReferenceError)) + return; + + if (e.message != "Not an XMLHttpRequest object") + return; + + setRequestHeader = true; + } + + try { + XMLHttpRequest.prototype.send.call(o); + } catch (e) { + if (!(e instanceof ReferenceError)) + return; + + if (e.message != "Not an XMLHttpRequest object") + return; + + send = true; + } + + try { + XMLHttpRequest.prototype.abort.call(o); + } catch (e) { + if (!(e instanceof ReferenceError)) + return; + + if (e.message != "Not an XMLHttpRequest object") + return; + + abort = true; + } + + try { + XMLHttpRequest.prototype.getResponseHeader.call(o); + } catch (e) { + if (!(e instanceof ReferenceError)) + return; + + if (e.message != "Not an XMLHttpRequest object") + return; + + getResponseHeader = true; + } + + try { + XMLHttpRequest.prototype.getAllResponseHeaders.call(o); + } catch (e) { + if (!(e instanceof ReferenceError)) + return; + + if (e.message != "Not an XMLHttpRequest object") + return; + + getAllResponseHeaders = true; + } + } +} diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/open.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/open.qml new file mode 100644 index 00000000..4bb5b1d6 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/open.qml @@ -0,0 +1,54 @@ +import QtQuick 1.0 + +QtObject { + property string url + + property bool readyState: false + property bool openedState: false + + property bool status: false + property bool statusText: false + property bool responseText: false + property bool responseXML: false + + property bool dataOK: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + + if (x.readyState == XMLHttpRequest.UNSENT) + readyState = true; + + x.open("GET", url); + x.setRequestHeader("Accept-Language","en-US"); + + if (x.readyState == XMLHttpRequest.OPENED) + openedState = true; + + try { + var a = x.status; + } catch (error) { + if (error.code == DOMException.INVALID_STATE_ERR) + status = true; + } + try { + var a = x.statusText; + } catch (error) { + if (error.code == DOMException.INVALID_STATE_ERR) + statusText = true; + } + responseText = (x.responseText == ""); + responseXML = (x.responseXML == null); + + // Test to the end + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.DONE) { + dataOK = (x.responseText == "QML Rocks!\n"); + } + } + + + x.send() + } +} + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/open_arg_count.1.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/open_arg_count.1.qml new file mode 100644 index 00000000..da6eb142 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/open_arg_count.1.qml @@ -0,0 +1,18 @@ +import QtQuick 1.0 + +QtObject { + property bool exceptionThrown: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + + try { + x.open("GET"); + } catch (e) { + if (e.code == DOMException.SYNTAX_ERR) + exceptionThrown = true; + } + } +} + + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/open_arg_count.2.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/open_arg_count.2.qml new file mode 100644 index 00000000..f0032927 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/open_arg_count.2.qml @@ -0,0 +1,18 @@ +import QtQuick 1.0 + +QtObject { + property bool exceptionThrown: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + + try { + x.open("GET", "http://www.nokia.com", true, "user", "password", "extra"); + } catch (e) { + if (e.code == DOMException.SYNTAX_ERR) + exceptionThrown = true; + } + } +} + + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/open_invalid_method.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/open_invalid_method.qml new file mode 100644 index 00000000..b87823d5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/open_invalid_method.qml @@ -0,0 +1,16 @@ +import QtQuick 1.0 + +QtObject { + property bool exceptionThrown: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + + try { + x.open("BLAH", "http://www.nokia.com"); + } catch (e) { + if (e.code == DOMException.SYNTAX_ERR) + exceptionThrown = true; + } + } +} diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/open_network.expect b/tests/auto/declarative/qdeclarativexmlhttprequest/data/open_network.expect new file mode 100644 index 00000000..c6cad706 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/open_network.expect @@ -0,0 +1,7 @@ +GET /testdocument.html HTTP/1.1 +ACCEPT-LANGUAGE: en-US +Connection: Keep-Alive +Accept-Encoding: gzip +User-Agent: Mozilla/5.0 +Host: 127.0.0.1:14445 + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/open_network.reply b/tests/auto/declarative/qdeclarativexmlhttprequest/data/open_network.reply new file mode 100644 index 00000000..7ae6951f --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/open_network.reply @@ -0,0 +1,3 @@ +HTTP/1.0 200 OK +Connection: close +Content-type: text/html; charset=UTF-8 diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/open_network.wait b/tests/auto/declarative/qdeclarativexmlhttprequest/data/open_network.wait new file mode 100644 index 00000000..e69de29b diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/open_sync.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/open_sync.qml new file mode 100644 index 00000000..9f8f3098 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/open_sync.qml @@ -0,0 +1,17 @@ +import QtQuick 1.0 + +QtObject { + property bool exceptionThrown: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + + try { + x.open("GET", "http://www.nokia.com", false); + } catch (e) { + if (e.code == DOMException.NOT_SUPPORTED_ERR) + exceptionThrown = true; + } + } +} + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/open_user.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/open_user.qml new file mode 100644 index 00000000..2bec3447 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/open_user.qml @@ -0,0 +1,54 @@ +import QtQuick 1.0 + +QtObject { + property string url + + property bool readyState: false + property bool openedState: false + + property bool status: false + property bool statusText: false + property bool responseText: false + property bool responseXML: false + + property bool dataOK: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + + if (x.readyState == XMLHttpRequest.UNSENT) + readyState = true; + + x.open("GET", url, true, "username", "password"); + x.setRequestHeader("Accept-Language","en-US"); + + if (x.readyState == XMLHttpRequest.OPENED) + openedState = true; + + try { + var a = x.status; + } catch (error) { + if (error.code == DOMException.INVALID_STATE_ERR) + status = true; + } + try { + var a = x.statusText; + } catch (error) { + if (error.code == DOMException.INVALID_STATE_ERR) + statusText = true; + } + responseText = (x.responseText == ""); + responseXML = (x.responseXML == null); + + // Test to the end + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.DONE) { + dataOK = (x.responseText == "QML Rocks!\n"); + } + } + + + x.send() + } +} + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/open_username.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/open_username.qml new file mode 100644 index 00000000..70f2fa62 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/open_username.qml @@ -0,0 +1,54 @@ +import QtQuick 1.0 + +QtObject { + property string url + + property bool readyState: false + property bool openedState: false + + property bool status: false + property bool statusText: false + property bool responseText: false + property bool responseXML: false + + property bool dataOK: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + + if (x.readyState == XMLHttpRequest.UNSENT) + readyState = true; + + x.open("GET", url, true, "sampleusername", "password"); + + if (x.readyState == XMLHttpRequest.OPENED) + openedState = true; + + try { + var a = x.status; + } catch (error) { + if (error.code == DOMException.INVALID_STATE_ERR) + status = true; + } + try { + var a = x.statusText; + } catch (error) { + if (error.code == DOMException.INVALID_STATE_ERR) + statusText = true; + } + responseText = (x.responseText == ""); + responseXML = (x.responseXML == null); + + // Test to the end + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.DONE) { + dataOK = (x.responseText == "QML Rocks!\n"); + } + } + + + x.send() + } +} + + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/redirectError.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/redirectError.qml new file mode 100644 index 00000000..f009ab78 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/redirectError.qml @@ -0,0 +1,23 @@ +import QtQuick 1.0 + +QtObject { + property string url + + property bool dataOK: false + property bool done: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + x.open("GET", url); + + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.DONE) { + done = true; + dataOK = x.status == 404; + } + } + + x.send(); + } +} + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/redirectRecur.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/redirectRecur.qml new file mode 100644 index 00000000..86337c43 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/redirectRecur.qml @@ -0,0 +1,23 @@ +import QtQuick 1.0 + +QtObject { + property string url + + property bool dataOK: false + property bool done: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + x.open("GET", url); + + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.DONE) { + done = true; + dataOK = x.status == 302; + } + } + + x.send(); + } +} + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/redirects.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/redirects.qml new file mode 100644 index 00000000..cd125adf --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/redirects.qml @@ -0,0 +1,22 @@ +import QtQuick 1.0 + +QtObject { + property string url + + property bool dataOK: false + property bool done: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + x.open("GET", url); + + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.DONE) { + done = true; + dataOK = x.responseText == "Redirected\n"; + } + } + + x.send(); + } +} diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/redirecttarget.html b/tests/auto/declarative/qdeclarativexmlhttprequest/data/redirecttarget.html new file mode 100644 index 00000000..95f35e01 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/redirecttarget.html @@ -0,0 +1 @@ +Redirected diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/responseText.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/responseText.qml new file mode 100644 index 00000000..da229f62 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/responseText.qml @@ -0,0 +1,54 @@ +import QtQuick 1.0 + +QtObject { + property string url + property string expectedText + + property bool unsent: false + property bool opened: false + property bool sent: false + property bool headersReceived: false + + property bool loading: false + property bool done: false + + property bool reset: false + + property bool dataOK: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + + unsent = (x.responseText == ""); + + x.open("GET", url); + x.setRequestHeader("Accept-Language", "en-US"); + + opened = (x.responseText == ""); + + // Test to the end + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.HEADERS_RECEIVED) { + headersReceived = (x.responseText == ""); + } else if (x.readyState == XMLHttpRequest.LOADING) { + if (x.responseText == expectedText) + loading = true; + } else if (x.readyState == XMLHttpRequest.DONE) { + if (x.responseText == expectedText) + done = true; + + dataOK = (x.responseText == expectedText); + + x.open("GET", url); + x.setRequestHeader("Accept-Language", "en-US"); + + reset = (x.responseText == ""); + } + } + + x.send() + + sent = (x.responseText == ""); + } +} + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/responseXML_invalid.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/responseXML_invalid.qml new file mode 100644 index 00000000..393ff09a --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/responseXML_invalid.qml @@ -0,0 +1,24 @@ +import QtQuick 1.0 + +QtObject { + property bool xmlNull: false + property bool dataOK: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + + x.open("GET", "testdocument.html"); + + // Test to the end + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.DONE) { + dataOK = (x.responseText == "QML Rocks!\n"); + xmlNull = (x.responseXML == null); + } + } + + + x.send() + } +} + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/seconddocument.html b/tests/auto/declarative/qdeclarativexmlhttprequest/data/seconddocument.html new file mode 100644 index 00000000..a33f44bc --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/seconddocument.html @@ -0,0 +1 @@ +This should not be read! diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_alreadySent.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_alreadySent.qml new file mode 100644 index 00000000..fd1c4247 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_alreadySent.qml @@ -0,0 +1,28 @@ +import QtQuick 1.0 + +QtObject { + property bool dataOK: false + property bool test: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + x.open("GET", "testdocument.html"); + x.setRequestHeader("Accept-Language","en-US"); + + // Test to the end + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.DONE) { + dataOK = (x.responseText == "QML Rocks!\n"); + } + } + + x.send(); + + try { + x.send() + } catch (e) { + if (e.code == DOMException.INVALID_STATE_ERR) + test = true; + } + } +} diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.1.expect b/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.1.expect new file mode 100644 index 00000000..2effbdcc --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.1.expect @@ -0,0 +1,10 @@ +POST /testdocument.html HTTP/1.1 +ACCEPT-LANGUAGE: en-US +Content-Type: text/plain;charset=UTF-8 +Content-Length: 12 +Connection: Keep-Alive +Accept-Encoding: gzip +User-Agent: Mozilla/5.0 +Host: 127.0.0.1:14445 + +My Sent Data \ No newline at end of file diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.1.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.1.qml new file mode 100644 index 00000000..3dd851e5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.1.qml @@ -0,0 +1,22 @@ +import QtQuick 1.0 + +QtObject { + property string url + + property bool dataOK: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + x.open("POST", url); + x.setRequestHeader("Accept-Language","en-US"); + + // Test to the end + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.DONE) { + dataOK = (x.responseText == "QML Rocks!\n"); + } + } + + x.send("My Sent Data"); + } +} diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.2.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.2.qml new file mode 100644 index 00000000..fb189362 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.2.qml @@ -0,0 +1,24 @@ +import QtQuick 1.0 + +QtObject { + property string url + + property bool dataOK: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + x.open("POST", url); + x.setRequestHeader("Content-Type", "text/plain;charset=UTF-8"); + x.setRequestHeader("Accept-Language","en-US"); + + // Test to the end + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.DONE) { + dataOK = (x.responseText == "QML Rocks!\n"); + } + } + + x.send("My Sent Data"); + } +} + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.3.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.3.qml new file mode 100644 index 00000000..9f2383e0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.3.qml @@ -0,0 +1,24 @@ +import QtQuick 1.0 + +QtObject { + property string url + + property bool dataOK: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + x.open("POST", url); + x.setRequestHeader("Content-Type", "text/plain;charset=latin1"); + x.setRequestHeader("Accept-Language","en-US"); + + // Test to the end + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.DONE) { + dataOK = (x.responseText == "QML Rocks!\n"); + } + } + + x.send("My Sent Data"); + } +} + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.4.expect b/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.4.expect new file mode 100644 index 00000000..83368607 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.4.expect @@ -0,0 +1,10 @@ +POST /testdocument.html HTTP/1.1 +ACCEPT-LANGUAGE: en-US +Content-Type: charset=UTF-8;text/plain +Content-Length: 12 +Connection: Keep-Alive +Accept-Encoding: gzip +User-Agent: Mozilla/5.0 +Host: 127.0.0.1:14445 + +My Sent Data \ No newline at end of file diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.4.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.4.qml new file mode 100644 index 00000000..410820e2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.4.qml @@ -0,0 +1,24 @@ +import QtQuick 1.0 + +QtObject { + property string url + + property bool dataOK: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + x.open("POST", url); + x.setRequestHeader("Content-Type", "charset=UTF-8;text/plain"); + x.setRequestHeader("Accept-Language","en-US"); + + // Test to the end + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.DONE) { + dataOK = (x.responseText == "QML Rocks!\n"); + } + } + + x.send("My Sent Data"); + } +} + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.5.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.5.qml new file mode 100644 index 00000000..f56c51b8 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.5.qml @@ -0,0 +1,24 @@ +import QtQuick 1.0 + +QtObject { + property string url + + property bool dataOK: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + x.open("POST", url); + x.setRequestHeader("Content-Type", "charset=latin1;text/plain"); + x.setRequestHeader("Accept-Language","en-US"); + + // Test to the end + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.DONE) { + dataOK = (x.responseText == "QML Rocks!\n"); + } + } + + x.send("My Sent Data"); + } +} + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.6.expect b/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.6.expect new file mode 100644 index 00000000..4f10bbc6 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.6.expect @@ -0,0 +1,10 @@ +PUT /testdocument.html HTTP/1.1 +ACCEPT-LANGUAGE: en-US +Content-Type: text/plain;charset=UTF-8 +Content-Length: 12 +Connection: Keep-Alive +Accept-Encoding: gzip +User-Agent: Mozilla/5.0 +Host: 127.0.0.1:14445 + +My Sent Data \ No newline at end of file diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.6.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.6.qml new file mode 100644 index 00000000..d44864cc --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.6.qml @@ -0,0 +1,22 @@ +import QtQuick 1.0 + +QtObject { + property string url + + property bool dataOK: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + x.open("PUT", url); + x.setRequestHeader("Accept-Language","en-US"); + + // Test to the end + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.DONE) { + dataOK = (x.responseText == "QML Rocks!\n"); + } + } + + x.send("My Sent Data"); + } +} diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.7.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.7.qml new file mode 100644 index 00000000..427d9f43 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.7.qml @@ -0,0 +1,24 @@ +import QtQuick 1.0 + +QtObject { + property string url + + property bool dataOK: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + x.open("POST", url); + x.setRequestHeader("Content-Type", "text/plain"); + x.setRequestHeader("Accept-Language","en-US"); + + // Test to the end + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.DONE) { + dataOK = (x.responseText == "QML Rocks!\n"); + } + } + + x.send("My Sent Data"); + } +} + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.reply b/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.reply new file mode 100644 index 00000000..7ae6951f --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_data.reply @@ -0,0 +1,3 @@ +HTTP/1.0 200 OK +Connection: close +Content-type: text/html; charset=UTF-8 diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_ignoreData.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_ignoreData.qml new file mode 100644 index 00000000..c98555cd --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_ignoreData.qml @@ -0,0 +1,27 @@ +import QtQuick 1.0 + +QtObject { + property string reqType + property string url + + property bool dataOK: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + x.open(reqType, url); + x.setRequestHeader("Accept-Language","en-US"); + + // Test to the end + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.DONE) { + if (reqType == "HEAD") + dataOK = (x.responseText == ""); + else + dataOK = (x.responseText == "QML Rocks!\n"); + } + } + + x.send("Data To Ignore"); + } +} + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_ignoreData.reply b/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_ignoreData.reply new file mode 100644 index 00000000..7ae6951f --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_ignoreData.reply @@ -0,0 +1,3 @@ +HTTP/1.0 200 OK +Connection: close +Content-type: text/html; charset=UTF-8 diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_ignoreData_GET.expect b/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_ignoreData_GET.expect new file mode 100644 index 00000000..c6cad706 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_ignoreData_GET.expect @@ -0,0 +1,7 @@ +GET /testdocument.html HTTP/1.1 +ACCEPT-LANGUAGE: en-US +Connection: Keep-Alive +Accept-Encoding: gzip +User-Agent: Mozilla/5.0 +Host: 127.0.0.1:14445 + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_ignoreData_PUT.expect b/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_ignoreData_PUT.expect new file mode 100644 index 00000000..74a97981 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_ignoreData_PUT.expect @@ -0,0 +1,7 @@ +HEAD /testdocument.html HTTP/1.1 +ACCEPT-LANGUAGE: en-US +Connection: Keep-Alive +Accept-Encoding: gzip +User-Agent: Mozilla/5.0 +Host: 127.0.0.1:14445 + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_unsent.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_unsent.qml new file mode 100644 index 00000000..badd7296 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/send_unsent.qml @@ -0,0 +1,16 @@ +import QtQuick 1.0 + +QtObject { + property bool test: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + + try { + x.send(); + } catch (e) { + if (e.code == DOMException.INVALID_STATE_ERR) + test = true; + } + } +} diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/setRequestHeader.expect b/tests/auto/declarative/qdeclarativexmlhttprequest/data/setRequestHeader.expect new file mode 100644 index 00000000..7b8e260f --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/setRequestHeader.expect @@ -0,0 +1,9 @@ +GET /testdocument.html HTTP/1.1 +ACCEPT-LANGUAGE: en-US +TEST-HEADER: value +TEST-HEADER2: value,value2 +Connection: Keep-Alive +Accept-Encoding: gzip +User-Agent: Mozilla/5.0 +Host: 127.0.0.1:14445 + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/setRequestHeader.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/setRequestHeader.qml new file mode 100644 index 00000000..5afab091 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/setRequestHeader.qml @@ -0,0 +1,29 @@ +import QtQuick 1.0 + +QtObject { + property string url + + property bool dataOK: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + + x.open("GET", url); + x.setRequestHeader("Accept-Language","en-US"); + + x.setRequestHeader("Test-header", "value"); + x.setRequestHeader("Test-header2", "value"); + x.setRequestHeader("Test-header2", "value2"); + + // Test to the end + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.DONE) { + dataOK = (x.responseText == "QML Rocks!\n"); + } + } + + x.send(); + } +} + + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/setRequestHeader.reply b/tests/auto/declarative/qdeclarativexmlhttprequest/data/setRequestHeader.reply new file mode 100644 index 00000000..7ae6951f --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/setRequestHeader.reply @@ -0,0 +1,3 @@ +HTTP/1.0 200 OK +Connection: close +Content-type: text/html; charset=UTF-8 diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/setRequestHeader_args.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/setRequestHeader_args.qml new file mode 100644 index 00000000..4558f0e5 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/setRequestHeader_args.qml @@ -0,0 +1,18 @@ +import QtQuick 1.0 + +QtObject { + property bool exceptionThrown: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + + x.open("GET", "testdocument.html"); + + try { + x.setRequestHeader("Test-header"); + } catch (e) { + if (e.code == DOMException.SYNTAX_ERR) + exceptionThrown = true; + } + } +} diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/setRequestHeader_illegalName.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/setRequestHeader_illegalName.qml new file mode 100644 index 00000000..b15318c1 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/setRequestHeader_illegalName.qml @@ -0,0 +1,58 @@ +import QtQuick 1.0 + +QtObject { + property string url + property string header + + property bool readyState: false + property bool openedState: false + + property bool status: false + property bool statusText: false + property bool responseText: false + property bool responseXML: false + + property bool dataOK: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + + if (x.readyState == XMLHttpRequest.UNSENT) + readyState = true; + + x.open("GET", url); + x.setRequestHeader("Accept-Language","en-US"); + + x.setRequestHeader(header, "Value"); + + if (x.readyState == XMLHttpRequest.OPENED) + openedState = true; + + try { + var a = x.status; + } catch (error) { + if (error.code == DOMException.INVALID_STATE_ERR) + status = true; + } + try { + var a = x.statusText; + } catch (error) { + if (error.code == DOMException.INVALID_STATE_ERR) + statusText = true; + } + responseText = (x.responseText == ""); + responseXML = (x.responseXML == null); + + // Test to the end + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.DONE) { + dataOK = (x.responseText == "QML Rocks!\n"); + } + } + + + x.send() + } +} + + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/setRequestHeader_sent.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/setRequestHeader_sent.qml new file mode 100644 index 00000000..3b9a91e2 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/setRequestHeader_sent.qml @@ -0,0 +1,32 @@ +import QtQuick 1.0 + +QtObject { + property string url + property bool test: false + + property bool dataOK: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + + x.open("GET", url); + x.setRequestHeader("Accept-Language","en-US"); + + // Test to the end + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.DONE) { + dataOK = (x.responseText == "QML Rocks!\n"); + } + } + + x.send(); + + try { + x.setRequestHeader("Test-header", "value"); + } catch (e) { + if (e.code == DOMException.INVALID_STATE_ERR) + test = true; + } + } +} + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/setRequestHeader_unsent.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/setRequestHeader_unsent.qml new file mode 100644 index 00000000..327fa7fb --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/setRequestHeader_unsent.qml @@ -0,0 +1,17 @@ +import QtQuick 1.0 + +QtObject { + property bool test: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + + try { + x.setRequestHeader("Test-header", "value"); + } catch (e) { + if (e.code == DOMException.INVALID_STATE_ERR) + test = true; + } + } +} + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/staticStateValues.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/staticStateValues.qml new file mode 100644 index 00000000..bc22d877 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/staticStateValues.qml @@ -0,0 +1,24 @@ +import QtQuick 1.0 + +QtObject { + property int unsent: XMLHttpRequest.UNSENT + property int opened: XMLHttpRequest.OPENED + property int headers_received: XMLHttpRequest.HEADERS_RECEIVED + property int loading: XMLHttpRequest.LOADING + property int done: XMLHttpRequest.DONE + + Component.onCompleted: { + // Attempt to overwrite and delete values + XMLHttpRequest.UNSENT = 9; + XMLHttpRequest.OPENED = 9; + XMLHttpRequest.HEADERS_RECEIVED = 9; + XMLHttpRequest.LOADING = 9; + XMLHttpRequest.DONE = 9; + + delete XMLHttpRequest.UNSENT; + delete XMLHttpRequest.OPENED; + delete XMLHttpRequest.HEADERS_RECEIVED; + delete XMLHttpRequest.LOADING; + delete XMLHttpRequest.DONE; + } +} diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/status.200.reply b/tests/auto/declarative/qdeclarativexmlhttprequest/data/status.200.reply new file mode 100644 index 00000000..7ae6951f --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/status.200.reply @@ -0,0 +1,3 @@ +HTTP/1.0 200 OK +Connection: close +Content-type: text/html; charset=UTF-8 diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/status.404.reply b/tests/auto/declarative/qdeclarativexmlhttprequest/data/status.404.reply new file mode 100644 index 00000000..2e29f56d --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/status.404.reply @@ -0,0 +1,3 @@ +HTTP/1.0 404 Document not found +Connection: close +Content-type: text/html; charset=UTF-8 diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/status.expect b/tests/auto/declarative/qdeclarativexmlhttprequest/data/status.expect new file mode 100644 index 00000000..c6cad706 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/status.expect @@ -0,0 +1,7 @@ +GET /testdocument.html HTTP/1.1 +ACCEPT-LANGUAGE: en-US +Connection: Keep-Alive +Accept-Encoding: gzip +User-Agent: Mozilla/5.0 +Host: 127.0.0.1:14445 + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/status.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/status.qml new file mode 100644 index 00000000..7aa08743 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/status.qml @@ -0,0 +1,79 @@ +import QtQuick 1.0 + +QtObject { + property string url + property int expectedStatus + + property bool unsentException: false; + property bool openedException: false; + property bool sentException: false; + + property bool headersReceived: false + property bool loading: false + property bool done: false + + property bool resetException: false + + property bool dataOK: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + + try { + var a = x.status; + } catch (e) { + if (e.code == DOMException.INVALID_STATE_ERR) + unsentException = true; + } + + x.open("GET", url); + x.setRequestHeader("Accept-Language", "en-US"); + + try { + var a = x.status; + } catch (e) { + if (e.code == DOMException.INVALID_STATE_ERR) + openedException = true; + } + + // Test to the end + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.HEADERS_RECEIVED) { + if (x.status == expectedStatus) + headersReceived = true; + } else if (x.readyState == XMLHttpRequest.LOADING) { + if (x.status == expectedStatus) + loading = true; + } else if (x.readyState == XMLHttpRequest.DONE) { + if (x.status == expectedStatus) + done = true; + + if (expectedStatus == 404) { + dataOK = (x.responseText == ""); + } else { + dataOK = (x.responseText == "QML Rocks!\n"); + } + + x.open("GET", url); + x.setRequestHeader("Accept-Language", "en-US"); + + try { + var a = x.status; + } catch (e) { + if (e.code == DOMException.INVALID_STATE_ERR) + resetException = true; + } + + } + } + + x.send() + + try { + var a = x.status; + } catch (e) { + if (e.code == DOMException.INVALID_STATE_ERR) + sentException = true; + } + } +} diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/statusText.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/statusText.qml new file mode 100644 index 00000000..d42e0cca --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/statusText.qml @@ -0,0 +1,79 @@ +import QtQuick 1.0 + +QtObject { + property string url + property string expectedStatus + + property bool unsentException: false; + property bool openedException: false; + property bool sentException: false; + + property bool headersReceived: false + property bool loading: false + property bool done: false + + property bool resetException: false + + property bool dataOK: false + + Component.onCompleted: { + var x = new XMLHttpRequest; + + try { + var a = x.statusText; + } catch (e) { + if (e.code == DOMException.INVALID_STATE_ERR) + unsentException = true; + } + + x.open("GET", url); + x.setRequestHeader("Accept-Language", "en-US"); + + try { + var a = x.statusText; + } catch (e) { + if (e.code == DOMException.INVALID_STATE_ERR) + openedException = true; + } + + // Test to the end + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.HEADERS_RECEIVED) { + if (x.statusText == expectedStatus) + headersReceived = true; + } else if (x.readyState == XMLHttpRequest.LOADING) { + if (x.statusText == expectedStatus) + loading = true; + } else if (x.readyState == XMLHttpRequest.DONE) { + if (x.statusText == expectedStatus) + done = true; + + if (expectedStatus != "OK") { + dataOK = (x.responseText == ""); + } else { + dataOK = (x.responseText == "QML Rocks!\n"); + } + + x.open("GET", url); + x.setRequestHeader("Accept-Language", "en-US"); + + try { + var a = x.statusText; + } catch (e) { + if (e.code == DOMException.INVALID_STATE_ERR) + resetException = true; + } + + } + } + + x.send() + + try { + var a = x.statusText; + } catch (e) { + if (e.code == DOMException.INVALID_STATE_ERR) + sentException = true; + } + } +} diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/testdocument.html b/tests/auto/declarative/qdeclarativexmlhttprequest/data/testdocument.html new file mode 100644 index 00000000..8fe0f4b0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/testdocument.html @@ -0,0 +1 @@ +QML Rocks! diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/text.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/text.qml new file mode 100644 index 00000000..e8c87312 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/text.qml @@ -0,0 +1,129 @@ +import QtQuick 1.0 + +QtObject { + property bool xmlTest: false + property bool dataOK: false + + function checkText(text, whitespacetext) + { + if (text == null) + return; + + if (text.nodeName != "#text") + return; + + if (text.nodeValue != "Hello world!") + return; + + if (text.nodeType != 3) + return; + + if (text.parentNode.nodeName != "item") + return; + + if (text.childNodes.length != 0) + return; + + if (text.firstChild != null) + return; + + if (text.lastChild != null) + return; + + if (text.previousSibling != null) + return; + + if (text.nextSibling != null) + return; + + if (text.attributes != null) + return; + + if (text.wholeText != "Hello world!") + return; + + if (text.data != "Hello world!") + return; + + if (text.length != 12) + return; + + if (text.isElementContentWhitespace != false) + return; + + if (whitespacetext.nodeName != "#text") + return; + + if (whitespacetext.nodeValue != " ") + return; + + if (whitespacetext.nodeType != 3) + return; + + if (whitespacetext.parentNode.nodeName != "item") + return; + + if (whitespacetext.childNodes.length != 0) + return; + + if (whitespacetext.firstChild != null) + return; + + if (whitespacetext.lastChild != null) + return; + + if (whitespacetext.previousSibling != null) + return; + + if (whitespacetext.nextSibling != null) + return; + + if (whitespacetext.attributes != null) + return; + + if (whitespacetext.wholeText != " ") + return; + + if (whitespacetext.data != " ") + return; + + if (whitespacetext.length != 3) + return; + + if (whitespacetext.isElementContentWhitespace != true) + return; + + xmlTest = true; + } + + function checkXML(document) + { + checkText(document.documentElement.childNodes[0].childNodes[0], + document.documentElement.childNodes[1].childNodes[0]); + + } + + Component.onCompleted: { + var x = new XMLHttpRequest; + + x.open("GET", "text.xml"); + + // Test to the end + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.DONE) { + + dataOK = true; + + if (x.responseXML != null) + checkXML(x.responseXML); + + } + } + + x.send() + } +} + + + + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/text.xml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/text.xml new file mode 100644 index 00000000..e7416888 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/text.xml @@ -0,0 +1 @@ +Hello world! diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/utf16.html b/tests/auto/declarative/qdeclarativexmlhttprequest/data/utf16.html new file mode 100644 index 00000000..b640733f --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/utf16.html @@ -0,0 +1 @@ +უ Σ diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/utf16.qml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/utf16.qml new file mode 100644 index 00000000..0f9da309 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/data/utf16.qml @@ -0,0 +1,29 @@ +import QtQuick 1.0 + +QtObject { + property bool dataOK: false + + property string fileName + property string responseText + property string responseXmlRootNodeValue + + function startRequest() { + var x = new XMLHttpRequest; + + x.open("GET", fileName); + + // Test to the end + x.onreadystatechange = function() { + if (x.readyState == XMLHttpRequest.DONE) { + + responseText = x.responseText + if (x.responseXML) + responseXmlRootNodeValue = x.responseXML.documentElement.childNodes[0].nodeValue + + dataOK = true; + } + } + x.send() + } +} + diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/data/utf16.xml b/tests/auto/declarative/qdeclarativexmlhttprequest/data/utf16.xml new file mode 100644 index 00000000..0fbb126e Binary files /dev/null and b/tests/auto/declarative/qdeclarativexmlhttprequest/data/utf16.xml differ diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/qdeclarativexmlhttprequest.pro b/tests/auto/declarative/qdeclarativexmlhttprequest/qdeclarativexmlhttprequest.pro new file mode 100644 index 00000000..4b5bf6eb --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/qdeclarativexmlhttprequest.pro @@ -0,0 +1,21 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative network +macx:CONFIG -= app_bundle + +INCLUDEPATH += ../shared/ +HEADERS += ../shared/testhttpserver.h + +SOURCES += tst_qdeclarativexmlhttprequest.cpp \ + ../shared/testhttpserver.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + +CONFIG+=insignificant_test # QTQAINFRA-428 diff --git a/tests/auto/declarative/qdeclarativexmlhttprequest/tst_qdeclarativexmlhttprequest.cpp b/tests/auto/declarative/qdeclarativexmlhttprequest/tst_qdeclarativexmlhttprequest.cpp new file mode 100644 index 00000000..879910dc --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmlhttprequest/tst_qdeclarativexmlhttprequest.cpp @@ -0,0 +1,1129 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#include +#include "testhttpserver.h" +#include "../../../shared/util.h" + +#define SERVER_PORT 14445 + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +class tst_qdeclarativexmlhttprequest : public QObject +{ + Q_OBJECT +public: + tst_qdeclarativexmlhttprequest() {} + +private slots: + void domExceptionCodes(); + void callbackException(); + void callbackException_data(); + void staticStateValues(); + void instanceStateValues(); + void constructor(); + void defaultState(); + void open(); + void open_data(); + void open_invalid_method(); + void open_sync(); + void open_arg_count(); + void setRequestHeader(); + void setRequestHeader_unsent(); + void setRequestHeader_illegalName_data(); + void setRequestHeader_illegalName(); + void setRequestHeader_sent(); + void setRequestHeader_args(); + void send_unsent(); + void send_alreadySent(); + void send_ignoreData(); + void send_withdata(); + void send_withdata_data(); + void abort(); + void abort_unsent(); + void abort_opened(); + void getResponseHeader(); + void getResponseHeader_unsent(); + void getResponseHeader_sent(); + void getResponseHeader_args(); + void getAllResponseHeaders(); + void getAllResponseHeaders_unsent(); + void getAllResponseHeaders_sent(); + void getAllResponseHeaders_args(); + void status(); + void status_data(); + void statusText(); + void statusText_data(); + void responseText(); + void responseText_data(); + void responseXML_invalid(); + void invalidMethodUsage(); + void redirects(); + void nonUtf8(); + void nonUtf8_data(); + + // Attributes + void document(); + void element(); + void attr(); + void text(); + void cdata(); + + // Crashes + // void outstanding_request_at_shutdown(); + + // void network_errors() + // void readyState() + +private: + QDeclarativeEngine engine; +}; + +inline QUrl TEST_FILE(const QString &filename) +{ + return QUrl::fromLocalFile(QLatin1String(SRCDIR) + QLatin1String("/data/") + filename); +} + +// Test that the dom exception codes are correct +void tst_qdeclarativexmlhttprequest::domExceptionCodes() +{ + QDeclarativeComponent component(&engine, TEST_FILE("domExceptionCodes.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("index_size_err").toInt(), 1); + QCOMPARE(object->property("domstring_size_err").toInt(), 2); + QCOMPARE(object->property("hierarchy_request_err").toInt(), 3); + QCOMPARE(object->property("wrong_document_err").toInt(), 4); + QCOMPARE(object->property("invalid_character_err").toInt(), 5); + QCOMPARE(object->property("no_data_allowed_err").toInt(), 6); + QCOMPARE(object->property("no_modification_allowed_err").toInt(), 7); + QCOMPARE(object->property("not_found_err").toInt(), 8); + QCOMPARE(object->property("not_supported_err").toInt(), 9); + QCOMPARE(object->property("inuse_attribute_err").toInt(), 10); + QCOMPARE(object->property("invalid_state_err").toInt(), 11); + QCOMPARE(object->property("syntax_err").toInt(), 12); + QCOMPARE(object->property("invalid_modification_err").toInt(), 13); + QCOMPARE(object->property("namespace_err").toInt(), 14); + QCOMPARE(object->property("invalid_access_err").toInt(), 15); + QCOMPARE(object->property("validation_err").toInt(), 16); + QCOMPARE(object->property("type_mismatch_err").toInt(), 17); + + delete object; +} + +void tst_qdeclarativexmlhttprequest::callbackException_data() +{ + QTest::addColumn("which"); + QTest::addColumn("line"); + + QTest::newRow("on-opened") << "1" << 15; + QTest::newRow("on-loading") << "3" << 15; + QTest::newRow("on-done") << "4" << 15; +} + +void tst_qdeclarativexmlhttprequest::callbackException() +{ + // Test exception reporting for exceptions thrown at various points. + + QFETCH(QString, which); + QFETCH(int, line); + + QString expect = TEST_FILE("callbackException.qml").toString() + ":"+QString::number(line)+": Error: Exception from Callback"; + QTest::ignoreMessage(QtWarningMsg, expect.toLatin1()); + + QDeclarativeComponent component(&engine, TEST_FILE("callbackException.qml")); + QObject *object = component.beginCreate(engine.rootContext()); + QVERIFY(object != 0); + object->setProperty("url", "testdocument.html"); + object->setProperty("which", which); + component.completeCreate(); + + QTRY_VERIFY(object->property("threw").toBool() == true); + + delete object; +} + +// Test that the state value properties on the XMLHttpRequest constructor have the correct values. +// ### WebKit does not do this, but it seems to fit the standard and QML better +void tst_qdeclarativexmlhttprequest::staticStateValues() +{ + QDeclarativeComponent component(&engine, TEST_FILE("staticStateValues.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("unsent").toInt(), 0); + QCOMPARE(object->property("opened").toInt(), 1); + QCOMPARE(object->property("headers_received").toInt(), 2); + QCOMPARE(object->property("loading").toInt(), 3); + QCOMPARE(object->property("done").toInt(), 4); + + delete object; +} + +// Test that the state value properties on instances have the correct values. +void tst_qdeclarativexmlhttprequest::instanceStateValues() +{ + QDeclarativeComponent component(&engine, TEST_FILE("instanceStateValues.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("unsent").toInt(), 0); + QCOMPARE(object->property("opened").toInt(), 1); + QCOMPARE(object->property("headers_received").toInt(), 2); + QCOMPARE(object->property("loading").toInt(), 3); + QCOMPARE(object->property("done").toInt(), 4); + + delete object; +} + +// Test calling constructor +void tst_qdeclarativexmlhttprequest::constructor() +{ + QDeclarativeComponent component(&engine, TEST_FILE("constructor.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("calledAsConstructor").toBool(), true); + QCOMPARE(object->property("calledAsFunction").toBool(), true); + + delete object; +} + +// Test that all the properties are set correctly before any request is sent +void tst_qdeclarativexmlhttprequest::defaultState() +{ + QDeclarativeComponent component(&engine, TEST_FILE("defaultState.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("readState").toInt(), 0); + QCOMPARE(object->property("statusIsException").toBool(), true); + QCOMPARE(object->property("statusTextIsException").toBool(), true); + QCOMPARE(object->property("responseText").toString(), QString()); + QCOMPARE(object->property("responseXMLIsNull").toBool(), true); + + delete object; +} + +// Test valid XMLHttpRequest.open() calls +void tst_qdeclarativexmlhttprequest::open() +{ + QFETCH(QUrl, qmlFile); + QFETCH(QString, url); + QFETCH(bool, remote); + + TestHTTPServer *server = 0; + if (remote) { + server = new TestHTTPServer(SERVER_PORT); + QVERIFY(server->isValid()); + QVERIFY(server->wait(TEST_FILE("open_network.expect"), + TEST_FILE("open_network.reply"), + TEST_FILE("testdocument.html"))); + } + + QDeclarativeComponent component(&engine, qmlFile); + QObject *object = component.beginCreate(engine.rootContext()); + QVERIFY(object != 0); + object->setProperty("url", url); + component.completeCreate(); + + QCOMPARE(object->property("readyState").toBool(), true); + QCOMPARE(object->property("openedState").toBool(), true); + QCOMPARE(object->property("status").toBool(), true); + QCOMPARE(object->property("statusText").toBool(), true); + QCOMPARE(object->property("responseText").toBool(), true); + QCOMPARE(object->property("responseXML").toBool(), true); + + QTRY_VERIFY(object->property("dataOK").toBool() == true); + + delete server; + delete object; +} + +void tst_qdeclarativexmlhttprequest::open_data() +{ + QTest::addColumn("qmlFile"); + QTest::addColumn("url"); + QTest::addColumn("remote"); + + QTest::newRow("Relative url)") << TEST_FILE("open.qml") << "testdocument.html" << false; + QTest::newRow("Absolute url)") << TEST_FILE("open.qml") << TEST_FILE("testdocument.html").toString() << false; + QTest::newRow("Absolute network url)") << TEST_FILE("open.qml") << "http://127.0.0.1:14445/testdocument.html" << true; + + // ### Check that the username/password were sent to the server + QTest::newRow("User/pass") << TEST_FILE("open_user.qml") << "http://127.0.0.1:14445/testdocument.html" << true; +} + +// Test that calling XMLHttpRequest.open() with an invalid method raises an exception +void tst_qdeclarativexmlhttprequest::open_invalid_method() +{ + QDeclarativeComponent component(&engine, TEST_FILE("open_invalid_method.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("exceptionThrown").toBool(), true); + + delete object; +} + +// Test that calling XMLHttpRequest.open() with sync raises an exception +void tst_qdeclarativexmlhttprequest::open_sync() +{ + QDeclarativeComponent component(&engine, TEST_FILE("open_sync.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("exceptionThrown").toBool(), true); + + delete object; +} + +// Calling with incorrect arg count raises an exception +void tst_qdeclarativexmlhttprequest::open_arg_count() +{ + { + QDeclarativeComponent component(&engine, TEST_FILE("open_arg_count.1.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("exceptionThrown").toBool(), true); + + delete object; + } + + { + QDeclarativeComponent component(&engine, TEST_FILE("open_arg_count.2.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("exceptionThrown").toBool(), true); + + delete object; + } +} + +// Test valid setRequestHeader() calls +void tst_qdeclarativexmlhttprequest::setRequestHeader() +{ + TestHTTPServer server(SERVER_PORT); + QVERIFY(server.isValid()); + QVERIFY(server.wait(TEST_FILE("setRequestHeader.expect"), + TEST_FILE("setRequestHeader.reply"), + TEST_FILE("testdocument.html"))); + + QDeclarativeComponent component(&engine, TEST_FILE("setRequestHeader.qml")); + QObject *object = component.beginCreate(engine.rootContext()); + QVERIFY(object != 0); + object->setProperty("url", "http://127.0.0.1:14445/testdocument.html"); + component.completeCreate(); + + QTRY_VERIFY(object->property("dataOK").toBool() == true); + + delete object; +} + +// Test setting headers before open() throws exception +void tst_qdeclarativexmlhttprequest::setRequestHeader_unsent() +{ + QDeclarativeComponent component(&engine, TEST_FILE("setRequestHeader_unsent.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("test").toBool(), true); + + delete object; +} + +void tst_qdeclarativexmlhttprequest::setRequestHeader_illegalName_data() +{ + QTest::addColumn("name"); + + QTest::newRow("Accept-Charset") << "AccePT-CHArset"; + QTest::newRow("Accept-Encoding") << "AccEpt-EnCOding"; + QTest::newRow("Connection") << "ConnECtion"; + QTest::newRow("Content-Length") << "ContEnt-LenGth"; + QTest::newRow("Cookie") << "CookIe"; + QTest::newRow("Cookie2") << "CoOkie2"; + QTest::newRow("Content-Transfer-Encoding") << "ConteNT-tRANSFER-eNCOding"; + QTest::newRow("Date") << "DaTE"; + QTest::newRow("Expect") << "ExPect"; + QTest::newRow("Host") << "HoST"; + QTest::newRow("Keep-Alive") << "KEEP-aLive"; + QTest::newRow("Referer") << "ReferEr"; + QTest::newRow("TE") << "Te"; + QTest::newRow("Trailer") << "TraILEr"; + QTest::newRow("Transfer-Encoding") << "tRANsfer-Encoding"; + QTest::newRow("Upgrade") << "UpgrADe"; + QTest::newRow("User-Agent") << "uSEr-Agent"; + QTest::newRow("Via") << "vIa"; + QTest::newRow("Proxy-") << "ProXy-"; + QTest::newRow("Sec-") << "SeC-"; + QTest::newRow("Proxy-*") << "Proxy-BLAH"; + QTest::newRow("Sec-*") << "Sec-F"; +} + +// Tests that using illegal header names has no effect +void tst_qdeclarativexmlhttprequest::setRequestHeader_illegalName() +{ + QFETCH(QString, name); + + TestHTTPServer server(SERVER_PORT); + QVERIFY(server.isValid()); + QVERIFY(server.wait(TEST_FILE("open_network.expect"), + TEST_FILE("open_network.reply"), + TEST_FILE("testdocument.html"))); + + QDeclarativeComponent component(&engine, TEST_FILE("setRequestHeader_illegalName.qml")); + QObject *object = component.beginCreate(engine.rootContext()); + QVERIFY(object != 0); + object->setProperty("url", "http://127.0.0.1:14445/testdocument.html"); + object->setProperty("header", name); + component.completeCreate(); + + QCOMPARE(object->property("readyState").toBool(), true); + QCOMPARE(object->property("openedState").toBool(), true); + QCOMPARE(object->property("status").toBool(), true); + QCOMPARE(object->property("statusText").toBool(), true); + QCOMPARE(object->property("responseText").toBool(), true); + QCOMPARE(object->property("responseXML").toBool(), true); + + QTRY_VERIFY(object->property("dataOK").toBool() == true); + + delete object; +} + +// Test that attempting to set a header after a request is sent throws an exception +void tst_qdeclarativexmlhttprequest::setRequestHeader_sent() +{ + TestHTTPServer server(SERVER_PORT); + QVERIFY(server.isValid()); + QVERIFY(server.wait(TEST_FILE("open_network.expect"), + TEST_FILE("open_network.reply"), + TEST_FILE("testdocument.html"))); + + QDeclarativeComponent component(&engine, TEST_FILE("setRequestHeader_sent.qml")); + QObject *object = component.beginCreate(engine.rootContext()); + QVERIFY(object != 0); + object->setProperty("url", "http://127.0.0.1:14445/testdocument.html"); + component.completeCreate(); + + QCOMPARE(object->property("test").toBool(), true); + + QTRY_VERIFY(object->property("dataOK").toBool() == true); + + delete object; +} + +// Invalid arg count throws exception +void tst_qdeclarativexmlhttprequest::setRequestHeader_args() +{ + QDeclarativeComponent component(&engine, TEST_FILE("setRequestHeader_args.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("exceptionThrown").toBool(), true); + + delete object; +} + +// Test that calling send() in UNSENT state throws an exception +void tst_qdeclarativexmlhttprequest::send_unsent() +{ + QDeclarativeComponent component(&engine, TEST_FILE("send_unsent.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("test").toBool(), true); + + delete object; +} + +// Test attempting to resend a sent request throws an exception +void tst_qdeclarativexmlhttprequest::send_alreadySent() +{ + QDeclarativeComponent component(&engine, TEST_FILE("send_alreadySent.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("test").toBool(), true); + QTRY_VERIFY(object->property("dataOK").toBool() == true); + + delete object; +} + +// Test that send for a GET or HEAD ignores data +void tst_qdeclarativexmlhttprequest::send_ignoreData() +{ + { + TestHTTPServer server(SERVER_PORT); + QVERIFY(server.isValid()); + QVERIFY(server.wait(TEST_FILE("send_ignoreData_GET.expect"), + TEST_FILE("send_ignoreData.reply"), + TEST_FILE("testdocument.html"))); + + QDeclarativeComponent component(&engine, TEST_FILE("send_ignoreData.qml")); + QObject *object = component.beginCreate(engine.rootContext()); + QVERIFY(object != 0); + object->setProperty("reqType", "GET"); + object->setProperty("url", "http://127.0.0.1:14445/testdocument.html"); + component.completeCreate(); + + QTRY_VERIFY(object->property("dataOK").toBool() == true); + + delete object; + } + + { + TestHTTPServer server(SERVER_PORT); + QVERIFY(server.isValid()); + QVERIFY(server.wait(TEST_FILE("send_ignoreData_PUT.expect"), + TEST_FILE("send_ignoreData.reply"), + TEST_FILE("testdocument.html"))); + + QDeclarativeComponent component(&engine, TEST_FILE("send_ignoreData.qml")); + QObject *object = component.beginCreate(engine.rootContext()); + QVERIFY(object != 0); + object->setProperty("reqType", "HEAD"); + object->setProperty("url", "http://127.0.0.1:14445/testdocument.html"); + component.completeCreate(); + + QTRY_VERIFY(object->property("dataOK").toBool() == true); + + delete object; + } +} + +// Test that send()'ing data works +void tst_qdeclarativexmlhttprequest::send_withdata() +{ + QFETCH(QString, file_expected); + QFETCH(QString, file_qml); + + TestHTTPServer server(SERVER_PORT); + QVERIFY(server.isValid()); + QVERIFY(server.wait(TEST_FILE(file_expected), + TEST_FILE("send_data.reply"), + TEST_FILE("testdocument.html"))); + + QDeclarativeComponent component(&engine, TEST_FILE(file_qml)); + QObject *object = component.beginCreate(engine.rootContext()); + QVERIFY(object != 0); + object->setProperty("url", "http://127.0.0.1:14445/testdocument.html"); + component.completeCreate(); + + QTRY_VERIFY(object->property("dataOK").toBool() == true); + + delete object; +} + +void tst_qdeclarativexmlhttprequest::send_withdata_data() +{ + QTest::addColumn("file_expected"); + QTest::addColumn("file_qml"); + + QTest::newRow("No content-type") << "send_data.1.expect" << "send_data.1.qml"; + QTest::newRow("Correct content-type") << "send_data.1.expect" << "send_data.2.qml"; + QTest::newRow("Incorrect content-type") << "send_data.1.expect" << "send_data.3.qml"; + QTest::newRow("Correct content-type - out of order") << "send_data.4.expect" << "send_data.4.qml"; + QTest::newRow("Incorrect content-type - out of order") << "send_data.4.expect" << "send_data.5.qml"; + QTest::newRow("PUT") << "send_data.6.expect" << "send_data.6.qml"; + QTest::newRow("Correct content-type - no charset") << "send_data.1.expect" << "send_data.7.qml"; +} + +// Test abort() has no effect in unsent state +void tst_qdeclarativexmlhttprequest::abort_unsent() +{ + QDeclarativeComponent component(&engine, TEST_FILE("abort_unsent.qml")); + QObject *object = component.beginCreate(engine.rootContext()); + QVERIFY(object != 0); + object->setProperty("url", "testdocument.html"); + component.completeCreate(); + + QCOMPARE(object->property("readyState").toBool(), true); + QCOMPARE(object->property("openedState").toBool(), true); + QCOMPARE(object->property("status").toBool(), true); + QCOMPARE(object->property("statusText").toBool(), true); + QCOMPARE(object->property("responseText").toBool(), true); + QCOMPARE(object->property("responseXML").toBool(), true); + + QTRY_VERIFY(object->property("dataOK").toBool() == true); + + delete object; +} + +// Test abort() cancels an open (but unsent) request +void tst_qdeclarativexmlhttprequest::abort_opened() +{ + QDeclarativeComponent component(&engine, TEST_FILE("abort_opened.qml")); + QObject *object = component.beginCreate(engine.rootContext()); + QVERIFY(object != 0); + object->setProperty("url", "testdocument.html"); + component.completeCreate(); + + QCOMPARE(object->property("readyState").toBool(), true); + QCOMPARE(object->property("openedState").toBool(), true); + QCOMPARE(object->property("status").toBool(), true); + QCOMPARE(object->property("statusText").toBool(), true); + QCOMPARE(object->property("responseText").toBool(), true); + QCOMPARE(object->property("responseXML").toBool(), true); + + QTRY_VERIFY(object->property("dataOK").toBool() == true); + + delete object; +} + +// Test abort() aborts in progress send +void tst_qdeclarativexmlhttprequest::abort() +{ + TestHTTPServer server(SERVER_PORT); + QVERIFY(server.isValid()); + QVERIFY(server.wait(TEST_FILE("abort.expect"), + TEST_FILE("abort.reply"), + TEST_FILE("testdocument.html"))); + + QDeclarativeComponent component(&engine, TEST_FILE("abort.qml")); + QObject *object = component.beginCreate(engine.rootContext()); + QVERIFY(object != 0); + object->setProperty("urlDummy", "http://127.0.0.1:14449/testdocument.html"); + object->setProperty("url", "http://127.0.0.1:14445/testdocument.html"); + component.completeCreate(); + + QCOMPARE(object->property("seenDone").toBool(), true); + QCOMPARE(object->property("didNotSeeUnsent").toBool(), true); + QCOMPARE(object->property("endStateUnsent").toBool(), true); + + QTRY_VERIFY(object->property("dataOK").toBool() == true); + + delete object; +} + +void tst_qdeclarativexmlhttprequest::getResponseHeader() +{ + QDeclarativeEngine engine; // Avoid cookie contamination + + TestHTTPServer server(SERVER_PORT); + QVERIFY(server.isValid()); + QVERIFY(server.wait(TEST_FILE("getResponseHeader.expect"), + TEST_FILE("getResponseHeader.reply"), + TEST_FILE("testdocument.html"))); + + + QDeclarativeComponent component(&engine, TEST_FILE("getResponseHeader.qml")); + QObject *object = component.beginCreate(engine.rootContext()); + QVERIFY(object != 0); + object->setProperty("url", "http://127.0.0.1:14445/testdocument.html"); + component.completeCreate(); + + QCOMPARE(object->property("unsentException").toBool(), true); + QCOMPARE(object->property("openedException").toBool(), true); + QCOMPARE(object->property("readyState").toBool(), true); + QCOMPARE(object->property("openedState").toBool(), true); + + QTRY_VERIFY(object->property("dataOK").toBool() == true); + + QCOMPARE(object->property("headersReceivedState").toBool(), true); + QCOMPARE(object->property("headersReceivedNullHeader").toBool(), true); + QCOMPARE(object->property("headersReceivedValidHeader").toBool(), true); + QCOMPARE(object->property("headersReceivedMultiValidHeader").toBool(), true); + QCOMPARE(object->property("headersReceivedCookieHeader").toBool(), true); + + QCOMPARE(object->property("doneState").toBool(), true); + QCOMPARE(object->property("doneNullHeader").toBool(), true); + QCOMPARE(object->property("doneValidHeader").toBool(), true); + QCOMPARE(object->property("doneMultiValidHeader").toBool(), true); + QCOMPARE(object->property("doneCookieHeader").toBool(), true); + + delete object; +} + +// Test getResponseHeader throws an exception in an invalid state +void tst_qdeclarativexmlhttprequest::getResponseHeader_unsent() +{ + QDeclarativeComponent component(&engine, TEST_FILE("getResponseHeader_unsent.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("test").toBool(), true); + + delete object; +} + +// Test getResponseHeader throws an exception in an invalid state +void tst_qdeclarativexmlhttprequest::getResponseHeader_sent() +{ + QDeclarativeComponent component(&engine, TEST_FILE("getResponseHeader_sent.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("test").toBool(), true); + + delete object; +} + +// Invalid arg count throws exception +void tst_qdeclarativexmlhttprequest::getResponseHeader_args() +{ + QDeclarativeComponent component(&engine, TEST_FILE("getResponseHeader_args.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QTRY_VERIFY(object->property("exceptionThrown").toBool() == true); + + delete object; +} + +void tst_qdeclarativexmlhttprequest::getAllResponseHeaders() +{ + QDeclarativeEngine engine; // Avoid cookie contamination + + TestHTTPServer server(SERVER_PORT); + QVERIFY(server.isValid()); + QVERIFY(server.wait(TEST_FILE("getResponseHeader.expect"), + TEST_FILE("getResponseHeader.reply"), + TEST_FILE("testdocument.html"))); + + QDeclarativeComponent component(&engine, TEST_FILE("getAllResponseHeaders.qml")); + QObject *object = component.beginCreate(engine.rootContext()); + QVERIFY(object != 0); + object->setProperty("url", "http://127.0.0.1:14445/testdocument.html"); + component.completeCreate(); + + QCOMPARE(object->property("unsentException").toBool(), true); + QCOMPARE(object->property("openedException").toBool(), true); + QCOMPARE(object->property("readyState").toBool(), true); + QCOMPARE(object->property("openedState").toBool(), true); + + QTRY_VERIFY(object->property("dataOK").toBool() == true); + + QCOMPARE(object->property("headersReceivedState").toBool(), true); + QCOMPARE(object->property("headersReceivedHeader").toBool(), true); + + QCOMPARE(object->property("doneState").toBool(), true); + QCOMPARE(object->property("doneHeader").toBool(), true); + + delete object; +} + +// Test getAllResponseHeaders throws an exception in an invalid state +void tst_qdeclarativexmlhttprequest::getAllResponseHeaders_unsent() +{ + QDeclarativeComponent component(&engine, TEST_FILE("getAllResponseHeaders_unsent.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("test").toBool(), true); + + delete object; +} + +// Test getAllResponseHeaders throws an exception in an invalid state +void tst_qdeclarativexmlhttprequest::getAllResponseHeaders_sent() +{ + QDeclarativeComponent component(&engine, TEST_FILE("getAllResponseHeaders_sent.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("test").toBool(), true); + + delete object; +} + +// Invalid arg count throws exception +void tst_qdeclarativexmlhttprequest::getAllResponseHeaders_args() +{ + QDeclarativeComponent component(&engine, TEST_FILE("getAllResponseHeaders_args.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QTRY_VERIFY(object->property("exceptionThrown").toBool() == true); + + delete object; +} + +void tst_qdeclarativexmlhttprequest::status() +{ + QFETCH(QUrl, replyUrl); + QFETCH(int, status); + + TestHTTPServer server(SERVER_PORT); + QVERIFY(server.isValid()); + QVERIFY(server.wait(TEST_FILE("status.expect"), + replyUrl, + TEST_FILE("testdocument.html"))); + + QDeclarativeComponent component(&engine, TEST_FILE("status.qml")); + QObject *object = component.beginCreate(engine.rootContext()); + QVERIFY(object != 0); + object->setProperty("url", "http://127.0.0.1:14445/testdocument.html"); + object->setProperty("expectedStatus", status); + component.completeCreate(); + + QTRY_VERIFY(object->property("dataOK").toBool() == true); + + QCOMPARE(object->property("unsentException").toBool(), true); + QCOMPARE(object->property("openedException").toBool(), true); + QCOMPARE(object->property("sentException").toBool(), true); + QCOMPARE(object->property("headersReceived").toBool(), true); + QCOMPARE(object->property("loading").toBool(), true); + QCOMPARE(object->property("done").toBool(), true); + QCOMPARE(object->property("resetException").toBool(), true); + + delete object; +} + +void tst_qdeclarativexmlhttprequest::status_data() +{ + QTest::addColumn("replyUrl"); + QTest::addColumn("status"); + + QTest::newRow("OK") << TEST_FILE("status.200.reply") << 200; + QTest::newRow("Not Found") << TEST_FILE("status.404.reply") << 404; +} + +void tst_qdeclarativexmlhttprequest::statusText() +{ + QFETCH(QUrl, replyUrl); + QFETCH(QString, statusText); + + TestHTTPServer server(SERVER_PORT); + QVERIFY(server.isValid()); + QVERIFY(server.wait(TEST_FILE("status.expect"), + replyUrl, + TEST_FILE("testdocument.html"))); + + QDeclarativeComponent component(&engine, TEST_FILE("statusText.qml")); + QObject *object = component.beginCreate(engine.rootContext()); + QVERIFY(object != 0); + object->setProperty("url", "http://127.0.0.1:14445/testdocument.html"); + object->setProperty("expectedStatus", statusText); + component.completeCreate(); + + QTRY_VERIFY(object->property("dataOK").toBool() == true); + + QCOMPARE(object->property("unsentException").toBool(), true); + QCOMPARE(object->property("openedException").toBool(), true); + QCOMPARE(object->property("sentException").toBool(), true); + QCOMPARE(object->property("headersReceived").toBool(), true); + QCOMPARE(object->property("loading").toBool(), true); + QCOMPARE(object->property("done").toBool(), true); + QCOMPARE(object->property("resetException").toBool(), true); + + delete object; +} + +void tst_qdeclarativexmlhttprequest::statusText_data() +{ + QTest::addColumn("replyUrl"); + QTest::addColumn("statusText"); + + QTest::newRow("OK") << TEST_FILE("status.200.reply") << "OK"; + QTest::newRow("Not Found") << TEST_FILE("status.404.reply") << "Document not found"; +} + +void tst_qdeclarativexmlhttprequest::responseText() +{ + QFETCH(QUrl, replyUrl); + QFETCH(QUrl, bodyUrl); + QFETCH(QString, responseText); + + TestHTTPServer server(SERVER_PORT); + QVERIFY(server.isValid()); + QVERIFY(server.wait(TEST_FILE("status.expect"), + replyUrl, + bodyUrl)); + + QDeclarativeComponent component(&engine, TEST_FILE("responseText.qml")); + QObject *object = component.beginCreate(engine.rootContext()); + QVERIFY(object != 0); + object->setProperty("url", "http://127.0.0.1:14445/testdocument.html"); + object->setProperty("expectedText", responseText); + component.completeCreate(); + + QTRY_VERIFY(object->property("dataOK").toBool() == true); + + QCOMPARE(object->property("unsent").toBool(), true); + QCOMPARE(object->property("opened").toBool(), true); + QCOMPARE(object->property("sent").toBool(), true); + QCOMPARE(object->property("headersReceived").toBool(), true); + QCOMPARE(object->property("loading").toBool(), true); + QCOMPARE(object->property("done").toBool(), true); + QCOMPARE(object->property("reset").toBool(), true); + + delete object; +} + +void tst_qdeclarativexmlhttprequest::responseText_data() +{ + QTest::addColumn("replyUrl"); + QTest::addColumn("bodyUrl"); + QTest::addColumn("responseText"); + + QTest::newRow("OK") << TEST_FILE("status.200.reply") << TEST_FILE("testdocument.html") << "QML Rocks!\n"; + QTest::newRow("empty body") << TEST_FILE("status.200.reply") << QUrl() << ""; + QTest::newRow("Not Found") << TEST_FILE("status.404.reply") << TEST_FILE("testdocument.html") << ""; +} + +void tst_qdeclarativexmlhttprequest::nonUtf8() +{ + QFETCH(QString, fileName); + QFETCH(QString, responseText); + QFETCH(QString, xmlRootNodeValue); + + QDeclarativeComponent component(&engine, TEST_FILE("utf16.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + object->setProperty("fileName", fileName); + QMetaObject::invokeMethod(object, "startRequest"); + + QTRY_VERIFY(object->property("dataOK").toBool() == true); + + QCOMPARE(object->property("responseText").toString(), responseText); + + if (!xmlRootNodeValue.isEmpty()) { + QString rootNodeValue = object->property("responseXmlRootNodeValue").toString(); + QCOMPARE(rootNodeValue, xmlRootNodeValue); + } + + delete object; +} + +void tst_qdeclarativexmlhttprequest::nonUtf8_data() +{ + QTest::addColumn("fileName"); + QTest::addColumn("responseText"); + QTest::addColumn("xmlRootNodeValue"); + + QString uc; + uc.resize(3); + uc[0] = QChar(0x10e3); + uc[1] = QChar(' '); + uc[2] = QChar(0x03a3); + + QTest::newRow("responseText") << "utf16.html" << uc + '\n' << ""; + QTest::newRow("responseXML") << "utf16.xml" << "\n\n" + uc + "\n\n" << QString('\n' + uc + '\n'); +} + +// Test that calling hte XMLHttpRequest methods on a non-XMLHttpRequest object +// throws an exception +void tst_qdeclarativexmlhttprequest::invalidMethodUsage() +{ + QDeclarativeComponent component(&engine, TEST_FILE("invalidMethodUsage.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QCOMPARE(object->property("onreadystatechange").toBool(), true); + QCOMPARE(object->property("readyState").toBool(), true); + QCOMPARE(object->property("status").toBool(), true); + QCOMPARE(object->property("statusText").toBool(), true); + QCOMPARE(object->property("responseText").toBool(), true); + QCOMPARE(object->property("responseXML").toBool(), true); + + QCOMPARE(object->property("open").toBool(), true); + QCOMPARE(object->property("setRequestHeader").toBool(), true); + QCOMPARE(object->property("send").toBool(), true); + QCOMPARE(object->property("abort").toBool(), true); + QCOMPARE(object->property("getResponseHeader").toBool(), true); + QCOMPARE(object->property("getAllResponseHeaders").toBool(), true); + + delete object; +} + +// Test that XMLHttpRequest transparently redirects +void tst_qdeclarativexmlhttprequest::redirects() +{ + { + TestHTTPServer server(SERVER_PORT); + QVERIFY(server.isValid()); + server.addRedirect("redirect.html", "http://127.0.0.1:14445/redirecttarget.html"); + server.serveDirectory(SRCDIR "/data"); + + QDeclarativeComponent component(&engine, TEST_FILE("redirects.qml")); + QObject *object = component.beginCreate(engine.rootContext()); + QVERIFY(object != 0); + object->setProperty("url", "http://127.0.0.1:14445/redirect.html"); + object->setProperty("expectedText", ""); + component.completeCreate(); + + QTRY_VERIFY(object->property("done").toBool() == true); + QCOMPARE(object->property("dataOK").toBool(), true); + + delete object; + } + + { + TestHTTPServer server(SERVER_PORT); + QVERIFY(server.isValid()); + server.addRedirect("redirect.html", "http://127.0.0.1:14445/redirectmissing.html"); + server.serveDirectory(SRCDIR "/data"); + + QDeclarativeComponent component(&engine, TEST_FILE("redirectError.qml")); + QObject *object = component.beginCreate(engine.rootContext()); + QVERIFY(object != 0); + object->setProperty("url", "http://127.0.0.1:14445/redirect.html"); + object->setProperty("expectedText", ""); + component.completeCreate(); + + QTRY_VERIFY(object->property("done").toBool() == true); + QCOMPARE(object->property("dataOK").toBool(), true); + + delete object; + } + + { + TestHTTPServer server(SERVER_PORT); + QVERIFY(server.isValid()); + server.addRedirect("redirect.html", "http://127.0.0.1:14445/redirect.html"); + server.serveDirectory(SRCDIR "/data"); + + QDeclarativeComponent component(&engine, TEST_FILE("redirectRecur.qml")); + QObject *object = component.beginCreate(engine.rootContext()); + QVERIFY(object != 0); + object->setProperty("url", "http://127.0.0.1:14445/redirect.html"); + object->setProperty("expectedText", ""); + component.completeCreate(); + + for (int ii = 0; ii < 60; ++ii) { + if (object->property("done").toBool()) break; + QTest::qWait(50); + } + QVERIFY(object->property("done").toBool() == true); + + QCOMPARE(object->property("dataOK").toBool(), true); + + delete object; + } +} + +void tst_qdeclarativexmlhttprequest::responseXML_invalid() +{ + QDeclarativeComponent component(&engine, TEST_FILE("responseXML_invalid.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QTRY_VERIFY(object->property("dataOK").toBool() == true); + + QCOMPARE(object->property("xmlNull").toBool(), true); + + delete object; +} + +// Test the Document DOM element +void tst_qdeclarativexmlhttprequest::document() +{ + QDeclarativeComponent component(&engine, TEST_FILE("document.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QTRY_VERIFY(object->property("dataOK").toBool() == true); + + QCOMPARE(object->property("xmlTest").toBool(), true); + + delete object; +} + +// Test the Element DOM element +void tst_qdeclarativexmlhttprequest::element() +{ + QDeclarativeComponent component(&engine, TEST_FILE("element.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QTRY_VERIFY(object->property("dataOK").toBool() == true); + + QCOMPARE(object->property("xmlTest").toBool(), true); + + delete object; +} + +// Test the Attr DOM element +void tst_qdeclarativexmlhttprequest::attr() +{ + QDeclarativeComponent component(&engine, TEST_FILE("attr.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QTRY_VERIFY(object->property("dataOK").toBool() == true); + + QCOMPARE(object->property("xmlTest").toBool(), true); + + delete object; +} + +// Test the Text DOM element +void tst_qdeclarativexmlhttprequest::text() +{ + QDeclarativeComponent component(&engine, TEST_FILE("text.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QTRY_VERIFY(object->property("dataOK").toBool() == true); + + QCOMPARE(object->property("xmlTest").toBool(), true); + + delete object; +} + +// Test the CDataSection DOM element +void tst_qdeclarativexmlhttprequest::cdata() +{ + QDeclarativeComponent component(&engine, TEST_FILE("cdata.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + + QTRY_VERIFY(object->property("dataOK").toBool() == true); + + QCOMPARE(object->property("xmlTest").toBool(), true); + + delete object; +} + +QTEST_MAIN(tst_qdeclarativexmlhttprequest) + +#include "tst_qdeclarativexmlhttprequest.moc" diff --git a/tests/auto/declarative/qdeclarativexmllistmodel/data/model.qml b/tests/auto/declarative/qdeclarativexmllistmodel/data/model.qml new file mode 100644 index 00000000..fdacb6c4 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmllistmodel/data/model.qml @@ -0,0 +1,10 @@ +import QtQuick 1.0 + +XmlListModel { + source: "model.xml" + query: "/Pets/Pet" + XmlRole { name: "name"; query: "name/string()" } + XmlRole { name: "type"; query: "type/string()" } + XmlRole { name: "age"; query: "age/number()" } + XmlRole { name: "size"; query: "size/string()" } +} diff --git a/tests/auto/declarative/qdeclarativexmllistmodel/data/model.xml b/tests/auto/declarative/qdeclarativexmllistmodel/data/model.xml new file mode 100644 index 00000000..40cd6d04 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmllistmodel/data/model.xml @@ -0,0 +1,54 @@ + + + Polly + Parrot + 12 + Small + + + Penny + Turtle + 4 + Small + + + Warren + Rabbit + 2 + Small + + + Spot + Dog + 9 + Medium + + + Whiskers + Cat + 2 + Medium + + + Joey + Kangaroo + 1 + + + Kimba + Bunny + 65 + Large + + + Rover + Dog + Large + + + Tiny + Elephant + 15 + Large + + diff --git a/tests/auto/declarative/qdeclarativexmllistmodel/data/model2.xml b/tests/auto/declarative/qdeclarativexmllistmodel/data/model2.xml new file mode 100644 index 00000000..dab2ec6d --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmllistmodel/data/model2.xml @@ -0,0 +1,14 @@ + + + Polly + Parrot + 12 + Small + + + Penny + Turtle + 4 + Small + + diff --git a/tests/auto/declarative/qdeclarativexmllistmodel/data/propertychanges.qml b/tests/auto/declarative/qdeclarativexmllistmodel/data/propertychanges.qml new file mode 100644 index 00000000..ed674ce3 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmllistmodel/data/propertychanges.qml @@ -0,0 +1,10 @@ +import QtQuick 1.0 + +XmlListModel { + source: "model.xml" + query: "/Pets/Pet" + XmlRole { objectName: "role"; name: "name"; query: "name/string()" } + XmlRole { name: "type"; query: "type/string()" } + XmlRole { name: "age"; query: "age/number()" } + XmlRole { name: "size"; query: "size/string()" } +} diff --git a/tests/auto/declarative/qdeclarativexmllistmodel/data/recipes.qml b/tests/auto/declarative/qdeclarativexmllistmodel/data/recipes.qml new file mode 100644 index 00000000..6345101d --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmllistmodel/data/recipes.qml @@ -0,0 +1,10 @@ +import QtQuick 1.0 + +XmlListModel { + source: "recipes.xml" + query: "/recipes/recipe" + XmlRole { name: "title"; query: "@title/string()" } + XmlRole { name: "picture"; query: "picture/string()" } + XmlRole { name: "ingredients"; query: "ingredients/string()" } + XmlRole { name: "preparation"; query: "method/string()" } +} diff --git a/tests/auto/declarative/qdeclarativexmllistmodel/data/recipes.xml b/tests/auto/declarative/qdeclarativexmllistmodel/data/recipes.xml new file mode 100644 index 00000000..d71de607 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmllistmodel/data/recipes.xml @@ -0,0 +1,90 @@ + + + content/pics/pancakes.jpg + +
    +
  • 1 cup (150g) self-raising flour +
  • 1 tbs caster sugar +
  • 3/4 cup (185ml) milk +
  • 1 egg +
+ + ]]>
+ +
    +
  1. Sift flour and sugar together into a bowl. Add a pinch of salt. +
  2. Beat milk and egg together, then add to dry ingredients. Beat until smooth. +
  3. Pour mixture into a pan on medium heat and cook until bubbles appear on the surface. +
  4. Turn over and cook other side until golden. +
+ + ]]>
+
+ + content/pics/fruit-salad.jpg + + + + + content/pics/vegetable-soup.jpg + +
    +
  • 1 onion +
  • 1 turnip +
  • 1 potato +
  • 1 carrot +
  • 1 head of celery +
  • 1 1/2 litres of water +
+ + ]]>
+ +
    +
  1. Chop vegetables. +
  2. Boil in water until vegetables soften. +
  3. Season with salt and pepper to taste. +
+ + ]]>
+
+ + content/pics/hamburger.jpg + +
    +
  • 500g minced beef +
  • Seasoning +
  • lettuce, tomato, onion, cheese +
  • 1 hamburger bun for each burger +
+ + ]]>
+ +
    +
  1. Mix the beef, together with seasoning, in a food processor. +
  2. Shape the beef into burgers. +
  3. Grill the burgers for about 5 mins on each side (until cooked through) +
  4. Serve each burger on a bun with ketchup, cheese, lettuce, tomato and onion. +
+ + ]]>
+
+ + content/pics/lemonade.jpg + +
    +
  • 1 cup Lemon Juice +
  • 1 cup Sugar +
  • 6 Cups of Water (2 cups warm water, 4 cups cold water) +
+ + ]]>
+ +
    +
  1. Pour 2 cups of warm water into a pitcher and stir in sugar until it dissolves. +
  2. Pour in lemon juice, stir again, and add 4 cups of cold water. +
  3. Chill or serve over ice cubes. +
+ + ]]>
+
+
diff --git a/tests/auto/declarative/qdeclarativexmllistmodel/data/roleCrash.qml b/tests/auto/declarative/qdeclarativexmllistmodel/data/roleCrash.qml new file mode 100644 index 00000000..492dad92 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmllistmodel/data/roleCrash.qml @@ -0,0 +1,7 @@ +import QtQuick 1.0 + +XmlListModel { + id: model + XmlRole {} + Component.onCompleted: model.roles = 0 +} diff --git a/tests/auto/declarative/qdeclarativexmllistmodel/data/roleErrors.qml b/tests/auto/declarative/qdeclarativexmllistmodel/data/roleErrors.qml new file mode 100644 index 00000000..a0d846f1 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmllistmodel/data/roleErrors.qml @@ -0,0 +1,10 @@ +import QtQuick 1.0 + +XmlListModel { + source: "model.xml" + query: "/Pets/Pet" + XmlRole { name: "name"; query: "/name/string()" } //starts with '/' + XmlRole { name: "type"; query: "type" } //no type + XmlRole { name: "age"; query: "age/" } //ends with '/' + XmlRole { name: "size"; query: "size/number()" } //wrong type +} diff --git a/tests/auto/declarative/qdeclarativexmllistmodel/data/roleKeys.qml b/tests/auto/declarative/qdeclarativexmllistmodel/data/roleKeys.qml new file mode 100644 index 00000000..d90cd610 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmllistmodel/data/roleKeys.qml @@ -0,0 +1,13 @@ +import QtQuick 1.0 + +XmlListModel { + query: "/data/item" + XmlRole { id: nameRole; name: "name"; query: "name/string()"; isKey: true } + XmlRole { name: "age"; query: "age/number()"; isKey: true } + XmlRole { name: "sport"; query: "sport/string()" } + + function disableNameKey() { + nameRole.isKey = false; + } +} + diff --git a/tests/auto/declarative/qdeclarativexmllistmodel/data/testtypes.qml b/tests/auto/declarative/qdeclarativexmllistmodel/data/testtypes.qml new file mode 100644 index 00000000..4dbcc029 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmllistmodel/data/testtypes.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 + +XmlListModel { + query: "/data" + XmlRole { name: "stringValue"; query: "a-string/string()" } + XmlRole { name: "numberValue"; query: "a-number/number()" } +} + diff --git a/tests/auto/declarative/qdeclarativexmllistmodel/data/unique.qml b/tests/auto/declarative/qdeclarativexmllistmodel/data/unique.qml new file mode 100644 index 00000000..dab8ffa7 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmllistmodel/data/unique.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 + +XmlListModel { + source: "model.xml" + query: "/Pets/Pet" + XmlRole { name: "name"; query: "name/string()" } + XmlRole { name: "name"; query: "type/string()" } +} diff --git a/tests/auto/declarative/qdeclarativexmllistmodel/qdeclarativexmllistmodel.pro b/tests/auto/declarative/qdeclarativexmllistmodel/qdeclarativexmllistmodel.pro new file mode 100644 index 00000000..64b82677 --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmllistmodel/qdeclarativexmllistmodel.pro @@ -0,0 +1,20 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative script gui network +contains(QT_CONFIG,xmlpatterns) { + QT += xmlpatterns + DEFINES += QTEST_XMLPATTERNS +} +macx:CONFIG -= app_bundle + +SOURCES += tst_qdeclarativexmllistmodel.cpp + +symbian: { + importFiles.files = data + importFiles.path = . + DEPLOYMENT += importFiles +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qdeclarativexmllistmodel/tst_qdeclarativexmllistmodel.cpp b/tests/auto/declarative/qdeclarativexmllistmodel/tst_qdeclarativexmllistmodel.cpp new file mode 100644 index 00000000..6a7ae44a --- /dev/null +++ b/tests/auto/declarative/qdeclarativexmllistmodel/tst_qdeclarativexmllistmodel.cpp @@ -0,0 +1,988 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef QTEST_XMLPATTERNS +#include +#include +#include +#include "../../../shared/util.h" + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define SRCDIR "." +#endif + +typedef QPair QDeclarativeXmlListRange; +typedef QList QDeclarativeXmlModelData; + +Q_DECLARE_METATYPE(QList) +Q_DECLARE_METATYPE(QDeclarativeXmlModelData) +Q_DECLARE_METATYPE(QDeclarativeXmlListModel::Status) + +class tst_qdeclarativexmllistmodel : public QObject + +{ + Q_OBJECT +public: + tst_qdeclarativexmllistmodel() {} + +private slots: + void initTestCase() { + qRegisterMetaType("QDeclarativeXmlListModel::Status"); + } + + void buildModel(); + void testTypes(); + void testTypes_data(); + void cdata(); + void attributes(); + void roles(); + void roleErrors(); + void uniqueRoleNames(); + void headers(); + void xml(); + void xml_data(); + void source(); + void source_data(); + void data(); + void get(); + void reload(); + void useKeys(); + void useKeys_data(); + void noKeysValueChanges(); + void keysChanged(); + void threading(); + void threading_data(); + void propertyChanges(); + + void roleCrash(); + +private: + QString makeItemXmlAndData(const QString &data, QDeclarativeXmlModelData *modelData = 0) const + { + if (modelData) + modelData->clear(); + QString xml; + + if (!data.isEmpty()) { + QStringList items = data.split(";"); + foreach(const QString &item, items) { + if (item.isEmpty()) + continue; + QVariantList variants; + xml += QLatin1String(""); + QStringList fields = item.split(","); + foreach(const QString &field, fields) { + QStringList values = field.split("="); + if (values.count() != 2) { + qWarning() << "makeItemXmlAndData: invalid field:" << field; + continue; + } + xml += QString("<%1>%2").arg(values[0], values[1]); + if (!modelData) + continue; + bool isNum = false; + int number = values[1].toInt(&isNum); + if (isNum) + variants << number; + else + variants << values[1]; + } + xml += QLatin1String(""); + if (modelData) + modelData->append(variants); + } + } + + QString decl = ""; + return decl + QLatin1String("") + xml + QLatin1String(""); + } + + QDeclarativeEngine engine; +}; + +class CustomNetworkAccessManagerFactory : public QObject, public QDeclarativeNetworkAccessManagerFactory +{ + Q_OBJECT +public: + QVariantMap lastSentHeaders; + +protected: + QNetworkAccessManager *create(QObject *parent); +}; + +class CustomNetworkAccessManager : public QNetworkAccessManager +{ + Q_OBJECT +public: + CustomNetworkAccessManager(CustomNetworkAccessManagerFactory *factory, QObject *parent) + : QNetworkAccessManager(parent), m_factory(factory) {} + +protected: + QNetworkReply *createRequest(Operation op, const QNetworkRequest &req, QIODevice * outgoingData = 0) + { + if (m_factory) { + QVariantMap map; + foreach (const QString &header, req.rawHeaderList()) + map[header] = req.rawHeader(header.toUtf8()); + m_factory->lastSentHeaders = map; + } + return QNetworkAccessManager::createRequest(op, req, outgoingData); + } + + QPointer m_factory; +}; + +QNetworkAccessManager *CustomNetworkAccessManagerFactory::create(QObject *parent) +{ + return new CustomNetworkAccessManager(this, parent); +} + + +void tst_qdeclarativexmllistmodel::buildModel() +{ + QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/model.qml")); + QDeclarativeXmlListModel *model = qobject_cast(component.create()); + QVERIFY(model != 0); + QTRY_COMPARE(model->count(), 9); + + QList roles; + roles << Qt::UserRole << Qt::UserRole + 1 << Qt::UserRole + 2 << Qt::UserRole + 3; + QHash data = model->data(3, roles); + QVERIFY(data.count() == 4); + QCOMPARE(data.value(Qt::UserRole).toString(), QLatin1String("Spot")); + QCOMPARE(data.value(Qt::UserRole+1).toString(), QLatin1String("Dog")); + QCOMPARE(data.value(Qt::UserRole+2).toInt(), 9); + QCOMPARE(data.value(Qt::UserRole+3).toString(), QLatin1String("Medium")); + + delete model; +} + +void tst_qdeclarativexmllistmodel::testTypes() +{ + QFETCH(QString, xml); + QFETCH(QString, roleName); + QFETCH(QVariant, expectedValue); + + QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/testtypes.qml")); + QDeclarativeXmlListModel *model = qobject_cast(component.create()); + QVERIFY(model != 0); + model->setXml(xml.toUtf8()); + model->reload(); + QTRY_COMPARE(model->count(), 1); + + int role = -1; + foreach (int i, model->roles()) { + if (model->toString(i) == roleName) { + role = i; + break; + } + } + QVERIFY(role >= 0); + + if (expectedValue.toString() == "nan") + QVERIFY(qIsNaN(model->data(0, role).toDouble())); + else + QCOMPARE(model->data(0, role), expectedValue); + + delete model; +} + +void tst_qdeclarativexmllistmodel::testTypes_data() +{ + QTest::addColumn("xml"); + QTest::addColumn("roleName"); + QTest::addColumn("expectedValue"); + + QTest::newRow("missing string field") << "" + << "stringValue" << QVariant(""); + QTest::newRow("empty string") << "" + << "stringValue" << QVariant(""); + QTest::newRow("1-char string") << "5" + << "stringValue" << QVariant("5"); + QTest::newRow("string ok") << "abc def g" + << "stringValue" << QVariant("abc def g"); + + QTest::newRow("missing number field") << "" + << "numberValue" << QVariant(""); + double nan = qQNaN(); + QTest::newRow("empty number field") << "" + << "numberValue" << QVariant(nan); + QTest::newRow("number field with string") << "a string" + << "numberValue" << QVariant(nan); + QTest::newRow("-1") << "-1" + << "numberValue" << QVariant("-1"); + QTest::newRow("-1.5") << "-1.5" + << "numberValue" << QVariant("-1.5"); + QTest::newRow("0") << "0" + << "numberValue" << QVariant("0"); + QTest::newRow("+1") << "1" + << "numberValue" << QVariant("1"); + QTest::newRow("+1.5") << "1.5" + << "numberValue" << QVariant("1.5"); +} + +void tst_qdeclarativexmllistmodel::cdata() +{ + QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/recipes.qml")); + QDeclarativeXmlListModel *model = qobject_cast(component.create()); + QVERIFY(model != 0); + QTRY_COMPARE(model->count(), 5); + + QList roles; + roles << Qt::UserRole + 2; + QHash data = model->data(2, roles); + QVERIFY(data.count() == 1); + QVERIFY(data.value(Qt::UserRole+2).toString().startsWith(QLatin1String(""))); + + delete model; +} + +void tst_qdeclarativexmllistmodel::attributes() +{ + QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/recipes.qml")); + QDeclarativeXmlListModel *model = qobject_cast(component.create()); + QVERIFY(model != 0); + QTRY_COMPARE(model->count(), 5); + QList roles; + roles << Qt::UserRole; + QHash data = model->data(2, roles); + QVERIFY(data.count() == 1); + QCOMPARE(data.value(Qt::UserRole).toString(), QLatin1String("Vegetable Soup")); + + delete model; +} + +void tst_qdeclarativexmllistmodel::roles() +{ + QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/model.qml")); + QDeclarativeXmlListModel *model = qobject_cast(component.create()); + QVERIFY(model != 0); + QTRY_COMPARE(model->count(), 9); + + QList roles = model->roles(); + QCOMPARE(roles.count(), 4); + QCOMPARE(model->toString(roles.at(0)), QLatin1String("name")); + QCOMPARE(model->toString(roles.at(1)), QLatin1String("type")); + QCOMPARE(model->toString(roles.at(2)), QLatin1String("age")); + QCOMPARE(model->toString(roles.at(3)), QLatin1String("size")); + + delete model; +} + +void tst_qdeclarativexmllistmodel::roleErrors() +{ + QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/roleErrors.qml")); + QTest::ignoreMessage(QtWarningMsg, (QUrl::fromLocalFile(SRCDIR "/data/roleErrors.qml").toString() + ":6:5: QML XmlRole: An XmlRole query must not start with '/'").toUtf8().constData()); + QTest::ignoreMessage(QtWarningMsg, (QUrl::fromLocalFile(SRCDIR "/data/roleErrors.qml").toString() + ":9:5: QML XmlRole: invalid query: \"age/\"").toUtf8().constData()); + + //### make sure we receive all expected warning messages. + QDeclarativeXmlListModel *model = qobject_cast(component.create()); + QVERIFY(model != 0); + QTRY_COMPARE(model->count(), 9); + + QList roles; + roles << Qt::UserRole << Qt::UserRole + 1 << Qt::UserRole + 2 << Qt::UserRole + 3; + QHash data = model->data(3, roles); + QVERIFY(data.count() == 4); + + //### should any of these return valid values? + QCOMPARE(data.value(Qt::UserRole), QVariant()); + QCOMPARE(data.value(Qt::UserRole+1), QVariant()); + QCOMPARE(data.value(Qt::UserRole+2), QVariant()); + + QEXPECT_FAIL("", "QTBUG-10797", Continue); + QCOMPARE(data.value(Qt::UserRole+3), QVariant()); + + delete model; +} + +void tst_qdeclarativexmllistmodel::uniqueRoleNames() +{ + QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/unique.qml")); + QTest::ignoreMessage(QtWarningMsg, (QUrl::fromLocalFile(SRCDIR "/data/unique.qml").toString() + ":7:5: QML XmlRole: \"name\" duplicates a previous role name and will be disabled.").toUtf8().constData()); + QDeclarativeXmlListModel *model = qobject_cast(component.create()); + QVERIFY(model != 0); + QTRY_COMPARE(model->count(), 9); + + QList roles = model->roles(); + QCOMPARE(roles.count(), 1); + + delete model; +} + + +void tst_qdeclarativexmllistmodel::xml() +{ + QFETCH(QString, xml); + QFETCH(int, count); + + QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/model.qml")); + QDeclarativeXmlListModel *model = qobject_cast(component.create()); + QSignalSpy spy(model, SIGNAL(statusChanged(QDeclarativeXmlListModel::Status))); + + QVERIFY(model->errorString().isEmpty()); + QCOMPARE(model->progress(), qreal(0.0)); + QCOMPARE(model->status(), QDeclarativeXmlListModel::Loading); + QTRY_COMPARE(spy.count(), 1); spy.clear(); + QCOMPARE(model->status(), QDeclarativeXmlListModel::Ready); + QVERIFY(model->errorString().isEmpty()); + QCOMPARE(model->progress(), qreal(1.0)); + QCOMPARE(model->count(), 9); + + // if xml is empty (i.e. clearing) it won't have any effect if a source is set + if (xml.isEmpty()) + model->setSource(QUrl()); + model->setXml(xml); + QCOMPARE(model->progress(), qreal(1.0)); // immediately goes to 1.0 if using setXml() + QTRY_COMPARE(spy.count(), 1); spy.clear(); + QCOMPARE(model->status(), QDeclarativeXmlListModel::Loading); + QTRY_COMPARE(spy.count(), 1); spy.clear(); + QCOMPARE(model->status(), QDeclarativeXmlListModel::Ready); + QVERIFY(model->errorString().isEmpty()); + QCOMPARE(model->count(), count); + + delete model; +} + +void tst_qdeclarativexmllistmodel::xml_data() +{ + QTest::addColumn("xml"); + QTest::addColumn("count"); + + QTest::newRow("xml with no items") << "" << 0; + QTest::newRow("empty xml") << "" << 0; + QTest::newRow("one item") << "HobbesTiger7Large" << 1; +} + +void tst_qdeclarativexmllistmodel::headers() +{ + // ensure the QNetworkAccessManagers created for this test are immediately deleted + QDeclarativeEngine qmlEng; + + CustomNetworkAccessManagerFactory factory; + qmlEng.setNetworkAccessManagerFactory(&factory); + + QDeclarativeComponent component(&qmlEng, QUrl::fromLocalFile(SRCDIR "/data/model.qml")); + QDeclarativeXmlListModel *model = qobject_cast(component.create()); + QVERIFY(model != 0); + QTRY_COMPARE(model->status(), QDeclarativeXmlListModel::Ready); + + QVariantMap expectedHeaders; + expectedHeaders["Accept"] = "application/xml,*/*"; + + QCOMPARE(factory.lastSentHeaders.count(), expectedHeaders.count()); + foreach (const QString &header, expectedHeaders.keys()) { + QVERIFY(factory.lastSentHeaders.contains(header)); + QCOMPARE(factory.lastSentHeaders[header].toString(), expectedHeaders[header].toString()); + } + + delete model; +} + +void tst_qdeclarativexmllistmodel::source() +{ + QFETCH(QUrl, source); + QFETCH(int, count); + QFETCH(QDeclarativeXmlListModel::Status, status); + + QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/model.qml")); + QDeclarativeXmlListModel *model = qobject_cast(component.create()); + QSignalSpy spy(model, SIGNAL(statusChanged(QDeclarativeXmlListModel::Status))); + + QVERIFY(model->errorString().isEmpty()); + QCOMPARE(model->progress(), qreal(0.0)); + QCOMPARE(model->status(), QDeclarativeXmlListModel::Loading); + QTRY_COMPARE(spy.count(), 1); spy.clear(); + QCOMPARE(model->status(), QDeclarativeXmlListModel::Ready); + QVERIFY(model->errorString().isEmpty()); + QCOMPARE(model->progress(), qreal(1.0)); + QCOMPARE(model->count(), 9); + + model->setSource(source); + QCOMPARE(model->progress(), qreal(0.0)); + QTRY_COMPARE(spy.count(), 1); spy.clear(); + QCOMPARE(model->status(), QDeclarativeXmlListModel::Loading); + QVERIFY(model->errorString().isEmpty()); + + QEventLoop loop; + QTimer timer; + timer.setSingleShot(true); + connect(model, SIGNAL(statusChanged(QDeclarativeXmlListModel::Status)), &loop, SLOT(quit())); + connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit())); + timer.start(20000); + loop.exec(); + + if (spy.count() == 0 && status != QDeclarativeXmlListModel::Ready) { + qWarning("QDeclarativeXmlListModel invalid source test timed out"); + } else { + QCOMPARE(spy.count(), 1); spy.clear(); + } + + QCOMPARE(model->status(), status); + QCOMPARE(model->count(), count); + + if (status == QDeclarativeXmlListModel::Ready) + QCOMPARE(model->progress(), qreal(1.0)); + + QCOMPARE(model->errorString().isEmpty(), status == QDeclarativeXmlListModel::Ready); + + delete model; +} + +void tst_qdeclarativexmllistmodel::source_data() +{ + QTest::addColumn("source"); + QTest::addColumn("count"); + QTest::addColumn("status"); + + QTest::newRow("valid") << QUrl::fromLocalFile(SRCDIR "/data/model2.xml") << 2 << QDeclarativeXmlListModel::Ready; + QTest::newRow("invalid") << QUrl("http://blah.blah/blah.xml") << 0 << QDeclarativeXmlListModel::Error; + + // empty file + QTemporaryFile *temp = new QTemporaryFile(this); + if (temp->open()) + QTest::newRow("empty file") << QUrl::fromLocalFile(temp->fileName()) << 0 << QDeclarativeXmlListModel::Ready; + temp->close(); +} + +void tst_qdeclarativexmllistmodel::data() +{ + QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/model.qml")); + QDeclarativeXmlListModel *model = qobject_cast(component.create()); + QVERIFY(model != 0); + + QHash blank; + for (int i=0; iroles().count(); i++) + blank.insert(model->roles()[i], QVariant()); + for (int i=0; i<9; i++) { + QCOMPARE(model->data(i, model->roles()), blank); + for (int j=0; jroles().count(); j++) { + QCOMPARE(model->data(i, j), QVariant()); + } + } + QTRY_COMPARE(model->count(), 9); + + delete model; +} + +void tst_qdeclarativexmllistmodel::get() +{ + QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/model.qml")); + QDeclarativeXmlListModel *model = qobject_cast(component.create()); + QVERIFY(model != 0); + QVERIFY(model->get(0).isUndefined()); + + QTRY_COMPARE(model->count(), 9); + QVERIFY(model->get(-1).isUndefined()); + + QScriptValue sv = model->get(0); + QCOMPARE(sv.property("name").toString(), QLatin1String("Polly")); + QCOMPARE(sv.property("type").toString(), QLatin1String("Parrot")); + QCOMPARE(sv.property("age").toNumber(), qsreal(12)); + QCOMPARE(sv.property("size").toString(), QLatin1String("Small")); + + sv = model->get(1); + QCOMPARE(sv.property("name").toString(), QLatin1String("Penny")); + QCOMPARE(sv.property("type").toString(), QLatin1String("Turtle")); + QCOMPARE(sv.property("age").toNumber(), qsreal(4)); + QCOMPARE(sv.property("size").toString(), QLatin1String("Small")); + + sv = model->get(7); + QCOMPARE(sv.property("name").toString(), QLatin1String("Rover")); + QCOMPARE(sv.property("type").toString(), QLatin1String("Dog")); + QCOMPARE(sv.property("age").toNumber(), qsreal(0)); + QCOMPARE(sv.property("size").toString(), QLatin1String("Large")); + + sv = model->get(8); + QCOMPARE(sv.property("name").toString(), QLatin1String("Tiny")); + QCOMPARE(sv.property("type").toString(), QLatin1String("Elephant")); + QCOMPARE(sv.property("age").toNumber(), qsreal(15)); + QCOMPARE(sv.property("size").toString(), QLatin1String("Large")); + + sv = model->get(9); + QVERIFY(sv.isUndefined()); + + delete model; +} + +void tst_qdeclarativexmllistmodel::reload() +{ + // If no keys are used, the model should be rebuilt from scratch when + // reload() is called. + + QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/model.qml")); + QDeclarativeXmlListModel *model = qobject_cast(component.create()); + QVERIFY(model != 0); + QTRY_COMPARE(model->count(), 9); + + QSignalSpy spyInsert(model, SIGNAL(itemsInserted(int,int))); + QSignalSpy spyRemove(model, SIGNAL(itemsRemoved(int,int))); + QSignalSpy spyCount(model, SIGNAL(countChanged())); + + //reload multiple times to test the xml query aborting + model->reload(); + model->reload(); + QCoreApplication::processEvents(); + model->reload(); + model->reload(); + QTRY_COMPARE(spyCount.count(), 1); + QTRY_COMPARE(spyInsert.count(), 1); + QTRY_COMPARE(spyRemove.count(), 1); + + QCOMPARE(spyInsert[0][0].toInt(), 0); + QCOMPARE(spyInsert[0][1].toInt(), 9); + + QCOMPARE(spyRemove[0][0].toInt(), 0); + QCOMPARE(spyRemove[0][1].toInt(), 9); + + delete model; +} + +void tst_qdeclarativexmllistmodel::useKeys() +{ + // If using incremental updates through keys, the model should only + // insert & remove some of the items, instead of throwing everything + // away and causing the view to repaint the whole view. + + QFETCH(QString, oldXml); + QFETCH(int, oldCount); + QFETCH(QString, newXml); + QFETCH(QDeclarativeXmlModelData, newData); + QFETCH(QList, insertRanges); + QFETCH(QList, removeRanges); + + QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/roleKeys.qml")); + QDeclarativeXmlListModel *model = qobject_cast(component.create()); + QVERIFY(model != 0); + + model->setXml(oldXml); + QTRY_COMPARE(model->count(), oldCount); + + QSignalSpy spyInsert(model, SIGNAL(itemsInserted(int,int))); + QSignalSpy spyRemove(model, SIGNAL(itemsRemoved(int,int))); + QSignalSpy spyCount(model, SIGNAL(countChanged())); + + model->setXml(newXml); + + if (oldCount != newData.count()) { + QTRY_COMPARE(model->count(), newData.count()); + QCOMPARE(spyCount.count(), 1); + } else { + QTRY_VERIFY(spyInsert.count() > 0 || spyRemove.count() > 0); + QCOMPARE(spyCount.count(), 0); + } + + QList roles = model->roles(); + for (int i=0; icount(); i++) { + for (int j=0; jdata(i, roles[j]), newData[i][j]); + } + + QCOMPARE(spyInsert.count(), insertRanges.count()); + for (int i=0; i("oldXml"); + QTest::addColumn("oldCount"); + QTest::addColumn("newXml"); + QTest::addColumn("newData"); + QTest::addColumn >("insertRanges"); + QTest::addColumn >("removeRanges"); + + QDeclarativeXmlModelData modelData; + + QTest::newRow("append 1") + << makeItemXmlAndData("name=A,age=25,sport=Football") << 1 + << makeItemXmlAndData("name=A,age=25,sport=Football;name=B,age=35,sport=Athletics", &modelData) + << modelData + << (QList() << qMakePair(1, 1)) + << QList(); + + QTest::newRow("append multiple") + << makeItemXmlAndData("name=A,age=25,sport=Football") << 1 + << makeItemXmlAndData("name=A,age=25,sport=Football;name=B,age=35,sport=Athletics;name=C,age=45,sport=Curling", &modelData) + << modelData + << (QList() << qMakePair(1, 2)) + << QList(); + + QTest::newRow("insert in different spots") + << makeItemXmlAndData("name=B,age=35,sport=Athletics") << 1 + << makeItemXmlAndData("name=A,age=25,sport=Football;name=B,age=35,sport=Athletics;name=C,age=45,sport=Curling;name=D,age=55,sport=Golf", &modelData) + << modelData + << (QList() << qMakePair(0, 1) << qMakePair(2,2)) + << QList(); + + QTest::newRow("insert in middle") + << makeItemXmlAndData("name=A,age=25,sport=Football;name=D,age=55,sport=Golf") << 2 + << makeItemXmlAndData("name=A,age=25,sport=Football;name=B,age=35,sport=Athletics;name=C,age=45,sport=Curling;name=D,age=55,sport=Golf", &modelData) + << modelData + << (QList() << qMakePair(1, 2)) + << QList(); + + QTest::newRow("remove first") + << makeItemXmlAndData("name=A,age=25,sport=Football;name=B,age=35,sport=Athletics") << 2 + << makeItemXmlAndData("name=B,age=35,sport=Athletics", &modelData) + << modelData + << QList() + << (QList() << qMakePair(0, 1)); + + QTest::newRow("remove last") + << makeItemXmlAndData("name=A,age=25,sport=Football;name=B,age=35,sport=Athletics") << 2 + << makeItemXmlAndData("name=A,age=25,sport=Football", &modelData) + << modelData + << QList() + << (QList() << qMakePair(1, 1)); + + QTest::newRow("remove from multiple spots") + << makeItemXmlAndData("name=A,age=25,sport=Football;name=B,age=35,sport=Athletics;name=C,age=45,sport=Curling;name=D,age=55,sport=Golf;name=E,age=65,sport=Fencing") << 5 + << makeItemXmlAndData("name=A,age=25,sport=Football;name=C,age=45,sport=Curling", &modelData) + << modelData + << QList() + << (QList() << qMakePair(1, 1) << qMakePair(3,2)); + + QTest::newRow("remove all") + << makeItemXmlAndData("name=A,age=25,sport=Football;name=B,age=35,sport=Athletics;name=C,age=45,sport=Curling") << 3 + << makeItemXmlAndData("", &modelData) + << modelData + << QList() + << (QList() << qMakePair(0, 3)); + + QTest::newRow("replace item") + << makeItemXmlAndData("name=A,age=25,sport=Football") << 1 + << makeItemXmlAndData("name=ZZZ,age=25,sport=Football", &modelData) + << modelData + << (QList() << qMakePair(0, 1)) + << (QList() << qMakePair(0, 1)); + + QTest::newRow("add and remove simultaneously, in different spots") + << makeItemXmlAndData("name=A,age=25,sport=Football;name=B,age=35,sport=Athletics;name=C,age=45,sport=Curling;name=D,age=55,sport=Golf") << 4 + << makeItemXmlAndData("name=B,age=35,sport=Athletics;name=E,age=65,sport=Fencing", &modelData) + << modelData + << (QList() << qMakePair(1, 1)) + << (QList() << qMakePair(0, 1) << qMakePair(2,2)); + + QTest::newRow("insert at start, remove at end i.e. rss feed") + << makeItemXmlAndData("name=C,age=45,sport=Curling;name=D,age=55,sport=Golf;name=E,age=65,sport=Fencing") << 3 + << makeItemXmlAndData("name=A,age=25,sport=Football;name=B,age=35,sport=Athletics;name=C,age=45,sport=Curling", &modelData) + << modelData + << (QList() << qMakePair(0, 2)) + << (QList() << qMakePair(1, 2)); + + QTest::newRow("remove at start, insert at end") + << makeItemXmlAndData("name=A,age=25,sport=Football;name=B,age=35,sport=Athletics;name=C,age=45,sport=Curling") << 3 + << makeItemXmlAndData("name=C,age=45,sport=Curling;name=D,age=55,sport=Golf;name=E,age=65,sport=Fencing", &modelData) + << modelData + << (QList() << qMakePair(1, 2)) + << (QList() << qMakePair(0, 2)); + + QTest::newRow("all data has changed") + << makeItemXmlAndData("name=A,age=25,sport=Football;name=B,age=35") << 2 + << makeItemXmlAndData("name=C,age=45,sport=Curling;name=D,age=55,sport=Golf", &modelData) + << modelData + << (QList() << qMakePair(0, 2)) + << (QList() << qMakePair(0, 2)); +} + +void tst_qdeclarativexmllistmodel::noKeysValueChanges() +{ + // The 'key' roles are 'name' and 'age', as defined in roleKeys.qml. + // If a 'sport' value is changed, the model should not be reloaded, + // since 'sport' is not marked as a key. + + QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/roleKeys.qml")); + QDeclarativeXmlListModel *model = qobject_cast(component.create()); + QVERIFY(model != 0); + + QString xml; + + xml = makeItemXmlAndData("name=A,age=25,sport=Football;name=B,age=35,sport=Athletics"); + model->setXml(xml); + QTRY_COMPARE(model->count(), 2); + + model->setXml(""); + + QSignalSpy spyInsert(model, SIGNAL(itemsInserted(int,int))); + QSignalSpy spyRemove(model, SIGNAL(itemsRemoved(int,int))); + QSignalSpy spyCount(model, SIGNAL(countChanged())); + + xml = makeItemXmlAndData("name=A,age=25,sport=AussieRules;name=B,age=35,sport=Athletics"); + model->setXml(xml); + + // wait for the new xml data to be set, and verify no signals were emitted + QTRY_VERIFY(model->data(0, model->roles()[2]).toString() != QLatin1String("Football")); + QCOMPARE(model->data(0, model->roles()[2]).toString(), QLatin1String("AussieRules")); + + QVERIFY(spyInsert.count() == 0); + QVERIFY(spyRemove.count() == 0); + QVERIFY(spyCount.count() == 0); + + QCOMPARE(model->count(), 2); + + delete model; +} + +void tst_qdeclarativexmllistmodel::keysChanged() +{ + // If the key roles change, the next time the data is reloaded, it should + // delete all its data and build a clean model (i.e. same behaviour as + // if no keys are set). + + QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/roleKeys.qml")); + QDeclarativeXmlListModel *model = qobject_cast(component.create()); + QVERIFY(model != 0); + + QString xml = makeItemXmlAndData("name=A,age=25,sport=Football;name=B,age=35,sport=Athletics"); + model->setXml(xml); + QTRY_COMPARE(model->count(), 2); + + model->setXml(""); + + QSignalSpy spyInsert(model, SIGNAL(itemsInserted(int,int))); + QSignalSpy spyRemove(model, SIGNAL(itemsRemoved(int,int))); + QSignalSpy spyCount(model, SIGNAL(countChanged())); + + QVERIFY(QMetaObject::invokeMethod(model, "disableNameKey")); + model->setXml(xml); + + QTRY_VERIFY(spyInsert.count() > 0 && spyRemove.count() > 0); + + QCOMPARE(spyInsert.count(), 1); + QCOMPARE(spyInsert[0][0].toInt(), 0); + QCOMPARE(spyInsert[0][1].toInt(), 2); + + QCOMPARE(spyRemove.count(), 1); + QCOMPARE(spyRemove[0][0].toInt(), 0); + QCOMPARE(spyRemove[0][1].toInt(), 2); + + QCOMPARE(spyCount.count(), 0); + + delete model; +} + +void tst_qdeclarativexmllistmodel::threading() +{ + QFETCH(int, xmlDataCount); + + QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/roleKeys.qml")); + + QDeclarativeXmlListModel *m1 = qobject_cast(component.create()); + QVERIFY(m1 != 0); + QDeclarativeXmlListModel *m2 = qobject_cast(component.create()); + QVERIFY(m2 != 0); + QDeclarativeXmlListModel *m3 = qobject_cast(component.create()); + QVERIFY(m3 != 0); + + for (int dataCount=0; dataCountsetXml(makeItemXmlAndData(data1)); + m2->setXml(makeItemXmlAndData(data2)); + m3->setXml(makeItemXmlAndData(data3)); + QCoreApplication::processEvents(); + m2->setXml(makeItemXmlAndData(data2)); + m1->setXml(makeItemXmlAndData(data1)); + m2->setXml(makeItemXmlAndData(data2)); + QCoreApplication::processEvents(); + m3->setXml(makeItemXmlAndData(data3)); + QCoreApplication::processEvents(); + m2->setXml(makeItemXmlAndData(data2)); + m1->setXml(makeItemXmlAndData(data1)); + m2->setXml(makeItemXmlAndData(data2)); + m3->setXml(makeItemXmlAndData(data3)); + QCoreApplication::processEvents(); + m2->setXml(makeItemXmlAndData(data2)); + m3->setXml(makeItemXmlAndData(data3)); + m3->setXml(makeItemXmlAndData(data3)); + QCoreApplication::processEvents(); + + QTRY_VERIFY(m1->count() == dataCount && m2->count() == dataCount && m3->count() == dataCount); + + for (int i=0; idata(i, m1->roles()[0]).toString(), QString("A" + QString::number(i))); + QCOMPARE(m1->data(i, m1->roles()[1]).toString(), QString("1" + QString::number(i))); + QCOMPARE(m1->data(i, m1->roles()[2]).toString(), QString("Football")); + + QCOMPARE(m2->data(i, m2->roles()[0]).toString(), QString("B" + QString::number(i))); + QCOMPARE(m2->data(i, m2->roles()[1]).toString(), QString("2" + QString::number(i))); + QCOMPARE(m2->data(i, m2->roles()[2]).toString(), QString("Athletics")); + + QCOMPARE(m3->data(i, m3->roles()[0]).toString(), QString("C" + QString::number(i))); + QCOMPARE(m3->data(i, m3->roles()[1]).toString(), QString("3" + QString::number(i))); + QCOMPARE(m3->data(i, m3->roles()[2]).toString(), QString("Curling")); + } + } + + delete m1; + delete m2; + delete m3; +} + +void tst_qdeclarativexmllistmodel::threading_data() +{ + QTest::addColumn("xmlDataCount"); + + QTest::newRow("1") << 1; + QTest::newRow("2") << 2; + QTest::newRow("10") << 10; +} + +void tst_qdeclarativexmllistmodel::propertyChanges() +{ + QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/propertychanges.qml")); + QDeclarativeXmlListModel *model = qobject_cast(component.create()); + QVERIFY(model != 0); + QTRY_COMPARE(model->count(), 9); + + QDeclarativeXmlListModelRole *role = model->findChild("role"); + QVERIFY(role); + + QSignalSpy nameSpy(role, SIGNAL(nameChanged())); + QSignalSpy querySpy(role, SIGNAL(queryChanged())); + QSignalSpy isKeySpy(role, SIGNAL(isKeyChanged())); + + role->setName("size"); + role->setQuery("size/string()"); + role->setIsKey(true); + + QCOMPARE(role->name(), QString("size")); + QCOMPARE(role->query(), QString("size/string()")); + QVERIFY(role->isKey()); + + QCOMPARE(nameSpy.count(),1); + QCOMPARE(querySpy.count(),1); + QCOMPARE(isKeySpy.count(),1); + + role->setName("size"); + role->setQuery("size/string()"); + role->setIsKey(true); + + QCOMPARE(nameSpy.count(),1); + QCOMPARE(querySpy.count(),1); + QCOMPARE(isKeySpy.count(),1); + + QSignalSpy sourceSpy(model, SIGNAL(sourceChanged())); + QSignalSpy xmlSpy(model, SIGNAL(xmlChanged())); + QSignalSpy modelQuerySpy(model, SIGNAL(queryChanged())); + QSignalSpy namespaceDeclarationsSpy(model, SIGNAL(namespaceDeclarationsChanged())); + + model->setSource(QUrl("")); + model->setXml("PollyParrot12Small"); + model->setQuery("/Pets"); + model->setNamespaceDeclarations("declare namespace media=\"http://search.yahoo.com/mrss/\";"); + + QCOMPARE(model->source(), QUrl("")); + QCOMPARE(model->xml(), QString("PollyParrot12Small")); + QCOMPARE(model->query(), QString("/Pets")); + QCOMPARE(model->namespaceDeclarations(), QString("declare namespace media=\"http://search.yahoo.com/mrss/\";")); + + QTRY_VERIFY(model->count() == 1); + + QCOMPARE(sourceSpy.count(),1); + QCOMPARE(xmlSpy.count(),1); + QCOMPARE(modelQuerySpy.count(),1); + QCOMPARE(namespaceDeclarationsSpy.count(),1); + + model->setSource(QUrl("")); + model->setXml("PollyParrot12Small"); + model->setQuery("/Pets"); + model->setNamespaceDeclarations("declare namespace media=\"http://search.yahoo.com/mrss/\";"); + + QCOMPARE(sourceSpy.count(),1); + QCOMPARE(xmlSpy.count(),1); + QCOMPARE(modelQuerySpy.count(),1); + QCOMPARE(namespaceDeclarationsSpy.count(),1); + + QTRY_VERIFY(model->count() == 1); + delete model; +} + +void tst_qdeclarativexmllistmodel::roleCrash() +{ + // don't crash + QDeclarativeComponent component(&engine, QUrl::fromLocalFile(SRCDIR "/data/roleCrash.qml")); + QDeclarativeXmlListModel *model = qobject_cast(component.create()); + QVERIFY(model != 0); + delete model; +} + +QTEST_MAIN(tst_qdeclarativexmllistmodel) + +#include "tst_qdeclarativexmllistmodel.moc" + +#else +QTEST_NOOP_MAIN +#endif diff --git a/tests/auto/declarative/qmetaobjectbuilder/qmetaobjectbuilder.pro b/tests/auto/declarative/qmetaobjectbuilder/qmetaobjectbuilder.pro new file mode 100644 index 00000000..988177e5 --- /dev/null +++ b/tests/auto/declarative/qmetaobjectbuilder/qmetaobjectbuilder.pro @@ -0,0 +1,8 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +macx:CONFIG -= app_bundle + +SOURCES += \ + tst_qmetaobjectbuilder.cpp + +CONFIG += parallel_test diff --git a/tests/auto/declarative/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp b/tests/auto/declarative/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp new file mode 100644 index 00000000..d19bf951 --- /dev/null +++ b/tests/auto/declarative/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp @@ -0,0 +1,1268 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include + +class tst_QMetaObjectBuilder : public QObject +{ + Q_OBJECT +public: + tst_QMetaObjectBuilder() {} + ~tst_QMetaObjectBuilder() {} + +private slots: + void mocVersionCheck(); + void create(); + void className(); + void superClass(); + void flags(); + void method(); + void slot(); + void signal(); + void constructor(); + void property(); + void notifySignal(); + void enumerator(); + void classInfo(); + void relatedMetaObject(); + void staticMetacall(); + void copyMetaObject(); + void serialize(); + void removeNotifySignal(); + +private: + static bool checkForSideEffects + (const QMetaObjectBuilder& builder, + QMetaObjectBuilder::AddMembers members); + static bool sameMetaObject + (const QMetaObject *meta1, const QMetaObject *meta2); +}; + +// Dummy class that has something of every type of thing moc can generate. +class SomethingOfEverything : public QObject +{ + Q_OBJECT + Q_CLASSINFO("ci_foo", "ABC") + Q_CLASSINFO("ci_bar", "DEF") + Q_PROPERTY(QString prop READ prop WRITE setProp NOTIFY propChanged) + Q_PROPERTY(QString prop2 READ prop WRITE setProp) + Q_PROPERTY(SomethingEnum eprop READ eprop) + Q_PROPERTY(SomethingFlagEnum fprop READ fprop) + Q_PROPERTY(QLocale::Language language READ language) + Q_ENUMS(SomethingEnum) + Q_FLAGS(SomethingFlagEnum) +public: + Q_INVOKABLE SomethingOfEverything() {} + ~SomethingOfEverything() {} + + enum SomethingEnum + { + GHI, + JKL = 10 + }; + + enum SomethingFlagEnum + { + XYZ = 1, + UVW = 8 + }; + + Q_INVOKABLE Q_SCRIPTABLE void method1() {} + + QString prop() const { return QString(); } + void setProp(const QString& v) { Q_UNUSED(v); } + + SomethingOfEverything::SomethingEnum eprop() const { return GHI; } + SomethingOfEverything::SomethingFlagEnum fprop() const { return XYZ; } + QLocale::Language language() const { return QLocale::English; } + +public slots: + void slot1(const QString&) {} + void slot2(int, const QString&) {} + +private slots: + void slot3() {} + +protected slots: + Q_SCRIPTABLE void slot4(int) {} + void slot5(int a, const QString& b) { Q_UNUSED(a); Q_UNUSED(b); } + +signals: + void sig1(); + void sig2(int x, const QString& y); + void propChanged(const QString&); +}; + +void tst_QMetaObjectBuilder::mocVersionCheck() +{ + // This test will fail when the moc version number is changed. + // It is intended as a reminder to also update QMetaObjectBuilder + // whenenver moc changes. Once QMetaObjectBuilder has been + // updated, this test can be changed to check for the next version. + int version = int(QObject::staticMetaObject.d.data[0]); + QVERIFY(version == 4 || version == 5 || version == 6); + version = int(staticMetaObject.d.data[0]); + QVERIFY(version == 4 || version == 5 || version == 6); +} + +void tst_QMetaObjectBuilder::create() +{ + QMetaObjectBuilder builder; + QVERIFY(builder.className().isEmpty()); + QVERIFY(builder.superClass() == &QObject::staticMetaObject); + QCOMPARE(builder.methodCount(), 0); + QCOMPARE(builder.constructorCount(), 0); + QCOMPARE(builder.propertyCount(), 0); + QCOMPARE(builder.enumeratorCount(), 0); + QCOMPARE(builder.classInfoCount(), 0); + QCOMPARE(builder.relatedMetaObjectCount(), 0); + QVERIFY(builder.staticMetacallFunction() == 0); +} + +void tst_QMetaObjectBuilder::className() +{ + QMetaObjectBuilder builder; + + // Change the class name. + builder.setClassName("Foo"); + QCOMPARE(builder.className(), QByteArray("Foo")); + + // Change it again. + builder.setClassName("Bar"); + QCOMPARE(builder.className(), QByteArray("Bar")); + + // Clone the class name off a static QMetaObject. + builder.addMetaObject(&QObject::staticMetaObject, QMetaObjectBuilder::ClassName); + QCOMPARE(builder.className(), QByteArray("QObject")); + + // Check that nothing else changed. + QVERIFY(checkForSideEffects(builder, QMetaObjectBuilder::ClassName)); +} + +void tst_QMetaObjectBuilder::superClass() +{ + QMetaObjectBuilder builder; + + // Change the super class. + builder.setSuperClass(&QObject::staticMetaObject); + QVERIFY(builder.superClass() == &QObject::staticMetaObject); + + // Change it again. + builder.setSuperClass(&staticMetaObject); + QVERIFY(builder.superClass() == &staticMetaObject); + + // Clone the super class off a static QMetaObject. + builder.addMetaObject(&QObject::staticMetaObject, QMetaObjectBuilder::SuperClass); + QVERIFY(builder.superClass() == 0); + builder.addMetaObject(&staticMetaObject, QMetaObjectBuilder::SuperClass); + QVERIFY(builder.superClass() == staticMetaObject.superClass()); + + // Check that nothing else changed. + QVERIFY(checkForSideEffects(builder, QMetaObjectBuilder::SuperClass)); +} + +void tst_QMetaObjectBuilder::flags() +{ + QMetaObjectBuilder builder; + + // Check default + QVERIFY(builder.flags() == 0); + + // Set flags + builder.setFlags(QMetaObjectBuilder::DynamicMetaObject); + QVERIFY(builder.flags() == QMetaObjectBuilder::DynamicMetaObject); +} + +void tst_QMetaObjectBuilder::method() +{ + QMetaObjectBuilder builder; + + // Check null method + QMetaMethodBuilder nullMethod; + QCOMPARE(nullMethod.signature(), QByteArray()); + QVERIFY(nullMethod.methodType() == QMetaMethod::Method); + QVERIFY(nullMethod.returnType().isEmpty()); + QVERIFY(nullMethod.parameterNames().isEmpty()); + QVERIFY(nullMethod.tag().isEmpty()); + QVERIFY(nullMethod.access() == QMetaMethod::Public); + QCOMPARE(nullMethod.attributes(), 0); + QCOMPARE(nullMethod.index(), 0); + + // Add a method and check its attributes. + QMetaMethodBuilder method1 = builder.addMethod("foo(const QString&, int)"); + QCOMPARE(method1.signature(), QByteArray("foo(QString,int)")); + QVERIFY(method1.methodType() == QMetaMethod::Method); + QVERIFY(method1.returnType().isEmpty()); + QVERIFY(method1.parameterNames().isEmpty()); + QVERIFY(method1.tag().isEmpty()); + QVERIFY(method1.access() == QMetaMethod::Public); + QCOMPARE(method1.attributes(), 0); + QCOMPARE(method1.index(), 0); + QCOMPARE(builder.methodCount(), 1); + + // Add another method and check again. + QMetaMethodBuilder method2 = builder.addMethod("bar(QString)", "int"); + QCOMPARE(method2.signature(), QByteArray("bar(QString)")); + QVERIFY(method2.methodType() == QMetaMethod::Method); + QCOMPARE(method2.returnType(), QByteArray("int")); + QVERIFY(method2.parameterNames().isEmpty()); + QVERIFY(method2.tag().isEmpty()); + QVERIFY(method2.access() == QMetaMethod::Public); + QCOMPARE(method2.attributes(), 0); + QCOMPARE(method2.index(), 1); + QCOMPARE(builder.methodCount(), 2); + + // Perform index-based lookup. + QCOMPARE(builder.indexOfMethod("foo(const QString&, int)"), 0); + QCOMPARE(builder.indexOfMethod("bar(QString)"), 1); + QCOMPARE(builder.indexOfMethod("baz()"), -1); + + // Modify the attributes on method1. + method1.setReturnType("int"); + method1.setParameterNames(QList() << "a" << "b"); + method1.setTag("tag"); + method1.setAccess(QMetaMethod::Private); + method1.setAttributes(42); + + // Check that method1 is changed, but method2 is not. + QCOMPARE(method1.signature(), QByteArray("foo(QString,int)")); + QVERIFY(method1.methodType() == QMetaMethod::Method); + QCOMPARE(method1.returnType(), QByteArray("int")); + QCOMPARE(method1.parameterNames(), QList() << "a" << "b"); + QCOMPARE(method1.tag(), QByteArray("tag")); + QVERIFY(method1.access() == QMetaMethod::Private); + QCOMPARE(method1.attributes(), 42); + QCOMPARE(method1.index(), 0); + QCOMPARE(method2.signature(), QByteArray("bar(QString)")); + QVERIFY(method2.methodType() == QMetaMethod::Method); + QCOMPARE(method2.returnType(), QByteArray("int")); + QVERIFY(method2.parameterNames().isEmpty()); + QVERIFY(method2.tag().isEmpty()); + QVERIFY(method2.access() == QMetaMethod::Public); + QCOMPARE(method2.attributes(), 0); + QCOMPARE(method2.index(), 1); + QCOMPARE(builder.methodCount(), 2); + + // Modify the attributes on method2. + method2.setReturnType("QString"); + method2.setParameterNames(QList() << "c"); + method2.setTag("Q_FOO"); + method2.setAccess(QMetaMethod::Protected); + method2.setAttributes(24); + + // This time check that only method2 changed. + QCOMPARE(method1.signature(), QByteArray("foo(QString,int)")); + QVERIFY(method1.methodType() == QMetaMethod::Method); + QCOMPARE(method1.returnType(), QByteArray("int")); + QCOMPARE(method1.parameterNames(), QList() << "a" << "b"); + QCOMPARE(method1.tag(), QByteArray("tag")); + QVERIFY(method1.access() == QMetaMethod::Private); + QCOMPARE(method1.attributes(), 42); + QCOMPARE(method1.index(), 0); + QCOMPARE(method2.signature(), QByteArray("bar(QString)")); + QVERIFY(method2.methodType() == QMetaMethod::Method); + QCOMPARE(method2.returnType(), QByteArray("QString")); + QCOMPARE(method2.parameterNames(), QList() << "c"); + QCOMPARE(method2.tag(), QByteArray("Q_FOO")); + QVERIFY(method2.access() == QMetaMethod::Protected); + QCOMPARE(method2.attributes(), 24); + QCOMPARE(method2.index(), 1); + QCOMPARE(builder.methodCount(), 2); + + // Remove method1 and check that method2 becomes index 0. + builder.removeMethod(0); + QCOMPARE(builder.methodCount(), 1); + method2 = builder.method(0); + QCOMPARE(method2.signature(), QByteArray("bar(QString)")); + QVERIFY(method2.methodType() == QMetaMethod::Method); + QCOMPARE(method2.returnType(), QByteArray("QString")); + QCOMPARE(method2.parameterNames(), QList() << "c"); + QCOMPARE(method2.tag(), QByteArray("Q_FOO")); + QVERIFY(method2.access() == QMetaMethod::Protected); + QCOMPARE(method2.attributes(), 24); + QCOMPARE(method2.index(), 0); + + // Perform index-based lookup again. + QCOMPARE(builder.indexOfMethod("foo(const QString&, int)"), -1); + QCOMPARE(builder.indexOfMethod("bar(QString)"), 0); + QCOMPARE(builder.indexOfMethod("baz()"), -1); + QCOMPARE(builder.method(0).signature(), QByteArray("bar(QString)")); + QCOMPARE(builder.method(9).signature(), QByteArray()); + + // Check that nothing else changed. + QVERIFY(checkForSideEffects(builder, QMetaObjectBuilder::Methods)); +} + +void tst_QMetaObjectBuilder::slot() +{ + QMetaObjectBuilder builder; + + // Add a slot and check its attributes. + QMetaMethodBuilder method1 = builder.addSlot("foo(const QString&, int)"); + QCOMPARE(method1.signature(), QByteArray("foo(QString,int)")); + QVERIFY(method1.methodType() == QMetaMethod::Slot); + QVERIFY(method1.returnType().isEmpty()); + QVERIFY(method1.parameterNames().isEmpty()); + QVERIFY(method1.tag().isEmpty()); + QVERIFY(method1.access() == QMetaMethod::Public); + QCOMPARE(method1.attributes(), 0); + QCOMPARE(method1.index(), 0); + QCOMPARE(builder.methodCount(), 1); + + // Add another slot and check again. + QMetaMethodBuilder method2 = builder.addSlot("bar(QString)"); + QCOMPARE(method2.signature(), QByteArray("bar(QString)")); + QVERIFY(method2.methodType() == QMetaMethod::Slot); + QVERIFY(method2.returnType().isEmpty()); + QVERIFY(method2.parameterNames().isEmpty()); + QVERIFY(method2.tag().isEmpty()); + QVERIFY(method2.access() == QMetaMethod::Public); + QCOMPARE(method2.attributes(), 0); + QCOMPARE(method2.index(), 1); + QCOMPARE(builder.methodCount(), 2); + + // Perform index-based lookup + QCOMPARE(builder.indexOfSlot("foo(const QString &, int)"), 0); + QCOMPARE(builder.indexOfSlot("bar(QString)"), 1); + QCOMPARE(builder.indexOfSlot("baz()"), -1); + + // Check that nothing else changed. + QVERIFY(checkForSideEffects(builder, QMetaObjectBuilder::Methods)); +} + +void tst_QMetaObjectBuilder::signal() +{ + QMetaObjectBuilder builder; + + // Add a signal and check its attributes. + QMetaMethodBuilder method1 = builder.addSignal("foo(const QString&, int)"); + QCOMPARE(method1.signature(), QByteArray("foo(QString,int)")); + QVERIFY(method1.methodType() == QMetaMethod::Signal); + QVERIFY(method1.returnType().isEmpty()); + QVERIFY(method1.parameterNames().isEmpty()); + QVERIFY(method1.tag().isEmpty()); + QVERIFY(method1.access() == QMetaMethod::Protected); + QCOMPARE(method1.attributes(), 0); + QCOMPARE(method1.index(), 0); + QCOMPARE(builder.methodCount(), 1); + + // Add another signal and check again. + QMetaMethodBuilder method2 = builder.addSignal("bar(QString)"); + QCOMPARE(method2.signature(), QByteArray("bar(QString)")); + QVERIFY(method2.methodType() == QMetaMethod::Signal); + QVERIFY(method2.returnType().isEmpty()); + QVERIFY(method2.parameterNames().isEmpty()); + QVERIFY(method2.tag().isEmpty()); + QVERIFY(method2.access() == QMetaMethod::Protected); + QCOMPARE(method2.attributes(), 0); + QCOMPARE(method2.index(), 1); + QCOMPARE(builder.methodCount(), 2); + + // Perform index-based lookup + QCOMPARE(builder.indexOfSignal("foo(const QString &, int)"), 0); + QCOMPARE(builder.indexOfSignal("bar(QString)"), 1); + QCOMPARE(builder.indexOfSignal("baz()"), -1); + + // Check that nothing else changed. + QVERIFY(checkForSideEffects(builder, QMetaObjectBuilder::Methods)); +} + +void tst_QMetaObjectBuilder::constructor() +{ + QMetaObjectBuilder builder; + + // Add a constructor and check its attributes. + QMetaMethodBuilder ctor1 = builder.addConstructor("foo(const QString&, int)"); + QCOMPARE(ctor1.signature(), QByteArray("foo(QString,int)")); + QVERIFY(ctor1.methodType() == QMetaMethod::Constructor); + QVERIFY(ctor1.returnType().isEmpty()); + QVERIFY(ctor1.parameterNames().isEmpty()); + QVERIFY(ctor1.tag().isEmpty()); + QVERIFY(ctor1.access() == QMetaMethod::Public); + QCOMPARE(ctor1.attributes(), 0); + QCOMPARE(ctor1.index(), 0); + QCOMPARE(builder.constructorCount(), 1); + + // Add another constructor and check again. + QMetaMethodBuilder ctor2 = builder.addConstructor("bar(QString)"); + QCOMPARE(ctor2.signature(), QByteArray("bar(QString)")); + QVERIFY(ctor2.methodType() == QMetaMethod::Constructor); + QVERIFY(ctor2.returnType().isEmpty()); + QVERIFY(ctor2.parameterNames().isEmpty()); + QVERIFY(ctor2.tag().isEmpty()); + QVERIFY(ctor2.access() == QMetaMethod::Public); + QCOMPARE(ctor2.attributes(), 0); + QCOMPARE(ctor2.index(), 1); + QCOMPARE(builder.constructorCount(), 2); + + // Perform index-based lookup. + QCOMPARE(builder.indexOfConstructor("foo(const QString&, int)"), 0); + QCOMPARE(builder.indexOfConstructor("bar(QString)"), 1); + QCOMPARE(builder.indexOfConstructor("baz()"), -1); + QCOMPARE(builder.constructor(1).signature(), QByteArray("bar(QString)")); + QCOMPARE(builder.constructor(9).signature(), QByteArray()); + + // Modify the attributes on ctor1. + ctor1.setReturnType("int"); + ctor1.setParameterNames(QList() << "a" << "b"); + ctor1.setTag("tag"); + ctor1.setAccess(QMetaMethod::Private); + ctor1.setAttributes(42); + + // Check that ctor1 is changed, but ctor2 is not. + QCOMPARE(ctor1.signature(), QByteArray("foo(QString,int)")); + QVERIFY(ctor1.methodType() == QMetaMethod::Constructor); + QCOMPARE(ctor1.returnType(), QByteArray("int")); + QCOMPARE(ctor1.parameterNames(), QList() << "a" << "b"); + QCOMPARE(ctor1.tag(), QByteArray("tag")); + QVERIFY(ctor1.access() == QMetaMethod::Private); + QCOMPARE(ctor1.attributes(), 42); + QCOMPARE(ctor1.index(), 0); + QCOMPARE(ctor2.signature(), QByteArray("bar(QString)")); + QVERIFY(ctor2.methodType() == QMetaMethod::Constructor); + QVERIFY(ctor2.returnType().isEmpty()); + QVERIFY(ctor2.parameterNames().isEmpty()); + QVERIFY(ctor2.tag().isEmpty()); + QVERIFY(ctor2.access() == QMetaMethod::Public); + QCOMPARE(ctor2.attributes(), 0); + QCOMPARE(ctor2.index(), 1); + QCOMPARE(builder.constructorCount(), 2); + + // Modify the attributes on ctor2. + ctor2.setReturnType("QString"); + ctor2.setParameterNames(QList() << "c"); + ctor2.setTag("Q_FOO"); + ctor2.setAccess(QMetaMethod::Protected); + ctor2.setAttributes(24); + + // This time check that only ctor2 changed. + QCOMPARE(ctor1.signature(), QByteArray("foo(QString,int)")); + QVERIFY(ctor1.methodType() == QMetaMethod::Constructor); + QCOMPARE(ctor1.returnType(), QByteArray("int")); + QCOMPARE(ctor1.parameterNames(), QList() << "a" << "b"); + QCOMPARE(ctor1.tag(), QByteArray("tag")); + QVERIFY(ctor1.access() == QMetaMethod::Private); + QCOMPARE(ctor1.attributes(), 42); + QCOMPARE(ctor1.index(), 0); + QCOMPARE(ctor2.signature(), QByteArray("bar(QString)")); + QVERIFY(ctor2.methodType() == QMetaMethod::Constructor); + QCOMPARE(ctor2.returnType(), QByteArray("QString")); + QCOMPARE(ctor2.parameterNames(), QList() << "c"); + QCOMPARE(ctor2.tag(), QByteArray("Q_FOO")); + QVERIFY(ctor2.access() == QMetaMethod::Protected); + QCOMPARE(ctor2.attributes(), 24); + QCOMPARE(ctor2.index(), 1); + QCOMPARE(builder.constructorCount(), 2); + + // Remove ctor1 and check that ctor2 becomes index 0. + builder.removeConstructor(0); + QCOMPARE(builder.constructorCount(), 1); + ctor2 = builder.constructor(0); + QCOMPARE(ctor2.signature(), QByteArray("bar(QString)")); + QVERIFY(ctor2.methodType() == QMetaMethod::Constructor); + QCOMPARE(ctor2.returnType(), QByteArray("QString")); + QCOMPARE(ctor2.parameterNames(), QList() << "c"); + QCOMPARE(ctor2.tag(), QByteArray("Q_FOO")); + QVERIFY(ctor2.access() == QMetaMethod::Protected); + QCOMPARE(ctor2.attributes(), 24); + QCOMPARE(ctor2.index(), 0); + + // Perform index-based lookup again. + QCOMPARE(builder.indexOfConstructor("foo(const QString&, int)"), -1); + QCOMPARE(builder.indexOfConstructor("bar(QString)"), 0); + QCOMPARE(builder.indexOfConstructor("baz()"), -1); + + // Add constructor from prototype + QMetaMethod prototype = SomethingOfEverything::staticMetaObject.constructor(0); + QMetaMethodBuilder prototypeConstructor = builder.addMethod(prototype); + QCOMPARE(builder.constructorCount(), 2); + + QCOMPARE(prototypeConstructor.signature(), QByteArray("SomethingOfEverything()")); + QVERIFY(prototypeConstructor.methodType() == QMetaMethod::Constructor); + QCOMPARE(prototypeConstructor.returnType(), QByteArray()); + QVERIFY(prototypeConstructor.access() == QMetaMethod::Public); + QCOMPARE(prototypeConstructor.index(), 1); + + // Check that nothing else changed. + QVERIFY(checkForSideEffects(builder, QMetaObjectBuilder::Constructors)); +} + +void tst_QMetaObjectBuilder::property() +{ + QMetaObjectBuilder builder; + + // Null property builder + QMetaPropertyBuilder nullProp; + QCOMPARE(nullProp.name(), QByteArray()); + QCOMPARE(nullProp.type(), QByteArray()); + QVERIFY(!nullProp.hasNotifySignal()); + QVERIFY(!nullProp.isReadable()); + QVERIFY(!nullProp.isWritable()); + QVERIFY(!nullProp.isResettable()); + QVERIFY(!nullProp.isDesignable()); + QVERIFY(!nullProp.isScriptable()); + QVERIFY(!nullProp.isStored()); + QVERIFY(!nullProp.isEditable()); + QVERIFY(!nullProp.isUser()); + QVERIFY(!nullProp.hasStdCppSet()); + QVERIFY(!nullProp.isEnumOrFlag()); + QVERIFY(!nullProp.isConstant()); + QVERIFY(!nullProp.isFinal()); + QCOMPARE(nullProp.index(), 0); + + // Add a property and check its attributes. + QMetaPropertyBuilder prop1 = builder.addProperty("foo", "const QString &"); + QCOMPARE(prop1.name(), QByteArray("foo")); + QCOMPARE(prop1.type(), QByteArray("QString")); + QVERIFY(!prop1.hasNotifySignal()); + QVERIFY(prop1.isReadable()); + QVERIFY(prop1.isWritable()); + QVERIFY(!prop1.isResettable()); + QVERIFY(!prop1.isDesignable()); + QVERIFY(prop1.isScriptable()); + QVERIFY(!prop1.isStored()); + QVERIFY(!prop1.isEditable()); + QVERIFY(!prop1.isUser()); + QVERIFY(!prop1.hasStdCppSet()); + QVERIFY(!prop1.isEnumOrFlag()); + QVERIFY(!prop1.isConstant()); + QVERIFY(!prop1.isFinal()); + QCOMPARE(prop1.index(), 0); + QCOMPARE(builder.propertyCount(), 1); + + // Add another property and check again. + QMetaPropertyBuilder prop2 = builder.addProperty("bar", "int"); + QCOMPARE(prop2.name(), QByteArray("bar")); + QCOMPARE(prop2.type(), QByteArray("int")); + QVERIFY(!prop2.hasNotifySignal()); + QVERIFY(prop2.isReadable()); + QVERIFY(prop2.isWritable()); + QVERIFY(!prop2.isResettable()); + QVERIFY(!prop2.isDesignable()); + QVERIFY(prop2.isScriptable()); + QVERIFY(!prop2.isStored()); + QVERIFY(!prop2.isEditable()); + QVERIFY(!prop2.isUser()); + QVERIFY(!prop2.hasStdCppSet()); + QVERIFY(!prop2.isEnumOrFlag()); + QVERIFY(!prop2.isConstant()); + QVERIFY(!prop2.isFinal()); + QCOMPARE(prop2.index(), 1); + QCOMPARE(builder.propertyCount(), 2); + + // Perform index-based lookup. + QCOMPARE(builder.indexOfProperty("foo"), 0); + QCOMPARE(builder.indexOfProperty("bar"), 1); + QCOMPARE(builder.indexOfProperty("baz"), -1); + QCOMPARE(builder.property(1).name(), QByteArray("bar")); + QCOMPARE(builder.property(9).name(), QByteArray()); + + // Modify the attributes on prop1. + prop1.setReadable(false); + prop1.setWritable(false); + prop1.setResettable(true); + prop1.setDesignable(true); + prop1.setScriptable(false); + prop1.setStored(true); + prop1.setEditable(true); + prop1.setUser(true); + prop1.setStdCppSet(true); + prop1.setEnumOrFlag(true); + prop1.setConstant(true); + prop1.setFinal(true); + + // Check that prop1 is changed, but prop2 is not. + QCOMPARE(prop1.name(), QByteArray("foo")); + QCOMPARE(prop1.type(), QByteArray("QString")); + QVERIFY(!prop1.isReadable()); + QVERIFY(!prop1.isWritable()); + QVERIFY(prop1.isResettable()); + QVERIFY(prop1.isDesignable()); + QVERIFY(!prop1.isScriptable()); + QVERIFY(prop1.isStored()); + QVERIFY(prop1.isEditable()); + QVERIFY(prop1.isUser()); + QVERIFY(prop1.hasStdCppSet()); + QVERIFY(prop1.isEnumOrFlag()); + QVERIFY(prop1.isConstant()); + QVERIFY(prop1.isFinal()); + QVERIFY(prop2.isReadable()); + QVERIFY(prop2.isWritable()); + QCOMPARE(prop2.name(), QByteArray("bar")); + QCOMPARE(prop2.type(), QByteArray("int")); + QVERIFY(!prop2.isResettable()); + QVERIFY(!prop2.isDesignable()); + QVERIFY(prop2.isScriptable()); + QVERIFY(!prop2.isStored()); + QVERIFY(!prop2.isEditable()); + QVERIFY(!prop2.isUser()); + QVERIFY(!prop2.hasStdCppSet()); + QVERIFY(!prop2.isEnumOrFlag()); + QVERIFY(!prop2.isConstant()); + QVERIFY(!prop2.isFinal()); + + // Remove prop1 and check that prop2 becomes index 0. + builder.removeProperty(0); + QCOMPARE(builder.propertyCount(), 1); + prop2 = builder.property(0); + QCOMPARE(prop2.name(), QByteArray("bar")); + QCOMPARE(prop2.type(), QByteArray("int")); + QVERIFY(!prop2.isResettable()); + QVERIFY(!prop2.isDesignable()); + QVERIFY(prop2.isScriptable()); + QVERIFY(!prop2.isStored()); + QVERIFY(!prop2.isEditable()); + QVERIFY(!prop2.isUser()); + QVERIFY(!prop2.hasStdCppSet()); + QVERIFY(!prop2.isEnumOrFlag()); + QVERIFY(!prop2.isConstant()); + QVERIFY(!prop2.isFinal()); + QCOMPARE(prop2.index(), 0); + + // Perform index-based lookup again. + QCOMPARE(builder.indexOfProperty("foo"), -1); + QCOMPARE(builder.indexOfProperty("bar"), 0); + QCOMPARE(builder.indexOfProperty("baz"), -1); + + // Check for side-effects between the flags on prop2. + // Setting a flag to true shouldn't set any of the others to true. + // This checks for cut-and-paste bugs in the implementation where + // the flag code was pasted but the flag name was not changed. +#define CLEAR_FLAGS() \ + do { \ + prop2.setReadable(false); \ + prop2.setWritable(false); \ + prop2.setResettable(false); \ + prop2.setDesignable(false); \ + prop2.setScriptable(false); \ + prop2.setStored(false); \ + prop2.setEditable(false); \ + prop2.setUser(false); \ + prop2.setStdCppSet(false); \ + prop2.setEnumOrFlag(false); \ + prop2.setConstant(false); \ + prop2.setFinal(false); \ + } while (0) +#define COUNT_FLAGS() \ + ((prop2.isReadable() ? 1 : 0) + \ + (prop2.isWritable() ? 1 : 0) + \ + (prop2.isResettable() ? 1 : 0) + \ + (prop2.isDesignable() ? 1 : 0) + \ + (prop2.isScriptable() ? 1 : 0) + \ + (prop2.isStored() ? 1 : 0) + \ + (prop2.isEditable() ? 1 : 0) + \ + (prop2.isUser() ? 1 : 0) + \ + (prop2.hasStdCppSet() ? 1 : 0) + \ + (prop2.isEnumOrFlag() ? 1 : 0) + \ + (prop2.isConstant() ? 1 : 0) + \ + (prop2.isFinal() ? 1 : 0)) +#define CHECK_FLAG(setFunc,isFunc) \ + do { \ + CLEAR_FLAGS(); \ + QCOMPARE(COUNT_FLAGS(), 0); \ + prop2.setFunc(true); \ + QVERIFY(prop2.isFunc()); \ + QCOMPARE(COUNT_FLAGS(), 1); \ + } while (0) + CHECK_FLAG(setReadable, isReadable); + CHECK_FLAG(setWritable, isWritable); + CHECK_FLAG(setResettable, isResettable); + CHECK_FLAG(setDesignable, isDesignable); + CHECK_FLAG(setScriptable, isScriptable); + CHECK_FLAG(setStored, isStored); + CHECK_FLAG(setEditable, isEditable); + CHECK_FLAG(setUser, isUser); + CHECK_FLAG(setStdCppSet, hasStdCppSet); + CHECK_FLAG(setEnumOrFlag, isEnumOrFlag); + CHECK_FLAG(setConstant, isConstant); + CHECK_FLAG(setFinal, isFinal); + + // Check that nothing else changed. + QVERIFY(checkForSideEffects(builder, QMetaObjectBuilder::Properties)); + + // Add property from prototype + QMetaProperty prototype = SomethingOfEverything::staticMetaObject.property(1); + QVERIFY(prototype.name() == QByteArray("prop")); + QMetaPropertyBuilder prototypeProp = builder.addProperty(prototype); + QCOMPARE(prototypeProp.name(), QByteArray("prop")); + QVERIFY(prototypeProp.hasNotifySignal()); + QCOMPARE(prototypeProp.notifySignal().signature(), QByteArray("propChanged(QString)")); + QCOMPARE(builder.methodCount(), 1); + QCOMPARE(builder.method(0).signature(), QByteArray("propChanged(QString)")); +} + +void tst_QMetaObjectBuilder::notifySignal() +{ + QMetaObjectBuilder builder; + + QMetaPropertyBuilder prop = builder.addProperty("foo", "const QString &"); + builder.addSlot("setFoo(QString)"); + QMetaMethodBuilder notify = builder.addSignal("fooChanged(QString)"); + + QVERIFY(!prop.hasNotifySignal()); + QCOMPARE(prop.notifySignal().index(), 0); + + prop.setNotifySignal(notify); + QVERIFY(prop.hasNotifySignal()); + QCOMPARE(prop.notifySignal().index(), 1); + + prop.setNotifySignal(QMetaMethodBuilder()); + QVERIFY(!prop.hasNotifySignal()); + QCOMPARE(prop.notifySignal().index(), 0); + + prop.setNotifySignal(notify); + prop.removeNotifySignal(); + QVERIFY(!prop.hasNotifySignal()); + QCOMPARE(prop.notifySignal().index(), 0); + + QCOMPARE(builder.methodCount(), 2); + QCOMPARE(builder.propertyCount(), 1); + + // Check that nothing else changed except methods and properties. + QVERIFY(checkForSideEffects + (builder, QMetaObjectBuilder::Methods | QMetaObjectBuilder::Properties)); +} + +void tst_QMetaObjectBuilder::enumerator() +{ + QMetaObjectBuilder builder; + + // Add an enumerator and check its attributes. + QMetaEnumBuilder enum1 = builder.addEnumerator("foo"); + QCOMPARE(enum1.name(), QByteArray("foo")); + QVERIFY(!enum1.isFlag()); + QCOMPARE(enum1.keyCount(), 0); + QCOMPARE(enum1.index(), 0); + QCOMPARE(builder.enumeratorCount(), 1); + + // Add another enumerator and check again. + QMetaEnumBuilder enum2 = builder.addEnumerator("bar"); + QCOMPARE(enum2.name(), QByteArray("bar")); + QVERIFY(!enum2.isFlag()); + QCOMPARE(enum2.keyCount(), 0); + QCOMPARE(enum2.index(), 1); + QCOMPARE(builder.enumeratorCount(), 2); + + // Perform index-based lookup. + QCOMPARE(builder.indexOfEnumerator("foo"), 0); + QCOMPARE(builder.indexOfEnumerator("bar"), 1); + QCOMPARE(builder.indexOfEnumerator("baz"), -1); + QCOMPARE(builder.enumerator(1).name(), QByteArray("bar")); + QCOMPARE(builder.enumerator(9).name(), QByteArray()); + + // Modify the attributes on enum1. + enum1.setIsFlag(true); + QCOMPARE(enum1.addKey("ABC", 0), 0); + QCOMPARE(enum1.addKey("DEF", 1), 1); + QCOMPARE(enum1.addKey("GHI", -1), 2); + + // Check that enum1 is changed, but enum2 is not. + QCOMPARE(enum1.name(), QByteArray("foo")); + QVERIFY(enum1.isFlag()); + QCOMPARE(enum1.keyCount(), 3); + QCOMPARE(enum1.index(), 0); + QCOMPARE(enum1.key(0), QByteArray("ABC")); + QCOMPARE(enum1.key(1), QByteArray("DEF")); + QCOMPARE(enum1.key(2), QByteArray("GHI")); + QCOMPARE(enum1.key(3), QByteArray()); + QCOMPARE(enum1.value(0), 0); + QCOMPARE(enum1.value(1), 1); + QCOMPARE(enum1.value(2), -1); + QCOMPARE(enum2.name(), QByteArray("bar")); + QVERIFY(!enum2.isFlag()); + QCOMPARE(enum2.keyCount(), 0); + QCOMPARE(enum2.index(), 1); + + // Modify the attributes on enum2. + enum2.setIsFlag(true); + QCOMPARE(enum2.addKey("XYZ", 10), 0); + QCOMPARE(enum2.addKey("UVW", 19), 1); + + // This time check that only method2 changed. + QCOMPARE(enum1.name(), QByteArray("foo")); + QVERIFY(enum1.isFlag()); + QCOMPARE(enum1.keyCount(), 3); + QCOMPARE(enum1.index(), 0); + QCOMPARE(enum1.key(0), QByteArray("ABC")); + QCOMPARE(enum1.key(1), QByteArray("DEF")); + QCOMPARE(enum1.key(2), QByteArray("GHI")); + QCOMPARE(enum1.key(3), QByteArray()); + QCOMPARE(enum1.value(0), 0); + QCOMPARE(enum1.value(1), 1); + QCOMPARE(enum1.value(2), -1); + QCOMPARE(enum2.name(), QByteArray("bar")); + QVERIFY(enum2.isFlag()); + QCOMPARE(enum2.keyCount(), 2); + QCOMPARE(enum2.index(), 1); + QCOMPARE(enum2.key(0), QByteArray("XYZ")); + QCOMPARE(enum2.key(1), QByteArray("UVW")); + QCOMPARE(enum2.key(2), QByteArray()); + QCOMPARE(enum2.value(0), 10); + QCOMPARE(enum2.value(1), 19); + + // Remove enum1 key + enum1.removeKey(2); + QCOMPARE(enum1.name(), QByteArray("foo")); + QVERIFY(enum1.isFlag()); + QCOMPARE(enum1.keyCount(), 2); + QCOMPARE(enum1.index(), 0); + QCOMPARE(enum1.key(0), QByteArray("ABC")); + QCOMPARE(enum1.key(1), QByteArray("DEF")); + QCOMPARE(enum1.key(2), QByteArray()); + QCOMPARE(enum1.value(0), 0); + QCOMPARE(enum1.value(1), 1); + QCOMPARE(enum1.value(2), -1); + QCOMPARE(enum2.name(), QByteArray("bar")); + QVERIFY(enum2.isFlag()); + QCOMPARE(enum2.keyCount(), 2); + QCOMPARE(enum2.index(), 1); + QCOMPARE(enum2.key(0), QByteArray("XYZ")); + QCOMPARE(enum2.key(1), QByteArray("UVW")); + QCOMPARE(enum2.key(2), QByteArray()); + QCOMPARE(enum2.value(0), 10); + QCOMPARE(enum2.value(1), 19); + + // Remove enum1 and check that enum2 becomes index 0. + builder.removeEnumerator(0); + QCOMPARE(builder.enumeratorCount(), 1); + enum2 = builder.enumerator(0); + QCOMPARE(enum2.name(), QByteArray("bar")); + QVERIFY(enum2.isFlag()); + QCOMPARE(enum2.keyCount(), 2); + QCOMPARE(enum2.index(), 0); + QCOMPARE(enum2.key(0), QByteArray("XYZ")); + QCOMPARE(enum2.key(1), QByteArray("UVW")); + QCOMPARE(enum2.key(2), QByteArray()); + QCOMPARE(enum2.value(0), 10); + QCOMPARE(enum2.value(1), 19); + + // Perform index-based lookup again. + QCOMPARE(builder.indexOfEnumerator("foo"), -1); + QCOMPARE(builder.indexOfEnumerator("bar"), 0); + QCOMPARE(builder.indexOfEnumerator("baz"), -1); + + // Check that nothing else changed. + QVERIFY(checkForSideEffects(builder, QMetaObjectBuilder::Enumerators)); +} + +void tst_QMetaObjectBuilder::classInfo() +{ + QMetaObjectBuilder builder; + + // Add two items of class information and check their attributes. + QCOMPARE(builder.addClassInfo("foo", "value1"), 0); + QCOMPARE(builder.addClassInfo("bar", "value2"), 1); + QCOMPARE(builder.classInfoName(0), QByteArray("foo")); + QCOMPARE(builder.classInfoValue(0), QByteArray("value1")); + QCOMPARE(builder.classInfoName(1), QByteArray("bar")); + QCOMPARE(builder.classInfoValue(1), QByteArray("value2")); + QCOMPARE(builder.classInfoName(9), QByteArray()); + QCOMPARE(builder.classInfoValue(9), QByteArray()); + QCOMPARE(builder.classInfoCount(), 2); + + // Perform index-based lookup. + QCOMPARE(builder.indexOfClassInfo("foo"), 0); + QCOMPARE(builder.indexOfClassInfo("bar"), 1); + QCOMPARE(builder.indexOfClassInfo("baz"), -1); + + // Remove the first one and check again. + builder.removeClassInfo(0); + QCOMPARE(builder.classInfoName(0), QByteArray("bar")); + QCOMPARE(builder.classInfoValue(0), QByteArray("value2")); + QCOMPARE(builder.classInfoCount(), 1); + + // Perform index-based lookup again. + QCOMPARE(builder.indexOfClassInfo("foo"), -1); + QCOMPARE(builder.indexOfClassInfo("bar"), 0); + QCOMPARE(builder.indexOfClassInfo("baz"), -1); + + // Check that nothing else changed. + QVERIFY(checkForSideEffects(builder, QMetaObjectBuilder::ClassInfos)); +} + +void tst_QMetaObjectBuilder::relatedMetaObject() +{ + QMetaObjectBuilder builder; + + // Add two related meta objects and check their attributes. + QCOMPARE(builder.addRelatedMetaObject(&QObject::staticMetaObject), 0); + QCOMPARE(builder.addRelatedMetaObject(&staticMetaObject), 1); + QVERIFY(builder.relatedMetaObject(0) == &QObject::staticMetaObject); + QVERIFY(builder.relatedMetaObject(1) == &staticMetaObject); + QCOMPARE(builder.relatedMetaObjectCount(), 2); + + // Remove the first one and check again. + builder.removeRelatedMetaObject(0); + QVERIFY(builder.relatedMetaObject(0) == &staticMetaObject); + QCOMPARE(builder.relatedMetaObjectCount(), 1); + + // Check that nothing else changed. + QVERIFY(checkForSideEffects(builder, QMetaObjectBuilder::RelatedMetaObjects)); +} + +static void smetacall(QObject *, QMetaObject::Call, int, void **) +{ + return; +} + +void tst_QMetaObjectBuilder::staticMetacall() +{ + QMetaObjectBuilder builder; + QVERIFY(!builder.staticMetacallFunction()); + builder.setStaticMetacallFunction(smetacall); + QVERIFY(builder.staticMetacallFunction() == smetacall); + QVERIFY(checkForSideEffects(builder, QMetaObjectBuilder::StaticMetacall)); +} + +// Copy the entire contents of a static QMetaObject and then check +// that QMetaObjectBuilder will produce an exact copy as output. +void tst_QMetaObjectBuilder::copyMetaObject() +{ + QMetaObjectBuilder builder(&QObject::staticMetaObject); + QMetaObject *meta = builder.toMetaObject(); + QVERIFY(sameMetaObject(meta, &QObject::staticMetaObject)); + qFree(meta); + + QMetaObjectBuilder builder2(&staticMetaObject); + meta = builder2.toMetaObject(); + QVERIFY(sameMetaObject(meta, &staticMetaObject)); + qFree(meta); + + QMetaObjectBuilder builder3(&SomethingOfEverything::staticMetaObject); + meta = builder3.toMetaObject(); + QVERIFY(sameMetaObject(meta, &SomethingOfEverything::staticMetaObject)); + qFree(meta); +} + +// Serialize and deserialize a meta object and check that +// it round-trips to the exact same value. +void tst_QMetaObjectBuilder::serialize() +{ + // Full QMetaObjectBuilder + { + QMetaObjectBuilder builder(&SomethingOfEverything::staticMetaObject); + QMetaObject *meta = builder.toMetaObject(); + + QByteArray data; + QDataStream stream(&data, QIODevice::WriteOnly | QIODevice::Append); + builder.serialize(stream); + + QMetaObjectBuilder builder2; + QDataStream stream2(data); + QMap references; + references.insert(QByteArray("QLocale"), &QLocale::staticMetaObject); + builder2.deserialize(stream2, references); + builder2.setStaticMetacallFunction(builder.staticMetacallFunction()); + QMetaObject *meta2 = builder2.toMetaObject(); + + QVERIFY(sameMetaObject(meta, meta2)); + qFree(meta); + qFree(meta2); + } + + // Partial QMetaObjectBuilder + { + QMetaObjectBuilder builder; + builder.setClassName("Test"); + builder.addProperty("foo", "int"); + + QByteArray data; + QDataStream stream(&data, QIODevice::WriteOnly | QIODevice::Append); + builder.serialize(stream); + + QMetaObjectBuilder builder2; + QDataStream stream2(data); + builder2.deserialize(stream2, QMap()); + + QCOMPARE(builder.superClass(), builder2.superClass()); + QCOMPARE(builder.className(), builder2.className()); + QCOMPARE(builder.propertyCount(), builder2.propertyCount()); + QCOMPARE(builder.property(0).name(), builder2.property(0).name()); + QCOMPARE(builder.property(0).type(), builder2.property(0).type()); + } +} + +// Check that removing a method updates notify signals appropriately +void tst_QMetaObjectBuilder::removeNotifySignal() +{ + QMetaObjectBuilder builder; + + QMetaMethodBuilder method1 = builder.addSignal("foo(const QString&, int)"); + QMetaMethodBuilder method2 = builder.addSignal("bar(QString)"); + + // Setup property + QMetaPropertyBuilder prop = builder.addProperty("prop", "const QString &"); + prop.setNotifySignal(method2); + QVERIFY(prop.hasNotifySignal()); + QCOMPARE(prop.notifySignal().index(), 1); + + // Remove non-notify signal + builder.removeMethod(0); + QVERIFY(prop.hasNotifySignal()); + QCOMPARE(prop.notifySignal().index(), 0); + + // Remove notify signal + builder.removeMethod(0); + QVERIFY(!prop.hasNotifySignal()); +} + +// Check that the only changes to a "builder" relative to the default +// state is specified by "members". +bool tst_QMetaObjectBuilder::checkForSideEffects + (const QMetaObjectBuilder& builder, + QMetaObjectBuilder::AddMembers members) +{ + if ((members & QMetaObjectBuilder::ClassName) == 0) { + if (!builder.className().isEmpty()) + return false; + } + + if ((members & QMetaObjectBuilder::SuperClass) == 0) { + if (builder.superClass() != &QObject::staticMetaObject) + return false; + } + + if ((members & QMetaObjectBuilder::Methods) == 0) { + if (builder.methodCount() != 0) + return false; + } + + if ((members & QMetaObjectBuilder::Constructors) == 0) { + if (builder.constructorCount() != 0) + return false; + } + + if ((members & QMetaObjectBuilder::Properties) == 0) { + if (builder.propertyCount() != 0) + return false; + } + + if ((members & QMetaObjectBuilder::Enumerators) == 0) { + if (builder.enumeratorCount() != 0) + return false; + } + + if ((members & QMetaObjectBuilder::ClassInfos) == 0) { + if (builder.classInfoCount() != 0) + return false; + } + + if ((members & QMetaObjectBuilder::RelatedMetaObjects) == 0) { + if (builder.relatedMetaObjectCount() != 0) + return false; + } + + if ((members & QMetaObjectBuilder::StaticMetacall) == 0) { + if (builder.staticMetacallFunction() != 0) + return false; + } + + return true; +} + +static bool sameMethod(const QMetaMethod& method1, const QMetaMethod& method2) +{ + if (QByteArray(method1.signature()) != QByteArray(method2.signature())) + return false; + + if (QByteArray(method1.typeName()) != QByteArray(method2.typeName())) + return false; + + if (method1.parameterNames() != method2.parameterNames()) + return false; + + if (QByteArray(method1.tag()) != QByteArray(method2.tag())) + return false; + + if (method1.access() != method2.access()) + return false; + + if (method1.methodType() != method2.methodType()) + return false; + + if (method1.attributes() != method2.attributes()) + return false; + + return true; +} + +static bool sameProperty(const QMetaProperty& prop1, const QMetaProperty& prop2) +{ + if (QByteArray(prop1.name()) != QByteArray(prop2.name())) + return false; + + if (QByteArray(prop1.typeName()) != QByteArray(prop2.typeName())) + return false; + + if (prop1.isReadable() != prop2.isReadable() || + prop1.isWritable() != prop2.isWritable() || + prop1.isResettable() != prop2.isResettable() || + prop1.isDesignable() != prop2.isDesignable() || + prop1.isScriptable() != prop2.isScriptable() || + prop1.isStored() != prop2.isStored() || + prop1.isEditable() != prop2.isEditable() || + prop1.isUser() != prop2.isUser() || + prop1.isFlagType() != prop2.isFlagType() || + prop1.isEnumType() != prop2.isEnumType() || + prop1.hasNotifySignal() != prop2.hasNotifySignal() || + prop1.hasStdCppSet() != prop2.hasStdCppSet()) + return false; + + if (prop1.hasNotifySignal()) { + if (prop1.notifySignalIndex() != prop2.notifySignalIndex()) + return false; + } + + return true; +} + +static bool sameEnumerator(const QMetaEnum& enum1, const QMetaEnum& enum2) +{ + if (QByteArray(enum1.name()) != QByteArray(enum2.name())) + return false; + + if (enum1.isFlag() != enum2.isFlag()) + return false; + + if (enum1.keyCount() != enum2.keyCount()) + return false; + + for (int index = 0; index < enum1.keyCount(); ++index) { + if (QByteArray(enum1.key(index)) != QByteArray(enum2.key(index))) + return false; + if (enum1.value(index) != enum2.value(index)) + return false; + } + + if (QByteArray(enum1.scope()) != QByteArray(enum2.scope())) + return false; + + return true; +} + +// Determine if two meta objects are identical. +bool tst_QMetaObjectBuilder::sameMetaObject + (const QMetaObject *meta1, const QMetaObject *meta2) +{ + int index; + + if (strcmp(meta1->className(), meta2->className()) != 0) + return false; + + if (meta1->superClass() != meta2->superClass()) + return false; + + if (meta1->constructorCount() != meta2->constructorCount() || + meta1->methodCount() != meta2->methodCount() || + meta1->enumeratorCount() != meta2->enumeratorCount() || + meta1->propertyCount() != meta2->propertyCount() || + meta1->classInfoCount() != meta2->classInfoCount()) + return false; + + for (index = 0; index < meta1->constructorCount(); ++index) { + if (!sameMethod(meta1->constructor(index), meta2->constructor(index))) + return false; + } + + for (index = 0; index < meta1->methodCount(); ++index) { + if (!sameMethod(meta1->method(index), meta2->method(index))) + return false; + } + + for (index = 0; index < meta1->propertyCount(); ++index) { + if (!sameProperty(meta1->property(index), meta2->property(index))) + return false; + } + + for (index = 0; index < meta1->enumeratorCount(); ++index) { + if (!sameEnumerator(meta1->enumerator(index), meta2->enumerator(index))) + return false; + } + + for (index = 0; index < meta1->classInfoCount(); ++index) { + if (QByteArray(meta1->classInfo(index).name()) != + QByteArray(meta2->classInfo(index).name())) + return false; + if (QByteArray(meta1->classInfo(index).value()) != + QByteArray(meta2->classInfo(index).value())) + return false; + } + + const QMetaObject **objects1 = 0; + const QMetaObject **objects2 = 0; + if (meta1->d.data[0] == meta2->d.data[0] && meta1->d.data[0] >= 2) { + QMetaObjectExtraData *extra1 = (QMetaObjectExtraData *)(meta1->d.extradata); + QMetaObjectExtraData *extra2 = (QMetaObjectExtraData *)(meta2->d.extradata); + if (extra1 && !extra2) + return false; + if (extra2 && !extra1) + return false; + if (extra1 && extra2) { + if (extra1->static_metacall != extra2->static_metacall) + return false; + objects1 = extra1->objects; + objects2 = extra1->objects; + } + } else if (meta1->d.data[0] == meta2->d.data[0] && meta1->d.data[0] == 1) { + objects1 = (const QMetaObject **)(meta1->d.extradata); + objects2 = (const QMetaObject **)(meta2->d.extradata); + } + if (objects1 && !objects2) + return false; + if (objects2 && !objects1) + return false; + if (objects1 && objects2) { + while (*objects1 != 0 && *objects2 != 0) { + if (*objects1 != *objects2) + return false; + ++objects1; + ++objects2; + } + } + + return true; +} + +QTEST_MAIN(tst_QMetaObjectBuilder) + +#include "tst_qmetaobjectbuilder.moc" diff --git a/tests/auto/declarative/qmlshadersplugin/main.qml b/tests/auto/declarative/qmlshadersplugin/main.qml new file mode 100644 index 00000000..e63fde08 --- /dev/null +++ b/tests/auto/declarative/qmlshadersplugin/main.qml @@ -0,0 +1,80 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 1.0 +import Qt.labs.shaders 1.0 + + Rectangle { + width: 300 + height: 300 + + Text { + id: textLabel + text: "Hello World" + anchors.centerIn: parent + font.pixelSize: 48 + } + + ShaderEffectItem { + objectName: "effectItem" + property variant source: ShaderEffectSource { objectName: "effectSource"; sourceItem: textLabel; hideSource: true } + property real wiggleAmount: 0.01 + anchors.fill: textLabel + + SequentialAnimation on wiggleAmount { + loops: Animation.Infinite + NumberAnimation { to: -0.01; duration: 500 } + NumberAnimation { to: 0.01; duration: 500 } + } + + fragmentShader: " + varying highp vec2 qt_TexCoord0; + uniform sampler2D source; + uniform highp float wiggleAmount; + void main(void) + { + highp vec2 wiggledTexCoord = qt_TexCoord0; + wiggledTexCoord.s += sin(4.0 * 3.141592653589 * wiggledTexCoord.t) * wiggleAmount; + gl_FragColor = texture2D(source, wiggledTexCoord.st); + } + " + } + } diff --git a/tests/auto/declarative/qmlshadersplugin/qmlshadersplugin.pro b/tests/auto/declarative/qmlshadersplugin/qmlshadersplugin.pro new file mode 100644 index 00000000..aa0e07a0 --- /dev/null +++ b/tests/auto/declarative/qmlshadersplugin/qmlshadersplugin.pro @@ -0,0 +1,18 @@ +load(qttest_p4) + +QT += opengl declarative +SOURCES += tst_qmlshadersplugin.cpp + +SOURCES += \ + ../../../../src/imports/shaders/shadereffectitem.cpp \ + ../../../../src/imports/shaders/shadereffectsource.cpp \ + ../../../../src/imports/shaders/shadereffect.cpp \ + ../../../../src/imports/shaders/shadereffectbuffer.cpp \ + ../../../../src/imports/shaders/scenegraph/qsggeometry.cpp + +HEADERS += \ + ../../../../src/imports/shaders/shadereffectitem.h \ + ../../../../src/imports/shaders/shadereffectsource.h \ + ../../../../src/imports/shaders/shadereffect.h \ + ../../../../src/imports/shaders/shadereffectbuffer.h \ + ../../../../src/imports/shaders/scenegraph/qsggeometry.h diff --git a/tests/auto/declarative/qmlshadersplugin/tst_qmlshadersplugin.cpp b/tests/auto/declarative/qmlshadersplugin/tst_qmlshadersplugin.cpp new file mode 100644 index 00000000..ba7f7957 --- /dev/null +++ b/tests/auto/declarative/qmlshadersplugin/tst_qmlshadersplugin.cpp @@ -0,0 +1,205 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QML Shaders plugin of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include "../../../../src/imports/shaders/shadereffectitem.h" +#include "../../../../src/imports/shaders/shadereffectsource.h" +#include "../../../../src/imports/shaders/shadereffect.h" + +static const char qt_default_vertex_code[] = + "uniform highp mat4 qt_ModelViewProjectionMatrix;\n" + "attribute highp vec4 qt_Vertex;\n" + "attribute highp vec2 qt_MultiTexCoord0;\n" + "varying highp vec2 qt_TexCoord0;\n" + "void main(void)\n" + "{\n" + "qt_TexCoord0 = qt_MultiTexCoord0;\n" + "gl_Position = qt_ModelViewProjectionMatrix * qt_Vertex;\n" + "}\n"; + +static const char qt_default_fragment_code[] = + "varying highp vec2 qt_TexCoord0;\n" + "uniform lowp sampler2D source;\n" + "void main(void)\n" + "{\n" + "gl_FragColor = texture2D(source, qt_TexCoord0.st);\n" + "}\n"; + +class tst_qmlshadersplugin : public QObject +{ + Q_OBJECT + +private slots: + void initTestCase(); + void shaderEffectItemAPI(); + void shaderEffectSourceAPI(); + void combined(); + +private: + QDeclarativeEngine engine; +}; + +void tst_qmlshadersplugin::initTestCase() +{ + const char *uri ="Qt.labs.shaders"; + qmlRegisterType(uri, 1, 0, "ShaderEffectItem"); + qmlRegisterType(uri, 1, 0, "ShaderEffectSource"); +} + + +void tst_qmlshadersplugin::shaderEffectItemAPI() +{ + // Creation + QString componentStr = "import QtQuick 1.0\n" + "import Qt.labs.shaders 1.0\n" + "ShaderEffectItem {\n" + "property variant source\n" + "width: 200; height: 300\n" + "}"; + QDeclarativeComponent component(&engine); + component.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + + QObject *obj = component.create(); + QTest::qWait(100); + QVERIFY(obj != 0); + + // Default values + QCOMPARE(obj->property("width").toDouble(), 200.); + QCOMPARE(obj->property("height").toDouble(), 300.); + QCOMPARE(obj->property("fragmentShader").toString(), QString("")); + QCOMPARE(obj->property("vertexShader").toString(), QString("")); + QCOMPARE(obj->property("blending").toBool(), true); + QCOMPARE(obj->property("meshResolution").toSize(), QSize(1, 1)); + QCOMPARE(obj->property("visible").toBool(), true); + + // Seting the values + QVERIFY(obj->setProperty("fragmentShader", QString(qt_default_fragment_code))); + QVERIFY(obj->setProperty("vertexShader", QString(qt_default_vertex_code))); + QVERIFY(obj->setProperty("blending", false)); + QVERIFY(obj->setProperty("meshResolution", QSize(20, 10))); + QVERIFY(obj->setProperty("visible", false)); + + QCOMPARE(obj->property("fragmentShader").toString(), QString(qt_default_fragment_code)); + QCOMPARE(obj->property("vertexShader").toString(), QString(qt_default_vertex_code)); + QCOMPARE(obj->property("blending").toBool(), false); + QCOMPARE(obj->property("meshResolution").toSize(), QSize(20, 10)); + QCOMPARE(obj->property("visible").toBool(), false); + + delete obj; +} + +void tst_qmlshadersplugin::shaderEffectSourceAPI() +{ + // Creation + QString componentStr = "import QtQuick 1.0\n" + "import Qt.labs.shaders 1.0\n" + "ShaderEffectSource {}"; + QDeclarativeComponent shaderEffectSourceComponent(&engine); + shaderEffectSourceComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + + QObject *obj = shaderEffectSourceComponent.create(); + QTest::qWait(100); + QVERIFY(obj != 0); + + // Default values + QCOMPARE(obj->property("sourceRect").toRect(), QRect(0, 0, 0, 0)); + QCOMPARE(obj->property("textureSize").toSize(), QSize(0, 0)); + QCOMPARE(obj->property("live").toBool(), true); + QCOMPARE(obj->property("hideSource").toBool(), false); + QCOMPARE(obj->property("wrapMode").toUInt(), static_cast(ShaderEffectSource::ClampToEdge)); + + // Seting the values + componentStr = "import QtQuick 1.0\n" + "Item {}"; + QDeclarativeComponent itemComponent(&engine); + itemComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); + QDeclarativeItem *item = qobject_cast (itemComponent.create()); + QVERIFY(item != 0); + + QVERIFY(obj->setProperty("sourceItem", QVariant::fromValue(item))); + QVERIFY(obj->setProperty("sourceRect", QRect(10, 20, 30, 40))); + QVERIFY(obj->setProperty("textureSize", QSize(50, 100))); + QVERIFY(obj->setProperty("live", false)); + QVERIFY(obj->setProperty("hideSource", true)); + QVERIFY(obj->setProperty("wrapMode", static_cast(ShaderEffectSource::Repeat))); + + QCOMPARE(obj->property("sourceItem"), QVariant::fromValue(item)); + QCOMPARE(obj->property("sourceRect").toRect(), QRect(10, 20, 30, 40)); + QCOMPARE(obj->property("textureSize").toSize(), QSize(50, 100)); + QCOMPARE(obj->property("live").toBool(), false); + QCOMPARE(obj->property("hideSource").toBool(), true); + QCOMPARE(obj->property("wrapMode").toUInt(), static_cast(ShaderEffectSource::Repeat)); + + delete item; + delete obj; +} + +void tst_qmlshadersplugin::combined() +{ + QGLFormat format = QGLFormat::defaultFormat(); + format.setSampleBuffers(false); + format.setSwapInterval(1); + + QGLWidget* glWidget = new QGLWidget(format); + glWidget->setAutoFillBackground(false); + + QDeclarativeView view; + view.setViewportUpdateMode(QGraphicsView::FullViewportUpdate); + view.setAttribute(Qt::WA_OpaquePaintEvent); + view.setAttribute(Qt::WA_NoSystemBackground); + view.setViewport(glWidget); + view.setSource(QUrl::fromLocalFile("main.qml")); + view.show(); + QTest::qWait(1000); + + QObject *item = view.rootObject()->findChild("effectItem"); + QVERIFY(item != 0); + + QObject *src = view.rootObject()->findChild("effectSource"); + QVERIFY(src != 0); + + QCOMPARE(item->property("source"), QVariant::fromValue(src)); +} + +QTEST_MAIN(tst_qmlshadersplugin) + +#include "tst_qmlshadersplugin.moc" diff --git a/tests/auto/declarative/qmlvisual/ListView/basic1.qml b/tests/auto/declarative/qmlvisual/ListView/basic1.qml new file mode 100644 index 00000000..8c1b56e5 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/ListView/basic1.qml @@ -0,0 +1,30 @@ +import QtQuick 1.0 + +Rectangle { + color: "blue" + width: 200 + height: 300 + id: page + ListView { + anchors.fill: parent + delegate: Rectangle { + color: "red" + width: 100 + height: 100 + Rectangle { + anchors.centerIn: parent + width: 60 + height: 60 + color: name + } + } + model: ListModel { + ListElement { + name: "palegoldenrod" + } + ListElement { + name: "lightsteelblue" + } + } + } +} diff --git a/tests/auto/declarative/qmlvisual/ListView/basic2.qml b/tests/auto/declarative/qmlvisual/ListView/basic2.qml new file mode 100644 index 00000000..9d26c737 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/ListView/basic2.qml @@ -0,0 +1,34 @@ +import QtQuick 1.0 + +Rectangle { + color: "blue" + width: 200 + height: 300 + id: page + Component { + id: delegate + Rectangle { + color: "red" + width: 100 + height: 100 + Rectangle { + anchors.centerIn: parent + width: 60 + height: 60 + color: name + } + } + } + ListView { + anchors.fill: parent + delegate: delegate + model: ListModel { + ListElement { + name: "palegoldenrod" + } + ListElement { + name: "lightsteelblue" + } + } + } +} diff --git a/tests/auto/declarative/qmlvisual/ListView/basic3.qml b/tests/auto/declarative/qmlvisual/ListView/basic3.qml new file mode 100644 index 00000000..982df9a6 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/ListView/basic3.qml @@ -0,0 +1,32 @@ +import QtQuick 1.0 + +Rectangle { + color: "blue" + width: 200 + height: 300 + id: page + ListModel { + id: model + ListElement { + name: "palegoldenrod" + } + ListElement { + name: "lightsteelblue" + } + } + ListView { + anchors.fill: parent + model: model + delegate: Rectangle { + color: "red" + width: 100 + height: 100 + Rectangle { + anchors.centerIn: parent + width: 60 + height: 60 + color: name + } + } + } +} diff --git a/tests/auto/declarative/qmlvisual/ListView/basic4.qml b/tests/auto/declarative/qmlvisual/ListView/basic4.qml new file mode 100644 index 00000000..2c5d1e3e --- /dev/null +++ b/tests/auto/declarative/qmlvisual/ListView/basic4.qml @@ -0,0 +1,36 @@ +import QtQuick 1.0 + +Rectangle { + color: "blue" + width: 200 + height: 300 + id: page + ListModel { + id: model + ListElement { + name: "palegoldenrod" + } + ListElement { + name: "lightsteelblue" + } + } + Component { + id: delegate + Rectangle { + color: "red" + width: 100 + height: 100 + Rectangle { + anchors.centerIn: parent + width: 60 + height: 60 + color: name + } + } + } + ListView { + anchors.fill: parent + model: model + delegate: delegate + } +} diff --git a/tests/auto/declarative/qmlvisual/ListView/data/basic1.0.png b/tests/auto/declarative/qmlvisual/ListView/data/basic1.0.png new file mode 100644 index 00000000..049d9c8d Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/basic1.0.png differ diff --git a/tests/auto/declarative/qmlvisual/ListView/data/basic1.qml b/tests/auto/declarative/qmlvisual/ListView/data/basic1.qml new file mode 100644 index 00000000..aad4858c --- /dev/null +++ b/tests/auto/declarative/qmlvisual/ListView/data/basic1.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "basic1.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/ListView/data/basic2.0.png b/tests/auto/declarative/qmlvisual/ListView/data/basic2.0.png new file mode 100644 index 00000000..049d9c8d Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/basic2.0.png differ diff --git a/tests/auto/declarative/qmlvisual/ListView/data/basic2.qml b/tests/auto/declarative/qmlvisual/ListView/data/basic2.qml new file mode 100644 index 00000000..373ad27c --- /dev/null +++ b/tests/auto/declarative/qmlvisual/ListView/data/basic2.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "basic2.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/ListView/data/basic3.0.png b/tests/auto/declarative/qmlvisual/ListView/data/basic3.0.png new file mode 100644 index 00000000..049d9c8d Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/basic3.0.png differ diff --git a/tests/auto/declarative/qmlvisual/ListView/data/basic3.qml b/tests/auto/declarative/qmlvisual/ListView/data/basic3.qml new file mode 100644 index 00000000..f5dbf65a --- /dev/null +++ b/tests/auto/declarative/qmlvisual/ListView/data/basic3.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "basic3.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/ListView/data/basic4.0.png b/tests/auto/declarative/qmlvisual/ListView/data/basic4.0.png new file mode 100644 index 00000000..049d9c8d Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/basic4.0.png differ diff --git a/tests/auto/declarative/qmlvisual/ListView/data/basic4.qml b/tests/auto/declarative/qmlvisual/ListView/data/basic4.qml new file mode 100644 index 00000000..5e494d13 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/ListView/data/basic4.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "basic4.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.0.png b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.0.png new file mode 100644 index 00000000..5c0b6a6a Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.0.png differ diff --git a/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.1.png b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.1.png new file mode 100644 index 00000000..5c0b6a6a Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.1.png differ diff --git a/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.2.png b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.2.png new file mode 100644 index 00000000..304aed8b Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.2.png differ diff --git a/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.3.png b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.3.png new file mode 100644 index 00000000..4abc58e0 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.3.png differ diff --git a/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.4.png b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.4.png new file mode 100644 index 00000000..5c0b6a6a Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.4.png differ diff --git a/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.5.png b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.5.png new file mode 100644 index 00000000..8d421afa Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.5.png differ diff --git a/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.6.png b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.6.png new file mode 100644 index 00000000..81ea1ff4 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.6.png differ diff --git a/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.qml b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.qml new file mode 100644 index 00000000..de3f49c8 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/ListView/data/enforcerange.qml @@ -0,0 +1,2119 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "enforcerange.0.png" + } + Frame { + msec: 32 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 48 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 64 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 80 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 96 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 112 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 128 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 144 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 160 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 176 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 192 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 208 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 224 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 240 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 256 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 272 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 288 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 304 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 320 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 336 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 352 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 368 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 384 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 400 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 416 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 432 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 448 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 464 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 480 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 496 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 512 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 528 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 544 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 560 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 576 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 592 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 608 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 624 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 640 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 656 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 672 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 688 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 704 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 720 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 736 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 752 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 768 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 784 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 800 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 816 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 832 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 848 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 864 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 880 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 896 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 912 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 928 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 944 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 960 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 976 + image: "enforcerange.1.png" + } + Frame { + msec: 992 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 1008 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 1024 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 1040 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 1056 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 1072 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 1088 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 1104 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 1120 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 1136 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 1152 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 1168 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 1184 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 1200 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 77; y: 157 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1216 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 1232 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 1248 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 77; y: 156 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1264 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 77; y: 154 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 76; y: 151 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1280 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 75; y: 144 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 74; y: 136 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1296 + hash: "c7667b5af9f2ee912abe5879266cb1e0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 73; y: 131 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 72; y: 122 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1312 + hash: "1e762d6ffe1ceb53046d7953645d02d5" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 71; y: 118 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 71; y: 111 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1328 + hash: "0d2b7130a84a8efac1cf4fe8a1768231" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 71; y: 108 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 71; y: 102 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1344 + hash: "6ef2715c3fd26d50d26fb740afa6dece" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 71; y: 98 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 71; y: 92 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 71; y: 92 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1360 + hash: "f489b6f951281ff9a981ec046ca5b17d" + } + Frame { + msec: 1376 + hash: "fd6e7d7db7c4571ee606269fb9680ed9" + } + Frame { + msec: 1392 + hash: "398a238f59a2edf07870b624b914c81d" + } + Frame { + msec: 1408 + hash: "fdce64faab7e7e31a229adda47924cd1" + } + Frame { + msec: 1424 + hash: "8d474956331fdd0c35beb13a06b7c557" + } + Frame { + msec: 1440 + hash: "f89fed6f7fa07a8320f07a1e68240a7e" + } + Frame { + msec: 1456 + hash: "940b70f15082ff138579892bb6f20ce9" + } + Frame { + msec: 1472 + hash: "35ab744ce2a91567dbbd769f9486f870" + } + Frame { + msec: 1488 + hash: "6b2d32b8f1df871c2c014af8b5d87329" + } + Frame { + msec: 1504 + hash: "edf3b33b80cca53999779555f9cd6162" + } + Frame { + msec: 1520 + hash: "180f3cc4ea5ff5b6f9e8be0294732d4e" + } + Frame { + msec: 1536 + hash: "28e9ca60a873910380b2d22d6b3df565" + } + Frame { + msec: 1552 + hash: "3bb1e8d69f171f09eb4c6f9914fc9576" + } + Frame { + msec: 1568 + hash: "0501da09be444df6cee4b19617290317" + } + Frame { + msec: 1584 + hash: "8ce1ac0163b0353167488aff2879e841" + } + Frame { + msec: 1600 + hash: "18e53bf6337cf6590fc3c73c00469d8e" + } + Frame { + msec: 1616 + hash: "0c31ede980d07069f4977d5753d00ddf" + } + Frame { + msec: 1632 + hash: "0a854a54176c24f0ebbb6cb747dc0ab7" + } + Frame { + msec: 1648 + hash: "8dba1ebca6f00b7a64a6982fb8c28c50" + } + Frame { + msec: 1664 + hash: "8d273efc36ba722af4d044e6552c9dcb" + } + Frame { + msec: 1680 + hash: "674b07dc5b99bf2da93c40d42dc9023d" + } + Frame { + msec: 1696 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 1712 + hash: "b64810845a97bedf6fe11c043457c197" + } + Frame { + msec: 1728 + hash: "87aaa82b96131fed8822e57e226162a0" + } + Frame { + msec: 1744 + hash: "7eb75e8e83874d52448a7dbf6a0ad29c" + } + Frame { + msec: 1760 + hash: "b061ee3784fbd4a287758ffd100a623e" + } + Frame { + msec: 1776 + hash: "81110f17d191f9795a2c57d136e86550" + } + Frame { + msec: 1792 + hash: "090a76cf068a5041ff993f21e6ebd087" + } + Frame { + msec: 1808 + hash: "30eb157c89ad0aeb17fd0012afb9246b" + } + Frame { + msec: 1824 + hash: "6b317b59e1b0f5b17a6d7d96e745f576" + } + Frame { + msec: 1840 + hash: "f9fc8467c6dbcb00d1f41a57b550193c" + } + Frame { + msec: 1856 + hash: "744227adbdd31be2920a232ea0dbc85d" + } + Frame { + msec: 1872 + hash: "d4b370ff8c3b66fc8a616dd9b944abd1" + } + Frame { + msec: 1888 + hash: "674b07dc5b99bf2da93c40d42dc9023d" + } + Frame { + msec: 1904 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 1920 + hash: "b64810845a97bedf6fe11c043457c197" + } + Frame { + msec: 1936 + image: "enforcerange.2.png" + } + Frame { + msec: 1952 + hash: "87aaa82b96131fed8822e57e226162a0" + } + Frame { + msec: 1968 + hash: "70b475e88060ead84d05f0ba1b47c139" + } + Frame { + msec: 1984 + hash: "7eb75e8e83874d52448a7dbf6a0ad29c" + } + Frame { + msec: 2000 + hash: "b061ee3784fbd4a287758ffd100a623e" + } + Frame { + msec: 2016 + hash: "81110f17d191f9795a2c57d136e86550" + } + Frame { + msec: 2032 + hash: "090a76cf068a5041ff993f21e6ebd087" + } + Frame { + msec: 2048 + hash: "090a76cf068a5041ff993f21e6ebd087" + } + Frame { + msec: 2064 + hash: "30eb157c89ad0aeb17fd0012afb9246b" + } + Frame { + msec: 2080 + hash: "6b317b59e1b0f5b17a6d7d96e745f576" + } + Frame { + msec: 2096 + hash: "f9fc8467c6dbcb00d1f41a57b550193c" + } + Frame { + msec: 2112 + hash: "f9fc8467c6dbcb00d1f41a57b550193c" + } + Frame { + msec: 2128 + hash: "711274e9b6811b4662ac29d813574fb6" + } + Frame { + msec: 2144 + hash: "744227adbdd31be2920a232ea0dbc85d" + } + Frame { + msec: 2160 + hash: "744227adbdd31be2920a232ea0dbc85d" + } + Frame { + msec: 2176 + hash: "d4b370ff8c3b66fc8a616dd9b944abd1" + } + Frame { + msec: 2192 + hash: "d4b370ff8c3b66fc8a616dd9b944abd1" + } + Frame { + msec: 2208 + hash: "674b07dc5b99bf2da93c40d42dc9023d" + } + Frame { + msec: 2224 + hash: "674b07dc5b99bf2da93c40d42dc9023d" + } + Frame { + msec: 2240 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 2256 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 2272 + hash: "b64810845a97bedf6fe11c043457c197" + } + Frame { + msec: 2288 + hash: "b64810845a97bedf6fe11c043457c197" + } + Frame { + msec: 2304 + hash: "87aaa82b96131fed8822e57e226162a0" + } + Frame { + msec: 2320 + hash: "87aaa82b96131fed8822e57e226162a0" + } + Frame { + msec: 2336 + hash: "87aaa82b96131fed8822e57e226162a0" + } + Frame { + msec: 2352 + hash: "70b475e88060ead84d05f0ba1b47c139" + } + Frame { + msec: 2368 + hash: "70b475e88060ead84d05f0ba1b47c139" + } + Frame { + msec: 2384 + hash: "70b475e88060ead84d05f0ba1b47c139" + } + Frame { + msec: 2400 + hash: "7eb75e8e83874d52448a7dbf6a0ad29c" + } + Frame { + msec: 2416 + hash: "7eb75e8e83874d52448a7dbf6a0ad29c" + } + Frame { + msec: 2432 + hash: "7eb75e8e83874d52448a7dbf6a0ad29c" + } + Frame { + msec: 2448 + hash: "7eb75e8e83874d52448a7dbf6a0ad29c" + } + Frame { + msec: 2464 + hash: "7eb75e8e83874d52448a7dbf6a0ad29c" + } + Frame { + msec: 2480 + hash: "b061ee3784fbd4a287758ffd100a623e" + } + Frame { + msec: 2496 + hash: "b061ee3784fbd4a287758ffd100a623e" + } + Frame { + msec: 2512 + hash: "b061ee3784fbd4a287758ffd100a623e" + } + Frame { + msec: 2528 + hash: "b061ee3784fbd4a287758ffd100a623e" + } + Frame { + msec: 2544 + hash: "b061ee3784fbd4a287758ffd100a623e" + } + Frame { + msec: 2560 + hash: "b061ee3784fbd4a287758ffd100a623e" + } + Frame { + msec: 2576 + hash: "b061ee3784fbd4a287758ffd100a623e" + } + Frame { + msec: 2592 + hash: "b061ee3784fbd4a287758ffd100a623e" + } + Frame { + msec: 2608 + hash: "b061ee3784fbd4a287758ffd100a623e" + } + Frame { + msec: 2624 + hash: "b061ee3784fbd4a287758ffd100a623e" + } + Frame { + msec: 2640 + hash: "b061ee3784fbd4a287758ffd100a623e" + } + Frame { + msec: 2656 + hash: "7eb75e8e83874d52448a7dbf6a0ad29c" + } + Frame { + msec: 2672 + hash: "7eb75e8e83874d52448a7dbf6a0ad29c" + } + Frame { + msec: 2688 + hash: "7eb75e8e83874d52448a7dbf6a0ad29c" + } + Frame { + msec: 2704 + hash: "70b475e88060ead84d05f0ba1b47c139" + } + Frame { + msec: 2720 + hash: "70b475e88060ead84d05f0ba1b47c139" + } + Frame { + msec: 2736 + hash: "87aaa82b96131fed8822e57e226162a0" + } + Frame { + msec: 2752 + hash: "87aaa82b96131fed8822e57e226162a0" + } + Frame { + msec: 2768 + hash: "b64810845a97bedf6fe11c043457c197" + } + Frame { + msec: 2784 + hash: "b64810845a97bedf6fe11c043457c197" + } + Frame { + msec: 2800 + hash: "b64810845a97bedf6fe11c043457c197" + } + Frame { + msec: 2816 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 2832 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 2848 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 2864 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 2880 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 2896 + image: "enforcerange.3.png" + } + Frame { + msec: 2912 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 2928 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 2944 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 2960 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 2976 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 2992 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 3008 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 3024 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 82; y: 39 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3040 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 3056 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 82; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3072 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 82; y: 42 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 81; y: 44 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3088 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 81; y: 47 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 81; y: 55 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3104 + hash: "89016574205e00cf42723446d6a3437e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 81; y: 60 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 81; y: 69 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3120 + hash: "e2db9b1ae5c4be51a548834a7776da1f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 80; y: 75 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 80; y: 87 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3136 + hash: "fcfad57224192065782a77ad3398d0d1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 80; y: 93 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 80; y: 107 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3152 + hash: "bae4fc0fc2d33008ebe827ece94af196" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 84; y: 130 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 88; y: 144 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3168 + hash: "569581944bf18c8165f72c60bdbf1011" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 96; y: 161 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 96; y: 161 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3184 + hash: "613ff94a26bfaa9a4dc94fcbf6c3eb57" + } + Frame { + msec: 3200 + hash: "a63f8e6b194f900acb1b7a332f9fb9ae" + } + Frame { + msec: 3216 + hash: "6c04761cc86d28112c16f692cda58ba4" + } + Frame { + msec: 3232 + hash: "544275da3f7e2ccaedc8c521bf17f59b" + } + Frame { + msec: 3248 + hash: "52831480eb69184341b12ffb09ace736" + } + Frame { + msec: 3264 + hash: "52831480eb69184341b12ffb09ace736" + } + Frame { + msec: 3280 + hash: "52831480eb69184341b12ffb09ace736" + } + Frame { + msec: 3296 + hash: "58f2b900bc335424fc70eaaeb23ceb56" + } + Frame { + msec: 3312 + hash: "58f2b900bc335424fc70eaaeb23ceb56" + } + Frame { + msec: 3328 + hash: "544275da3f7e2ccaedc8c521bf17f59b" + } + Frame { + msec: 3344 + hash: "df9fef370c2f6ff300b20fc24b5b9e34" + } + Frame { + msec: 3360 + hash: "0662898d246e5ff6981610d32e2b8375" + } + Frame { + msec: 3376 + hash: "6c04761cc86d28112c16f692cda58ba4" + } + Frame { + msec: 3392 + hash: "82b31c8e8794ce3a9a6a635ef93b29b3" + } + Frame { + msec: 3408 + hash: "388658b5e03f3853e93173bd9501b77b" + } + Frame { + msec: 3424 + hash: "cf1856e961e6b8277a82c03ace5ba864" + } + Frame { + msec: 3440 + hash: "e1d022cc1b41098baffe49925b20678f" + } + Frame { + msec: 3456 + hash: "a63f8e6b194f900acb1b7a332f9fb9ae" + } + Frame { + msec: 3472 + hash: "044c3712a6a5f6a973defe85643c8d02" + } + Frame { + msec: 3488 + hash: "044c3712a6a5f6a973defe85643c8d02" + } + Frame { + msec: 3504 + hash: "e4fe2f1a81a4a4806f4155807f285a2d" + } + Frame { + msec: 3520 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 3536 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 3552 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 3568 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 3584 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 3600 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 3616 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 3632 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 3648 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 3664 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 3680 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 3696 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 3712 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 3728 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 3744 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 3760 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 3776 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 3792 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 3808 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 3824 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 3840 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 3856 + image: "enforcerange.4.png" + } + Frame { + msec: 3872 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 3888 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 3904 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 3920 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 3936 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 3952 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 3968 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 3984 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 4000 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 4016 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Frame { + msec: 4032 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 105; y: 169 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4048 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 106; y: 168 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 106; y: 167 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4064 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 106; y: 164 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 106; y: 163 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4080 + hash: "19c43fcf2875769c9a15f1ce317a0f1e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 106; y: 162 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 106; y: 160 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4096 + hash: "331164730fb7ccf37dc08ddc26c0e182" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 107; y: 157 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 107; y: 156 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4112 + hash: "73e27ff972eefc421bc65897ad8b9a11" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 108; y: 152 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 109; y: 148 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4128 + hash: "c5e903fd827f8f1ec060dcb9a925bf6d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 109; y: 145 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 109; y: 145 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4144 + hash: "74d4357dff4d6e00c5ae9ea0c34f1010" + } + Frame { + msec: 4160 + hash: "790274ee21ba257b84671a6fb19c142f" + } + Frame { + msec: 4176 + hash: "65ccc26f20be484fefa8ea25a7daf825" + } + Frame { + msec: 4192 + hash: "e435e2fbba7f0f6a65b9fecf07893eb0" + } + Frame { + msec: 4208 + hash: "6a994a18a9331731d5fca50dce2b9cff" + } + Frame { + msec: 4224 + hash: "9fc4405cddc06310215969a4583b2353" + } + Frame { + msec: 4240 + hash: "0d2b7130a84a8efac1cf4fe8a1768231" + } + Frame { + msec: 4256 + hash: "791db15db47090e1af299e5b32e53918" + } + Frame { + msec: 4272 + hash: "0ec6cf7a6ed9a073d2ce8f9e534e2ee5" + } + Frame { + msec: 4288 + hash: "c7b358f51a9500ca4958d266de5307e6" + } + Frame { + msec: 4304 + hash: "d24d00e4cd1ea3aaacf202e2fdf1eaa0" + } + Frame { + msec: 4320 + hash: "169f1a7a933d84071c449132a3c2745e" + } + Frame { + msec: 4336 + hash: "b6bf9c15ed40d6e862f693155c884035" + } + Frame { + msec: 4352 + hash: "8639955aa7a03f54d50d7e9051a4b997" + } + Frame { + msec: 4368 + hash: "411bc9a9aedbfb75f3122eaea6be0c16" + } + Frame { + msec: 4384 + hash: "827094da86716daf69386af2c8d4027a" + } + Frame { + msec: 4400 + hash: "ddddd5457e4a54ca5e7415dc2c7eabe5" + } + Frame { + msec: 4416 + hash: "632a5756af20083504fb1faaa019dd48" + } + Frame { + msec: 4432 + hash: "0cc2901b1b25412f13865887a8c9d13e" + } + Frame { + msec: 4448 + hash: "4c8a9473eb9843634340d70f8eab9487" + } + Frame { + msec: 4464 + hash: "398a238f59a2edf07870b624b914c81d" + } + Frame { + msec: 4480 + hash: "a7c282235e9166b900ea2ff68800a5f5" + } + Frame { + msec: 4496 + hash: "bae4fc0fc2d33008ebe827ece94af196" + } + Frame { + msec: 4512 + hash: "45e0670a2b4c18b847a3c7870539b962" + } + Frame { + msec: 4528 + hash: "8d474956331fdd0c35beb13a06b7c557" + } + Frame { + msec: 4544 + hash: "5d5bdffc30d90fd5b061c6fcf24c2599" + } + Frame { + msec: 4560 + hash: "15721b103981f5fe40b5dfe7d65c5b38" + } + Frame { + msec: 4576 + hash: "940b70f15082ff138579892bb6f20ce9" + } + Frame { + msec: 4592 + hash: "5137ea98fd291a4b967fb66d93253a37" + } + Frame { + msec: 4608 + hash: "35ab744ce2a91567dbbd769f9486f870" + } + Frame { + msec: 4624 + hash: "d5c55c00b07735e5d7c02dfa99ef2f45" + } + Frame { + msec: 4640 + hash: "6b2d32b8f1df871c2c014af8b5d87329" + } + Frame { + msec: 4656 + hash: "edf3b33b80cca53999779555f9cd6162" + } + Frame { + msec: 4672 + hash: "180f3cc4ea5ff5b6f9e8be0294732d4e" + } + Frame { + msec: 4688 + hash: "9b99a1b0c0bb0ce37655d92854ee4d19" + } + Frame { + msec: 4704 + hash: "28e9ca60a873910380b2d22d6b3df565" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 109; y: 131 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4720 + hash: "28e9ca60a873910380b2d22d6b3df565" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 109; y: 126 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 109; y: 124 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4736 + hash: "18e53bf6337cf6590fc3c73c00469d8e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 109; y: 115 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 109; y: 110 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4752 + hash: "81110f17d191f9795a2c57d136e86550" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 108; y: 99 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 106; y: 85 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4768 + hash: "b64810845a97bedf6fe11c043457c197" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 105; y: 74 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 103; y: 60 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4784 + hash: "711274e9b6811b4662ac29d813574fb6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 102; y: 54 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 100; y: 40 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 100; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4800 + hash: "da5a30a6f9f40fbb5e2b150965be8ac0" + } + Frame { + msec: 4816 + image: "enforcerange.5.png" + } + Frame { + msec: 4832 + hash: "090a76cf068a5041ff993f21e6ebd087" + } + Frame { + msec: 4848 + hash: "6b317b59e1b0f5b17a6d7d96e745f576" + } + Frame { + msec: 4864 + hash: "744227adbdd31be2920a232ea0dbc85d" + } + Frame { + msec: 4880 + hash: "674b07dc5b99bf2da93c40d42dc9023d" + } + Frame { + msec: 4896 + hash: "b64810845a97bedf6fe11c043457c197" + } + Frame { + msec: 4912 + hash: "7eb75e8e83874d52448a7dbf6a0ad29c" + } + Frame { + msec: 4928 + hash: "81110f17d191f9795a2c57d136e86550" + } + Frame { + msec: 4944 + hash: "30eb157c89ad0aeb17fd0012afb9246b" + } + Frame { + msec: 4960 + hash: "f9fc8467c6dbcb00d1f41a57b550193c" + } + Frame { + msec: 4976 + hash: "711274e9b6811b4662ac29d813574fb6" + } + Frame { + msec: 4992 + hash: "d4b370ff8c3b66fc8a616dd9b944abd1" + } + Frame { + msec: 5008 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 5024 + hash: "87aaa82b96131fed8822e57e226162a0" + } + Frame { + msec: 5040 + hash: "70b475e88060ead84d05f0ba1b47c139" + } + Frame { + msec: 5056 + hash: "b061ee3784fbd4a287758ffd100a623e" + } + Frame { + msec: 5072 + hash: "81110f17d191f9795a2c57d136e86550" + } + Frame { + msec: 5088 + hash: "30eb157c89ad0aeb17fd0012afb9246b" + } + Frame { + msec: 5104 + hash: "6b317b59e1b0f5b17a6d7d96e745f576" + } + Frame { + msec: 5120 + hash: "711274e9b6811b4662ac29d813574fb6" + } + Frame { + msec: 5136 + hash: "744227adbdd31be2920a232ea0dbc85d" + } + Frame { + msec: 5152 + hash: "674b07dc5b99bf2da93c40d42dc9023d" + } + Frame { + msec: 5168 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 5184 + hash: "b64810845a97bedf6fe11c043457c197" + } + Frame { + msec: 5200 + hash: "87aaa82b96131fed8822e57e226162a0" + } + Frame { + msec: 5216 + hash: "7eb75e8e83874d52448a7dbf6a0ad29c" + } + Frame { + msec: 5232 + hash: "b061ee3784fbd4a287758ffd100a623e" + } + Frame { + msec: 5248 + hash: "81110f17d191f9795a2c57d136e86550" + } + Frame { + msec: 5264 + hash: "090a76cf068a5041ff993f21e6ebd087" + } + Frame { + msec: 5280 + hash: "30eb157c89ad0aeb17fd0012afb9246b" + } + Frame { + msec: 5296 + hash: "6b317b59e1b0f5b17a6d7d96e745f576" + } + Frame { + msec: 5312 + hash: "f9fc8467c6dbcb00d1f41a57b550193c" + } + Frame { + msec: 5328 + hash: "744227adbdd31be2920a232ea0dbc85d" + } + Frame { + msec: 5344 + hash: "d4b370ff8c3b66fc8a616dd9b944abd1" + } + Frame { + msec: 5360 + hash: "674b07dc5b99bf2da93c40d42dc9023d" + } + Frame { + msec: 5376 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 5392 + hash: "b64810845a97bedf6fe11c043457c197" + } + Frame { + msec: 5408 + hash: "b64810845a97bedf6fe11c043457c197" + } + Frame { + msec: 5424 + hash: "87aaa82b96131fed8822e57e226162a0" + } + Frame { + msec: 5440 + hash: "70b475e88060ead84d05f0ba1b47c139" + } + Frame { + msec: 5456 + hash: "7eb75e8e83874d52448a7dbf6a0ad29c" + } + Frame { + msec: 5472 + hash: "b061ee3784fbd4a287758ffd100a623e" + } + Frame { + msec: 5488 + hash: "81110f17d191f9795a2c57d136e86550" + } + Frame { + msec: 5504 + hash: "090a76cf068a5041ff993f21e6ebd087" + } + Frame { + msec: 5520 + hash: "090a76cf068a5041ff993f21e6ebd087" + } + Frame { + msec: 5536 + hash: "30eb157c89ad0aeb17fd0012afb9246b" + } + Frame { + msec: 5552 + hash: "6b317b59e1b0f5b17a6d7d96e745f576" + } + Frame { + msec: 5568 + hash: "f9fc8467c6dbcb00d1f41a57b550193c" + } + Frame { + msec: 5584 + hash: "f9fc8467c6dbcb00d1f41a57b550193c" + } + Frame { + msec: 5600 + hash: "711274e9b6811b4662ac29d813574fb6" + } + Frame { + msec: 5616 + hash: "744227adbdd31be2920a232ea0dbc85d" + } + Frame { + msec: 5632 + hash: "744227adbdd31be2920a232ea0dbc85d" + } + Frame { + msec: 5648 + hash: "d4b370ff8c3b66fc8a616dd9b944abd1" + } + Frame { + msec: 5664 + hash: "d4b370ff8c3b66fc8a616dd9b944abd1" + } + Frame { + msec: 5680 + hash: "674b07dc5b99bf2da93c40d42dc9023d" + } + Frame { + msec: 5696 + hash: "674b07dc5b99bf2da93c40d42dc9023d" + } + Frame { + msec: 5712 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 5728 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 5744 + hash: "b64810845a97bedf6fe11c043457c197" + } + Frame { + msec: 5760 + hash: "b64810845a97bedf6fe11c043457c197" + } + Frame { + msec: 5776 + image: "enforcerange.6.png" + } + Frame { + msec: 5792 + hash: "87aaa82b96131fed8822e57e226162a0" + } + Frame { + msec: 5808 + hash: "87aaa82b96131fed8822e57e226162a0" + } + Frame { + msec: 5824 + hash: "70b475e88060ead84d05f0ba1b47c139" + } + Frame { + msec: 5840 + hash: "70b475e88060ead84d05f0ba1b47c139" + } + Frame { + msec: 5856 + hash: "70b475e88060ead84d05f0ba1b47c139" + } + Frame { + msec: 5872 + hash: "7eb75e8e83874d52448a7dbf6a0ad29c" + } + Frame { + msec: 5888 + hash: "7eb75e8e83874d52448a7dbf6a0ad29c" + } + Frame { + msec: 5904 + hash: "7eb75e8e83874d52448a7dbf6a0ad29c" + } + Frame { + msec: 5920 + hash: "7eb75e8e83874d52448a7dbf6a0ad29c" + } + Frame { + msec: 5936 + hash: "7eb75e8e83874d52448a7dbf6a0ad29c" + } + Frame { + msec: 5952 + hash: "b061ee3784fbd4a287758ffd100a623e" + } + Frame { + msec: 5968 + hash: "b061ee3784fbd4a287758ffd100a623e" + } + Frame { + msec: 5984 + hash: "b061ee3784fbd4a287758ffd100a623e" + } + Frame { + msec: 6000 + hash: "b061ee3784fbd4a287758ffd100a623e" + } + Frame { + msec: 6016 + hash: "b061ee3784fbd4a287758ffd100a623e" + } + Frame { + msec: 6032 + hash: "b061ee3784fbd4a287758ffd100a623e" + } + Frame { + msec: 6048 + hash: "b061ee3784fbd4a287758ffd100a623e" + } + Frame { + msec: 6064 + hash: "b061ee3784fbd4a287758ffd100a623e" + } + Frame { + msec: 6080 + hash: "b061ee3784fbd4a287758ffd100a623e" + } + Frame { + msec: 6096 + hash: "b061ee3784fbd4a287758ffd100a623e" + } + Frame { + msec: 6112 + hash: "7eb75e8e83874d52448a7dbf6a0ad29c" + } + Frame { + msec: 6128 + hash: "7eb75e8e83874d52448a7dbf6a0ad29c" + } + Frame { + msec: 6144 + hash: "7eb75e8e83874d52448a7dbf6a0ad29c" + } + Frame { + msec: 6160 + hash: "70b475e88060ead84d05f0ba1b47c139" + } + Frame { + msec: 6176 + hash: "70b475e88060ead84d05f0ba1b47c139" + } + Frame { + msec: 6192 + hash: "87aaa82b96131fed8822e57e226162a0" + } + Frame { + msec: 6208 + hash: "87aaa82b96131fed8822e57e226162a0" + } + Frame { + msec: 6224 + hash: "87aaa82b96131fed8822e57e226162a0" + } + Frame { + msec: 6240 + hash: "b64810845a97bedf6fe11c043457c197" + } + Frame { + msec: 6256 + hash: "b64810845a97bedf6fe11c043457c197" + } + Frame { + msec: 6272 + hash: "b64810845a97bedf6fe11c043457c197" + } + Frame { + msec: 6288 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 6304 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 6320 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 6336 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 6352 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 6368 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 6384 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 6400 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 6416 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 6432 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 6448 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 6464 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 6480 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 6496 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 6512 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 6528 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 6544 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 6560 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 6576 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 6592 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 6608 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 6624 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 6640 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } + Frame { + msec: 6656 + hash: "a4ff6c6c43697808f9ad7387d152cef3" + } +} diff --git a/tests/auto/declarative/qmlvisual/ListView/data/itemlist.0.png b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.0.png new file mode 100644 index 00000000..75d2089c Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.0.png differ diff --git a/tests/auto/declarative/qmlvisual/ListView/data/itemlist.1.png b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.1.png new file mode 100644 index 00000000..75d2089c Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.1.png differ diff --git a/tests/auto/declarative/qmlvisual/ListView/data/itemlist.2.png b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.2.png new file mode 100644 index 00000000..bc7dc2c4 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.2.png differ diff --git a/tests/auto/declarative/qmlvisual/ListView/data/itemlist.3.png b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.3.png new file mode 100644 index 00000000..def378f4 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.3.png differ diff --git a/tests/auto/declarative/qmlvisual/ListView/data/itemlist.4.png b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.4.png new file mode 100644 index 00000000..e23b9033 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.4.png differ diff --git a/tests/auto/declarative/qmlvisual/ListView/data/itemlist.5.png b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.5.png new file mode 100644 index 00000000..def378f4 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.5.png differ diff --git a/tests/auto/declarative/qmlvisual/ListView/data/itemlist.6.png b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.6.png new file mode 100644 index 00000000..b81e713a Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.6.png differ diff --git a/tests/auto/declarative/qmlvisual/ListView/data/itemlist.7.png b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.7.png new file mode 100644 index 00000000..75d2089c Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.7.png differ diff --git a/tests/auto/declarative/qmlvisual/ListView/data/itemlist.qml b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.qml new file mode 100644 index 00000000..6438e425 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/ListView/data/itemlist.qml @@ -0,0 +1,2203 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "itemlist.0.png" + } + Frame { + msec: 32 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 48 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 64 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 80 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 96 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 112 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 128 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 144 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 160 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 176 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 192 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 208 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 224 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 240 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 256 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 272 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 288 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 304 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 320 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 336 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 352 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 368 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 384 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 400 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 416 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 432 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 448 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 464 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 480 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 496 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 512 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 528 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 544 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 560 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 576 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 592 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 608 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 624 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 640 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 656 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 672 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 688 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 704 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 720 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 736 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 752 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 768 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 784 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 800 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 816 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 832 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 848 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 864 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 880 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 896 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 912 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 928 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 944 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 960 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 976 + image: "itemlist.1.png" + } + Frame { + msec: 992 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1008 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1024 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1040 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1056 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1072 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1088 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1104 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1120 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1136 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1152 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1168 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1184 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1200 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1216 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1232 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1248 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1264 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1280 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1296 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1312 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1328 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1344 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1360 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1376 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1392 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1408 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1424 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1440 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1456 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1472 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1488 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1504 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1520 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1536 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1552 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1568 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1584 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1600 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1616 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1632 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 1648 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 192; y: 111 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1664 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 191; y: 111 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1680 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 190; y: 112 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 187; y: 113 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1696 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 184; y: 113 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 180; y: 113 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1712 + hash: "b6e433a23282a50db2e165a2447ba3f6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 174; y: 114 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 167; y: 115 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1728 + hash: "68d443f16c16821ffc9ca68b17c76034" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 160; y: 117 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1744 + hash: "04b9041c6f10969889d92e94785c7e88" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 140; y: 121 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 132; y: 122 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1760 + hash: "64b902fe7ab4d89ef0c7b760974e3488" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 114; y: 126 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 98; y: 132 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1776 + hash: "c2125b59e00f1a1c189c778c44fe39b0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 91; y: 132 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 91; y: 132 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1792 + hash: "c78175071f2e95649d529b9e1cf045b2" + } + Frame { + msec: 1808 + hash: "ca8ef2c2a7b06e55899b1b63208e257d" + } + Frame { + msec: 1824 + hash: "b54957726e6257956b63e1d7ebbc96e4" + } + Frame { + msec: 1840 + hash: "48847db78ddde75bb96edf01c52c3400" + } + Frame { + msec: 1856 + hash: "48dab5cd1feedf1b5dd67390d6f40fda" + } + Frame { + msec: 1872 + hash: "fe32013c245091b577d0e38eea05705d" + } + Frame { + msec: 1888 + hash: "e4b6e31029c1ea26405537c6d2304b72" + } + Frame { + msec: 1904 + hash: "b5fc9ab0a96ef526e6eb1c022f26c6a7" + } + Frame { + msec: 1920 + hash: "75ab445a739fb2415e20e8997b043656" + } + Frame { + msec: 1936 + image: "itemlist.2.png" + } + Frame { + msec: 1952 + hash: "1bce9b85235e9a1a472c079dfec70ec5" + } + Frame { + msec: 1968 + hash: "98e707a3e39a5f7bd4a101c2ed83535c" + } + Frame { + msec: 1984 + hash: "f73470027601a0c1a2382d5ded9e5fa6" + } + Frame { + msec: 2000 + hash: "d917b18a47b4e90821cba8987492cd1f" + } + Frame { + msec: 2016 + hash: "fa526c5ef57eaa210fb4d03b72c35b69" + } + Frame { + msec: 2032 + hash: "15cbc226b032d5a97199735ea7a1408b" + } + Frame { + msec: 2048 + hash: "6ffd2b79cf0e941a59e74bc6f9025bcb" + } + Frame { + msec: 2064 + hash: "c009924bfa30153f22ab168b539494e9" + } + Frame { + msec: 2080 + hash: "0525908c0302ada989e28990bac3f2ca" + } + Frame { + msec: 2096 + hash: "75c1295ef99680784b2e11fb88fa1423" + } + Frame { + msec: 2112 + hash: "53064c1938f08a55603a99b0db225174" + } + Frame { + msec: 2128 + hash: "99d9e58697736198e0a00443d237e85b" + } + Frame { + msec: 2144 + hash: "6c1e860aef983367365d53f5849ad441" + } + Frame { + msec: 2160 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2176 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2192 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2208 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2224 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2240 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2256 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2272 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2288 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2304 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2320 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2336 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2352 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2368 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2384 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2400 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2416 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2432 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2448 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2464 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2480 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2496 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2512 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2528 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2544 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2560 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2576 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2592 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2608 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2624 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2640 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2656 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2672 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2688 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2704 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2720 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2736 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2752 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2768 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2784 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2800 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2816 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2832 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2848 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2864 + hash: "99f9988040a389576cb6420b5391f768" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 181; y: 104 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2880 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 2896 + image: "itemlist.3.png" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 179; y: 105 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 177; y: 106 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2912 + hash: "99f9988040a389576cb6420b5391f768" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 174; y: 108 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 170; y: 110 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2928 + hash: "99f9988040a389576cb6420b5391f768" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 166; y: 112 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 160; y: 115 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2944 + hash: "52af1b81022e8572b9123461d123197f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 154; y: 117 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 140; y: 123 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2960 + hash: "e1390ad02ae7a6e757df4a7af9032167" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 124; y: 127 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 124; y: 127 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2976 + hash: "bf57f309378c956dfd70aa79a7dd97c5" + } + Frame { + msec: 2992 + hash: "408b59b96ecad0541ecbb97262c2567b" + } + Frame { + msec: 3008 + hash: "c52f691a0a6cf155118bdfea2dfea623" + } + Frame { + msec: 3024 + hash: "9aabf0500b1272375f5f6db1bd1d7b04" + } + Frame { + msec: 3040 + hash: "2e92065ca9425d1645d69c1734804518" + } + Frame { + msec: 3056 + hash: "c73b2e430a0e96a660aa4447697e5adf" + } + Frame { + msec: 3072 + hash: "875560b509215a869d1cad8a05f38850" + } + Frame { + msec: 3088 + hash: "fd8e51cca3432f6edcf949857737095f" + } + Frame { + msec: 3104 + hash: "aa5d4e65932b3ec2f5549079dfc7718d" + } + Frame { + msec: 3120 + hash: "f811f3c6b022730dd68ebd7b1659ea40" + } + Frame { + msec: 3136 + hash: "e51a2e41972cfc3df46a7d4375024d80" + } + Frame { + msec: 3152 + hash: "275f3594a0e2cc4b6717f9f336e7e1b6" + } + Frame { + msec: 3168 + hash: "9229054bb70662b12a4f7e45ac5b7a90" + } + Frame { + msec: 3184 + hash: "89ff346eca0b71cad3b04a2cb8064fb0" + } + Frame { + msec: 3200 + hash: "94e6ecb87a7efca6344d6d63a1e3829f" + } + Frame { + msec: 3216 + hash: "bc5eb6b0eeae316ddd0b308da2cc32e2" + } + Frame { + msec: 3232 + hash: "240081760f0cf2f02be4d6d2600d2bbc" + } + Frame { + msec: 3248 + hash: "69b335aeb81fc2ae6173f2ec5cdc4c55" + } + Frame { + msec: 3264 + hash: "10d481e57cc8cd694500d9ed6ae1f8bb" + } + Frame { + msec: 3280 + hash: "6b21f71d0bedef4bbcb445a13f61e7a3" + } + Frame { + msec: 3296 + hash: "aa94ebdbb4b8423aff28c95daff0baf5" + } + Frame { + msec: 3312 + hash: "5f6708f615654c459f5749676fc09016" + } + Frame { + msec: 3328 + hash: "8ef246d322446e7f0848b99495f89e2b" + } + Frame { + msec: 3344 + hash: "c3b219bdd7710427d134402a8d3e6429" + } + Frame { + msec: 3360 + hash: "3b2e2d957585fb44a7165186a146892c" + } + Frame { + msec: 3376 + hash: "124da0099a7dd6fbf6dfd0ecfb09638c" + } + Frame { + msec: 3392 + hash: "e4dacafba5ab5f8db53f08cef458cf42" + } + Frame { + msec: 3408 + hash: "b554512bac0766063870c5b3acb1d24f" + } + Frame { + msec: 3424 + hash: "bb5ea2a238920a8486263bc7450edfb4" + } + Frame { + msec: 3440 + hash: "bb5ea2a238920a8486263bc7450edfb4" + } + Frame { + msec: 3456 + hash: "bb5ea2a238920a8486263bc7450edfb4" + } + Frame { + msec: 3472 + hash: "b554512bac0766063870c5b3acb1d24f" + } + Frame { + msec: 3488 + hash: "b554512bac0766063870c5b3acb1d24f" + } + Frame { + msec: 3504 + hash: "e4dacafba5ab5f8db53f08cef458cf42" + } + Frame { + msec: 3520 + hash: "de7f3c83f37cc89c87009626c72e7642" + } + Frame { + msec: 3536 + hash: "124da0099a7dd6fbf6dfd0ecfb09638c" + } + Frame { + msec: 3552 + hash: "40204fdb7a84b86f1380224908092354" + } + Frame { + msec: 3568 + hash: "ff93c3290b7d9a9743cc11d41a112a0a" + } + Frame { + msec: 3584 + hash: "c3b219bdd7710427d134402a8d3e6429" + } + Frame { + msec: 3600 + hash: "56e2f6b2ac103caf7ada3b56c19622c2" + } + Frame { + msec: 3616 + hash: "8ef246d322446e7f0848b99495f89e2b" + } + Frame { + msec: 3632 + hash: "8eb6d69d9833d0fbf87f951f489b71fe" + } + Frame { + msec: 3648 + hash: "17deb6b26fc9d27d5194995c102da4ac" + } + Frame { + msec: 3664 + hash: "5f6708f615654c459f5749676fc09016" + } + Frame { + msec: 3680 + hash: "1734205ea5e7539b47d80c5a93ec74aa" + } + Frame { + msec: 3696 + hash: "1734205ea5e7539b47d80c5a93ec74aa" + } + Frame { + msec: 3712 + hash: "88143ff6c278a5433b314b551b7b8b1d" + } + Frame { + msec: 3728 + hash: "88143ff6c278a5433b314b551b7b8b1d" + } + Frame { + msec: 3744 + hash: "88143ff6c278a5433b314b551b7b8b1d" + } + Frame { + msec: 3760 + hash: "88143ff6c278a5433b314b551b7b8b1d" + } + Frame { + msec: 3776 + hash: "88143ff6c278a5433b314b551b7b8b1d" + } + Frame { + msec: 3792 + hash: "88143ff6c278a5433b314b551b7b8b1d" + } + Frame { + msec: 3808 + hash: "88143ff6c278a5433b314b551b7b8b1d" + } + Frame { + msec: 3824 + hash: "88143ff6c278a5433b314b551b7b8b1d" + } + Frame { + msec: 3840 + hash: "88143ff6c278a5433b314b551b7b8b1d" + } + Frame { + msec: 3856 + image: "itemlist.4.png" + } + Frame { + msec: 3872 + hash: "88143ff6c278a5433b314b551b7b8b1d" + } + Frame { + msec: 3888 + hash: "88143ff6c278a5433b314b551b7b8b1d" + } + Frame { + msec: 3904 + hash: "88143ff6c278a5433b314b551b7b8b1d" + } + Frame { + msec: 3920 + hash: "88143ff6c278a5433b314b551b7b8b1d" + } + Frame { + msec: 3936 + hash: "88143ff6c278a5433b314b551b7b8b1d" + } + Frame { + msec: 3952 + hash: "88143ff6c278a5433b314b551b7b8b1d" + } + Frame { + msec: 3968 + hash: "88143ff6c278a5433b314b551b7b8b1d" + } + Frame { + msec: 3984 + hash: "88143ff6c278a5433b314b551b7b8b1d" + } + Frame { + msec: 4000 + hash: "88143ff6c278a5433b314b551b7b8b1d" + } + Frame { + msec: 4016 + hash: "88143ff6c278a5433b314b551b7b8b1d" + } + Frame { + msec: 4032 + hash: "88143ff6c278a5433b314b551b7b8b1d" + } + Frame { + msec: 4048 + hash: "88143ff6c278a5433b314b551b7b8b1d" + } + Frame { + msec: 4064 + hash: "88143ff6c278a5433b314b551b7b8b1d" + } + Frame { + msec: 4080 + hash: "88143ff6c278a5433b314b551b7b8b1d" + } + Frame { + msec: 4096 + hash: "88143ff6c278a5433b314b551b7b8b1d" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 31; y: 137 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4112 + hash: "88143ff6c278a5433b314b551b7b8b1d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 32; y: 137 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4128 + hash: "88143ff6c278a5433b314b551b7b8b1d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 33; y: 136 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 36; y: 135 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4144 + hash: "88143ff6c278a5433b314b551b7b8b1d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 40; y: 134 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 46; y: 132 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4160 + hash: "f619097356671f6eb54d3b1c481e709d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 64; y: 130 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4176 + hash: "240081760f0cf2f02be4d6d2600d2bbc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 86; y: 126 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 110; y: 118 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 110; y: 118 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4192 + hash: "3b85c1739fdf3933d8cb0b2eaf22e6e3" + } + Frame { + msec: 4208 + hash: "f811f3c6b022730dd68ebd7b1659ea40" + } + Frame { + msec: 4224 + hash: "2e97a74eb9ddb1c9613c89e2d78db018" + } + Frame { + msec: 4240 + hash: "7b7f5daf5eaf047e69d04b5bcb73240c" + } + Frame { + msec: 4256 + hash: "1af58a2f44f1f613712d4df85e38356d" + } + Frame { + msec: 4272 + hash: "1bbdda445cec7f95a189c15d7e3c77b8" + } + Frame { + msec: 4288 + hash: "91d8bcfebff29d2caf526b4012daaf46" + } + Frame { + msec: 4304 + hash: "71ec8c363ca6a6f7556afb70faccffe6" + } + Frame { + msec: 4320 + hash: "303ebc28d09a49de52cb1adaa03872dd" + } + Frame { + msec: 4336 + hash: "9402e86bf4ffa62c60b02531a3735275" + } + Frame { + msec: 4352 + hash: "5652de6fb2e107d41c0c5aeacf5a3055" + } + Frame { + msec: 4368 + hash: "b6a2ade6565a86b1f8e369b02e0b93f9" + } + Frame { + msec: 4384 + hash: "30dd35e0b9ffa846f3cfc39edcbae511" + } + Frame { + msec: 4400 + hash: "401975fb4c9a48953aec25adb593eec4" + } + Frame { + msec: 4416 + hash: "71f9039c7aa9c8dc6d1de4561b1d5537" + } + Frame { + msec: 4432 + hash: "e1390ad02ae7a6e757df4a7af9032167" + } + Frame { + msec: 4448 + hash: "53a26f00bd49b8a9c065be99f9402d9c" + } + Frame { + msec: 4464 + hash: "b6e515e9a27af23b895f5024a41ce7b3" + } + Frame { + msec: 4480 + hash: "85d143505d56f53c629358b37ad11581" + } + Frame { + msec: 4496 + hash: "de5cbdd848a07b78f9c5eb510cca2d3e" + } + Frame { + msec: 4512 + hash: "0ad7411316031e22034c14e81ca3a806" + } + Frame { + msec: 4528 + hash: "32bef6f5005ad94e29ff59165958fbdc" + } + Frame { + msec: 4544 + hash: "87758dd311f91193bf1e3536c2f58525" + } + Frame { + msec: 4560 + hash: "d4c34ed49317c6692d71681fcd9842b6" + } + Frame { + msec: 4576 + hash: "abaa235bb946a8abaddd52981d632c2d" + } + Frame { + msec: 4592 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 4608 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 4624 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 4640 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 4656 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 4672 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 4688 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 4704 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 4720 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 4736 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 4752 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 4768 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 4784 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 4800 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 4816 + image: "itemlist.5.png" + } + Frame { + msec: 4832 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 4848 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 4864 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 4880 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 4896 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 4912 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 4928 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 4944 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 4960 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 4976 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 4992 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 5008 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 5024 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 5040 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 5056 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 5072 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 5088 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 5104 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 5120 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 5136 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 5152 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 5168 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 5184 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 5200 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 5216 + hash: "99f9988040a389576cb6420b5391f768" + } + Frame { + msec: 5232 + hash: "99f9988040a389576cb6420b5391f768" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 17; y: 120 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5248 + hash: "99f9988040a389576cb6420b5391f768" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 19; y: 120 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 21; y: 120 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5264 + hash: "99f9988040a389576cb6420b5391f768" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 24; y: 119 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 28; y: 119 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5280 + hash: "99f9988040a389576cb6420b5391f768" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 35; y: 119 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 44; y: 119 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5296 + hash: "6ffd2b79cf0e941a59e74bc6f9025bcb" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 119 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 96; y: 117 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 96; y: 117 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5312 + hash: "4aa05d978267325ae00cb45e310a2f01" + } + Frame { + msec: 5328 + hash: "b5717b311259c77a0210e26ab99dd401" + } + Frame { + msec: 5344 + hash: "9b3fde82278fa2f0caaf64cf23bb6530" + } + Frame { + msec: 5360 + hash: "e7795610115593e78bb32f7bcc0ae2eb" + } + Frame { + msec: 5376 + hash: "0dc7c4c161e0b3c3d176e5e6bc08a805" + } + Frame { + msec: 5392 + hash: "7c2b0307c4040d8d9e88425b3bf3fb70" + } + Frame { + msec: 5408 + hash: "06ce7db518da042e04dd3f79b7220974" + } + Frame { + msec: 5424 + hash: "7aeec517e845c1c5012ed63be6bbd006" + } + Frame { + msec: 5440 + hash: "53e9d5a0098f2e91bbea45360b876607" + } + Frame { + msec: 5456 + hash: "22a6c7f3dcb5a36592909783b2466c8d" + } + Frame { + msec: 5472 + hash: "9d8da9199efebb95f56e5d4ebc9a585e" + } + Frame { + msec: 5488 + hash: "c553400402f233a6246be4e544b433ae" + } + Frame { + msec: 5504 + hash: "c2e41a54c03340832db93f6f88393f00" + } + Frame { + msec: 5520 + hash: "3622a619a99c939e96636a86c4428ba3" + } + Frame { + msec: 5536 + hash: "e65d5e6c756e750e6d98096fe211465c" + } + Frame { + msec: 5552 + hash: "cabd6d30b1f4e42b38b73803aae6d5be" + } + Frame { + msec: 5568 + hash: "68d443f16c16821ffc9ca68b17c76034" + } + Frame { + msec: 5584 + hash: "a68b1bc6c2963ee92c3a45f500667b3b" + } + Frame { + msec: 5600 + hash: "805319ac7ca842feb3649e92f8b5b72f" + } + Frame { + msec: 5616 + hash: "fd8d3f5688b1806998c6087e18c6c730" + } + Frame { + msec: 5632 + hash: "b135c8c9975f4d45d2054cf31d0b1fe1" + } + Frame { + msec: 5648 + hash: "40382f644935dc4e99353fa29c3e0b21" + } + Frame { + msec: 5664 + hash: "aa32e4c20c6a43c4ef7991a9418e57fe" + } + Frame { + msec: 5680 + hash: "b8db9180b4ad15fdbd25a4e974512f92" + } + Frame { + msec: 5696 + hash: "127871a98123b7bd44f4c38f27cbc836" + } + Frame { + msec: 5712 + hash: "35fe67a91e50f8ebc896451b39cb8f1c" + } + Frame { + msec: 5728 + hash: "35fe67a91e50f8ebc896451b39cb8f1c" + } + Frame { + msec: 5744 + hash: "0b7fc796f818bddcada99e9981f1cce0" + } + Frame { + msec: 5760 + hash: "35fe67a91e50f8ebc896451b39cb8f1c" + } + Frame { + msec: 5776 + image: "itemlist.6.png" + } + Frame { + msec: 5792 + hash: "35fe67a91e50f8ebc896451b39cb8f1c" + } + Frame { + msec: 5808 + hash: "2311ce1a83a43619ab7ce537a2b948e1" + } + Frame { + msec: 5824 + hash: "2311ce1a83a43619ab7ce537a2b948e1" + } + Frame { + msec: 5840 + hash: "127871a98123b7bd44f4c38f27cbc836" + } + Frame { + msec: 5856 + hash: "b8db9180b4ad15fdbd25a4e974512f92" + } + Frame { + msec: 5872 + hash: "65af7a4a4aea5a983ea3fb9324e74256" + } + Frame { + msec: 5888 + hash: "aa32e4c20c6a43c4ef7991a9418e57fe" + } + Frame { + msec: 5904 + hash: "b3e92eb4cfe548b92ac526066dfc7d23" + } + Frame { + msec: 5920 + hash: "39fcad34db24d591e24c8ae1c7094d5b" + } + Frame { + msec: 5936 + hash: "165b91b850bcb8dd1d9b1eaa6f81be57" + } + Frame { + msec: 5952 + hash: "f34d2248999f5f51210064315d631f60" + } + Frame { + msec: 5968 + hash: "f34d2248999f5f51210064315d631f60" + } + Frame { + msec: 5984 + hash: "b135c8c9975f4d45d2054cf31d0b1fe1" + } + Frame { + msec: 6000 + hash: "b135c8c9975f4d45d2054cf31d0b1fe1" + } + Frame { + msec: 6016 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6032 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6048 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6064 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6080 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6096 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6112 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6128 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6144 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6160 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6176 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6192 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6208 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6224 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6240 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6256 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6272 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6288 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6304 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6320 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6336 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6352 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6368 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6384 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6400 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6416 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6432 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6448 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6464 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6480 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6496 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6512 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6528 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6544 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6560 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6576 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6592 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6608 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6624 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6640 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6656 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6672 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6688 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6704 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6720 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6736 + image: "itemlist.7.png" + } + Frame { + msec: 6752 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6768 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6784 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6800 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6816 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6832 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6848 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6864 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6880 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6896 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6912 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6928 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6944 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6960 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6976 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 6992 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 7008 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 7024 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 7040 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 7056 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 7072 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 7088 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 7104 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 7120 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 7136 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 7152 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 7168 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 7184 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 7200 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 7216 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 7232 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 7248 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 7264 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 7280 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 7296 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } + Frame { + msec: 7312 + hash: "bf47cc398a702dd17c8efebb3d2f8073" + } +} diff --git a/tests/auto/declarative/qmlvisual/ListView/data/listview.0.png b/tests/auto/declarative/qmlvisual/ListView/data/listview.0.png new file mode 100644 index 00000000..71926d71 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/listview.0.png differ diff --git a/tests/auto/declarative/qmlvisual/ListView/data/listview.1.png b/tests/auto/declarative/qmlvisual/ListView/data/listview.1.png new file mode 100644 index 00000000..80f82e41 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/listview.1.png differ diff --git a/tests/auto/declarative/qmlvisual/ListView/data/listview.2.png b/tests/auto/declarative/qmlvisual/ListView/data/listview.2.png new file mode 100644 index 00000000..61501bb1 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/listview.2.png differ diff --git a/tests/auto/declarative/qmlvisual/ListView/data/listview.3.png b/tests/auto/declarative/qmlvisual/ListView/data/listview.3.png new file mode 100644 index 00000000..51c4eb13 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/listview.3.png differ diff --git a/tests/auto/declarative/qmlvisual/ListView/data/listview.4.png b/tests/auto/declarative/qmlvisual/ListView/data/listview.4.png new file mode 100644 index 00000000..81e00ed6 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/listview.4.png differ diff --git a/tests/auto/declarative/qmlvisual/ListView/data/listview.5.png b/tests/auto/declarative/qmlvisual/ListView/data/listview.5.png new file mode 100644 index 00000000..d1f06fa0 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/listview.5.png differ diff --git a/tests/auto/declarative/qmlvisual/ListView/data/listview.6.png b/tests/auto/declarative/qmlvisual/ListView/data/listview.6.png new file mode 100644 index 00000000..9e6e29c6 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/listview.6.png differ diff --git a/tests/auto/declarative/qmlvisual/ListView/data/listview.7.png b/tests/auto/declarative/qmlvisual/ListView/data/listview.7.png new file mode 100644 index 00000000..9e7bd6eb Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/listview.7.png differ diff --git a/tests/auto/declarative/qmlvisual/ListView/data/listview.8.png b/tests/auto/declarative/qmlvisual/ListView/data/listview.8.png new file mode 100644 index 00000000..9e7bd6eb Binary files /dev/null and b/tests/auto/declarative/qmlvisual/ListView/data/listview.8.png differ diff --git a/tests/auto/declarative/qmlvisual/ListView/data/listview.qml b/tests/auto/declarative/qmlvisual/ListView/data/listview.qml new file mode 100644 index 00000000..b1ffe8f5 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/ListView/data/listview.qml @@ -0,0 +1,2227 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "listview.0.png" + } + Frame { + msec: 32 + hash: "3b88645092be28037fca4a6034f5b2f7" + } + Frame { + msec: 48 + hash: "3b88645092be28037fca4a6034f5b2f7" + } + Frame { + msec: 64 + hash: "3b88645092be28037fca4a6034f5b2f7" + } + Frame { + msec: 80 + hash: "3b88645092be28037fca4a6034f5b2f7" + } + Frame { + msec: 96 + hash: "3b88645092be28037fca4a6034f5b2f7" + } + Frame { + msec: 112 + hash: "3b88645092be28037fca4a6034f5b2f7" + } + Frame { + msec: 128 + hash: "3b88645092be28037fca4a6034f5b2f7" + } + Frame { + msec: 144 + hash: "3b88645092be28037fca4a6034f5b2f7" + } + Frame { + msec: 160 + hash: "3b88645092be28037fca4a6034f5b2f7" + } + Frame { + msec: 176 + hash: "3b88645092be28037fca4a6034f5b2f7" + } + Frame { + msec: 192 + hash: "3b88645092be28037fca4a6034f5b2f7" + } + Frame { + msec: 208 + hash: "3b88645092be28037fca4a6034f5b2f7" + } + Frame { + msec: 224 + hash: "3b88645092be28037fca4a6034f5b2f7" + } + Frame { + msec: 240 + hash: "3b88645092be28037fca4a6034f5b2f7" + } + Frame { + msec: 256 + hash: "3b88645092be28037fca4a6034f5b2f7" + } + Frame { + msec: 272 + hash: "3b88645092be28037fca4a6034f5b2f7" + } + Frame { + msec: 288 + hash: "3b88645092be28037fca4a6034f5b2f7" + } + Frame { + msec: 304 + hash: "3b88645092be28037fca4a6034f5b2f7" + } + Frame { + msec: 320 + hash: "3b88645092be28037fca4a6034f5b2f7" + } + Frame { + msec: 336 + hash: "3b88645092be28037fca4a6034f5b2f7" + } + Frame { + msec: 352 + hash: "3b88645092be28037fca4a6034f5b2f7" + } + Frame { + msec: 368 + hash: "3b88645092be28037fca4a6034f5b2f7" + } + Frame { + msec: 384 + hash: "3b88645092be28037fca4a6034f5b2f7" + } + Frame { + msec: 400 + hash: "3b88645092be28037fca4a6034f5b2f7" + } + Frame { + msec: 416 + hash: "3b88645092be28037fca4a6034f5b2f7" + } + Key { + type: 6 + key: 16777237 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 432 + hash: "3b88645092be28037fca4a6034f5b2f7" + } + Frame { + msec: 448 + hash: "435ac0668ad4d0e196eb040d385053cb" + } + Frame { + msec: 464 + hash: "e9532fe1acc1c27a2119e6dde3e01637" + } + Frame { + msec: 480 + hash: "9c757feaf5a8d1e88c659fca97e3b7b2" + } + Key { + type: 7 + key: 16777237 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 496 + hash: "ccc7785a45a41615db01580835a4638e" + } + Frame { + msec: 512 + hash: "11ad92022bcd5d3fbd28ffb9f51c69eb" + } + Frame { + msec: 528 + hash: "a8a94e1f95216864c368b8c3d0ae682b" + } + Frame { + msec: 544 + hash: "d83e213d35e7fcff2580b4e197547f24" + } + Frame { + msec: 560 + hash: "9e5a57fabdc443e395cacbaf6e0c9bef" + } + Frame { + msec: 576 + hash: "9e5a57fabdc443e395cacbaf6e0c9bef" + } + Frame { + msec: 592 + hash: "9e5a57fabdc443e395cacbaf6e0c9bef" + } + Frame { + msec: 608 + hash: "9e5a57fabdc443e395cacbaf6e0c9bef" + } + Key { + type: 6 + key: 16777237 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 624 + hash: "9e5a57fabdc443e395cacbaf6e0c9bef" + } + Frame { + msec: 640 + hash: "0e9c577fa86d9b3734da0d50040624e0" + } + Frame { + msec: 656 + hash: "834cf83f0f8d613191cac775b5737664" + } + Frame { + msec: 672 + hash: "495ea7650b2ae45f9afd7f9f6ecdd793" + } + Frame { + msec: 688 + hash: "55c761ccee6543bb3b9564bb813df58e" + } + Frame { + msec: 704 + hash: "e29e5f86cb3b1fb5ec77fde696024812" + } + Key { + type: 7 + key: 16777237 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 720 + hash: "f24b7d5a8f5ab03460505d6203269d1b" + } + Frame { + msec: 736 + hash: "893473965efe9e0540b197cbaa3f765d" + } + Frame { + msec: 752 + hash: "a541b7be2f370f948048b2101b037ab7" + } + Frame { + msec: 768 + hash: "a541b7be2f370f948048b2101b037ab7" + } + Key { + type: 6 + key: 16777237 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 784 + hash: "da065f1e72883a45241630b96ee5b1f8" + } + Frame { + msec: 800 + hash: "e97f78604c0c6d468c8dd225642e2ebd" + } + Frame { + msec: 816 + hash: "7b9d4b14eedfa4ff10dd7e3747c4a7f5" + } + Frame { + msec: 832 + hash: "6d55ba6287c720614854d36bb681a9f3" + } + Key { + type: 7 + key: 16777237 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 848 + hash: "3e7a44811f59bfb81de2f4f884a7af17" + } + Frame { + msec: 864 + hash: "101113a7723b9d09275f66152b82142f" + } + Frame { + msec: 880 + hash: "0044e068522f912630868476f8bf49f8" + } + Frame { + msec: 896 + hash: "92065f9f170ee09abf67f0d0c7a1b6ba" + } + Frame { + msec: 912 + hash: "92065f9f170ee09abf67f0d0c7a1b6ba" + } + Frame { + msec: 928 + hash: "92065f9f170ee09abf67f0d0c7a1b6ba" + } + Key { + type: 6 + key: 16777237 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 944 + hash: "92065f9f170ee09abf67f0d0c7a1b6ba" + } + Frame { + msec: 960 + hash: "d193987835dc12e4391e55ff5fee4ce1" + } + Frame { + msec: 976 + image: "listview.1.png" + } + Key { + type: 7 + key: 16777237 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 992 + hash: "9b07b6861a97d0871ed89369ff7449da" + } + Frame { + msec: 1008 + hash: "7d95daf35c1823ea7187162b62010c57" + } + Frame { + msec: 1024 + hash: "cc1e70fd1235d50ca291580bef1d6fc4" + } + Frame { + msec: 1040 + hash: "c8250f4cf69642e78523412b7b75501c" + } + Frame { + msec: 1056 + hash: "c57e421c803e8bfa1a85409cbb858829" + } + Key { + type: 6 + key: 16777237 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1072 + hash: "19b429a90d9877e62a7dee53ebf01fb2" + } + Frame { + msec: 1088 + hash: "7c810f174bed3826016272515df2d525" + } + Frame { + msec: 1104 + hash: "9034cf480bda0d8b55aa6c43fc96b23d" + } + Frame { + msec: 1120 + hash: "f62697a1f4e4df2869c14462a0d514fd" + } + Key { + type: 7 + key: 16777237 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1136 + hash: "c878f53b338d1ce332973193b0fa4b86" + } + Frame { + msec: 1152 + hash: "5d26f27061b319c391961dc30d985593" + } + Frame { + msec: 1168 + hash: "e038ae877e8dddd3d99bf97475f59b3d" + } + Frame { + msec: 1184 + hash: "f44adc5e46d320c62095e1285ca8848b" + } + Key { + type: 6 + key: 16777237 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1200 + hash: "17f6b13e0556ac07dc527a9013a307a1" + } + Frame { + msec: 1216 + hash: "70a1cc3b6dd3be4e30bb6763344fb980" + } + Frame { + msec: 1232 + hash: "097c37d2243a27b8e800b5d4ec94b2e3" + } + Key { + type: 7 + key: 16777237 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1248 + hash: "15839227c002b1c71eb516f6653a7531" + } + Frame { + msec: 1264 + hash: "f4a8103ef9010c651368d325fe9eee98" + } + Frame { + msec: 1280 + hash: "d158ec1c83719c58c1d0a2e4cc90998f" + } + Frame { + msec: 1296 + hash: "6f66a44f5dc3fe150db2291b8cbc7327" + } + Frame { + msec: 1312 + hash: "8a016eac5befb215a157f7fe5bc743de" + } + Frame { + msec: 1328 + hash: "8a016eac5befb215a157f7fe5bc743de" + } + Key { + type: 6 + key: 16777237 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1344 + hash: "807129a4c578b1a5f0d3d84686eb0553" + } + Frame { + msec: 1360 + hash: "f9f2da990518048f0b050cc193567a20" + } + Frame { + msec: 1376 + hash: "762de7b1f4e56df6d7a245a23446884b" + } + Key { + type: 7 + key: 16777237 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1392 + hash: "84ba7354badc3dca92974933c3610010" + } + Frame { + msec: 1408 + hash: "36c3018870d74cff638d00acd03a0cf0" + } + Frame { + msec: 1424 + hash: "82b756a14eb0e802cd3e2d2d2a07f28e" + } + Frame { + msec: 1440 + hash: "74af1c12613130dc53533fe1178d5534" + } + Frame { + msec: 1456 + hash: "c32818b0ba24f11295580d1ccffffdc0" + } + Key { + type: 6 + key: 16777237 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1472 + hash: "b858be109fac6852234bf1db161e515b" + } + Frame { + msec: 1488 + hash: "9b3f8cffd3e79241d8a3b1f7d80790db" + } + Frame { + msec: 1504 + hash: "840dc72aabc4a9b28bae641354676324" + } + Frame { + msec: 1520 + hash: "c60bfd5cc8b26a841035db29baba5dab" + } + Key { + type: 7 + key: 16777237 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1536 + hash: "88d80dc8b0d968aa718ff464e507f53b" + } + Frame { + msec: 1552 + hash: "f7ffc82d3448c415b4997401fb61b96b" + } + Frame { + msec: 1568 + hash: "df8e9a09752fe2b2eff9184ba8e88ef1" + } + Frame { + msec: 1584 + hash: "97330e949a609f5f33832dd17e0c3716" + } + Frame { + msec: 1600 + hash: "97330e949a609f5f33832dd17e0c3716" + } + Key { + type: 6 + key: 16777237 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1616 + hash: "97330e949a609f5f33832dd17e0c3716" + } + Frame { + msec: 1632 + hash: "97330e949a609f5f33832dd17e0c3716" + } + Frame { + msec: 1648 + hash: "97330e949a609f5f33832dd17e0c3716" + } + Key { + type: 7 + key: 16777237 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1664 + hash: "97330e949a609f5f33832dd17e0c3716" + } + Frame { + msec: 1680 + hash: "97330e949a609f5f33832dd17e0c3716" + } + Frame { + msec: 1696 + hash: "97330e949a609f5f33832dd17e0c3716" + } + Frame { + msec: 1712 + hash: "97330e949a609f5f33832dd17e0c3716" + } + Frame { + msec: 1728 + hash: "97330e949a609f5f33832dd17e0c3716" + } + Frame { + msec: 1744 + hash: "97330e949a609f5f33832dd17e0c3716" + } + Key { + type: 6 + key: 16777237 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1760 + hash: "97330e949a609f5f33832dd17e0c3716" + } + Frame { + msec: 1776 + hash: "97330e949a609f5f33832dd17e0c3716" + } + Key { + type: 7 + key: 16777237 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1792 + hash: "97330e949a609f5f33832dd17e0c3716" + } + Frame { + msec: 1808 + hash: "97330e949a609f5f33832dd17e0c3716" + } + Frame { + msec: 1824 + hash: "97330e949a609f5f33832dd17e0c3716" + } + Frame { + msec: 1840 + hash: "97330e949a609f5f33832dd17e0c3716" + } + Frame { + msec: 1856 + hash: "97330e949a609f5f33832dd17e0c3716" + } + Frame { + msec: 1872 + hash: "97330e949a609f5f33832dd17e0c3716" + } + Key { + type: 6 + key: 16777235 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1888 + hash: "97330e949a609f5f33832dd17e0c3716" + } + Frame { + msec: 1904 + hash: "15e45e1f64438d7c31e79a9602e1db7a" + } + Frame { + msec: 1920 + hash: "02f34b6fde613c7c5928285bf81837d6" + } + Frame { + msec: 1936 + image: "listview.2.png" + } + Key { + type: 7 + key: 16777235 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1952 + hash: "33091359f9e6f21a14bf415d32d4d3b1" + } + Frame { + msec: 1968 + hash: "0fdcffa304f3eadde5cd7866d0a74e72" + } + Frame { + msec: 1984 + hash: "024539dbf8e66f1ba7d5d8c91bd278f0" + } + Frame { + msec: 2000 + hash: "4900babcc0a7bbd622a72590dcb0eea4" + } + Frame { + msec: 2016 + hash: "d6f68d576fe46bb832accf5e9e590f7e" + } + Key { + type: 6 + key: 16777235 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2032 + hash: "5a54bcb9a59268d70a2bb99bd32395be" + } + Frame { + msec: 2048 + hash: "72fbb18da8c5ef3e98390796dad31390" + } + Frame { + msec: 2064 + hash: "ac073b398e3d50ef10c92d8e6b4b3fa0" + } + Frame { + msec: 2080 + hash: "41e38d866d65bf1d42448b07a133cd93" + } + Key { + type: 7 + key: 16777235 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2096 + hash: "c45310b94cd2ff276e97be1706e1d432" + } + Frame { + msec: 2112 + hash: "aefc6994644d266d4be0310f01c28be7" + } + Frame { + msec: 2128 + hash: "f07bcb1d8ad693e1ddd79bf651126554" + } + Frame { + msec: 2144 + hash: "62ff227caab71d2d98daf0da302ec796" + } + Key { + type: 6 + key: 16777235 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2160 + hash: "72350eeeaefd043354c82ca2039cff59" + } + Frame { + msec: 2176 + hash: "d89f288f0b231b4ec4a634b3856ecf8e" + } + Frame { + msec: 2192 + hash: "bc7d7e2253651cb3ea1cdebf9f188ae0" + } + Frame { + msec: 2208 + hash: "7c89cdb693489708fe2db327ae66d083" + } + Frame { + msec: 2224 + hash: "8ca778c1812ede19545c3c70020faa67" + } + Key { + type: 7 + key: 16777235 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2240 + hash: "bd50cd99f177eb3f70b2ffad9f7a49e1" + } + Frame { + msec: 2256 + hash: "b439c3576cad17689e7b6b134bb04e14" + } + Frame { + msec: 2272 + hash: "9489c0e1e8cc5675bbc42b78e567eab6" + } + Frame { + msec: 2288 + hash: "9489c0e1e8cc5675bbc42b78e567eab6" + } + Frame { + msec: 2304 + hash: "9489c0e1e8cc5675bbc42b78e567eab6" + } + Frame { + msec: 2320 + hash: "9489c0e1e8cc5675bbc42b78e567eab6" + } + Frame { + msec: 2336 + hash: "9489c0e1e8cc5675bbc42b78e567eab6" + } + Frame { + msec: 2352 + hash: "9489c0e1e8cc5675bbc42b78e567eab6" + } + Frame { + msec: 2368 + hash: "9489c0e1e8cc5675bbc42b78e567eab6" + } + Frame { + msec: 2384 + hash: "9489c0e1e8cc5675bbc42b78e567eab6" + } + Frame { + msec: 2400 + hash: "9489c0e1e8cc5675bbc42b78e567eab6" + } + Frame { + msec: 2416 + hash: "9489c0e1e8cc5675bbc42b78e567eab6" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 488; y: 56 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2432 + hash: "9489c0e1e8cc5675bbc42b78e567eab6" + } + Frame { + msec: 2448 + hash: "9489c0e1e8cc5675bbc42b78e567eab6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 489; y: 56 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2464 + hash: "9489c0e1e8cc5675bbc42b78e567eab6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 490; y: 59 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 491; y: 64 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2480 + hash: "9489c0e1e8cc5675bbc42b78e567eab6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 494; y: 74 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 497; y: 90 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2496 + hash: "6502b3a17af7ebca92d4794f0c2a62ac" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 499; y: 108 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 501; y: 126 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2512 + hash: "8a7ac12d59126b2784fd0af8d6b762a5" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 505; y: 170 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2528 + hash: "12fa9c4e2d6681f3a0643d8243d83e23" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 509; y: 214 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2544 + hash: "ccf18952f7c9686bd12fa196af9919e6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 516; y: 289 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2560 + hash: "70d654eecaf2163971596a503d2925a0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 518; y: 316 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 518; y: 316 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2576 + hash: "01ef888104f290f25612970a91e64620" + } + Frame { + msec: 2592 + hash: "25b730c7c126875078c64cce118f6277" + } + Frame { + msec: 2608 + hash: "68f3366932fed9156bf68dce6660b2a8" + } + Frame { + msec: 2624 + hash: "9f4be0b58c46035a11c5b80ec60618d5" + } + Frame { + msec: 2640 + hash: "6d38a4eaa2a41c57599cca381957ec4c" + } + Frame { + msec: 2656 + hash: "1061db26c9080067bf121eb1d164a3f3" + } + Frame { + msec: 2672 + hash: "c78d271711dc8f13fb48b41871249141" + } + Frame { + msec: 2688 + hash: "c5825611f6c429fddd8c20495507ea5f" + } + Frame { + msec: 2704 + hash: "9888b608bcf80496a3fe8848be4e3629" + } + Frame { + msec: 2720 + hash: "9995d6ba039045d94903d5095b018ca8" + } + Frame { + msec: 2736 + hash: "f8ea705b4710b3ffb11c2fe08ccccda2" + } + Frame { + msec: 2752 + hash: "7354c2fcabdede9fb1ee823ce098da3b" + } + Frame { + msec: 2768 + hash: "0d6beff960fa26771f09748356accedb" + } + Frame { + msec: 2784 + hash: "0720a8a1ed85344a1de6682b3aefd502" + } + Frame { + msec: 2800 + hash: "0245488740e13dbfc836b587b2bdf917" + } + Frame { + msec: 2816 + hash: "25c4fcdd85017d18df7e83c15f1accbc" + } + Frame { + msec: 2832 + hash: "51192ae0eae814f3dead9d949e2e4676" + } + Frame { + msec: 2848 + hash: "ddbe6b273882c6018c01e0a4480b1adb" + } + Frame { + msec: 2864 + hash: "bb840a0677114b67d9b08589e8a8192b" + } + Frame { + msec: 2880 + hash: "5387de4152cac542735a4debf997b56f" + } + Frame { + msec: 2896 + image: "listview.3.png" + } + Frame { + msec: 2912 + hash: "f5c99d06e0b3055374ee4c6bf3e634f4" + } + Frame { + msec: 2928 + hash: "18fe01fadf4c5acbd369f4450db1efa6" + } + Frame { + msec: 2944 + hash: "bed738f1883a76c5169dd2726456b9ea" + } + Frame { + msec: 2960 + hash: "c80c45be3189269d8edc5be22db7227d" + } + Frame { + msec: 2976 + hash: "3dcb08dd8ac8f083ad6aacbafaae05f4" + } + Frame { + msec: 2992 + hash: "38850ecc15cdcd55b758f94e8ac7fe55" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 517; y: 241 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3008 + hash: "033c44c51b8ab8f1555e153e20a80699" + } + Frame { + msec: 3024 + hash: "b6dc510369c679a028bb059e74796f6c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 518; y: 240 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 519; y: 239 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3040 + hash: "f3606887493ee9c0db86b1c6cc6fef6d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 524; y: 229 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3056 + hash: "79975f978ebf4556381d08b500dcab72" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 530; y: 204 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3072 + hash: "1345974969c1a56c4c14c74301985289" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 532; y: 167 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3088 + hash: "fd623f2bf161f326da6dec8b5d8bf16f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 530; y: 117 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 530; y: 117 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3104 + hash: "f1dfb47c5d4449e6cf7e2e6a2e86b1c5" + } + Frame { + msec: 3120 + hash: "26b31d08a1d50614771bec0458a2776b" + } + Frame { + msec: 3136 + hash: "dd017925e34f942c279ceb18b5e222da" + } + Frame { + msec: 3152 + hash: "be400b4ad1d9a1ccca56b8ff6b809272" + } + Frame { + msec: 3168 + hash: "4a4faa75155bb2c260f3a35675bd113e" + } + Frame { + msec: 3184 + hash: "3884c5d0d4c127876ba92a7b3a416339" + } + Frame { + msec: 3200 + hash: "b3d15196484410e24084b0f0d8fd683f" + } + Frame { + msec: 3216 + hash: "ed636ae433d185338ddbf7bffae731e1" + } + Frame { + msec: 3232 + hash: "0e1f352c163ad8fe852c2e4857881d2f" + } + Frame { + msec: 3248 + hash: "3c3b44481a6c2330a4a03076e35055f4" + } + Frame { + msec: 3264 + hash: "6ea3210a929774aea84a7beb4a784842" + } + Frame { + msec: 3280 + hash: "74dd747f9a64b19e5c5230c90ad3b642" + } + Frame { + msec: 3296 + hash: "c02be4ebefd19f4c5e864e8bbab7c13e" + } + Frame { + msec: 3312 + hash: "ce661af9085c833ec7d1fd66ebe67649" + } + Frame { + msec: 3328 + hash: "4bf921874cfdc1b7d14e3a110b9e70a1" + } + Frame { + msec: 3344 + hash: "f3e9cf8ac9e109e88d8c426fdcee28a9" + } + Frame { + msec: 3360 + hash: "aa718a37f7ccf655d176adb799b5ddfb" + } + Frame { + msec: 3376 + hash: "aa114a9676af508b4a106b21f7a2ed10" + } + Frame { + msec: 3392 + hash: "a5bbbaebb61b83384f5be82a9c3181ba" + } + Frame { + msec: 3408 + hash: "83deebf650b192de7c8a764d5379eeb4" + } + Frame { + msec: 3424 + hash: "5b433e1f5b97b39b6e86c837f0b91f2b" + } + Frame { + msec: 3440 + hash: "b5236be4e416f89a91eda7afbd75fc63" + } + Frame { + msec: 3456 + hash: "1713477f5484a1b35686f2f4bff27612" + } + Frame { + msec: 3472 + hash: "77f91f90744a23bbe172629f311d1a4e" + } + Frame { + msec: 3488 + hash: "3963753a90d6cbf74bc21c9d06f4227b" + } + Frame { + msec: 3504 + hash: "7f64804cd07a0ae63d0e3a1b9f8f8a84" + } + Frame { + msec: 3520 + hash: "9ae6bc952da97239bfee88633637aeb7" + } + Frame { + msec: 3536 + hash: "ba34cd0d57d5d027ad6c2de102676399" + } + Frame { + msec: 3552 + hash: "c49632f9369aa901fcb702e76295c1e8" + } + Frame { + msec: 3568 + hash: "3adab59e06a635a033564dfc8edc4877" + } + Frame { + msec: 3584 + hash: "67643cbfb3c9864b7447a9a8e316b251" + } + Frame { + msec: 3600 + hash: "d04d288cbf89e1ad3bbf25ffebd7a382" + } + Frame { + msec: 3616 + hash: "e6c4d34b9b3de464ec0dcf8719b86313" + } + Frame { + msec: 3632 + hash: "f73462d0fe19cbbd771f9f78d7bc4384" + } + Frame { + msec: 3648 + hash: "6369f075a492240aee36eae8dcb2ace5" + } + Frame { + msec: 3664 + hash: "1e9424a3b93833f8ae855c5f7877679a" + } + Frame { + msec: 3680 + hash: "da274c1ae57d217ef4515326d32646b4" + } + Frame { + msec: 3696 + hash: "1cbe684ba95e6ef635873f746e942f3d" + } + Frame { + msec: 3712 + hash: "228e13c1d3dea6e666637de7cedd6dd4" + } + Frame { + msec: 3728 + hash: "a3f8fec49fb88652e9339b621ea8b972" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 487; y: 34 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3744 + hash: "7c3eb16bf4f66d2b9889c9d80aaae8b2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 488; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3760 + hash: "1825d33eb9ae94a63d334d93e07ce9af" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 489; y: 49 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3776 + hash: "306652a5a179cf23ee87c10571814f53" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 490; y: 55 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3792 + hash: "3d3ba7cd968a1f91f7534cabd7cc034b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 490; y: 60 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3808 + hash: "862f70151938a5d27db37a9f5dd53faa" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 491; y: 64 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3824 + hash: "92b9283fa8b5642ce9bd14d875a12b75" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 491; y: 72 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3840 + hash: "294e6961316b028201657ab6b244559f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 493; y: 93 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3856 + image: "listview.4.png" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 493; y: 123 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3872 + hash: "6cdd764ee39789307e5e313bfbbb7765" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 494; y: 141 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 494; y: 141 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3888 + hash: "a88656d49e4636b18c4f6f4a0ab943d6" + } + Frame { + msec: 3904 + hash: "f1ec9a65d5f8d2020db1b70bcd419417" + } + Frame { + msec: 3920 + hash: "ca7d3d7d26445d13acd7fe4a2c5d1d4d" + } + Frame { + msec: 3936 + hash: "90016f51541a15ba4b6265f6843a2998" + } + Frame { + msec: 3952 + hash: "bdb992552a5c5707ddb372631f72e6a3" + } + Frame { + msec: 3968 + hash: "af69ed47f0f40648d55af10c87866805" + } + Frame { + msec: 3984 + hash: "33e77562bdf839ca1e969b918d90a07b" + } + Frame { + msec: 4000 + hash: "2001b5ca444808a79c49adc9d03c960e" + } + Frame { + msec: 4016 + hash: "e4186283e5fe0c1efb29eca6f59e9079" + } + Frame { + msec: 4032 + hash: "dab82d0bbba66df3297712b42f74f25a" + } + Frame { + msec: 4048 + hash: "b180ad3acdfd736276ef4d1de040bb55" + } + Frame { + msec: 4064 + hash: "577445b0e4d6f8079830c2b87ce5829d" + } + Frame { + msec: 4080 + hash: "45fffe51376abef4cb28842b392ab0b7" + } + Frame { + msec: 4096 + hash: "fc14e3b2d16e1f078d223876ef71c81e" + } + Frame { + msec: 4112 + hash: "4ef2b65280a00a6a4e66185f41479aef" + } + Frame { + msec: 4128 + hash: "131181ce7ff2f4d4e69823fcb7a20755" + } + Frame { + msec: 4144 + hash: "8e6db058e96dad9c4963b881083ab9bf" + } + Frame { + msec: 4160 + hash: "e2d407b6dff40625790d4fd9e599b374" + } + Frame { + msec: 4176 + hash: "631fe708fdcb1e4f4ea89b10da5db623" + } + Frame { + msec: 4192 + hash: "e11831f37a3a1da78cbdc7604ddccd68" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 491; y: 193 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4208 + hash: "c2dccc4e890b2302edd413dcdb87b50b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 491; y: 189 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4224 + hash: "b4f6a6650dd779c8ad8696c23f44411a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 493; y: 187 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4240 + hash: "ad913e53e63c030ffdf4560766722760" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 494; y: 182 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 495; y: 180 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4256 + hash: "ef31f8a4d5bde5a2e308d19ee6d5e759" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 496; y: 174 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4272 + hash: "3ba07527f66e8bea5a8fb7647b0b4f3f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 496; y: 168 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4288 + hash: "70e5fe656f5fd843383964825690b678" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 497; y: 159 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 497; y: 156 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4304 + hash: "b7d8738be4cd6caa63dbecdb0f810a2f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 497; y: 147 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4320 + hash: "d6312191f9d7bbddc07f9253d8a93469" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 497; y: 139 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4336 + hash: "b182da64886cf4f444296e5fde26701e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 497; y: 128 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4352 + hash: "ebefef14b6fb990e0c6900884528bbd3" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 497; y: 120 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4368 + hash: "9a3451ed091b1bb6b975a9c5506b1ea4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 497; y: 117 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4384 + hash: "04290d8d62436c8a812f886e0a56ec1b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 498; y: 114 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4400 + hash: "eaaf9ea1d7fcf4a2a9dd58b1b5bb3cae" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 498; y: 112 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4416 + hash: "7ca8e3d76cf913d85f84f0b96acde829" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 498; y: 110 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4432 + hash: "7cfef56b24a552c6d4ecb3d0b88a1d08" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 498; y: 109 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 498; y: 108 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4448 + hash: "d032b257259810b4fe514c63ca5c9e4b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 498; y: 106 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4464 + hash: "568f6a57e6f1644b0dc245d03a1d7b85" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 499; y: 105 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4480 + hash: "5cb4cf2c527d821db2a5072dd3702653" + } + Frame { + msec: 4496 + hash: "5cb4cf2c527d821db2a5072dd3702653" + } + Frame { + msec: 4512 + hash: "5cb4cf2c527d821db2a5072dd3702653" + } + Frame { + msec: 4528 + hash: "5cb4cf2c527d821db2a5072dd3702653" + } + Frame { + msec: 4544 + hash: "5cb4cf2c527d821db2a5072dd3702653" + } + Frame { + msec: 4560 + hash: "5cb4cf2c527d821db2a5072dd3702653" + } + Frame { + msec: 4576 + hash: "5cb4cf2c527d821db2a5072dd3702653" + } + Frame { + msec: 4592 + hash: "5cb4cf2c527d821db2a5072dd3702653" + } + Frame { + msec: 4608 + hash: "5cb4cf2c527d821db2a5072dd3702653" + } + Frame { + msec: 4624 + hash: "5cb4cf2c527d821db2a5072dd3702653" + } + Frame { + msec: 4640 + hash: "5cb4cf2c527d821db2a5072dd3702653" + } + Frame { + msec: 4656 + hash: "5cb4cf2c527d821db2a5072dd3702653" + } + Frame { + msec: 4672 + hash: "5cb4cf2c527d821db2a5072dd3702653" + } + Frame { + msec: 4688 + hash: "5cb4cf2c527d821db2a5072dd3702653" + } + Frame { + msec: 4704 + hash: "5cb4cf2c527d821db2a5072dd3702653" + } + Frame { + msec: 4720 + hash: "5cb4cf2c527d821db2a5072dd3702653" + } + Frame { + msec: 4736 + hash: "5cb4cf2c527d821db2a5072dd3702653" + } + Frame { + msec: 4752 + hash: "5cb4cf2c527d821db2a5072dd3702653" + } + Frame { + msec: 4768 + hash: "5cb4cf2c527d821db2a5072dd3702653" + } + Frame { + msec: 4784 + hash: "5cb4cf2c527d821db2a5072dd3702653" + } + Frame { + msec: 4800 + hash: "5cb4cf2c527d821db2a5072dd3702653" + } + Frame { + msec: 4816 + image: "listview.5.png" + } + Frame { + msec: 4832 + hash: "5cb4cf2c527d821db2a5072dd3702653" + } + Frame { + msec: 4848 + hash: "5cb4cf2c527d821db2a5072dd3702653" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 499; y: 106 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 498; y: 107 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4864 + hash: "d48ecbd0661e08b2117fe2fd96ffeb2c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 497; y: 110 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4880 + hash: "7cfef56b24a552c6d4ecb3d0b88a1d08" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 496; y: 113 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4896 + hash: "5b12e9d17d9d464b055601db9cf0da44" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 495; y: 115 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4912 + hash: "25333e1f0cc9cfc664fd7369af544c06" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 494; y: 117 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4928 + hash: "04290d8d62436c8a812f886e0a56ec1b" + } + Frame { + msec: 4944 + hash: "04290d8d62436c8a812f886e0a56ec1b" + } + Frame { + msec: 4960 + hash: "04290d8d62436c8a812f886e0a56ec1b" + } + Frame { + msec: 4976 + hash: "04290d8d62436c8a812f886e0a56ec1b" + } + Frame { + msec: 4992 + hash: "04290d8d62436c8a812f886e0a56ec1b" + } + Frame { + msec: 5008 + hash: "04290d8d62436c8a812f886e0a56ec1b" + } + Frame { + msec: 5024 + hash: "04290d8d62436c8a812f886e0a56ec1b" + } + Frame { + msec: 5040 + hash: "04290d8d62436c8a812f886e0a56ec1b" + } + Frame { + msec: 5056 + hash: "04290d8d62436c8a812f886e0a56ec1b" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 494; y: 117 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5072 + hash: "04290d8d62436c8a812f886e0a56ec1b" + } + Frame { + msec: 5088 + hash: "04290d8d62436c8a812f886e0a56ec1b" + } + Frame { + msec: 5104 + hash: "04290d8d62436c8a812f886e0a56ec1b" + } + Frame { + msec: 5120 + hash: "04290d8d62436c8a812f886e0a56ec1b" + } + Frame { + msec: 5136 + hash: "04290d8d62436c8a812f886e0a56ec1b" + } + Frame { + msec: 5152 + hash: "04290d8d62436c8a812f886e0a56ec1b" + } + Frame { + msec: 5168 + hash: "04290d8d62436c8a812f886e0a56ec1b" + } + Frame { + msec: 5184 + hash: "04290d8d62436c8a812f886e0a56ec1b" + } + Frame { + msec: 5200 + hash: "04290d8d62436c8a812f886e0a56ec1b" + } + Frame { + msec: 5216 + hash: "04290d8d62436c8a812f886e0a56ec1b" + } + Frame { + msec: 5232 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5248 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5264 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5280 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5296 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5312 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5328 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5344 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5360 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5376 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5392 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5408 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5424 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5440 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5456 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5472 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5488 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5504 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5520 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5536 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5552 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5568 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5584 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5600 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5616 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5632 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5648 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5664 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5680 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5696 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5712 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5728 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5744 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5760 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5776 + image: "listview.6.png" + } + Frame { + msec: 5792 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5808 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5824 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5840 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5856 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5872 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5888 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5904 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5920 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5936 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5952 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5968 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 5984 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 6000 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 6016 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 6032 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 6048 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 6064 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 6080 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 6096 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 6112 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } + Frame { + msec: 6128 + hash: "dbd87bf02d698b7f053d307ef0c98452" + } +} diff --git a/tests/auto/declarative/qmlvisual/ListView/enforcerange.qml b/tests/auto/declarative/qmlvisual/ListView/enforcerange.qml new file mode 100644 index 00000000..a796be73 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/ListView/enforcerange.qml @@ -0,0 +1,31 @@ +import QtQuick 1.0 + +Item { + id: document + width: 200; height: 200 + + ListView { + id: serviceListView + anchors.fill: parent + model: 100 + + preferredHighlightBegin: 90 + preferredHighlightEnd: 90 + + highlightRangeMode: ListView.StrictlyEnforceRange + + delegate: Component { + Item { + height: 15 + ((serviceListView.currentIndex == index) ? 20 : 0) + width: 200 + Rectangle { width: 180; height: parent.height - 4; x: 10; y: 2; color: "red" } + } + } + } + + Rectangle { + y: 90; width: 200; height: 35 + border.color: "black" + color: "transparent" + } +} diff --git a/tests/auto/declarative/qmlvisual/ListView/itemlist.qml b/tests/auto/declarative/qmlvisual/ListView/itemlist.qml new file mode 100644 index 00000000..7e5d6347 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/ListView/itemlist.qml @@ -0,0 +1,40 @@ +// This example demonstrates placing items in a view using +// a VisualItemModel + +import QtQuick 1.0 + +Rectangle { + color: "lightgray" + width: 240 + height: 320 + + VisualItemModel { + id: itemModel + objectName: "itemModel" + Rectangle { + objectName: "item1" + height: view.height; width: view.width; color: "#FFFEF0" + } + Rectangle { + objectName: "item2" + height: view.height; width: view.width; color: "#F0FFF7" + } + Rectangle { + objectName: "item3" + height: view.height; width: view.width; color: "#F4F0FF" + } + } + + 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/qmlvisual/ListView/listview.qml b/tests/auto/declarative/qmlvisual/ListView/listview.qml new file mode 100644 index 00000000..6171c75a --- /dev/null +++ b/tests/auto/declarative/qmlvisual/ListView/listview.qml @@ -0,0 +1,86 @@ +import QtQuick 1.0 + +Rectangle { + id: root + property int current: 0 + width: 600; height: 300; color: "white" + + ListModel { + id: myModel + ListElement { + itemColor: "red" + } + ListElement { + itemColor: "green" + } + ListElement { + itemColor: "blue" + } + ListElement { + itemColor: "orange" + } + ListElement { + itemColor: "brown" + } + ListElement { + itemColor: "yellow" + } + ListElement { + itemColor: "purple" + } + ListElement { + itemColor: "darkred" + } + ListElement { + itemColor: "darkblue" + } + } + + Component { + id: myDelegate + Item { + width: 200; height: 50 + Rectangle { + x: 5; y : 5 + width: 190; height: 40 + opacity: 0.5 + color: itemColor + } + } + } + + Component { + id: myHighlight + Rectangle { width: 200; height: 50; color: "black" } + } + + ListView { + id: list1 + width: 200; height: parent.height + model: myModel; delegate: myDelegate + highlight: myHighlight + currentIndex: root.current + onCurrentIndexChanged: root.current = currentIndex + focus: true + } + ListView { + id: list2 + x: 200; width: 200; height: parent.height + model: myModel; delegate: myDelegate; highlight: myHighlight + preferredHighlightBegin: 80 + preferredHighlightEnd: 220 + highlightRangeMode: "ApplyRange" + currentIndex: root.current + } + ListView { + id: list3 + x: 400; width: 200; height: parent.height + model: myModel; delegate: myDelegate; highlight: myHighlight + currentIndex: root.current + onCurrentIndexChanged: root.current = currentIndex + preferredHighlightBegin: 125 + preferredHighlightEnd: 125 + highlightRangeMode: "StrictlyEnforceRange" + flickDeceleration: 1000 + } +} diff --git a/tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.0.png b/tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.0.png new file mode 100644 index 00000000..85f86916 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.0.png differ diff --git a/tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.1.png b/tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.1.png new file mode 100644 index 00000000..3cbb470e Binary files /dev/null and b/tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.1.png differ diff --git a/tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.2.png b/tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.2.png new file mode 100644 index 00000000..521e8187 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.2.png differ diff --git a/tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.3.png b/tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.3.png new file mode 100644 index 00000000..f5e76401 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.3.png differ diff --git a/tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.4.png b/tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.4.png new file mode 100644 index 00000000..7b0c620f Binary files /dev/null and b/tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.4.png differ diff --git a/tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.5.png b/tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.5.png new file mode 100644 index 00000000..8c40a7a7 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.5.png differ diff --git a/tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.6.png b/tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.6.png new file mode 100644 index 00000000..8dfcf7ba Binary files /dev/null and b/tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.6.png differ diff --git a/tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.qml b/tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.qml new file mode 100644 index 00000000..af9e005c --- /dev/null +++ b/tests/auto/declarative/qmlvisual/Package_Views/data/packageviews.qml @@ -0,0 +1,1767 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "packageviews.0.png" + } + Frame { + msec: 32 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 48 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 64 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 80 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 96 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 112 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 128 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 144 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 160 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 176 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 192 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 208 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 224 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 240 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 256 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 272 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 288 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 304 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 320 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 336 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 352 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 368 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 384 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 400 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 416 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 432 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 448 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 464 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 480 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 496 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 512 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 528 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 544 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 560 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 576 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 592 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 608 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 624 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 640 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 656 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 672 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 688 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 704 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 720 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 736 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 752 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 768 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 784 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 26; y: 79 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 800 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 816 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 832 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 848 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 26; y: 79 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 864 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 880 + hash: "ae75402b2fa678a20c32d743e2b297a0" + } + Frame { + msec: 896 + hash: "76a9721ada8280925ff32e7207c01944" + } + Frame { + msec: 912 + hash: "87fb13adce4e2af05a7ad2f8cd18bad9" + } + Frame { + msec: 928 + hash: "cd7be3a5b9bae876998770dc52dbcd86" + } + Frame { + msec: 944 + hash: "3ba0b907dad0bfa9b20337d41661030b" + } + Frame { + msec: 960 + hash: "9748e4da669f474bf10abfe7a9c013fd" + } + Frame { + msec: 976 + image: "packageviews.1.png" + } + Frame { + msec: 992 + hash: "5af677254d12dc96b82cde90c5a65140" + } + Frame { + msec: 1008 + hash: "72cb4e75acb87de293a3cb1872eb946b" + } + Frame { + msec: 1024 + hash: "9b057090349c0c544036a33a60710920" + } + Frame { + msec: 1040 + hash: "ae19cf81092e75979b6471c0b05541cf" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 48; y: 165 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1056 + hash: "0f42c19fee319bc8c27a89e9692c5cd9" + } + Frame { + msec: 1072 + hash: "865e19e35f361b08e6e844aa88d149eb" + } + Frame { + msec: 1088 + hash: "d5fcf7bd78da8918a3512a76189c7202" + } + Frame { + msec: 1104 + hash: "d2a6b42c2a3f7ca9eb35acc47f1faaf6" + } + Frame { + msec: 1120 + hash: "1388e856eb04fc24091c94406f4b5118" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 48; y: 165 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1136 + hash: "1388e856eb04fc24091c94406f4b5118" + } + Frame { + msec: 1152 + hash: "d529b6dcf510392488b370f6cfb87b3c" + } + Frame { + msec: 1168 + hash: "a50b1f2869c95f97a194a95581fa7be9" + } + Frame { + msec: 1184 + hash: "4bbee959f95548c3e76fb60ad363c184" + } + Frame { + msec: 1200 + hash: "5ec0185f4479377579822f92eb7f375a" + } + Frame { + msec: 1216 + hash: "263d09b9447d942c6c048139164d4427" + } + Frame { + msec: 1232 + hash: "291cc81fc3f82bca46db4e4403f39d49" + } + Frame { + msec: 1248 + hash: "c212f98ededa9ce7fc0fec697116a8e2" + } + Frame { + msec: 1264 + hash: "4309ef22d0c36d28a462ab2d4bf2cabd" + } + Frame { + msec: 1280 + hash: "f899f861c569416708c6754d821239e9" + } + Frame { + msec: 1296 + hash: "ed5ec237020ff06f258ce6e1b31e5eb8" + } + Frame { + msec: 1312 + hash: "98f3fe1c211d4f7bdc47b4a485226f14" + } + Frame { + msec: 1328 + hash: "40e376d37a85d225c46579b8f7c27159" + } + Frame { + msec: 1344 + hash: "cc8a178bf0cfc285185d17b37722bf41" + } + Frame { + msec: 1360 + hash: "b612439873d0eeb015d31cccd8e5a436" + } + Frame { + msec: 1376 + hash: "48c436165872098b474d0c691df11473" + } + Frame { + msec: 1392 + hash: "48c436165872098b474d0c691df11473" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 44; y: 50 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1408 + hash: "48c436165872098b474d0c691df11473" + } + Frame { + msec: 1424 + hash: "48c436165872098b474d0c691df11473" + } + Frame { + msec: 1440 + hash: "48c436165872098b474d0c691df11473" + } + Frame { + msec: 1456 + hash: "48c436165872098b474d0c691df11473" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 44; y: 50 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1472 + hash: "48c436165872098b474d0c691df11473" + } + Frame { + msec: 1488 + hash: "33cb50c11326c0589c7cc43ba6193e03" + } + Frame { + msec: 1504 + hash: "3f7e7534ccd7105762c78afab5ab997d" + } + Frame { + msec: 1520 + hash: "53b23d3eb2aaa1b21e4abaf9c0bfc7f2" + } + Frame { + msec: 1536 + hash: "609b37b12154291a28961210e81049fb" + } + Frame { + msec: 1552 + hash: "33cc6e17d087c251381ecf1b4cb9887c" + } + Frame { + msec: 1568 + hash: "dcb3e716035ca3f43895fda99c27e0d8" + } + Frame { + msec: 1584 + hash: "56bb753199873fac4ed9f30682bd1a3c" + } + Frame { + msec: 1600 + hash: "8b744c5cbf6154b73bd6c4fe6b087f0a" + } + Frame { + msec: 1616 + hash: "f2d5996d7fd5391a4d96493e9ef6a637" + } + Frame { + msec: 1632 + hash: "4407a05b64c68d43b29124df1f0d8f44" + } + Frame { + msec: 1648 + hash: "b71e43a8f7aa7a58cea80629b782a972" + } + Frame { + msec: 1664 + hash: "cca961a04dfdf9da8282219f2022fd2e" + } + Frame { + msec: 1680 + hash: "f3349a7ae7d7a97a6665476244d46dd6" + } + Frame { + msec: 1696 + hash: "78fc6123a10c027faa08dc2ff8318acc" + } + Frame { + msec: 1712 + hash: "6056cb02b921b56c63696d7fe9fe90fa" + } + Frame { + msec: 1728 + hash: "6056cb02b921b56c63696d7fe9fe90fa" + } + Frame { + msec: 1744 + hash: "6056cb02b921b56c63696d7fe9fe90fa" + } + Frame { + msec: 1760 + hash: "6056cb02b921b56c63696d7fe9fe90fa" + } + Frame { + msec: 1776 + hash: "6056cb02b921b56c63696d7fe9fe90fa" + } + Frame { + msec: 1792 + hash: "6056cb02b921b56c63696d7fe9fe90fa" + } + Frame { + msec: 1808 + hash: "6056cb02b921b56c63696d7fe9fe90fa" + } + Frame { + msec: 1824 + hash: "6056cb02b921b56c63696d7fe9fe90fa" + } + Frame { + msec: 1840 + hash: "6056cb02b921b56c63696d7fe9fe90fa" + } + Frame { + msec: 1856 + hash: "6056cb02b921b56c63696d7fe9fe90fa" + } + Frame { + msec: 1872 + hash: "6056cb02b921b56c63696d7fe9fe90fa" + } + Frame { + msec: 1888 + hash: "6056cb02b921b56c63696d7fe9fe90fa" + } + Frame { + msec: 1904 + hash: "6056cb02b921b56c63696d7fe9fe90fa" + } + Frame { + msec: 1920 + hash: "6056cb02b921b56c63696d7fe9fe90fa" + } + Frame { + msec: 1936 + image: "packageviews.2.png" + } + Frame { + msec: 1952 + hash: "6056cb02b921b56c63696d7fe9fe90fa" + } + Frame { + msec: 1968 + hash: "6056cb02b921b56c63696d7fe9fe90fa" + } + Frame { + msec: 1984 + hash: "6056cb02b921b56c63696d7fe9fe90fa" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 181; y: 76 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2000 + hash: "6056cb02b921b56c63696d7fe9fe90fa" + } + Frame { + msec: 2016 + hash: "6056cb02b921b56c63696d7fe9fe90fa" + } + Frame { + msec: 2032 + hash: "6056cb02b921b56c63696d7fe9fe90fa" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 181; y: 76 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2048 + hash: "9f94c38547da1855e4bd3ae498aed705" + } + Frame { + msec: 2064 + hash: "783f73da3736a2c554c8d749ce0522c0" + } + Frame { + msec: 2080 + hash: "9a0e1c2bed75874381e4b1ce275d0f68" + } + Frame { + msec: 2096 + hash: "e2ce85192977e6422c89190b3cea4518" + } + Frame { + msec: 2112 + hash: "ba9c80ff0ed723bca702cb6b4c6dfb76" + } + Frame { + msec: 2128 + hash: "7e194db1b86bc7346248d2acf34af286" + } + Frame { + msec: 2144 + hash: "cdd013bb8ee5880b16449efc99dd3ae5" + } + Frame { + msec: 2160 + hash: "3ef7d0fb43c2a1c1398f1152573974e0" + } + Frame { + msec: 2176 + hash: "176d1a86257cc85315dac4ecfe33f543" + } + Frame { + msec: 2192 + hash: "6def1267e573217a19e7b8e2cf6d7b6c" + } + Frame { + msec: 2208 + hash: "f679db34d99e24cda2e41c2afeaf551e" + } + Frame { + msec: 2224 + hash: "54a27193c5e59cd7220b65d8fbbd9061" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 112; y: 79 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2240 + hash: "171db3d0bf50062a0d7edd8e4c174024" + } + Frame { + msec: 2256 + hash: "9a7d293dc455e1ef0d18f44c3db7eed7" + } + Frame { + msec: 2272 + hash: "83bef2586d5abeb0ac8765d62135d308" + } + Frame { + msec: 2288 + hash: "56fed2e01cc8a6b9ccbf15731d4e533b" + } + Frame { + msec: 2304 + hash: "10174f2574c51155b8ee77ae545ac76d" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 112; y: 79 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2320 + hash: "107928ffebd936080325a1f4e39a0ac0" + } + Frame { + msec: 2336 + hash: "107928ffebd936080325a1f4e39a0ac0" + } + Frame { + msec: 2352 + hash: "d46e040f85295e66d8b22185be553d3e" + } + Frame { + msec: 2368 + hash: "3368a34c316486a779d62d143588b425" + } + Frame { + msec: 2384 + hash: "8f4cd4223c05e1b06a688c5eabc2a854" + } + Frame { + msec: 2400 + hash: "b576bf54b4bae38e8af6d922b3c73463" + } + Frame { + msec: 2416 + hash: "a3a238f5bf182ec6afc398569fd51ac7" + } + Frame { + msec: 2432 + hash: "a31329ba054a6fe144c030cffb5bd401" + } + Frame { + msec: 2448 + hash: "0a4b96a93e62359b6003daa703af1a5f" + } + Frame { + msec: 2464 + hash: "a16f126d874d957b879f45d36e88df34" + } + Frame { + msec: 2480 + hash: "89735c5b14f075b8f65533d16b3f714a" + } + Frame { + msec: 2496 + hash: "5d67dac0c4d2cf60e4cb717f4e4bc25f" + } + Frame { + msec: 2512 + hash: "dbfcc86e621a140466dd2a9215087e81" + } + Frame { + msec: 2528 + hash: "9f8dfa788048466dc07463e83d0377ff" + } + Frame { + msec: 2544 + hash: "021e1edec94a1909790a4acdbbc71fd8" + } + Frame { + msec: 2560 + hash: "f16be9ff4aba07708d469d6cfb80f1c2" + } + Frame { + msec: 2576 + hash: "1ab35df24a27349264ec282eb1f53018" + } + Frame { + msec: 2592 + hash: "1ab35df24a27349264ec282eb1f53018" + } + Frame { + msec: 2608 + hash: "1ab35df24a27349264ec282eb1f53018" + } + Frame { + msec: 2624 + hash: "1ab35df24a27349264ec282eb1f53018" + } + Frame { + msec: 2640 + hash: "1ab35df24a27349264ec282eb1f53018" + } + Frame { + msec: 2656 + hash: "1ab35df24a27349264ec282eb1f53018" + } + Frame { + msec: 2672 + hash: "1ab35df24a27349264ec282eb1f53018" + } + Frame { + msec: 2688 + hash: "1ab35df24a27349264ec282eb1f53018" + } + Frame { + msec: 2704 + hash: "1ab35df24a27349264ec282eb1f53018" + } + Frame { + msec: 2720 + hash: "1ab35df24a27349264ec282eb1f53018" + } + Frame { + msec: 2736 + hash: "1ab35df24a27349264ec282eb1f53018" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 116; y: 165 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2752 + hash: "1ab35df24a27349264ec282eb1f53018" + } + Frame { + msec: 2768 + hash: "1ab35df24a27349264ec282eb1f53018" + } + Frame { + msec: 2784 + hash: "1ab35df24a27349264ec282eb1f53018" + } + Frame { + msec: 2800 + hash: "1ab35df24a27349264ec282eb1f53018" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 116; y: 165 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2816 + hash: "a0aa5583886efc9bb0571bbb02fdb051" + } + Frame { + msec: 2832 + hash: "a0aa5583886efc9bb0571bbb02fdb051" + } + Frame { + msec: 2848 + hash: "edec25fdce2e05c0456434be4b8fad84" + } + Frame { + msec: 2864 + hash: "0c2061fc908c98980404b9e08acdc2f2" + } + Frame { + msec: 2880 + hash: "7bb02b032c1dcb4a7b3e6604ea5a8a8d" + } + Frame { + msec: 2896 + image: "packageviews.3.png" + } + Frame { + msec: 2912 + hash: "3a80012f6ca448fc30db70e9bcb23ddc" + } + Frame { + msec: 2928 + hash: "22a68838e9f6039e782facce7cfe0c9b" + } + Frame { + msec: 2944 + hash: "243fcc73e46db96ab6a91748adeff1a9" + } + Frame { + msec: 2960 + hash: "433bf03a821da5641909785b4c22cb55" + } + Frame { + msec: 2976 + hash: "66be8aa73b1e7173d899df3c0b9072a6" + } + Frame { + msec: 2992 + hash: "d7e563c1a1db45865794351daea5eb08" + } + Frame { + msec: 3008 + hash: "cc4345c2d4d0d7748c352a22f63030cb" + } + Frame { + msec: 3024 + hash: "382172adf3a339cac16a3e185ef4bb05" + } + Frame { + msec: 3040 + hash: "6019a3eac1825acdeac24d39c898d506" + } + Frame { + msec: 3056 + hash: "ac4b9427592a6fe7585625de8d1bff96" + } + Frame { + msec: 3072 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 3088 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 3104 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 3120 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 3136 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 3152 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 3168 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 80; y: 189 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3184 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 3200 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 3216 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 3232 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 80; y: 189 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3248 + hash: "7cf95f1bc67a90c0df788787589a75a9" + } + Frame { + msec: 3264 + hash: "a623e09cddb4304db658e30aef433dd8" + } + Frame { + msec: 3280 + hash: "4dce74fbb6649138a6ea6c288818fda5" + } + Frame { + msec: 3296 + hash: "2356d6d1f8481cf60542126f197ee0b1" + } + Frame { + msec: 3312 + hash: "7553601e70a7ccc3c60306fcf4999bed" + } + Frame { + msec: 3328 + hash: "bc86afd210d18dc68b433d70705b6603" + } + Frame { + msec: 3344 + hash: "8538d87120dd14958f92b81ceff304a3" + } + Frame { + msec: 3360 + hash: "2a8d299ff16589069d493bbab2ceda53" + } + Frame { + msec: 3376 + hash: "9f92b838c36e46d61a78f9013f04b580" + } + Frame { + msec: 3392 + hash: "7e6710b5491d5b9ad9a84691eadaa66c" + } + Frame { + msec: 3408 + hash: "1b165e39ff01747d5e9ad0d8769c8ee9" + } + Frame { + msec: 3424 + hash: "f78ad1eeb030eb58f8140da041acf4cd" + } + Frame { + msec: 3440 + hash: "f009dcb6b085ae38a45206f35ab37754" + } + Frame { + msec: 3456 + hash: "371dd67bf5a16ea085a256dd2e2583f9" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 75; y: 164 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3472 + hash: "9a0606cd6930b3f992f0533f3f6a0f7a" + } + Frame { + msec: 3488 + hash: "1d538ccb1874fe2ddb410d48ca668d74" + } + Frame { + msec: 3504 + hash: "71e08cb1eced66950e5893306b3043e7" + } + Frame { + msec: 3520 + hash: "71e08cb1eced66950e5893306b3043e7" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 75; y: 164 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3536 + hash: "71e08cb1eced66950e5893306b3043e7" + } + Frame { + msec: 3552 + hash: "2da0d9bb50d97ca78ee56f3c528a7db5" + } + Frame { + msec: 3568 + hash: "7f5105df4d41a6739ce13d69451d6059" + } + Frame { + msec: 3584 + hash: "8d171773d643ca5bfb095208efe841a9" + } + Frame { + msec: 3600 + hash: "8aa93bddb58d0533b03d2b7fc6efb839" + } + Frame { + msec: 3616 + hash: "26e2bcff7c3de9995e29fd8a06db4139" + } + Frame { + msec: 3632 + hash: "94fe4626d8f978649bf200bf79885ec0" + } + Frame { + msec: 3648 + hash: "61e92064d9da2db6ea0adfdffaad81f6" + } + Frame { + msec: 3664 + hash: "54d5845c08eb5cc9263c84146fd9fcd2" + } + Frame { + msec: 3680 + hash: "d10a128980a46713093899696110d81e" + } + Frame { + msec: 3696 + hash: "ff6301533f4fb29194f20a4520824030" + } + Frame { + msec: 3712 + hash: "598b6e7c6c6c0de77b4793d1f68beea6" + } + Frame { + msec: 3728 + hash: "e3d123e179a6930e1bc1864095621607" + } + Frame { + msec: 3744 + hash: "b1bb4c350969f579630680803e622662" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 72; y: 147 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3760 + hash: "3dd276bb96dd3a5ef96095e0b8251c05" + } + Frame { + msec: 3776 + hash: "144402c1397313fb5d13b4972bb3a450" + } + Frame { + msec: 3792 + hash: "144402c1397313fb5d13b4972bb3a450" + } + Frame { + msec: 3808 + hash: "144402c1397313fb5d13b4972bb3a450" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 72; y: 146 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 72; y: 146 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3824 + hash: "144402c1397313fb5d13b4972bb3a450" + } + Frame { + msec: 3840 + hash: "6dbc00069eca813c20731afdf0d25e35" + } + Frame { + msec: 3856 + image: "packageviews.4.png" + } + Frame { + msec: 3872 + hash: "1f7a173f70f04adcc28481cfa40ad82e" + } + Frame { + msec: 3888 + hash: "5189e3a7f4c93d6095d526ee4583adea" + } + Frame { + msec: 3904 + hash: "03ef5fa51d7455e58c34c52be2b2625b" + } + Frame { + msec: 3920 + hash: "6589088e4efab3426d5b3c08f885fcc4" + } + Frame { + msec: 3936 + hash: "35593c99aa3f7040efe6420ce90426f7" + } + Frame { + msec: 3952 + hash: "61e13ba4ed7251e607ae299841b55fea" + } + Frame { + msec: 3968 + hash: "7bc5f663e54b6ac10b7aa8787de0483a" + } + Frame { + msec: 3984 + hash: "141e2fa188fabeef8587770b2d18538c" + } + Frame { + msec: 4000 + hash: "5f59ea38bb55096d6ca50ffb9e9706ec" + } + Frame { + msec: 4016 + hash: "9ff31c7768afa3eba211e862bbfddda1" + } + Frame { + msec: 4032 + hash: "f8731aa264c5e534f13f4fa89fc320a1" + } + Frame { + msec: 4048 + hash: "87bc86979d05432f8ad16ca1f0537fa0" + } + Frame { + msec: 4064 + hash: "749f93235f677af13d162aacfde3840a" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 69; y: 113 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4080 + hash: "3af211e45026670fef0e5b391bad3455" + } + Frame { + msec: 4096 + hash: "3af211e45026670fef0e5b391bad3455" + } + Frame { + msec: 4112 + hash: "3af211e45026670fef0e5b391bad3455" + } + Frame { + msec: 4128 + hash: "3af211e45026670fef0e5b391bad3455" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 112 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4144 + hash: "3af211e45026670fef0e5b391bad3455" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 70; y: 112 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4160 + hash: "3af211e45026670fef0e5b391bad3455" + } + Frame { + msec: 4176 + hash: "de1b3a0b2ffb02f4969ce532bb7d6ad9" + } + Frame { + msec: 4192 + hash: "1e0bb98146f64975c4d5b8f8ef65319c" + } + Frame { + msec: 4208 + hash: "3540ee1fc403cc923100888e3bd15168" + } + Frame { + msec: 4224 + hash: "8f8178db769ed067e40c06ec2a8f3e3f" + } + Frame { + msec: 4240 + hash: "18310df1f8f735313e71739c58b2e42d" + } + Frame { + msec: 4256 + hash: "0797a57080ad60f00a185ad7eecbc40f" + } + Frame { + msec: 4272 + hash: "80cffb466c0e8947f775a4b7a677cd20" + } + Frame { + msec: 4288 + hash: "3f80ed589a282924e1dd4fbbd99078b0" + } + Frame { + msec: 4304 + hash: "7368b2da0c37d4b212fff8222244d413" + } + Frame { + msec: 4320 + hash: "7fb81e12fc1cb3e6f08a4bd0af23f40d" + } + Frame { + msec: 4336 + hash: "6677c15df6babf38036d4083c63c2684" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 67; y: 89 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4352 + hash: "106d90e84bd5b88c5df048ffc717e843" + } + Frame { + msec: 4368 + hash: "ce69c7e561e9f0c1fd5f3dba2ffda3e8" + } + Frame { + msec: 4384 + hash: "63b2956e9bad879bef156a318162656c" + } + Frame { + msec: 4400 + hash: "e9f02812bdd7071d1ceb71e0c2195f3a" + } + Frame { + msec: 4416 + hash: "e9f02812bdd7071d1ceb71e0c2195f3a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 67; y: 88 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4432 + hash: "e9f02812bdd7071d1ceb71e0c2195f3a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 67; y: 87 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 67; y: 87 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4448 + hash: "e9f02812bdd7071d1ceb71e0c2195f3a" + } + Frame { + msec: 4464 + hash: "e33d1f7d03ec85600cb61896c66fd9ca" + } + Frame { + msec: 4480 + hash: "72347f42ad925abdc614244b2ec01e7a" + } + Frame { + msec: 4496 + hash: "5fbd0e2ce5e2fe609dfc5e5643bfbc8a" + } + Frame { + msec: 4512 + hash: "4bcb24b700ac09da7387738bce36def5" + } + Frame { + msec: 4528 + hash: "7c489062131ef9fcdfe765cd0361361b" + } + Frame { + msec: 4544 + hash: "c4c1834200b2b7b3eb38b20d7147b8ee" + } + Frame { + msec: 4560 + hash: "49994b7471ec620ff52e5ba516bbb5d4" + } + Frame { + msec: 4576 + hash: "e1cf4e92e291b8509a8eb8a84f70dcad" + } + Frame { + msec: 4592 + hash: "9c7d6d53aa6089712389b1c2b4207d15" + } + Frame { + msec: 4608 + hash: "408731f3b11d888fff1ef9340ad1c568" + } + Frame { + msec: 4624 + hash: "d34f3092b84dea762adf7cf86c80abc6" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 67; y: 67 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4640 + hash: "d0202d3154721c968301e4fdb759b5d2" + } + Frame { + msec: 4656 + hash: "89601cb9b82465f6ae96156b7e259e70" + } + Frame { + msec: 4672 + hash: "7c775a699646acf45f26dea5bd5db783" + } + Frame { + msec: 4688 + hash: "be285c318afaeb932a2fd50fdc357813" + } + Frame { + msec: 4704 + hash: "5ddee39853aa1b8d1be287c86e5b763c" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 67; y: 67 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4720 + hash: "5ddee39853aa1b8d1be287c86e5b763c" + } + Frame { + msec: 4736 + hash: "8386713865c12636ce442cd31eacb8ba" + } + Frame { + msec: 4752 + hash: "9f4df793b3b6320e238b451e35183b9f" + } + Frame { + msec: 4768 + hash: "3cd41f6ab2303dd666269cca13dc95e3" + } + Frame { + msec: 4784 + hash: "504a3dd9018c3c725a92a9d6e84743fc" + } + Frame { + msec: 4800 + hash: "a703cbbef38b49be2d3033163ad450e7" + } + Frame { + msec: 4816 + image: "packageviews.5.png" + } + Frame { + msec: 4832 + hash: "c4f7130484f17854eace9e541c92207a" + } + Frame { + msec: 4848 + hash: "406a0371c7366fadefcbae7d428d1879" + } + Frame { + msec: 4864 + hash: "f9d6128c4fe60d95a001642cb80ccb99" + } + Frame { + msec: 4880 + hash: "2fb6886550a0eb7927274cd9cfc46819" + } + Frame { + msec: 4896 + hash: "dd4ac1eb6d18bc267b2f39d6d291a8bd" + } + Frame { + msec: 4912 + hash: "7f1e1114fe65b7a54364a04ad7697d4c" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 66; y: 45 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4928 + hash: "60a4882d0384489465fec8660933c29c" + } + Frame { + msec: 4944 + hash: "2330e35830fb707c9d9074b54cd5c7f6" + } + Frame { + msec: 4960 + hash: "02c275412e380c7f2878bc1f01e2850a" + } + Frame { + msec: 4976 + hash: "02c275412e380c7f2878bc1f01e2850a" + } + Frame { + msec: 4992 + hash: "02c275412e380c7f2878bc1f01e2850a" + } + Frame { + msec: 5008 + hash: "02c275412e380c7f2878bc1f01e2850a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 66; y: 44 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 66; y: 43 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 66; y: 43 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5024 + hash: "02c275412e380c7f2878bc1f01e2850a" + } + Frame { + msec: 5040 + hash: "a304ddc3e20220f7ed06aeae22589927" + } + Frame { + msec: 5056 + hash: "8ef8e13dff7e5f12c1d0a7a0e438a24f" + } + Frame { + msec: 5072 + hash: "ef7ef97e56c6b7579e11022861dd3eb5" + } + Frame { + msec: 5088 + hash: "133613dd5ac9242ce0b6926986cd384a" + } + Frame { + msec: 5104 + hash: "eb5125c97b9deca07e999ec7e78986b3" + } + Frame { + msec: 5120 + hash: "123c37efefdc1c8e6b27b7eff3bffff8" + } + Frame { + msec: 5136 + hash: "8443d904bcb63ab2d14cbb5a2e2a8fe7" + } + Frame { + msec: 5152 + hash: "379826db02c7e5cb8ab9007a419e34f9" + } + Frame { + msec: 5168 + hash: "672d45cdc24a2e1286956e3ce00cab56" + } + Frame { + msec: 5184 + hash: "cbaa7c4f52b2ebc1176a3bbe3e029487" + } + Frame { + msec: 5200 + hash: "35d70b84722fecd08b1c03f01c5a9895" + } + Frame { + msec: 5216 + hash: "65c1d1c4fc845229853836afd2e7a3c4" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 68; y: 19 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5232 + hash: "a238ffd4f6de5ca91bcf0e629407ad11" + } + Frame { + msec: 5248 + hash: "42322853eef74b9b849d81d7aa2ea4af" + } + Frame { + msec: 5264 + hash: "25fb0c4c04d9dcda865a8b254970330c" + } + Frame { + msec: 5280 + hash: "565891a25190705df8b424e1e5e73ddd" + } + Frame { + msec: 5296 + hash: "565891a25190705df8b424e1e5e73ddd" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 68; y: 19 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5312 + hash: "565891a25190705df8b424e1e5e73ddd" + } + Frame { + msec: 5328 + hash: "39e05f846071d4ec9a1413922a928995" + } + Frame { + msec: 5344 + hash: "7040400386930b34d989df4cdf36d125" + } + Frame { + msec: 5360 + hash: "2d3c081a1bbb94952becfd486d455de5" + } + Frame { + msec: 5376 + hash: "7a0719f22b0b74e4139ada77ca8d38d6" + } + Frame { + msec: 5392 + hash: "40d070285de7865fa8f415ff06be69d3" + } + Frame { + msec: 5408 + hash: "875ba6c617a4b5d157c747ead185247c" + } + Frame { + msec: 5424 + hash: "2d0ef679259f503d42cc2267b8d95a4e" + } + Frame { + msec: 5440 + hash: "b2aeceddd4d36e600f617578d64a4c32" + } + Frame { + msec: 5456 + hash: "a065ec04aff7a7c164ed8c152130589f" + } + Frame { + msec: 5472 + hash: "a09d94403ce40a8afb12e390aea3d848" + } + Frame { + msec: 5488 + hash: "34b116228527a669dadbfc75f309d045" + } + Frame { + msec: 5504 + hash: "5bee91cba46537ddaefe87f4e118d3d5" + } + Frame { + msec: 5520 + hash: "d0d8bd32268f3e3a62a08514f0d53799" + } + Frame { + msec: 5536 + hash: "b90c3915255d3f98700f8af0181fa6ee" + } + Frame { + msec: 5552 + hash: "8d52a504170547407fad6d8785b7199b" + } + Frame { + msec: 5568 + hash: "8d52a504170547407fad6d8785b7199b" + } + Frame { + msec: 5584 + hash: "8d52a504170547407fad6d8785b7199b" + } + Frame { + msec: 5600 + hash: "8d52a504170547407fad6d8785b7199b" + } + Frame { + msec: 5616 + hash: "8d52a504170547407fad6d8785b7199b" + } + Frame { + msec: 5632 + hash: "8d52a504170547407fad6d8785b7199b" + } + Frame { + msec: 5648 + hash: "8d52a504170547407fad6d8785b7199b" + } + Frame { + msec: 5664 + hash: "8d52a504170547407fad6d8785b7199b" + } + Frame { + msec: 5680 + hash: "8d52a504170547407fad6d8785b7199b" + } + Frame { + msec: 5696 + hash: "8d52a504170547407fad6d8785b7199b" + } + Frame { + msec: 5712 + hash: "8d52a504170547407fad6d8785b7199b" + } + Frame { + msec: 5728 + hash: "8d52a504170547407fad6d8785b7199b" + } + Frame { + msec: 5744 + hash: "8d52a504170547407fad6d8785b7199b" + } + Frame { + msec: 5760 + hash: "8d52a504170547407fad6d8785b7199b" + } + Frame { + msec: 5776 + image: "packageviews.6.png" + } + Frame { + msec: 5792 + hash: "8d52a504170547407fad6d8785b7199b" + } + Frame { + msec: 5808 + hash: "8d52a504170547407fad6d8785b7199b" + } + Frame { + msec: 5824 + hash: "8d52a504170547407fad6d8785b7199b" + } + Frame { + msec: 5840 + hash: "8d52a504170547407fad6d8785b7199b" + } + Frame { + msec: 5856 + hash: "8d52a504170547407fad6d8785b7199b" + } + Frame { + msec: 5872 + hash: "8d52a504170547407fad6d8785b7199b" + } + Frame { + msec: 5888 + hash: "8d52a504170547407fad6d8785b7199b" + } + Frame { + msec: 5904 + hash: "8d52a504170547407fad6d8785b7199b" + } + Frame { + msec: 5920 + hash: "8d52a504170547407fad6d8785b7199b" + } + Frame { + msec: 5936 + hash: "8d52a504170547407fad6d8785b7199b" + } + Frame { + msec: 5952 + hash: "8d52a504170547407fad6d8785b7199b" + } +} diff --git a/tests/auto/declarative/qmlvisual/Package_Views/packageviews.qml b/tests/auto/declarative/qmlvisual/Package_Views/packageviews.qml new file mode 100644 index 00000000..a9de3f87 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/Package_Views/packageviews.qml @@ -0,0 +1,82 @@ +import QtQuick 1.0 + +Rectangle { + id: root + width: 200 + height: 200 + color: "black" + + VisualDataModel { + id: model + model: ListModel { + ListElement { itemColor: "red" } + ListElement { itemColor: "green" } + ListElement { itemColor: "blue" } + ListElement { itemColor: "orange" } + ListElement { itemColor: "purple" } + ListElement { itemColor: "yellow" } + ListElement { itemColor: "slategrey" } + ListElement { itemColor: "cyan" } + } + delegate: Package { + Rectangle { + id: listItem; Package.name: "list"; width:root.width/2; height: 25; color: "transparent"; border.color: "white" + MouseArea { + anchors.fill: parent + onClicked: myState.state = myState.state == "list" ? "grid" : "list" + } + } + Rectangle { + id: gridItem; Package.name: "grid"; width:50; height: 50; color: "transparent"; border.color: "white" + MouseArea { + anchors.fill: parent + onClicked: myState.state = myState.state == "list" ? "grid" : "list" + } + } + Rectangle { id: myContent; width:50; height: 50; color: itemColor } + + StateGroup { + id: myState + state: "list" + states: [ + State { + name: "list" + ParentChange { target: myContent; parent: listItem } + PropertyChanges { target: myContent; x: 0; y: 0; width: listItem.width; height: listItem.height } + }, + State { + name: "grid" + ParentChange { target: myContent; parent: gridItem } + PropertyChanges { target: myContent; x: 0; y: 0; width: gridItem.width; height: gridItem.height } + } + ] + + transitions: [ + Transition { + from: "*"; to: "*" + SequentialAnimation { + ParentAnimation{ + NumberAnimation { properties: "x,y,width,height"; easing.type: "InOutQuad" } + } + } + } + ] + } + } + } + + ListView { + width: parent.width/2 + height: parent.height + model: model.parts.list + } + + GridView { + x: parent.width/2 + width: parent.width/2 + cellWidth: 50 + cellHeight: 50 + height: parent.height + model: model.parts.grid + } +} diff --git a/tests/auto/declarative/qmlvisual/TEST_GUIDELINES b/tests/auto/declarative/qmlvisual/TEST_GUIDELINES new file mode 100644 index 00000000..469832f5 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/TEST_GUIDELINES @@ -0,0 +1,7 @@ +Guidelines for creating new visual tests: + +1. Keep it small. All visual tests should be able to run on a device with a screen of at least 640x360 pixels. Smaller than that is even better, because images of this side need to be processed and saved for every test (and even committed to the repository). + +2. Keep it short. It is hoped that these tests can be run regularly, perhaps even for every commit, and if you add up ten seconds for every time someone commits a change to QML then we'll be sitting here for a long time. Completeness is more important than haste, but consider the most time efficient ways to achieve said completeness. Do not forget about snapshot mode (tst_qmlvisual -help for details on -recordsnapshot) when testing that a static scene looks right. + +3. Avoid text. Text is relatively unstable due to platform specific peculiarities. If you need to identify an area, consider a unique color as opposed to a unique text label. If you must use Text, TextEdit, or TextInput, use the test-friendlier versions in the 'shared' directory. Also keep in mind that text anti-aliasing is disabled during tests for greater consistency, and you should never use point sizes in tests. Text autotests can thus only test some aspects of the elements. diff --git a/tests/auto/declarative/qmlvisual/animation/bindinganimation/bindinganimation.qml b/tests/auto/declarative/qmlvisual/animation/bindinganimation/bindinganimation.qml new file mode 100644 index 00000000..90198126 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/animation/bindinganimation/bindinganimation.qml @@ -0,0 +1,36 @@ +import QtQuick 1.0 + +Rectangle { + color: "blue" + width: 320 + height: 240 + id: page + Rectangle { + id: myRectangle + width: 100 + height: 100 + color: "red" + x: 10 + } + states: [ + State { + when: myMouseArea.pressed + name: "hello" + PropertyChanges { + target: myRectangle + x: 50 + 50 + } + } + ] + transitions: [ + Transition { + NumberAnimation { + properties: "x" + } + } + ] + MouseArea { + id: myMouseArea + anchors.fill: parent + } +} diff --git a/tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.0.png b/tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.0.png new file mode 100644 index 00000000..24c11bee Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.0.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.1.png b/tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.1.png new file mode 100644 index 00000000..82492d49 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.1.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.2.png b/tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.2.png new file mode 100644 index 00000000..a31f02a3 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.2.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.3.png b/tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.3.png new file mode 100644 index 00000000..a029af69 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.3.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.4.png b/tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.4.png new file mode 100644 index 00000000..c8367ec3 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.4.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.5.png b/tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.5.png new file mode 100644 index 00000000..900156f6 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.5.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.qml b/tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.qml new file mode 100644 index 00000000..be0637e4 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/animation/bindinganimation/data/bindinganimation.qml @@ -0,0 +1,1055 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "bindinganimation.0.png" + } + Frame { + msec: 32 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 48 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 64 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 80 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 96 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 112 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 128 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 144 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 160 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 176 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 192 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 208 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 224 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 240 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 256 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 272 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 288 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 304 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 320 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 336 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 352 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 368 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 384 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 400 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 416 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 432 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 448 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 464 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 480 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 496 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 512 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 87; y: 129 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 528 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 544 + hash: "a78c9394bf3b81f192f42710cd7218b1" + } + Frame { + msec: 560 + hash: "7f08e8170feb1d02373c9ab42b6e882d" + } + Frame { + msec: 576 + hash: "967fbad8ac664400a3efbe66617d62aa" + } + Frame { + msec: 592 + hash: "abc2ec0bc7a93e75b5823310e6284db1" + } + Frame { + msec: 608 + hash: "afbd5b24e2f86646f5ec2aa22f3a4b5b" + } + Frame { + msec: 624 + hash: "9413dffb7ee853ba0125ac22ab22abbd" + } + Frame { + msec: 640 + hash: "fcae0317f81a3ddd713f4db1349a9da0" + } + Frame { + msec: 656 + hash: "37739777a5979f3ebf85e47e63341660" + } + Frame { + msec: 672 + hash: "72731478d80f024076ea639b55152360" + } + Frame { + msec: 688 + hash: "69058485ced6bc992a1a7c5ee34add4c" + } + Frame { + msec: 704 + hash: "391ad7ff2362e059f6170dfe306f94a7" + } + Frame { + msec: 720 + hash: "f9f74a2e38b52c9266f33e428b6acd9d" + } + Frame { + msec: 736 + hash: "25152412c4ea2aec6caf89486c073484" + } + Frame { + msec: 752 + hash: "ba403842ba3128b1cdf6a9cb28c90751" + } + Frame { + msec: 768 + hash: "e90cd68490cf3ce6ef9fe4e8f92feaa9" + } + Frame { + msec: 784 + hash: "383ba6b9efcc58fca512982a207631f6" + } + Frame { + msec: 800 + hash: "383ba6b9efcc58fca512982a207631f6" + } + Frame { + msec: 816 + hash: "383ba6b9efcc58fca512982a207631f6" + } + Frame { + msec: 832 + hash: "383ba6b9efcc58fca512982a207631f6" + } + Frame { + msec: 848 + hash: "383ba6b9efcc58fca512982a207631f6" + } + Frame { + msec: 864 + hash: "383ba6b9efcc58fca512982a207631f6" + } + Frame { + msec: 880 + hash: "383ba6b9efcc58fca512982a207631f6" + } + Frame { + msec: 896 + hash: "383ba6b9efcc58fca512982a207631f6" + } + Frame { + msec: 912 + hash: "383ba6b9efcc58fca512982a207631f6" + } + Frame { + msec: 928 + hash: "383ba6b9efcc58fca512982a207631f6" + } + Frame { + msec: 944 + hash: "383ba6b9efcc58fca512982a207631f6" + } + Frame { + msec: 960 + hash: "383ba6b9efcc58fca512982a207631f6" + } + Frame { + msec: 976 + image: "bindinganimation.1.png" + } + Frame { + msec: 992 + hash: "383ba6b9efcc58fca512982a207631f6" + } + Frame { + msec: 1008 + hash: "383ba6b9efcc58fca512982a207631f6" + } + Frame { + msec: 1024 + hash: "383ba6b9efcc58fca512982a207631f6" + } + Frame { + msec: 1040 + hash: "383ba6b9efcc58fca512982a207631f6" + } + Frame { + msec: 1056 + hash: "383ba6b9efcc58fca512982a207631f6" + } + Frame { + msec: 1072 + hash: "383ba6b9efcc58fca512982a207631f6" + } + Frame { + msec: 1088 + hash: "383ba6b9efcc58fca512982a207631f6" + } + Frame { + msec: 1104 + hash: "383ba6b9efcc58fca512982a207631f6" + } + Frame { + msec: 1120 + hash: "383ba6b9efcc58fca512982a207631f6" + } + Frame { + msec: 1136 + hash: "383ba6b9efcc58fca512982a207631f6" + } + Frame { + msec: 1152 + hash: "383ba6b9efcc58fca512982a207631f6" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 87; y: 129 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1168 + hash: "383ba6b9efcc58fca512982a207631f6" + } + Frame { + msec: 1184 + hash: "adc501a3a2b8aaf72f58ba985b57424e" + } + Frame { + msec: 1200 + hash: "bfa51b7c19753ef7b16d78afffc7b9dd" + } + Frame { + msec: 1216 + hash: "ffa8471f57765b49fcdb9155393251e5" + } + Frame { + msec: 1232 + hash: "ddb65481469c38f2331546ee03a44206" + } + Frame { + msec: 1248 + hash: "6f48d1a9977b77cafd38a5903017605b" + } + Frame { + msec: 1264 + hash: "4279c814163af3bd069ce21b3cd1c729" + } + Frame { + msec: 1280 + hash: "17c46242c17983478f34cb49cb91ca6e" + } + Frame { + msec: 1296 + hash: "42f65c58b1f5f4b5ba70855f4aaa7d2f" + } + Frame { + msec: 1312 + hash: "6a74d6dc91a8b370200d3765c55c1136" + } + Frame { + msec: 1328 + hash: "ecda10356cca33901c2acd0a702fee46" + } + Frame { + msec: 1344 + hash: "4f58226bdbda7339d972eca065f75766" + } + Frame { + msec: 1360 + hash: "a39c80859a7643c9879da9c77b644703" + } + Frame { + msec: 1376 + hash: "16fe17b15900ff0464ab20ea921e5b1f" + } + Frame { + msec: 1392 + hash: "bc5c83b2014b7260900587ae3637598f" + } + Frame { + msec: 1408 + hash: "96c077e3a572edff04fa9b2f7020ffd0" + } + Frame { + msec: 1424 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 1440 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 1456 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 1472 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 1488 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 1504 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 1520 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 1536 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 1552 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 1568 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 1584 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 1600 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 1616 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 1632 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 1648 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 1664 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 1680 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 1696 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 1712 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 1728 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 1744 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 1760 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 1776 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 1792 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 1808 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 1824 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 1840 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 81; y: 130 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1856 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 1872 + hash: "a78c9394bf3b81f192f42710cd7218b1" + } + Frame { + msec: 1888 + hash: "7f08e8170feb1d02373c9ab42b6e882d" + } + Frame { + msec: 1904 + hash: "967fbad8ac664400a3efbe66617d62aa" + } + Frame { + msec: 1920 + hash: "abc2ec0bc7a93e75b5823310e6284db1" + } + Frame { + msec: 1936 + image: "bindinganimation.2.png" + } + Frame { + msec: 1952 + hash: "9413dffb7ee853ba0125ac22ab22abbd" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 81; y: 130 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1968 + hash: "9413dffb7ee853ba0125ac22ab22abbd" + } + Frame { + msec: 1984 + hash: "ecda10356cca33901c2acd0a702fee46" + } + Frame { + msec: 2000 + hash: "5fae0bdc65c609cb766ce585b8c649db" + } + Frame { + msec: 2016 + hash: "575d30ac088448b01f49082519bbb3a1" + } + Frame { + msec: 2032 + hash: "ffeb3db6d3f177acf6f92049359a9025" + } + Frame { + msec: 2048 + hash: "abc2ec0bc7a93e75b5823310e6284db1" + } + Frame { + msec: 2064 + hash: "fcb17070ef24575c61046928a8bbe440" + } + Frame { + msec: 2080 + hash: "4ab21e266919fb8d340f87091d8e1f62" + } + Frame { + msec: 2096 + hash: "f141c7c4402c6bacff31d4e77785f5f1" + } + Frame { + msec: 2112 + hash: "29e5f1388c6aaf23abe9f514d7e902d1" + } + Mouse { + type: 4 + button: 1 + buttons: 1 + x: 81; y: 130 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2128 + hash: "29e5f1388c6aaf23abe9f514d7e902d1" + } + Frame { + msec: 2144 + hash: "4ab21e266919fb8d340f87091d8e1f62" + } + Frame { + msec: 2160 + hash: "2d21b4af3780ef2bbccfcec957ce49c8" + } + Frame { + msec: 2176 + hash: "527b1f9e7a222483134675a73f9cf5b7" + } + Frame { + msec: 2192 + hash: "5edaad77f334e6a01982ee89a733b1f8" + } + Frame { + msec: 2208 + hash: "6a74d6dc91a8b370200d3765c55c1136" + } + Frame { + msec: 2224 + hash: "42f65c58b1f5f4b5ba70855f4aaa7d2f" + } + Frame { + msec: 2240 + hash: "3223ed179c828fadb3eca9c6373176c1" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 81; y: 130 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2256 + hash: "3223ed179c828fadb3eca9c6373176c1" + } + Frame { + msec: 2272 + hash: "516c44b44c23f213f5db01f9eb164b0b" + } + Frame { + msec: 2288 + hash: "4f41101378a104e72228eeb4ba395ca8" + } + Frame { + msec: 2304 + hash: "f9deee3a204c939562b896a6179743d2" + } + Frame { + msec: 2320 + hash: "772396bb23c713f34ea5c23bfbcb115e" + } + Frame { + msec: 2336 + hash: "ecda10356cca33901c2acd0a702fee46" + } + Frame { + msec: 2352 + hash: "527b1f9e7a222483134675a73f9cf5b7" + } + Frame { + msec: 2368 + hash: "4f58226bdbda7339d972eca065f75766" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 81; y: 130 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2384 + hash: "4f58226bdbda7339d972eca065f75766" + } + Frame { + msec: 2400 + hash: "5fae0bdc65c609cb766ce585b8c649db" + } + Frame { + msec: 2416 + hash: "9413dffb7ee853ba0125ac22ab22abbd" + } + Frame { + msec: 2432 + hash: "6a74d6dc91a8b370200d3765c55c1136" + } + Frame { + msec: 2448 + hash: "4f41101378a104e72228eeb4ba395ca8" + } + Frame { + msec: 2464 + hash: "37739777a5979f3ebf85e47e63341660" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 81; y: 130 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2480 + hash: "37739777a5979f3ebf85e47e63341660" + } + Frame { + msec: 2496 + hash: "42f65c58b1f5f4b5ba70855f4aaa7d2f" + } + Frame { + msec: 2512 + hash: "fcae0317f81a3ddd713f4db1349a9da0" + } + Frame { + msec: 2528 + hash: "082e0e7650d187a54ef0948ccca98e5a" + } + Frame { + msec: 2544 + hash: "9413dffb7ee853ba0125ac22ab22abbd" + } + Frame { + msec: 2560 + hash: "d9af30557f99b086bb1a185a946b580d" + } + Frame { + msec: 2576 + hash: "afbd5b24e2f86646f5ec2aa22f3a4b5b" + } + Frame { + msec: 2592 + hash: "ffeb3db6d3f177acf6f92049359a9025" + } + Mouse { + type: 4 + button: 1 + buttons: 1 + x: 81; y: 130 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2608 + hash: "ffeb3db6d3f177acf6f92049359a9025" + } + Frame { + msec: 2624 + hash: "5fae0bdc65c609cb766ce585b8c649db" + } + Frame { + msec: 2640 + hash: "9413dffb7ee853ba0125ac22ab22abbd" + } + Frame { + msec: 2656 + hash: "6a74d6dc91a8b370200d3765c55c1136" + } + Frame { + msec: 2672 + hash: "4f41101378a104e72228eeb4ba395ca8" + } + Frame { + msec: 2688 + hash: "37739777a5979f3ebf85e47e63341660" + } + Frame { + msec: 2704 + hash: "f4fe2cc93d65e086ba8ded1438269eb2" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 81; y: 130 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2720 + hash: "f4fe2cc93d65e086ba8ded1438269eb2" + } + Frame { + msec: 2736 + hash: "56c72b5da44bd5efdc47c3b9c3eac409" + } + Frame { + msec: 2752 + hash: "b08811b237ce7a460c80d285f04d53d8" + } + Frame { + msec: 2768 + hash: "fcae0317f81a3ddd713f4db1349a9da0" + } + Frame { + msec: 2784 + hash: "082e0e7650d187a54ef0948ccca98e5a" + } + Frame { + msec: 2800 + hash: "9413dffb7ee853ba0125ac22ab22abbd" + } + Frame { + msec: 2816 + hash: "d9af30557f99b086bb1a185a946b580d" + } + Frame { + msec: 2832 + hash: "575d30ac088448b01f49082519bbb3a1" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 81; y: 130 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2848 + hash: "575d30ac088448b01f49082519bbb3a1" + } + Frame { + msec: 2864 + hash: "d9af30557f99b086bb1a185a946b580d" + } + Frame { + msec: 2880 + hash: "82363265ed2b611a54f8d48b2af22f11" + } + Frame { + msec: 2896 + image: "bindinganimation.3.png" + } + Frame { + msec: 2912 + hash: "42f65c58b1f5f4b5ba70855f4aaa7d2f" + } + Frame { + msec: 2928 + hash: "56c72b5da44bd5efdc47c3b9c3eac409" + } + Frame { + msec: 2944 + hash: "72731478d80f024076ea639b55152360" + } + Frame { + msec: 2960 + hash: "4279c814163af3bd069ce21b3cd1c729" + } + Frame { + msec: 2976 + hash: "72a0c017a2fa90a4aeadfa6e552ff573" + } + Frame { + msec: 2992 + hash: "391ad7ff2362e059f6170dfe306f94a7" + } + Frame { + msec: 3008 + hash: "0b0c6419e1e5b016d9c22bd98fd452b1" + } + Frame { + msec: 3024 + hash: "365c824c330398d267ea52ae9468b9ee" + } + Frame { + msec: 3040 + hash: "65ad7e0189c096792331bd1bb0daf0db" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 81; y: 130 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3056 + hash: "65ad7e0189c096792331bd1bb0daf0db" + } + Frame { + msec: 3072 + hash: "a21aa1984f068650cce2a124a82c12be" + } + Frame { + msec: 3088 + hash: "8006ceaa02d22b5fdfeab400d39a0caf" + } + Frame { + msec: 3104 + hash: "6f48d1a9977b77cafd38a5903017605b" + } + Frame { + msec: 3120 + hash: "07f751ea4cf877ba72fbb36f9da268d7" + } + Frame { + msec: 3136 + hash: "72731478d80f024076ea639b55152360" + } + Frame { + msec: 3152 + hash: "37739777a5979f3ebf85e47e63341660" + } + Frame { + msec: 3168 + hash: "ed47684a0b21836cd27549e0989e96dd" + } + Frame { + msec: 3184 + hash: "772396bb23c713f34ea5c23bfbcb115e" + } + Frame { + msec: 3200 + hash: "ecda10356cca33901c2acd0a702fee46" + } + Frame { + msec: 3216 + hash: "575d30ac088448b01f49082519bbb3a1" + } + Frame { + msec: 3232 + hash: "2e3f134664df8204a291af2c9f81239a" + } + Frame { + msec: 3248 + hash: "967fbad8ac664400a3efbe66617d62aa" + } + Frame { + msec: 3264 + hash: "2b93a05b0e78e52d8d8bc2c71d898d3e" + } + Frame { + msec: 3280 + hash: "c7a9850ed078eb0cfdb5a7ef11840d64" + } + Frame { + msec: 3296 + hash: "96c077e3a572edff04fa9b2f7020ffd0" + } + Frame { + msec: 3312 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 3328 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 3344 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 3360 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 3376 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 3392 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 3408 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 3424 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 3440 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 3456 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 3472 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 3488 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 3504 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 3520 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 3536 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 3552 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 3568 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 3584 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 3600 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 3616 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 3632 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 3648 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 3664 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 3680 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 3696 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 3712 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 3728 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 3744 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 3760 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 3776 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 3792 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } + Frame { + msec: 3808 + hash: "7cb5fc371040e587de9f06ce14a4b29a" + } +} diff --git a/tests/auto/declarative/qmlvisual/animation/colorAnimation/colorAnimation-visual.qml b/tests/auto/declarative/qmlvisual/animation/colorAnimation/colorAnimation-visual.qml new file mode 100644 index 00000000..235ad9d9 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/animation/colorAnimation/colorAnimation-visual.qml @@ -0,0 +1,41 @@ +import QtQuick 1.0 + +Rectangle { + id: mainrect + width: 200; height: 200 + state: "first" + states: [ + State { + name: "first" + PropertyChanges { + target: mainrect + color: "red" + } + }, + State { + name: "second" + PropertyChanges { + target: mainrect + color: "blue" + } + } + ] + transitions: [ + Transition { + from: "first" + to: "second" + reversible: true + SequentialAnimation { + ColorAnimation { + duration: 2000 + target: mainrect + property: "color" + } + } + } + ] + MouseArea { + anchors.fill: parent + onClicked: { mainrect.state = 'second' } + } +} diff --git a/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.0.png b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.0.png new file mode 100644 index 00000000..99748a7a Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.0.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.1.png b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.1.png new file mode 100644 index 00000000..5393dd83 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.1.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.2.png b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.2.png new file mode 100644 index 00000000..8c17bf76 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.2.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.3.png b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.3.png new file mode 100644 index 00000000..1317eef8 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.3.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.qml b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.qml new file mode 100644 index 00000000..930f08f7 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data-X11/colorAnimation-visual.qml @@ -0,0 +1,951 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "colorAnimation-visual.0.png" + } + Frame { + msec: 32 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 48 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 64 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 80 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 96 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 112 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 128 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 144 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 160 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 176 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 192 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 208 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 224 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 240 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 256 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 272 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 288 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 304 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 320 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 336 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 352 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 368 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 384 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 400 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 416 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 432 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 448 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 464 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 480 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 496 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 512 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 93; y: 136 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 528 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 544 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 560 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 576 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 592 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 93; y: 136 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 608 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 624 + hash: "e5bda0daf98288ce18db6ce06eda3ba0" + } + Frame { + msec: 640 + hash: "d35008f75b8c992f80fb16ba7203649d" + } + Frame { + msec: 656 + hash: "14f43e0784ddf42ea8550db88c501bf1" + } + Frame { + msec: 672 + hash: "02276e158b5391480b1bdeaadf1fb903" + } + Frame { + msec: 688 + hash: "35d9513eb97a2c482b7cd197de910934" + } + Frame { + msec: 704 + hash: "faf0fd681e60bb2489099f5df772b6cd" + } + Frame { + msec: 720 + hash: "a863d3e346f94785a3a392fdc91526eb" + } + Frame { + msec: 736 + hash: "fdf328d3f6eb8410da59a91345e41a44" + } + Frame { + msec: 752 + hash: "83514a3b10d5be8f6c3b128d0f3e0b1c" + } + Frame { + msec: 768 + hash: "ead0eae76cd00189075964671effbaea" + } + Frame { + msec: 784 + hash: "24d2457fcd51490fda23071bf9929d12" + } + Frame { + msec: 800 + hash: "1478683446cf543dacbe31d0b76a98a6" + } + Frame { + msec: 816 + hash: "99f7da1f31fe920f6c02add4042ae925" + } + Frame { + msec: 832 + hash: "22def892006cf66667770b0f17baf6c0" + } + Frame { + msec: 848 + hash: "6a36d5a77099bfd58baf285478ff04e4" + } + Frame { + msec: 864 + hash: "6258150666b59b20ab476724c07fc20c" + } + Frame { + msec: 880 + hash: "f1636315bc950a6dd400d9c7ed263b88" + } + Frame { + msec: 896 + hash: "18447ea8dc2e8da956788e5b3cf3790a" + } + Frame { + msec: 912 + hash: "1d2a6e65997a73e9e670356c8e8b63b2" + } + Frame { + msec: 928 + hash: "bed0242c0f9ef229d1392835286d5782" + } + Frame { + msec: 944 + hash: "88923c190e9e5beadef8a409c06df9d6" + } + Frame { + msec: 960 + hash: "2d133e7ee60c97386f57838b3f0976c7" + } + Frame { + msec: 976 + image: "colorAnimation-visual.1.png" + } + Frame { + msec: 992 + hash: "395195716d76bc0be7b2033ed37a7a1c" + } + Frame { + msec: 1008 + hash: "243dbffcf416926242bbcb7348974c4c" + } + Frame { + msec: 1024 + hash: "a755068679616d8ac65c2aa7431f2a19" + } + Frame { + msec: 1040 + hash: "e8249b35a47eb492cbdf2d91cc8426f0" + } + Frame { + msec: 1056 + hash: "15f3da1c0e6f0779b96859d51171dd27" + } + Frame { + msec: 1072 + hash: "258c0c756aac3de743b43051f2aace6b" + } + Frame { + msec: 1088 + hash: "a58b9fdf301d72b2cc5c93934cc8927b" + } + Frame { + msec: 1104 + hash: "a9181d30870d472521f8904818ce520f" + } + Frame { + msec: 1120 + hash: "7f9e94069ccf3897c26a71bd7becd903" + } + Frame { + msec: 1136 + hash: "bdf305c2f46cdb86dbf57b1e0cc5a65b" + } + Frame { + msec: 1152 + hash: "fe5b6865d7e4fc7d1d42c1e74f8666f7" + } + Frame { + msec: 1168 + hash: "734f0de45a6e34c9eab7ef606196f96a" + } + Frame { + msec: 1184 + hash: "02a361c4534fdf7f286dc3e6dc23275c" + } + Frame { + msec: 1200 + hash: "e649155ad69999c14b92f6561e4d1185" + } + Frame { + msec: 1216 + hash: "01af177084fab755d622973f64b92018" + } + Frame { + msec: 1232 + hash: "097cc4a082dfab995d213a3a73883c97" + } + Frame { + msec: 1248 + hash: "d7b4239a3280b1eb8e885e3f422df8e9" + } + Frame { + msec: 1264 + hash: "59893977994e34e83f91e7ce3ad65d6d" + } + Frame { + msec: 1280 + hash: "b68e3fbb5cdcd6bd96df7dec558db42b" + } + Frame { + msec: 1296 + hash: "94ad0580648f36a1e18a9ea7e249b04d" + } + Frame { + msec: 1312 + hash: "750a4c01d2f5806a89a1c6cc6a9b9a68" + } + Frame { + msec: 1328 + hash: "4f109f50f388f1bfa4bc6b03b3e6e514" + } + Frame { + msec: 1344 + hash: "c6168d5cf27a533e8ee636637667be47" + } + Frame { + msec: 1360 + hash: "f8120547bed987aa34c00da5a01a4d1e" + } + Frame { + msec: 1376 + hash: "cbff526136fa2c128c8b898fbbef9e5c" + } + Frame { + msec: 1392 + hash: "f29e52398fab1a239a63df4c32f2fc69" + } + Frame { + msec: 1408 + hash: "7178bfe86fd2fd513218b33760460f8d" + } + Frame { + msec: 1424 + hash: "ca83285bc8ac633403896fe976896eb0" + } + Frame { + msec: 1440 + hash: "96ba486c09cc69d5aa38c46c00df1181" + } + Frame { + msec: 1456 + hash: "b88eab335842787869f4a14824c19dd8" + } + Frame { + msec: 1472 + hash: "065aa59012729e1e1a246a2083142690" + } + Frame { + msec: 1488 + hash: "dd0e98c8398861002c5f178c5f9f612d" + } + Frame { + msec: 1504 + hash: "04192c2b545948048eccf4d81bbde198" + } + Frame { + msec: 1520 + hash: "bb7502c7208281ef9fd41714ab88a1a8" + } + Frame { + msec: 1536 + hash: "5397195471890d08b703dca101e5bc7c" + } + Frame { + msec: 1552 + hash: "4c678cdbebb2ffd2cbf012ca77800cde" + } + Frame { + msec: 1568 + hash: "0d7a34ecd0c7f52b2c015037bf1902c6" + } + Frame { + msec: 1584 + hash: "fd9d5048be749ac4369fda2d018b43ae" + } + Frame { + msec: 1600 + hash: "93ee03795cd57ae6f7fe3a020b039ad4" + } + Frame { + msec: 1616 + hash: "5e1118963f219c39761ca7fbf564a9ca" + } + Frame { + msec: 1632 + hash: "8f40038741903150136170503649d941" + } + Frame { + msec: 1648 + hash: "b087b7d0aa6224821f8e18718ff5e77d" + } + Frame { + msec: 1664 + hash: "aa46b04a3c67dc772265ed2901955565" + } + Frame { + msec: 1680 + hash: "ac024bf2aeb4becdf31a09fe0a6db8f3" + } + Frame { + msec: 1696 + hash: "13745a174e4d06e2108a5bf125ba50cc" + } + Frame { + msec: 1712 + hash: "bd972f0d8e230eca0b3fea1b8c960c08" + } + Frame { + msec: 1728 + hash: "cbdbec802a58e7ced0cf45b3ab0bc0ba" + } + Frame { + msec: 1744 + hash: "5128584c50305c7d218b81b8367fa3d5" + } + Frame { + msec: 1760 + hash: "a71461d3593f3685620668916de870bd" + } + Frame { + msec: 1776 + hash: "74ebac8f32cf044b58d9883dbcd9a722" + } + Frame { + msec: 1792 + hash: "fedc5b638f339b90fe59b478721e65b7" + } + Frame { + msec: 1808 + hash: "8593a81be812edf54ec94da8ae9c1314" + } + Frame { + msec: 1824 + hash: "4e9b083075bc5e9287a8abc982778b56" + } + Frame { + msec: 1840 + hash: "1d6f02aa99afa47d77fc49ab894b365a" + } + Frame { + msec: 1856 + hash: "a204feec783b3b05de4c209c21745826" + } + Frame { + msec: 1872 + hash: "665a2a8ff00b9663157802767f504754" + } + Frame { + msec: 1888 + hash: "624fb09ebe60cb87d767faf8d2420b1e" + } + Frame { + msec: 1904 + hash: "e5af0cdc33f3275a25abb09e9165f310" + } + Frame { + msec: 1920 + hash: "02bafb5a81ca66f7670ac93de5123860" + } + Frame { + msec: 1936 + image: "colorAnimation-visual.2.png" + } + Frame { + msec: 1952 + hash: "b5abd0dff1ab076faac7cc226e83f5d0" + } + Frame { + msec: 1968 + hash: "b759acc35bccff8efc2e6fe276ddc0f7" + } + Frame { + msec: 1984 + hash: "ce52e18c1f7732768779863b45314ff5" + } + Frame { + msec: 2000 + hash: "99d30652559dd6931e0c95543eeaa149" + } + Frame { + msec: 2016 + hash: "ffbd9a00e05e085b89296d19d5caec57" + } + Frame { + msec: 2032 + hash: "9c9d658b9c25602816b8066bf19105db" + } + Frame { + msec: 2048 + hash: "2b7fd058e6601e22a30bb7106b1c683b" + } + Frame { + msec: 2064 + hash: "f4c7e26b19ee0a3e7c9688685eb7bd05" + } + Frame { + msec: 2080 + hash: "0dc6d593bceff56b7f81f2a49d37fefb" + } + Frame { + msec: 2096 + hash: "9bfd7ad5091ccbdde43c593e133a7b10" + } + Frame { + msec: 2112 + hash: "2703b617937914a90ea42ebf249d79ee" + } + Frame { + msec: 2128 + hash: "b77e2983138254016c4cca53100f46fa" + } + Frame { + msec: 2144 + hash: "60c4dd24187d1281081479e586f02b37" + } + Frame { + msec: 2160 + hash: "62f2511abd99ef1231c9fa4b91d4abfe" + } + Frame { + msec: 2176 + hash: "e309b3353fd174e883d309571caddc98" + } + Frame { + msec: 2192 + hash: "1e2d6a134c7b12dde551b148ef4f088c" + } + Frame { + msec: 2208 + hash: "e5dc5450604a491cc24a0dcf5c278b58" + } + Frame { + msec: 2224 + hash: "c8dae97c10e1962c1e6a51ab3ab8579e" + } + Frame { + msec: 2240 + hash: "4e1b7e06f55fb084080689b474f1fe1d" + } + Frame { + msec: 2256 + hash: "b4639c907fa937bf15fac62421170cd8" + } + Frame { + msec: 2272 + hash: "c250208a0caeb5f6cb4d3aac3d7d350b" + } + Frame { + msec: 2288 + hash: "a73351eabecf0d71149efe31f197413e" + } + Frame { + msec: 2304 + hash: "479425f1b7aff79e4dfb7fca534af018" + } + Frame { + msec: 2320 + hash: "046d0f0040a52d1f26ba9f7c5de06ef4" + } + Frame { + msec: 2336 + hash: "655778bf13c6080903150b0eb43a7edc" + } + Frame { + msec: 2352 + hash: "72da0bbe81514870655fdd3354adac60" + } + Frame { + msec: 2368 + hash: "defe0bdf675c65fff55aaaced1e4dae7" + } + Frame { + msec: 2384 + hash: "c988628b6c3d3780e9a865c7694926cd" + } + Frame { + msec: 2400 + hash: "5ab17563655231089edd986ff13d6012" + } + Frame { + msec: 2416 + hash: "c1adff1d2e5800ed466d1691d3b17382" + } + Frame { + msec: 2432 + hash: "70129ba01fbb19592b9dc0d0a3b3e7df" + } + Frame { + msec: 2448 + hash: "0000829ef7ed908bf430d42904d59cc2" + } + Frame { + msec: 2464 + hash: "843d2927f50ab87b4a86b7a6aaeed91f" + } + Frame { + msec: 2480 + hash: "da86d21756025e7de8050586d5e2a1f8" + } + Frame { + msec: 2496 + hash: "48dd1bd6580133b0793fee327ea4f1e6" + } + Frame { + msec: 2512 + hash: "f0618193dcd0ba2837249515a1898b1c" + } + Frame { + msec: 2528 + hash: "a530184e57251065286c0cbba7301e9c" + } + Frame { + msec: 2544 + hash: "64a1d7203973d65dd342793007a61c58" + } + Frame { + msec: 2560 + hash: "5b830dfc6ba442772de87d75d5a578de" + } + Frame { + msec: 2576 + hash: "5563b056b0409b65f60dd16dd0dd890e" + } + Frame { + msec: 2592 + hash: "b8bcf9ad2ca8720c11563a23d8280804" + } + Frame { + msec: 2608 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2624 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2640 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2656 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2672 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2688 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2704 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2720 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2736 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2752 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2768 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2784 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2800 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2816 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2832 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2848 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2864 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2880 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2896 + image: "colorAnimation-visual.3.png" + } + Frame { + msec: 2912 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2928 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2944 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2960 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2976 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2992 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3008 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3024 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3040 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3056 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3072 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3088 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3104 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3120 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3136 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3152 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3168 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3184 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3200 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3216 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3232 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3248 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3264 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3280 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3296 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3312 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3328 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3344 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3360 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3376 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3392 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3408 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3424 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3440 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3456 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3472 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3488 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3504 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3520 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3536 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3552 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3568 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3584 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3600 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3616 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3632 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Key { + type: 6 + key: 16777249 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3648 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3664 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3680 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } +} diff --git a/tests/auto/declarative/qmlvisual/animation/colorAnimation/data/colorAnimation-visual.0.png b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data/colorAnimation-visual.0.png new file mode 100644 index 00000000..2a79113d Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data/colorAnimation-visual.0.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/colorAnimation/data/colorAnimation-visual.1.png b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data/colorAnimation-visual.1.png new file mode 100644 index 00000000..ebd18023 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data/colorAnimation-visual.1.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/colorAnimation/data/colorAnimation-visual.2.png b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data/colorAnimation-visual.2.png new file mode 100644 index 00000000..9b8ecbbe Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data/colorAnimation-visual.2.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/colorAnimation/data/colorAnimation-visual.3.png b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data/colorAnimation-visual.3.png new file mode 100644 index 00000000..277cb9e5 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data/colorAnimation-visual.3.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/colorAnimation/data/colorAnimation-visual.qml b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data/colorAnimation-visual.qml new file mode 100644 index 00000000..2b664d44 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/animation/colorAnimation/data/colorAnimation-visual.qml @@ -0,0 +1,951 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "colorAnimation-visual.0.png" + } + Frame { + msec: 32 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 48 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 64 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 80 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 96 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 112 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 128 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 144 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 160 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 176 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 192 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 208 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 224 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 240 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 256 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 272 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 288 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 304 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 320 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 336 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 352 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 368 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 384 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 400 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 416 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 432 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 448 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 464 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 480 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 496 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 512 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 93; y: 136 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 528 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 544 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 560 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 576 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 592 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 93; y: 136 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 608 + hash: "acc736435c9f84aa82941ba561bc5dbc" + } + Frame { + msec: 624 + hash: "e5bda0daf98288ce18db6ce06eda3ba0" + } + Frame { + msec: 640 + hash: "d35008f75b8c992f80fb16ba7203649d" + } + Frame { + msec: 656 + hash: "14f43e0784ddf42ea8550db88c501bf1" + } + Frame { + msec: 672 + hash: "02276e158b5391480b1bdeaadf1fb903" + } + Frame { + msec: 688 + hash: "35d9513eb97a2c482b7cd197de910934" + } + Frame { + msec: 704 + hash: "faf0fd681e60bb2489099f5df772b6cd" + } + Frame { + msec: 720 + hash: "a863d3e346f94785a3a392fdc91526eb" + } + Frame { + msec: 736 + hash: "fdf328d3f6eb8410da59a91345e41a44" + } + Frame { + msec: 752 + hash: "83514a3b10d5be8f6c3b128d0f3e0b1c" + } + Frame { + msec: 768 + hash: "ead0eae76cd00189075964671effbaea" + } + Frame { + msec: 784 + hash: "24d2457fcd51490fda23071bf9929d12" + } + Frame { + msec: 800 + hash: "1478683446cf543dacbe31d0b76a98a6" + } + Frame { + msec: 816 + hash: "99f7da1f31fe920f6c02add4042ae925" + } + Frame { + msec: 832 + hash: "22def892006cf66667770b0f17baf6c0" + } + Frame { + msec: 848 + hash: "6a36d5a77099bfd58baf285478ff04e4" + } + Frame { + msec: 864 + hash: "6258150666b59b20ab476724c07fc20c" + } + Frame { + msec: 880 + hash: "f1636315bc950a6dd400d9c7ed263b88" + } + Frame { + msec: 896 + hash: "18447ea8dc2e8da956788e5b3cf3790a" + } + Frame { + msec: 912 + hash: "1d2a6e65997a73e9e670356c8e8b63b2" + } + Frame { + msec: 928 + hash: "bed0242c0f9ef229d1392835286d5782" + } + Frame { + msec: 944 + hash: "88923c190e9e5beadef8a409c06df9d6" + } + Frame { + msec: 960 + hash: "2d133e7ee60c97386f57838b3f0976c7" + } + Frame { + msec: 976 + image: "colorAnimation-visual.1.png" + } + Frame { + msec: 992 + hash: "395195716d76bc0be7b2033ed37a7a1c" + } + Frame { + msec: 1008 + hash: "e0f53c5605116a30d9bf3c031c63d958" + } + Frame { + msec: 1024 + hash: "a755068679616d8ac65c2aa7431f2a19" + } + Frame { + msec: 1040 + hash: "e8249b35a47eb492cbdf2d91cc8426f0" + } + Frame { + msec: 1056 + hash: "15f3da1c0e6f0779b96859d51171dd27" + } + Frame { + msec: 1072 + hash: "258c0c756aac3de743b43051f2aace6b" + } + Frame { + msec: 1088 + hash: "a58b9fdf301d72b2cc5c93934cc8927b" + } + Frame { + msec: 1104 + hash: "a9181d30870d472521f8904818ce520f" + } + Frame { + msec: 1120 + hash: "7f9e94069ccf3897c26a71bd7becd903" + } + Frame { + msec: 1136 + hash: "bdf305c2f46cdb86dbf57b1e0cc5a65b" + } + Frame { + msec: 1152 + hash: "fe5b6865d7e4fc7d1d42c1e74f8666f7" + } + Frame { + msec: 1168 + hash: "734f0de45a6e34c9eab7ef606196f96a" + } + Frame { + msec: 1184 + hash: "02a361c4534fdf7f286dc3e6dc23275c" + } + Frame { + msec: 1200 + hash: "e649155ad69999c14b92f6561e4d1185" + } + Frame { + msec: 1216 + hash: "01af177084fab755d622973f64b92018" + } + Frame { + msec: 1232 + hash: "097cc4a082dfab995d213a3a73883c97" + } + Frame { + msec: 1248 + hash: "d7b4239a3280b1eb8e885e3f422df8e9" + } + Frame { + msec: 1264 + hash: "59893977994e34e83f91e7ce3ad65d6d" + } + Frame { + msec: 1280 + hash: "b68e3fbb5cdcd6bd96df7dec558db42b" + } + Frame { + msec: 1296 + hash: "94ad0580648f36a1e18a9ea7e249b04d" + } + Frame { + msec: 1312 + hash: "750a4c01d2f5806a89a1c6cc6a9b9a68" + } + Frame { + msec: 1328 + hash: "4f109f50f388f1bfa4bc6b03b3e6e514" + } + Frame { + msec: 1344 + hash: "c6168d5cf27a533e8ee636637667be47" + } + Frame { + msec: 1360 + hash: "f8120547bed987aa34c00da5a01a4d1e" + } + Frame { + msec: 1376 + hash: "cbff526136fa2c128c8b898fbbef9e5c" + } + Frame { + msec: 1392 + hash: "f29e52398fab1a239a63df4c32f2fc69" + } + Frame { + msec: 1408 + hash: "45770fe0d61c485c13992d0f98b2a3ba" + } + Frame { + msec: 1424 + hash: "ca83285bc8ac633403896fe976896eb0" + } + Frame { + msec: 1440 + hash: "96ba486c09cc69d5aa38c46c00df1181" + } + Frame { + msec: 1456 + hash: "b88eab335842787869f4a14824c19dd8" + } + Frame { + msec: 1472 + hash: "065aa59012729e1e1a246a2083142690" + } + Frame { + msec: 1488 + hash: "dd0e98c8398861002c5f178c5f9f612d" + } + Frame { + msec: 1504 + hash: "04192c2b545948048eccf4d81bbde198" + } + Frame { + msec: 1520 + hash: "bb7502c7208281ef9fd41714ab88a1a8" + } + Frame { + msec: 1536 + hash: "5397195471890d08b703dca101e5bc7c" + } + Frame { + msec: 1552 + hash: "4c678cdbebb2ffd2cbf012ca77800cde" + } + Frame { + msec: 1568 + hash: "0d7a34ecd0c7f52b2c015037bf1902c6" + } + Frame { + msec: 1584 + hash: "fd9d5048be749ac4369fda2d018b43ae" + } + Frame { + msec: 1600 + hash: "93ee03795cd57ae6f7fe3a020b039ad4" + } + Frame { + msec: 1616 + hash: "5e1118963f219c39761ca7fbf564a9ca" + } + Frame { + msec: 1632 + hash: "8f40038741903150136170503649d941" + } + Frame { + msec: 1648 + hash: "b087b7d0aa6224821f8e18718ff5e77d" + } + Frame { + msec: 1664 + hash: "aa46b04a3c67dc772265ed2901955565" + } + Frame { + msec: 1680 + hash: "ac024bf2aeb4becdf31a09fe0a6db8f3" + } + Frame { + msec: 1696 + hash: "13745a174e4d06e2108a5bf125ba50cc" + } + Frame { + msec: 1712 + hash: "bd972f0d8e230eca0b3fea1b8c960c08" + } + Frame { + msec: 1728 + hash: "cbdbec802a58e7ced0cf45b3ab0bc0ba" + } + Frame { + msec: 1744 + hash: "5128584c50305c7d218b81b8367fa3d5" + } + Frame { + msec: 1760 + hash: "a71461d3593f3685620668916de870bd" + } + Frame { + msec: 1776 + hash: "74ebac8f32cf044b58d9883dbcd9a722" + } + Frame { + msec: 1792 + hash: "fedc5b638f339b90fe59b478721e65b7" + } + Frame { + msec: 1808 + hash: "a2fa71b4147372175774250501b6625e" + } + Frame { + msec: 1824 + hash: "4e9b083075bc5e9287a8abc982778b56" + } + Frame { + msec: 1840 + hash: "1d6f02aa99afa47d77fc49ab894b365a" + } + Frame { + msec: 1856 + hash: "a204feec783b3b05de4c209c21745826" + } + Frame { + msec: 1872 + hash: "665a2a8ff00b9663157802767f504754" + } + Frame { + msec: 1888 + hash: "624fb09ebe60cb87d767faf8d2420b1e" + } + Frame { + msec: 1904 + hash: "e5af0cdc33f3275a25abb09e9165f310" + } + Frame { + msec: 1920 + hash: "02bafb5a81ca66f7670ac93de5123860" + } + Frame { + msec: 1936 + image: "colorAnimation-visual.2.png" + } + Frame { + msec: 1952 + hash: "b5abd0dff1ab076faac7cc226e83f5d0" + } + Frame { + msec: 1968 + hash: "b759acc35bccff8efc2e6fe276ddc0f7" + } + Frame { + msec: 1984 + hash: "ce52e18c1f7732768779863b45314ff5" + } + Frame { + msec: 2000 + hash: "99d30652559dd6931e0c95543eeaa149" + } + Frame { + msec: 2016 + hash: "ffbd9a00e05e085b89296d19d5caec57" + } + Frame { + msec: 2032 + hash: "9c9d658b9c25602816b8066bf19105db" + } + Frame { + msec: 2048 + hash: "2b7fd058e6601e22a30bb7106b1c683b" + } + Frame { + msec: 2064 + hash: "f4c7e26b19ee0a3e7c9688685eb7bd05" + } + Frame { + msec: 2080 + hash: "0dc6d593bceff56b7f81f2a49d37fefb" + } + Frame { + msec: 2096 + hash: "9bfd7ad5091ccbdde43c593e133a7b10" + } + Frame { + msec: 2112 + hash: "2703b617937914a90ea42ebf249d79ee" + } + Frame { + msec: 2128 + hash: "b77e2983138254016c4cca53100f46fa" + } + Frame { + msec: 2144 + hash: "60c4dd24187d1281081479e586f02b37" + } + Frame { + msec: 2160 + hash: "62f2511abd99ef1231c9fa4b91d4abfe" + } + Frame { + msec: 2176 + hash: "e309b3353fd174e883d309571caddc98" + } + Frame { + msec: 2192 + hash: "1e2d6a134c7b12dde551b148ef4f088c" + } + Frame { + msec: 2208 + hash: "10d46d2862e333e5136b1c046dabb33b" + } + Frame { + msec: 2224 + hash: "c8dae97c10e1962c1e6a51ab3ab8579e" + } + Frame { + msec: 2240 + hash: "4e1b7e06f55fb084080689b474f1fe1d" + } + Frame { + msec: 2256 + hash: "b4639c907fa937bf15fac62421170cd8" + } + Frame { + msec: 2272 + hash: "c250208a0caeb5f6cb4d3aac3d7d350b" + } + Frame { + msec: 2288 + hash: "a73351eabecf0d71149efe31f197413e" + } + Frame { + msec: 2304 + hash: "479425f1b7aff79e4dfb7fca534af018" + } + Frame { + msec: 2320 + hash: "046d0f0040a52d1f26ba9f7c5de06ef4" + } + Frame { + msec: 2336 + hash: "655778bf13c6080903150b0eb43a7edc" + } + Frame { + msec: 2352 + hash: "72da0bbe81514870655fdd3354adac60" + } + Frame { + msec: 2368 + hash: "defe0bdf675c65fff55aaaced1e4dae7" + } + Frame { + msec: 2384 + hash: "c988628b6c3d3780e9a865c7694926cd" + } + Frame { + msec: 2400 + hash: "5ab17563655231089edd986ff13d6012" + } + Frame { + msec: 2416 + hash: "c1adff1d2e5800ed466d1691d3b17382" + } + Frame { + msec: 2432 + hash: "70129ba01fbb19592b9dc0d0a3b3e7df" + } + Frame { + msec: 2448 + hash: "0000829ef7ed908bf430d42904d59cc2" + } + Frame { + msec: 2464 + hash: "843d2927f50ab87b4a86b7a6aaeed91f" + } + Frame { + msec: 2480 + hash: "da86d21756025e7de8050586d5e2a1f8" + } + Frame { + msec: 2496 + hash: "48dd1bd6580133b0793fee327ea4f1e6" + } + Frame { + msec: 2512 + hash: "f0618193dcd0ba2837249515a1898b1c" + } + Frame { + msec: 2528 + hash: "a530184e57251065286c0cbba7301e9c" + } + Frame { + msec: 2544 + hash: "64a1d7203973d65dd342793007a61c58" + } + Frame { + msec: 2560 + hash: "5b830dfc6ba442772de87d75d5a578de" + } + Frame { + msec: 2576 + hash: "5563b056b0409b65f60dd16dd0dd890e" + } + Frame { + msec: 2592 + hash: "b8bcf9ad2ca8720c11563a23d8280804" + } + Frame { + msec: 2608 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2624 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2640 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2656 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2672 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2688 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2704 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2720 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2736 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2752 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2768 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2784 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2800 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2816 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2832 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2848 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2864 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2880 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2896 + image: "colorAnimation-visual.3.png" + } + Frame { + msec: 2912 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2928 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2944 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2960 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2976 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 2992 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3008 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3024 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3040 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3056 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3072 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3088 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3104 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3120 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3136 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3152 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3168 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3184 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3200 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3216 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3232 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3248 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3264 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3280 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3296 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3312 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3328 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3344 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3360 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3376 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3392 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3408 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3424 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3440 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3456 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3472 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3488 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3504 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3520 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3536 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3552 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3568 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3584 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3600 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3616 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3632 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Key { + type: 6 + key: 16777249 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3648 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3664 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } + Frame { + msec: 3680 + hash: "8c0fcda4f8956394c53fc4ba18caa850" + } +} diff --git a/tests/auto/declarative/qmlvisual/animation/easing/data/easing.0.png b/tests/auto/declarative/qmlvisual/animation/easing/data/easing.0.png new file mode 100644 index 00000000..81edfff9 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/easing/data/easing.0.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/easing/data/easing.1.png b/tests/auto/declarative/qmlvisual/animation/easing/data/easing.1.png new file mode 100644 index 00000000..ebac47f6 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/easing/data/easing.1.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/easing/data/easing.2.png b/tests/auto/declarative/qmlvisual/animation/easing/data/easing.2.png new file mode 100644 index 00000000..e1200bb1 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/easing/data/easing.2.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/easing/data/easing.3.png b/tests/auto/declarative/qmlvisual/animation/easing/data/easing.3.png new file mode 100644 index 00000000..81edfff9 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/easing/data/easing.3.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/easing/data/easing.qml b/tests/auto/declarative/qmlvisual/animation/easing/data/easing.qml new file mode 100644 index 00000000..597c3a6b --- /dev/null +++ b/tests/auto/declarative/qmlvisual/animation/easing/data/easing.qml @@ -0,0 +1,863 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "easing.0.png" + } + Frame { + msec: 32 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 48 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 64 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 80 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 96 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 112 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 128 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 144 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 160 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 176 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 192 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 208 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 224 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 240 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 256 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 272 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 288 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 304 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 320 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 336 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 352 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 368 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 384 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 400 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 416 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 432 + hash: "4f12d90df04192e3f28026249015fa41" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 28; y: 245 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 448 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 464 + hash: "a74da88fed6727a41b0bef096bd52eea" + } + Frame { + msec: 480 + hash: "e640a847e36f4a7d322ad7ca0b893d9c" + } + Frame { + msec: 496 + hash: "3e3fe8581c80dc190108b9844e77fb17" + } + Frame { + msec: 512 + hash: "8ee8ce9f8d9d93997aa8e05efae9b901" + } + Frame { + msec: 528 + hash: "8752f7849a3afa35889f7f1406d79e5c" + } + Frame { + msec: 544 + hash: "df31ed3556e84a4517b26765ea11023c" + } + Frame { + msec: 560 + hash: "a35602db546bf5e71fbc7ff7c5895427" + } + Frame { + msec: 576 + hash: "c29ee32e39126cb00544cf0326e483d8" + } + Frame { + msec: 592 + hash: "79b0d26288fd9ca67c6aacacb9bf355f" + } + Frame { + msec: 608 + hash: "aa0b8c9921058be0913c00725c45b287" + } + Frame { + msec: 624 + hash: "964f498603fdd2abb2d3b1cc1b78ffde" + } + Frame { + msec: 640 + hash: "a3c7226d5b5f91b91d2a1ec21f2cb9ab" + } + Frame { + msec: 656 + hash: "d28f5fb2e07c028c9697f8d1e4d7b676" + } + Frame { + msec: 672 + hash: "0a1aa6ba2749b1ef5d8c67b5d8d7fba4" + } + Frame { + msec: 688 + hash: "12d926e80c7b4da41ef9c747cf9ca1d4" + } + Frame { + msec: 704 + hash: "2015e4d29b3424a3683d7d8710ef60b4" + } + Frame { + msec: 720 + hash: "530924a6f4bdf7e9ab37415109a28e2f" + } + Frame { + msec: 736 + hash: "4dd20811ffa8cfb64cebc6ec6f43b029" + } + Frame { + msec: 752 + hash: "2238138f486a061e32607b130ba505f8" + } + Frame { + msec: 768 + hash: "a2991487b51b9802f18a975a323dfb32" + } + Frame { + msec: 784 + hash: "9cf19f7c9ee16bfdd56cb889358ab789" + } + Frame { + msec: 800 + hash: "32eee6b05e73a36eef878c562badbb8f" + } + Frame { + msec: 816 + hash: "04cbb2d8fe38011c46ff95d84830ed2a" + } + Frame { + msec: 832 + hash: "c11c2591ecf40ab31e616f6803e37e95" + } + Frame { + msec: 848 + hash: "a22cdeea89739bdf10850c7251fb62f2" + } + Frame { + msec: 864 + hash: "7d13f611bc516cda6afe56a8ec59cbf4" + } + Frame { + msec: 880 + hash: "4b3a3469f1c64760bd6ce84ec0bfc2cc" + } + Frame { + msec: 896 + hash: "e1a3af06282f369427d967cb21771564" + } + Frame { + msec: 912 + hash: "e1c90f78a2fe5e7cf43eeb700c867beb" + } + Frame { + msec: 928 + hash: "e63fbd42405a5d251ea6703d9564b2e0" + } + Frame { + msec: 944 + hash: "a1b4f08ccf38575f789bdb8968c7cdeb" + } + Frame { + msec: 960 + hash: "2604313688bddd75b1fbd146415097a7" + } + Frame { + msec: 976 + image: "easing.1.png" + } + Frame { + msec: 992 + hash: "df391105c7f6e0fbcdb0b4719e5af9e3" + } + Frame { + msec: 1008 + hash: "33603ef5b2368a7f5a71de0318404ac7" + } + Frame { + msec: 1024 + hash: "78cdbf2a2522e057db08aba284bd7a07" + } + Frame { + msec: 1040 + hash: "7aac87953a7e1ddf0040769a15878017" + } + Frame { + msec: 1056 + hash: "eae27f47c56ee0c491eeebed0f3855b2" + } + Frame { + msec: 1072 + hash: "0f0c4d8dbc27bc301c993a768afeaa39" + } + Frame { + msec: 1088 + hash: "ec844dffe8be01b9906ffa10a18784bc" + } + Frame { + msec: 1104 + hash: "69f6dd26fd9268c474c422c2ce126424" + } + Frame { + msec: 1120 + hash: "0e3f95c339c1868fc716a542e9acbd49" + } + Frame { + msec: 1136 + hash: "fa0762f9d8112e5c6889ef3a204d4838" + } + Frame { + msec: 1152 + hash: "18132a9adedd13fcd015ac5c7f741718" + } + Frame { + msec: 1168 + hash: "f07aba4891c1aab84f656b3507d4f31a" + } + Frame { + msec: 1184 + hash: "123dfe5bf375b698ae529fe370133d4d" + } + Frame { + msec: 1200 + hash: "d176cacbad1459d18729e99b52ed0c89" + } + Frame { + msec: 1216 + hash: "21d9f6aeb67b5bfa0d190d305ddbaabd" + } + Frame { + msec: 1232 + hash: "38884e097938bdd2fecb33a2d782e87e" + } + Frame { + msec: 1248 + hash: "d0fb3dbb20f4873784dde690c48efd4b" + } + Frame { + msec: 1264 + hash: "9821efad0c5bfc459029f42a32ad7c85" + } + Frame { + msec: 1280 + hash: "c19ef8982ffa6d5d1a0b2844d0bd77e1" + } + Frame { + msec: 1296 + hash: "e5d09b511557ac724b488dcaa5079ac7" + } + Frame { + msec: 1312 + hash: "a1bf72e745137dd8ae48ff3e5df22944" + } + Frame { + msec: 1328 + hash: "6319a88b12b431b1715b0231c0b86f9e" + } + Frame { + msec: 1344 + hash: "f69fc6078e0b6c863b19f2306ca22a17" + } + Frame { + msec: 1360 + hash: "e0945fc7aea81263fb84fb5de83b7ffc" + } + Frame { + msec: 1376 + hash: "bae0fc82e69b37d6f0d23faf5d877d9b" + } + Frame { + msec: 1392 + hash: "764e6cf407b66cefb0e867c55b4d214b" + } + Frame { + msec: 1408 + hash: "208a9d634e7c45211a8aea56b7cb17e1" + } + Frame { + msec: 1424 + hash: "5426675426babcfb303d5534b66038e0" + } + Frame { + msec: 1440 + hash: "f9b2505bf94f9ae9a6212aae64a8023f" + } + Frame { + msec: 1456 + hash: "672e4366f9eb212a3dcb539476ffe83b" + } + Frame { + msec: 1472 + hash: "672e4366f9eb212a3dcb539476ffe83b" + } + Frame { + msec: 1488 + hash: "672e4366f9eb212a3dcb539476ffe83b" + } + Frame { + msec: 1504 + hash: "672e4366f9eb212a3dcb539476ffe83b" + } + Frame { + msec: 1520 + hash: "672e4366f9eb212a3dcb539476ffe83b" + } + Frame { + msec: 1536 + hash: "672e4366f9eb212a3dcb539476ffe83b" + } + Frame { + msec: 1552 + hash: "672e4366f9eb212a3dcb539476ffe83b" + } + Frame { + msec: 1568 + hash: "672e4366f9eb212a3dcb539476ffe83b" + } + Frame { + msec: 1584 + hash: "672e4366f9eb212a3dcb539476ffe83b" + } + Frame { + msec: 1600 + hash: "672e4366f9eb212a3dcb539476ffe83b" + } + Frame { + msec: 1616 + hash: "672e4366f9eb212a3dcb539476ffe83b" + } + Frame { + msec: 1632 + hash: "672e4366f9eb212a3dcb539476ffe83b" + } + Frame { + msec: 1648 + hash: "672e4366f9eb212a3dcb539476ffe83b" + } + Frame { + msec: 1664 + hash: "672e4366f9eb212a3dcb539476ffe83b" + } + Frame { + msec: 1680 + hash: "672e4366f9eb212a3dcb539476ffe83b" + } + Frame { + msec: 1696 + hash: "672e4366f9eb212a3dcb539476ffe83b" + } + Frame { + msec: 1712 + hash: "672e4366f9eb212a3dcb539476ffe83b" + } + Frame { + msec: 1728 + hash: "672e4366f9eb212a3dcb539476ffe83b" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 28; y: 245 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1744 + hash: "672e4366f9eb212a3dcb539476ffe83b" + } + Frame { + msec: 1760 + hash: "0312cf9bff66e992528cc24211a7a9ef" + } + Frame { + msec: 1776 + hash: "d29d071c26556302881badd90b1f1135" + } + Frame { + msec: 1792 + hash: "747b398a00dec18a82fb3e2313ba318b" + } + Frame { + msec: 1808 + hash: "1df120f0cc1e8583dd52b02b203ba7ff" + } + Frame { + msec: 1824 + hash: "783f4c179f8468055f1b5585108c4c91" + } + Frame { + msec: 1840 + hash: "7307344c196f13348e7e23415c8eed1f" + } + Frame { + msec: 1856 + hash: "cf97103f94eb6b9e68e095ff5eaf2aeb" + } + Frame { + msec: 1872 + hash: "df8ef82f145ad55f084c3693cb601577" + } + Frame { + msec: 1888 + hash: "e25a344db6358ac5876cc95eb7ce35e7" + } + Frame { + msec: 1904 + hash: "4f4d55823e468ec2c0e73977a6851f5b" + } + Frame { + msec: 1920 + hash: "894e23e77af266bde42f5ca6ac2184d7" + } + Frame { + msec: 1936 + image: "easing.2.png" + } + Frame { + msec: 1952 + hash: "a48cc4f2c5282d9d2a8b55e0908324b7" + } + Frame { + msec: 1968 + hash: "f5cd3c873cf57f199ea7439a45f094d8" + } + Frame { + msec: 1984 + hash: "8c6f4c913be02ee21efa551ce9a6544b" + } + Frame { + msec: 2000 + hash: "fc979e4e4f6e82d704e0a53d3f9eef6e" + } + Frame { + msec: 2016 + hash: "e8085e2e6741028a9218487181a8cc5b" + } + Frame { + msec: 2032 + hash: "c67a1cec25d25687d369af58018ce213" + } + Frame { + msec: 2048 + hash: "25b8e080f8fe5525bafa1e760b5845be" + } + Frame { + msec: 2064 + hash: "fef16bd6dc6dfa248ab5a33f53229528" + } + Frame { + msec: 2080 + hash: "57b7e04b1722feda16fb80269dd51c2c" + } + Frame { + msec: 2096 + hash: "f2415e564efe5b5306b33001395a41f4" + } + Frame { + msec: 2112 + hash: "40116a7a67be4de5b767ee1fe7ae0d02" + } + Frame { + msec: 2128 + hash: "52d71e7e8f44e554df361d7d9e281655" + } + Frame { + msec: 2144 + hash: "226620a3c624f0a1659ee33616734a28" + } + Frame { + msec: 2160 + hash: "8849d02547a90ca47748749fc8615179" + } + Frame { + msec: 2176 + hash: "5523d277bc7a7161f3bbd79a4099e6c4" + } + Frame { + msec: 2192 + hash: "6ff2c6b89c3a024e1597d1c110b5f5f3" + } + Frame { + msec: 2208 + hash: "732b9e2e601ad7fc11510f3c590dca20" + } + Frame { + msec: 2224 + hash: "1ff9abdcb182fca444bc4b36e91b2a13" + } + Frame { + msec: 2240 + hash: "6f851aee4e3c4427fcb8672f37885d2d" + } + Frame { + msec: 2256 + hash: "3572977ef7c618404168514400fc22a4" + } + Frame { + msec: 2272 + hash: "e6e6f7cdf4f2ee1d182d18da482ab6a8" + } + Frame { + msec: 2288 + hash: "fac4878038516ad0a5601f78ff3d3ab0" + } + Frame { + msec: 2304 + hash: "b37e2cf2fb3b5a91845e50d2ab288572" + } + Frame { + msec: 2320 + hash: "711ea820aa842c46f629f3eb36144ec2" + } + Frame { + msec: 2336 + hash: "fcaa0576cbc8d4459b94498f332a4576" + } + Frame { + msec: 2352 + hash: "dfa935d0ac700696a78c139585d2cc3f" + } + Frame { + msec: 2368 + hash: "291042d40fc9fa8eebf80225b2cae93e" + } + Frame { + msec: 2384 + hash: "4e1d6af5f5f9200b6871dfc63ec8d92e" + } + Frame { + msec: 2400 + hash: "9c7ccdf3aba3c28717891e7ef4333aa5" + } + Frame { + msec: 2416 + hash: "b5bfa2eeb932ebc8913381bbea62ea9d" + } + Frame { + msec: 2432 + hash: "296bc4fcc206c6563630a6de8be9deac" + } + Frame { + msec: 2448 + hash: "57d39578c1ba3a6a21efdef8c9323965" + } + Frame { + msec: 2464 + hash: "16352e11b7fd763d82d26fcc02da24a7" + } + Frame { + msec: 2480 + hash: "02157cc0e120e1b751a9931ff65edb52" + } + Frame { + msec: 2496 + hash: "23554c786732241aa9a59304cb4870b1" + } + Frame { + msec: 2512 + hash: "e38f68e818b35b23361a7937b7a37bb7" + } + Frame { + msec: 2528 + hash: "dd39869048e6ccfceb1b2882404ef1b3" + } + Frame { + msec: 2544 + hash: "5587d88f5b8fcb3914efedee9ae3a939" + } + Frame { + msec: 2560 + hash: "5a23991509d69d400249e403cd3fbe4d" + } + Frame { + msec: 2576 + hash: "eed425fb759c92ec9966fcdc625321fb" + } + Frame { + msec: 2592 + hash: "7bbf0748f5fbbf48605287342df8e687" + } + Frame { + msec: 2608 + hash: "7722f0d3c358d57f3d614f2850fc23f9" + } + Frame { + msec: 2624 + hash: "3ec5ccb1e6ed677617dcb3b699b10d58" + } + Frame { + msec: 2640 + hash: "303a61969566062d5c77a3a1a65c847a" + } + Frame { + msec: 2656 + hash: "aadf4d4cc978b5f88b97a7e453b21024" + } + Frame { + msec: 2672 + hash: "2d24097717f5ec669e29250af78235fd" + } + Frame { + msec: 2688 + hash: "2a58e7ce319cc1cd7dfcd740bfe59517" + } + Frame { + msec: 2704 + hash: "6a21af6c920588f0f709bf91bb56f548" + } + Frame { + msec: 2720 + hash: "f5a63f241f27c6e7cef969dde6790ac3" + } + Frame { + msec: 2736 + hash: "33b64aad57e117f6b170432843c3c996" + } + Frame { + msec: 2752 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 2768 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 2784 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 2800 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 2816 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 2832 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 2848 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 2864 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 2880 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 2896 + image: "easing.3.png" + } + Frame { + msec: 2912 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 2928 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 2944 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 2960 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 2976 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 2992 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 3008 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 3024 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 3040 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 3056 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 3072 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 3088 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 3104 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 3120 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 3136 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 3152 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 3168 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 3184 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 3200 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 3216 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 3232 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 3248 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 3264 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 3280 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 3296 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 3312 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 3328 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 3344 + hash: "4f12d90df04192e3f28026249015fa41" + } + Frame { + msec: 3360 + hash: "4f12d90df04192e3f28026249015fa41" + } +} diff --git a/tests/auto/declarative/qmlvisual/animation/easing/easing.qml b/tests/auto/declarative/qmlvisual/animation/easing/easing.qml new file mode 100644 index 00000000..625aeeb9 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/animation/easing/easing.qml @@ -0,0 +1,194 @@ +import QtQuick 1.0 +/* This test just animates y of a block with every easing curve*/ + +Rectangle { + id: item + height: 300 + width: layout.width + color: "white" + resources: [ + ListModel { + id: easingtypes + ListElement { + type: "Linear" + } + ListElement { + type: "InQuad" + } + ListElement { + type: "OutQuad" + } + ListElement { + type: "InOutQuad" + } + ListElement { + type: "OutInQuad" + } + ListElement { + type: "InCubic" + } + ListElement { + type: "OutCubic" + } + ListElement { + type: "InOutCubic" + } + ListElement { + type: "OutInCubic" + } + ListElement { + type: "InQuart" + } + ListElement { + type: "OutQuart" + } + ListElement { + type: "InOutQuart" + } + ListElement { + type: "OutInQuart" + } + ListElement { + type: "InQuint" + } + ListElement { + type: "OutQuint" + } + ListElement { + type: "InOutQuint" + } + ListElement { + type: "OutInQuint" + } + ListElement { + type: "InSine" + } + ListElement { + type: "OutSine" + } + ListElement { + type: "InOutSine" + } + ListElement { + type: "OutInSine" + } + ListElement { + type: "InExpo" + } + ListElement { + type: "OutExpo" + } + ListElement { + type: "InOutExpo" + } + ListElement { + type: "OutInExpo" + } + ListElement { + type: "InCirc" + } + ListElement { + type: "OutCirc" + } + ListElement { + type: "InOutCirc" + } + ListElement { + type: "OutInCirc" + } + ListElement { + type: "InElastic" + } + ListElement { + type: "OutElastic" + } + ListElement { + type: "InOutElastic" + } + ListElement { + type: "OutInElastic" + } + ListElement { + type: "InBack" + } + ListElement { + type: "OutBack" + } + ListElement { + type: "InOutBack" + } + ListElement { + type: "OutInBack" + } + ListElement { + type: "OutBounce" + } + ListElement { + type: "InBounce" + } + ListElement { + type: "InOutBounce" + } + ListElement { + type: "OutInBounce" + } + } + ] + Row { + id: layout + anchors.top: item.top + anchors.bottom: item.bottom + Repeater { + model: easingtypes + Component { + Rectangle { + id: block + Text { + text: type + anchors.centerIn: parent + font.italic: true + color: index & 1 ? "black" : "white" + opacity: 0 // 1 for debugging + } + width: 15 + height: 30 + color: index & 1 ? "red" : "blue" + states: [ + State { + name: "from" + when: !mouse.pressed + PropertyChanges { + target: block + y: 0 + } + }, + State { + name: "to" + when: mouse.pressed + PropertyChanges { + target: block + y: item.height-block.height + } + } + ] + transitions: [ + Transition { + from: "*" + to: "to" + reversible: true + NumberAnimation { + properties: "y" + easing.type: type + duration: 1000 + } + } + ] + } + } + } + } + MouseArea { + id: mouse + anchors.fill: layout + } +} diff --git a/tests/auto/declarative/qmlvisual/animation/loop/data/loop.0.png b/tests/auto/declarative/qmlvisual/animation/loop/data/loop.0.png new file mode 100644 index 00000000..ca37de9d Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/loop/data/loop.0.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/loop/data/loop.1.png b/tests/auto/declarative/qmlvisual/animation/loop/data/loop.1.png new file mode 100644 index 00000000..a2d87ca8 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/loop/data/loop.1.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/loop/data/loop.2.png b/tests/auto/declarative/qmlvisual/animation/loop/data/loop.2.png new file mode 100644 index 00000000..1cb2cb89 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/loop/data/loop.2.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/loop/data/loop.3.png b/tests/auto/declarative/qmlvisual/animation/loop/data/loop.3.png new file mode 100644 index 00000000..f58deca6 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/loop/data/loop.3.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/loop/data/loop.4.png b/tests/auto/declarative/qmlvisual/animation/loop/data/loop.4.png new file mode 100644 index 00000000..1936361b Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/loop/data/loop.4.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/loop/data/loop.5.png b/tests/auto/declarative/qmlvisual/animation/loop/data/loop.5.png new file mode 100644 index 00000000..758c2231 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/loop/data/loop.5.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/loop/data/loop.6.png b/tests/auto/declarative/qmlvisual/animation/loop/data/loop.6.png new file mode 100644 index 00000000..b049e638 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/loop/data/loop.6.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/loop/data/loop.qml b/tests/auto/declarative/qmlvisual/animation/loop/data/loop.qml new file mode 100644 index 00000000..3cbc0745 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/animation/loop/data/loop.qml @@ -0,0 +1,1471 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "loop.0.png" + } + Frame { + msec: 32 + hash: "1012b52727ae98522061945e32a6269a" + } + Frame { + msec: 48 + hash: "06c3f3c1fa014b0eb7341e0a45ca16e4" + } + Frame { + msec: 64 + hash: "71ecb0af25649c056310d3b865d4144d" + } + Frame { + msec: 80 + hash: "e249fe5b113797433f96a2f84d47e42b" + } + Frame { + msec: 96 + hash: "2a7256921c25c79c22263f2b48d4e98c" + } + Frame { + msec: 112 + hash: "8657944b456402622f2991a0c9acc2fb" + } + Frame { + msec: 128 + hash: "c919a94cd7afb1fbad4c88537af00869" + } + Frame { + msec: 144 + hash: "303b5057d94e328f9447a01d54eea93d" + } + Frame { + msec: 160 + hash: "72eb974dc008c9454935b18b47d4d9e6" + } + Frame { + msec: 176 + hash: "545f258cb0ec7f5d951b74cc7d3f4f0d" + } + Frame { + msec: 192 + hash: "3b3d6046fb01adf7c8a7f67bbc46d28e" + } + Frame { + msec: 208 + hash: "12f7556076cf7a4c2f029dab80e666e7" + } + Frame { + msec: 224 + hash: "fab272c7dce2bbee4042764d38c7ceb5" + } + Frame { + msec: 240 + hash: "ff8addee408527bbaed1819bae07c23f" + } + Frame { + msec: 256 + hash: "53eb6f575db2af3635139e5ddbd7b2f9" + } + Frame { + msec: 272 + hash: "a2fa1cf169acb8ff26a2c5ec1f1d5c81" + } + Frame { + msec: 288 + hash: "ab8d5d6d146ed11b92bc93e78f28e50c" + } + Frame { + msec: 304 + hash: "0fbfc6609b082008e44592067b18ab63" + } + Frame { + msec: 320 + hash: "7fbeda19c19c62a0af5f7f98e633993f" + } + Frame { + msec: 336 + hash: "1882b591bc9d4e79d69d0baecb78b700" + } + Frame { + msec: 352 + hash: "dde429007f876206f3ec0c68d239983e" + } + Frame { + msec: 368 + hash: "b656bdba2978a9a1af511cc2bb0cb59a" + } + Frame { + msec: 384 + hash: "1f6573bf67b2893c94f0c2d40213dc73" + } + Frame { + msec: 400 + hash: "f5786fb532300a1b2f820251fc17c775" + } + Frame { + msec: 416 + hash: "a0e9c4bd3b6c4cdadd40bdf3ca5e2986" + } + Frame { + msec: 432 + hash: "073f74ab23a1173025b3c63424ce2697" + } + Frame { + msec: 448 + hash: "1ac1367d21e346c6c652a88b9ea25bfc" + } + Frame { + msec: 464 + hash: "f62720308dc9ae67c3856bc3afb32b75" + } + Frame { + msec: 480 + hash: "066476a57efba802d2497bc3731a3583" + } + Frame { + msec: 496 + hash: "fb965028a760e8d0a4d81fd982a18ff3" + } + Frame { + msec: 512 + hash: "ba008abd1a7a73c750b909d57c043649" + } + Frame { + msec: 528 + hash: "4c974470953f74d1ee7bcd0f4a4c48cf" + } + Frame { + msec: 544 + hash: "ea233f3476da26c90d67b7775b718aa2" + } + Frame { + msec: 560 + hash: "e12c3b810c0aa628d7a3827453bea9f3" + } + Frame { + msec: 576 + hash: "7451954ca0465c430fc4bae84f6d97cb" + } + Frame { + msec: 592 + hash: "503e40f193a8b099daa4013eddc2f664" + } + Frame { + msec: 608 + hash: "1f81acf94f325a51faa7aa61e73f8a25" + } + Frame { + msec: 624 + hash: "0257d7d53eda8afe182a9f97ef451679" + } + Frame { + msec: 640 + hash: "cfc260bdc977ef16311840022cc85378" + } + Frame { + msec: 656 + hash: "27483f0b89d727b32722ea153fad30ad" + } + Frame { + msec: 672 + hash: "355afa11b8e7b24a353d1aa79daf7564" + } + Frame { + msec: 688 + hash: "bbc1d55f346719476f471a2294227bda" + } + Frame { + msec: 704 + hash: "9bbab5ff75219d8bd65022c6d061e57a" + } + Frame { + msec: 720 + hash: "ff0699f02845f3c5cf5aabb19198c346" + } + Frame { + msec: 736 + hash: "26768e09270ade4c5b484154e7042f43" + } + Frame { + msec: 752 + hash: "31c9ae63071de3fb2f7e1836a22515cb" + } + Frame { + msec: 768 + hash: "783ce2acdae8d87883151532c9293336" + } + Frame { + msec: 784 + hash: "86b9fd739f437127e0cc4d7dcd4284bd" + } + Frame { + msec: 800 + hash: "5e1d6e164dd184cc197d514e5ff60a4c" + } + Frame { + msec: 816 + hash: "13063a8d73704165d64dd2a95803ec0f" + } + Frame { + msec: 832 + hash: "c244e0c0d60f4be2e017bba21a17ab3f" + } + Frame { + msec: 848 + hash: "b3bd657873f1b49c888b9b98d8c0e23f" + } + Frame { + msec: 864 + hash: "65a011e4f62ecddd820bdbdeb0084b65" + } + Frame { + msec: 880 + hash: "86018de7b4a93b267fe94c4de9e61bab" + } + Frame { + msec: 896 + hash: "44827055c99ae3ed924c101c9d1be5c5" + } + Frame { + msec: 912 + hash: "1c31fcb20ec1abc7ea815b703ae05363" + } + Frame { + msec: 928 + hash: "9d7825b7b05ca696846a4116ab27f966" + } + Frame { + msec: 944 + hash: "61b6690dd14fc76dbac4d785bbddb8ee" + } + Frame { + msec: 960 + hash: "0de25d97a43cf1a7551c8e8dd1943039" + } + Frame { + msec: 976 + image: "loop.1.png" + } + Frame { + msec: 992 + hash: "9747fdff3429f7a2dbc9e3173ad43a67" + } + Frame { + msec: 1008 + hash: "e68058b9565138f2d7f0f96b74c38dec" + } + Frame { + msec: 1024 + hash: "f32aceabb929471dffd73bf0290e75a2" + } + Frame { + msec: 1040 + hash: "9112838cc8f9a0cfb94e0ef6ca7eca71" + } + Frame { + msec: 1056 + hash: "53bd2c46e3a11db0ee151a6a0311b3a8" + } + Frame { + msec: 1072 + hash: "d5105f958a592324e53aae4a83beb049" + } + Frame { + msec: 1088 + hash: "862249432e6fc6114b63284ad9c97cb6" + } + Frame { + msec: 1104 + hash: "3e6a6f505aa146a6789434d265ad4d3b" + } + Frame { + msec: 1120 + hash: "0f5b2b05f72b86bd2b0a6d0ea2b6bf37" + } + Frame { + msec: 1136 + hash: "922520f7ec954d6d1061208cbd63877e" + } + Frame { + msec: 1152 + hash: "d1c02f3ce4bcc96e0c3d2503a0e9aa48" + } + Frame { + msec: 1168 + hash: "ebb41112b687ecb062dedc3b49cb93fc" + } + Frame { + msec: 1184 + hash: "7bc87d71d532aa52abc26ac9c1cbb665" + } + Frame { + msec: 1200 + hash: "1a7a81f851c8817cac3cc0cb7ac07971" + } + Frame { + msec: 1216 + hash: "ca17c870c55f2947bb5f85d28f30ee7c" + } + Frame { + msec: 1232 + hash: "48b123cfd6d2ea1c2bc9f2ba822ec7bf" + } + Frame { + msec: 1248 + hash: "2a6b8aecef26793e200993dc1e25fd95" + } + Frame { + msec: 1264 + hash: "f10a0a11ed54a910fe434311f67343a4" + } + Frame { + msec: 1280 + hash: "47b6e1beabdcd3cd3d21d77c62e5bed8" + } + Frame { + msec: 1296 + hash: "1eea7eb2853a9e7a1a69738667457b7a" + } + Frame { + msec: 1312 + hash: "9e018f9e7a5ba22bbb9be3049373124a" + } + Frame { + msec: 1328 + hash: "d63069a8e7b0eb5611cc34caaecef2fb" + } + Frame { + msec: 1344 + hash: "def9383a090e4454343725f1a7c4fb3d" + } + Frame { + msec: 1360 + hash: "fd3036e559fd31eeadb0032666a95864" + } + Frame { + msec: 1376 + hash: "cf9f82b9e2a03f63f75b6ac113b3d4e5" + } + Frame { + msec: 1392 + hash: "346e7f597cfb4fc51d5393e705deddd5" + } + Frame { + msec: 1408 + hash: "0d6d6cb2ca808f5a57acfa32e10fc335" + } + Frame { + msec: 1424 + hash: "9a660a0fed41211a37d3ac82be40f81a" + } + Frame { + msec: 1440 + hash: "df3fd60ecbd517879e00e8112c49bed4" + } + Frame { + msec: 1456 + hash: "cd86fe5894e5d061f7ffe37913f00ce6" + } + Frame { + msec: 1472 + hash: "a5fdb825c18d43f3ae18f5c28e715174" + } + Frame { + msec: 1488 + hash: "0fdfb5f9463def560da6c19acf96bafb" + } + Frame { + msec: 1504 + hash: "8849a36af064503dbccad69a35b6ab03" + } + Frame { + msec: 1520 + hash: "baeb4f90b0e2efc09225dbb5dd003e9e" + } + Frame { + msec: 1536 + hash: "86922e71c80976ef3aa2cab18f86c010" + } + Frame { + msec: 1552 + hash: "10d166d7da9949370a66251415522186" + } + Frame { + msec: 1568 + hash: "ada1608055b221dc9f1f7650a9764930" + } + Frame { + msec: 1584 + hash: "dd25ffb9a6bf009139b2942f9cc1f8e7" + } + Frame { + msec: 1600 + hash: "dc4a1c44d08328965b53ff079a8fa57b" + } + Frame { + msec: 1616 + hash: "d3d88cf635ba38e5035732cb36014417" + } + Frame { + msec: 1632 + hash: "be5e44f6b9978ba3b9ae878ae5758a96" + } + Frame { + msec: 1648 + hash: "34f193daf199ab45310be2b407499e57" + } + Frame { + msec: 1664 + hash: "d87c854e1c16642dba0d87e25f0e416f" + } + Frame { + msec: 1680 + hash: "08c404f4efd27695071ad52fbfa57c0b" + } + Frame { + msec: 1696 + hash: "84828f8e0cace1a39d9b7f19b6e4cbaa" + } + Frame { + msec: 1712 + hash: "8a0c6e1f597e699c3e2be816ae4e1dd4" + } + Frame { + msec: 1728 + hash: "9aecb0c464fb140725f34ad94ede367a" + } + Frame { + msec: 1744 + hash: "a298b3ab2939819ced7e7f903ec63be4" + } + Frame { + msec: 1760 + hash: "99789b6e168355a3960986c7d1f21f82" + } + Frame { + msec: 1776 + hash: "ebd37ee719ca460480521fd4ec284a3f" + } + Frame { + msec: 1792 + hash: "9c9b3fb5b623d3deaf9920c99279d71b" + } + Frame { + msec: 1808 + hash: "8f0be6d4d6fd7f66a43fd604e17717dd" + } + Frame { + msec: 1824 + hash: "854defd35cf3315e4501583756814ff6" + } + Frame { + msec: 1840 + hash: "fd7157aef6dfb303472cd33b176f91d8" + } + Frame { + msec: 1856 + hash: "e6521a3c74c190c193af2c913e5326e2" + } + Frame { + msec: 1872 + hash: "19862dcb88fcbbb2c4ecdc42821c7fef" + } + Frame { + msec: 1888 + hash: "5e29a9f9c6c4131c5b71f84d24503ad2" + } + Frame { + msec: 1904 + hash: "140e63c071ef77d26034d0bb6a5d5b7a" + } + Frame { + msec: 1920 + hash: "72c0bf8225504e86ff023242b84513a8" + } + Frame { + msec: 1936 + image: "loop.2.png" + } + Frame { + msec: 1952 + hash: "a5eb3334044999f56c759ce8727d627f" + } + Frame { + msec: 1968 + hash: "3fb70a7591b6decfa44f7cad18f73855" + } + Frame { + msec: 1984 + hash: "3fab99be73f7f12b9463dea359fc86d2" + } + Frame { + msec: 2000 + hash: "50ce6b869e42c949b84cf2dd0cca3af9" + } + Frame { + msec: 2016 + hash: "5369125b23e2f954c18f2fd4e0ba6f6a" + } + Frame { + msec: 2032 + hash: "a76f624be0db97ec4450b10f748065df" + } + Frame { + msec: 2048 + hash: "3fb70a7591b6decfa44f7cad18f73855" + } + Frame { + msec: 2064 + hash: "dada267799b6e57acfcc5de3b8822c7c" + } + Frame { + msec: 2080 + hash: "72c0bf8225504e86ff023242b84513a8" + } + Frame { + msec: 2096 + hash: "1e8b095c39bd359637b1b9c975ee514c" + } + Frame { + msec: 2112 + hash: "19862dcb88fcbbb2c4ecdc42821c7fef" + } + Frame { + msec: 2128 + hash: "60c95993a894e1c6e2d476db365b7746" + } + Frame { + msec: 2144 + hash: "854defd35cf3315e4501583756814ff6" + } + Frame { + msec: 2160 + hash: "15e8959bfa4d206b2f0607322b21cba6" + } + Frame { + msec: 2176 + hash: "ebd37ee719ca460480521fd4ec284a3f" + } + Frame { + msec: 2192 + hash: "6d278926822d044fff04c3f182dcb058" + } + Frame { + msec: 2208 + hash: "9aecb0c464fb140725f34ad94ede367a" + } + Frame { + msec: 2224 + hash: "b36f70f138e6deecf5b105bcd89d1a15" + } + Frame { + msec: 2240 + hash: "08c404f4efd27695071ad52fbfa57c0b" + } + Frame { + msec: 2256 + hash: "6469d0bee7ab280639b565ebf174f251" + } + Frame { + msec: 2272 + hash: "be5e44f6b9978ba3b9ae878ae5758a96" + } + Frame { + msec: 2288 + hash: "5214e578bc78b729ddf35c140093c0da" + } + Frame { + msec: 2304 + hash: "dd25ffb9a6bf009139b2942f9cc1f8e7" + } + Frame { + msec: 2320 + hash: "2ddf31aeac4815be56848703a9b5aa14" + } + Frame { + msec: 2336 + hash: "86922e71c80976ef3aa2cab18f86c010" + } + Frame { + msec: 2352 + hash: "d8415ba4fb19b62b838ef2e09ae7607a" + } + Frame { + msec: 2368 + hash: "0fdfb5f9463def560da6c19acf96bafb" + } + Frame { + msec: 2384 + hash: "68fac60713af7cb130e92fa381be411c" + } + Frame { + msec: 2400 + hash: "df3fd60ecbd517879e00e8112c49bed4" + } + Frame { + msec: 2416 + hash: "64e49282d97ba864d2f6be632ae048e4" + } + Frame { + msec: 2432 + hash: "346e7f597cfb4fc51d5393e705deddd5" + } + Frame { + msec: 2448 + hash: "f302a9ce45187ff1001c967a4c753b2b" + } + Frame { + msec: 2464 + hash: "def9383a090e4454343725f1a7c4fb3d" + } + Frame { + msec: 2480 + hash: "fd177a7ae3b5b9205fd38e955be327e0" + } + Frame { + msec: 2496 + hash: "1eea7eb2853a9e7a1a69738667457b7a" + } + Frame { + msec: 2512 + hash: "32b16dd62ccf06e44be38fd5885f297e" + } + Frame { + msec: 2528 + hash: "2a6b8aecef26793e200993dc1e25fd95" + } + Frame { + msec: 2544 + hash: "8637606843905d6ae3f95fcb745f2a6e" + } + Frame { + msec: 2560 + hash: "1a7a81f851c8817cac3cc0cb7ac07971" + } + Frame { + msec: 2576 + hash: "704ca30ddc0a637f3d1cd4926a6f7983" + } + Frame { + msec: 2592 + hash: "d1c02f3ce4bcc96e0c3d2503a0e9aa48" + } + Frame { + msec: 2608 + hash: "7759418b4fe412857ab8e7294f5a3206" + } + Frame { + msec: 2624 + hash: "3e6a6f505aa146a6789434d265ad4d3b" + } + Frame { + msec: 2640 + hash: "3e6089b47573cd53b0a220275202c80b" + } + Frame { + msec: 2656 + hash: "53bd2c46e3a11db0ee151a6a0311b3a8" + } + Frame { + msec: 2672 + hash: "f30202ae354a587c5949a16c1f8b95c3" + } + Frame { + msec: 2688 + hash: "66f78a34fe9d297af1ae8e98f84ead55" + } + Frame { + msec: 2704 + hash: "3e2fc29876812fe57ea008a71db299a4" + } + Frame { + msec: 2720 + hash: "7234b6df2220e418ef8ebe8f1c82bf26" + } + Frame { + msec: 2736 + hash: "82dd491c3b34e702a24ece8e55761a6f" + } + Frame { + msec: 2752 + hash: "d7f1065f5c42088dfc5ce36687fd8010" + } + Frame { + msec: 2768 + hash: "15bfbb0261b66ccbe3b34d0ac807165c" + } + Frame { + msec: 2784 + hash: "69963ce07eb434d787588b21fd020fa3" + } + Frame { + msec: 2800 + hash: "2fb9e078573ebd1a5cf0f615c97f1d20" + } + Frame { + msec: 2816 + hash: "31fa31ed47ea16390be8ea9d41f483e7" + } + Frame { + msec: 2832 + hash: "0f9ed8cd5cfbdab03bcb05cf6dd92620" + } + Frame { + msec: 2848 + hash: "a0e737132ae642c465e991e770ab3e34" + } + Frame { + msec: 2864 + hash: "d57cc5045f01ab4e7eb72575aef22a10" + } + Frame { + msec: 2880 + hash: "d57e1a10e48938e1f7fc219220fe1204" + } + Frame { + msec: 2896 + image: "loop.3.png" + } + Frame { + msec: 2912 + hash: "2d294613ed10dfdbca829b43b6990574" + } + Frame { + msec: 2928 + hash: "0a278a4ec3626442c94ef2da30771171" + } + Frame { + msec: 2944 + hash: "7071526c830fdfde9d520ad1578d27a8" + } + Frame { + msec: 2960 + hash: "ad02e7b90f223d3fc5a433bc4ffbee9e" + } + Frame { + msec: 2976 + hash: "e7ef412697c7df3887980ed1b079ffd5" + } + Frame { + msec: 2992 + hash: "ebda21f95079b37f4862b42523bbc1c0" + } + Frame { + msec: 3008 + hash: "6e8889e9b44ff8ed44e228d97fb5034c" + } + Frame { + msec: 3024 + hash: "f32aceabb929471dffd73bf0290e75a2" + } + Frame { + msec: 3040 + hash: "9112838cc8f9a0cfb94e0ef6ca7eca71" + } + Frame { + msec: 3056 + hash: "53bd2c46e3a11db0ee151a6a0311b3a8" + } + Frame { + msec: 3072 + hash: "d5105f958a592324e53aae4a83beb049" + } + Frame { + msec: 3088 + hash: "862249432e6fc6114b63284ad9c97cb6" + } + Frame { + msec: 3104 + hash: "3e6a6f505aa146a6789434d265ad4d3b" + } + Frame { + msec: 3120 + hash: "0f5b2b05f72b86bd2b0a6d0ea2b6bf37" + } + Frame { + msec: 3136 + hash: "922520f7ec954d6d1061208cbd63877e" + } + Frame { + msec: 3152 + hash: "d1c02f3ce4bcc96e0c3d2503a0e9aa48" + } + Frame { + msec: 3168 + hash: "ebb41112b687ecb062dedc3b49cb93fc" + } + Frame { + msec: 3184 + hash: "7bc87d71d532aa52abc26ac9c1cbb665" + } + Frame { + msec: 3200 + hash: "1a7a81f851c8817cac3cc0cb7ac07971" + } + Frame { + msec: 3216 + hash: "ca17c870c55f2947bb5f85d28f30ee7c" + } + Frame { + msec: 3232 + hash: "48b123cfd6d2ea1c2bc9f2ba822ec7bf" + } + Frame { + msec: 3248 + hash: "2a6b8aecef26793e200993dc1e25fd95" + } + Frame { + msec: 3264 + hash: "f10a0a11ed54a910fe434311f67343a4" + } + Frame { + msec: 3280 + hash: "47b6e1beabdcd3cd3d21d77c62e5bed8" + } + Frame { + msec: 3296 + hash: "1eea7eb2853a9e7a1a69738667457b7a" + } + Frame { + msec: 3312 + hash: "9e018f9e7a5ba22bbb9be3049373124a" + } + Frame { + msec: 3328 + hash: "d63069a8e7b0eb5611cc34caaecef2fb" + } + Frame { + msec: 3344 + hash: "def9383a090e4454343725f1a7c4fb3d" + } + Frame { + msec: 3360 + hash: "fd3036e559fd31eeadb0032666a95864" + } + Frame { + msec: 3376 + hash: "cf9f82b9e2a03f63f75b6ac113b3d4e5" + } + Frame { + msec: 3392 + hash: "346e7f597cfb4fc51d5393e705deddd5" + } + Frame { + msec: 3408 + hash: "0d6d6cb2ca808f5a57acfa32e10fc335" + } + Frame { + msec: 3424 + hash: "9a660a0fed41211a37d3ac82be40f81a" + } + Frame { + msec: 3440 + hash: "df3fd60ecbd517879e00e8112c49bed4" + } + Frame { + msec: 3456 + hash: "cd86fe5894e5d061f7ffe37913f00ce6" + } + Frame { + msec: 3472 + hash: "a5fdb825c18d43f3ae18f5c28e715174" + } + Frame { + msec: 3488 + hash: "0fdfb5f9463def560da6c19acf96bafb" + } + Frame { + msec: 3504 + hash: "8849a36af064503dbccad69a35b6ab03" + } + Frame { + msec: 3520 + hash: "baeb4f90b0e2efc09225dbb5dd003e9e" + } + Frame { + msec: 3536 + hash: "86922e71c80976ef3aa2cab18f86c010" + } + Frame { + msec: 3552 + hash: "10d166d7da9949370a66251415522186" + } + Frame { + msec: 3568 + hash: "ada1608055b221dc9f1f7650a9764930" + } + Frame { + msec: 3584 + hash: "dd25ffb9a6bf009139b2942f9cc1f8e7" + } + Frame { + msec: 3600 + hash: "dc4a1c44d08328965b53ff079a8fa57b" + } + Frame { + msec: 3616 + hash: "d3d88cf635ba38e5035732cb36014417" + } + Frame { + msec: 3632 + hash: "be5e44f6b9978ba3b9ae878ae5758a96" + } + Frame { + msec: 3648 + hash: "34f193daf199ab45310be2b407499e57" + } + Frame { + msec: 3664 + hash: "d87c854e1c16642dba0d87e25f0e416f" + } + Frame { + msec: 3680 + hash: "08c404f4efd27695071ad52fbfa57c0b" + } + Frame { + msec: 3696 + hash: "84828f8e0cace1a39d9b7f19b6e4cbaa" + } + Frame { + msec: 3712 + hash: "8a0c6e1f597e699c3e2be816ae4e1dd4" + } + Frame { + msec: 3728 + hash: "9aecb0c464fb140725f34ad94ede367a" + } + Frame { + msec: 3744 + hash: "a298b3ab2939819ced7e7f903ec63be4" + } + Frame { + msec: 3760 + hash: "99789b6e168355a3960986c7d1f21f82" + } + Frame { + msec: 3776 + hash: "ebd37ee719ca460480521fd4ec284a3f" + } + Frame { + msec: 3792 + hash: "9c9b3fb5b623d3deaf9920c99279d71b" + } + Frame { + msec: 3808 + hash: "8f0be6d4d6fd7f66a43fd604e17717dd" + } + Frame { + msec: 3824 + hash: "854defd35cf3315e4501583756814ff6" + } + Frame { + msec: 3840 + hash: "fd7157aef6dfb303472cd33b176f91d8" + } + Frame { + msec: 3856 + image: "loop.4.png" + } + Frame { + msec: 3872 + hash: "19862dcb88fcbbb2c4ecdc42821c7fef" + } + Frame { + msec: 3888 + hash: "5e29a9f9c6c4131c5b71f84d24503ad2" + } + Frame { + msec: 3904 + hash: "140e63c071ef77d26034d0bb6a5d5b7a" + } + Frame { + msec: 3920 + hash: "72c0bf8225504e86ff023242b84513a8" + } + Frame { + msec: 3936 + hash: "7f79dd50a0af8e8871191ee80afcad0f" + } + Frame { + msec: 3952 + hash: "a5eb3334044999f56c759ce8727d627f" + } + Frame { + msec: 3968 + hash: "3fb70a7591b6decfa44f7cad18f73855" + } + Frame { + msec: 3984 + hash: "3fab99be73f7f12b9463dea359fc86d2" + } + Frame { + msec: 4000 + hash: "50ce6b869e42c949b84cf2dd0cca3af9" + } + Frame { + msec: 4016 + hash: "5369125b23e2f954c18f2fd4e0ba6f6a" + } + Frame { + msec: 4032 + hash: "a76f624be0db97ec4450b10f748065df" + } + Frame { + msec: 4048 + hash: "3fb70a7591b6decfa44f7cad18f73855" + } + Frame { + msec: 4064 + hash: "dada267799b6e57acfcc5de3b8822c7c" + } + Frame { + msec: 4080 + hash: "72c0bf8225504e86ff023242b84513a8" + } + Frame { + msec: 4096 + hash: "1e8b095c39bd359637b1b9c975ee514c" + } + Frame { + msec: 4112 + hash: "19862dcb88fcbbb2c4ecdc42821c7fef" + } + Frame { + msec: 4128 + hash: "60c95993a894e1c6e2d476db365b7746" + } + Frame { + msec: 4144 + hash: "854defd35cf3315e4501583756814ff6" + } + Frame { + msec: 4160 + hash: "15e8959bfa4d206b2f0607322b21cba6" + } + Frame { + msec: 4176 + hash: "ebd37ee719ca460480521fd4ec284a3f" + } + Frame { + msec: 4192 + hash: "6d278926822d044fff04c3f182dcb058" + } + Frame { + msec: 4208 + hash: "9aecb0c464fb140725f34ad94ede367a" + } + Frame { + msec: 4224 + hash: "b36f70f138e6deecf5b105bcd89d1a15" + } + Frame { + msec: 4240 + hash: "08c404f4efd27695071ad52fbfa57c0b" + } + Frame { + msec: 4256 + hash: "6469d0bee7ab280639b565ebf174f251" + } + Frame { + msec: 4272 + hash: "be5e44f6b9978ba3b9ae878ae5758a96" + } + Frame { + msec: 4288 + hash: "5214e578bc78b729ddf35c140093c0da" + } + Frame { + msec: 4304 + hash: "dd25ffb9a6bf009139b2942f9cc1f8e7" + } + Frame { + msec: 4320 + hash: "2ddf31aeac4815be56848703a9b5aa14" + } + Frame { + msec: 4336 + hash: "86922e71c80976ef3aa2cab18f86c010" + } + Frame { + msec: 4352 + hash: "d8415ba4fb19b62b838ef2e09ae7607a" + } + Frame { + msec: 4368 + hash: "0fdfb5f9463def560da6c19acf96bafb" + } + Frame { + msec: 4384 + hash: "68fac60713af7cb130e92fa381be411c" + } + Frame { + msec: 4400 + hash: "df3fd60ecbd517879e00e8112c49bed4" + } + Frame { + msec: 4416 + hash: "64e49282d97ba864d2f6be632ae048e4" + } + Frame { + msec: 4432 + hash: "346e7f597cfb4fc51d5393e705deddd5" + } + Frame { + msec: 4448 + hash: "f302a9ce45187ff1001c967a4c753b2b" + } + Frame { + msec: 4464 + hash: "def9383a090e4454343725f1a7c4fb3d" + } + Frame { + msec: 4480 + hash: "fd177a7ae3b5b9205fd38e955be327e0" + } + Frame { + msec: 4496 + hash: "1eea7eb2853a9e7a1a69738667457b7a" + } + Frame { + msec: 4512 + hash: "32b16dd62ccf06e44be38fd5885f297e" + } + Frame { + msec: 4528 + hash: "2a6b8aecef26793e200993dc1e25fd95" + } + Frame { + msec: 4544 + hash: "8637606843905d6ae3f95fcb745f2a6e" + } + Frame { + msec: 4560 + hash: "1a7a81f851c8817cac3cc0cb7ac07971" + } + Frame { + msec: 4576 + hash: "704ca30ddc0a637f3d1cd4926a6f7983" + } + Frame { + msec: 4592 + hash: "d1c02f3ce4bcc96e0c3d2503a0e9aa48" + } + Frame { + msec: 4608 + hash: "7759418b4fe412857ab8e7294f5a3206" + } + Frame { + msec: 4624 + hash: "3e6a6f505aa146a6789434d265ad4d3b" + } + Frame { + msec: 4640 + hash: "3e6089b47573cd53b0a220275202c80b" + } + Frame { + msec: 4656 + hash: "53bd2c46e3a11db0ee151a6a0311b3a8" + } + Frame { + msec: 4672 + hash: "f30202ae354a587c5949a16c1f8b95c3" + } + Frame { + msec: 4688 + hash: "66f78a34fe9d297af1ae8e98f84ead55" + } + Frame { + msec: 4704 + hash: "3e2fc29876812fe57ea008a71db299a4" + } + Frame { + msec: 4720 + hash: "7234b6df2220e418ef8ebe8f1c82bf26" + } + Frame { + msec: 4736 + hash: "82dd491c3b34e702a24ece8e55761a6f" + } + Frame { + msec: 4752 + hash: "d7f1065f5c42088dfc5ce36687fd8010" + } + Frame { + msec: 4768 + hash: "15bfbb0261b66ccbe3b34d0ac807165c" + } + Frame { + msec: 4784 + hash: "69963ce07eb434d787588b21fd020fa3" + } + Frame { + msec: 4800 + hash: "2fb9e078573ebd1a5cf0f615c97f1d20" + } + Frame { + msec: 4816 + image: "loop.5.png" + } + Frame { + msec: 4832 + hash: "0f9ed8cd5cfbdab03bcb05cf6dd92620" + } + Frame { + msec: 4848 + hash: "a0e737132ae642c465e991e770ab3e34" + } + Frame { + msec: 4864 + hash: "d57cc5045f01ab4e7eb72575aef22a10" + } + Frame { + msec: 4880 + hash: "d57e1a10e48938e1f7fc219220fe1204" + } + Frame { + msec: 4896 + hash: "df41be1fa564353ceb2088af209610d3" + } + Frame { + msec: 4912 + hash: "2d294613ed10dfdbca829b43b6990574" + } + Frame { + msec: 4928 + hash: "0a278a4ec3626442c94ef2da30771171" + } + Frame { + msec: 4944 + hash: "7071526c830fdfde9d520ad1578d27a8" + } + Frame { + msec: 4960 + hash: "ad02e7b90f223d3fc5a433bc4ffbee9e" + } + Frame { + msec: 4976 + hash: "e7ef412697c7df3887980ed1b079ffd5" + } + Frame { + msec: 4992 + hash: "ebda21f95079b37f4862b42523bbc1c0" + } + Frame { + msec: 5008 + hash: "6e8889e9b44ff8ed44e228d97fb5034c" + } + Frame { + msec: 5024 + hash: "f32aceabb929471dffd73bf0290e75a2" + } + Frame { + msec: 5040 + hash: "9112838cc8f9a0cfb94e0ef6ca7eca71" + } + Frame { + msec: 5056 + hash: "53bd2c46e3a11db0ee151a6a0311b3a8" + } + Frame { + msec: 5072 + hash: "d5105f958a592324e53aae4a83beb049" + } + Frame { + msec: 5088 + hash: "862249432e6fc6114b63284ad9c97cb6" + } + Frame { + msec: 5104 + hash: "3e6a6f505aa146a6789434d265ad4d3b" + } + Frame { + msec: 5120 + hash: "0f5b2b05f72b86bd2b0a6d0ea2b6bf37" + } + Frame { + msec: 5136 + hash: "922520f7ec954d6d1061208cbd63877e" + } + Frame { + msec: 5152 + hash: "d1c02f3ce4bcc96e0c3d2503a0e9aa48" + } + Frame { + msec: 5168 + hash: "ebb41112b687ecb062dedc3b49cb93fc" + } + Frame { + msec: 5184 + hash: "7bc87d71d532aa52abc26ac9c1cbb665" + } + Frame { + msec: 5200 + hash: "1a7a81f851c8817cac3cc0cb7ac07971" + } + Frame { + msec: 5216 + hash: "ca17c870c55f2947bb5f85d28f30ee7c" + } + Frame { + msec: 5232 + hash: "48b123cfd6d2ea1c2bc9f2ba822ec7bf" + } + Frame { + msec: 5248 + hash: "2a6b8aecef26793e200993dc1e25fd95" + } + Frame { + msec: 5264 + hash: "f10a0a11ed54a910fe434311f67343a4" + } + Frame { + msec: 5280 + hash: "47b6e1beabdcd3cd3d21d77c62e5bed8" + } + Frame { + msec: 5296 + hash: "1eea7eb2853a9e7a1a69738667457b7a" + } + Frame { + msec: 5312 + hash: "9e018f9e7a5ba22bbb9be3049373124a" + } + Frame { + msec: 5328 + hash: "d63069a8e7b0eb5611cc34caaecef2fb" + } + Frame { + msec: 5344 + hash: "def9383a090e4454343725f1a7c4fb3d" + } + Frame { + msec: 5360 + hash: "fd3036e559fd31eeadb0032666a95864" + } + Frame { + msec: 5376 + hash: "cf9f82b9e2a03f63f75b6ac113b3d4e5" + } + Frame { + msec: 5392 + hash: "346e7f597cfb4fc51d5393e705deddd5" + } + Frame { + msec: 5408 + hash: "0d6d6cb2ca808f5a57acfa32e10fc335" + } + Frame { + msec: 5424 + hash: "9a660a0fed41211a37d3ac82be40f81a" + } + Frame { + msec: 5440 + hash: "df3fd60ecbd517879e00e8112c49bed4" + } + Frame { + msec: 5456 + hash: "cd86fe5894e5d061f7ffe37913f00ce6" + } + Frame { + msec: 5472 + hash: "a5fdb825c18d43f3ae18f5c28e715174" + } + Frame { + msec: 5488 + hash: "0fdfb5f9463def560da6c19acf96bafb" + } + Frame { + msec: 5504 + hash: "8849a36af064503dbccad69a35b6ab03" + } + Frame { + msec: 5520 + hash: "baeb4f90b0e2efc09225dbb5dd003e9e" + } + Frame { + msec: 5536 + hash: "86922e71c80976ef3aa2cab18f86c010" + } + Frame { + msec: 5552 + hash: "10d166d7da9949370a66251415522186" + } + Frame { + msec: 5568 + hash: "ada1608055b221dc9f1f7650a9764930" + } + Frame { + msec: 5584 + hash: "dd25ffb9a6bf009139b2942f9cc1f8e7" + } + Frame { + msec: 5600 + hash: "dc4a1c44d08328965b53ff079a8fa57b" + } + Frame { + msec: 5616 + hash: "d3d88cf635ba38e5035732cb36014417" + } + Frame { + msec: 5632 + hash: "be5e44f6b9978ba3b9ae878ae5758a96" + } + Frame { + msec: 5648 + hash: "34f193daf199ab45310be2b407499e57" + } + Frame { + msec: 5664 + hash: "d87c854e1c16642dba0d87e25f0e416f" + } + Frame { + msec: 5680 + hash: "08c404f4efd27695071ad52fbfa57c0b" + } + Frame { + msec: 5696 + hash: "84828f8e0cace1a39d9b7f19b6e4cbaa" + } + Frame { + msec: 5712 + hash: "8a0c6e1f597e699c3e2be816ae4e1dd4" + } + Frame { + msec: 5728 + hash: "9aecb0c464fb140725f34ad94ede367a" + } + Frame { + msec: 5744 + hash: "a298b3ab2939819ced7e7f903ec63be4" + } + Frame { + msec: 5760 + hash: "99789b6e168355a3960986c7d1f21f82" + } + Frame { + msec: 5776 + image: "loop.6.png" + } + Frame { + msec: 5792 + hash: "9c9b3fb5b623d3deaf9920c99279d71b" + } + Frame { + msec: 5808 + hash: "8f0be6d4d6fd7f66a43fd604e17717dd" + } + Frame { + msec: 5824 + hash: "854defd35cf3315e4501583756814ff6" + } + Frame { + msec: 5840 + hash: "fd7157aef6dfb303472cd33b176f91d8" + } + Frame { + msec: 5856 + hash: "e6521a3c74c190c193af2c913e5326e2" + } +} diff --git a/tests/auto/declarative/qmlvisual/animation/loop/loop.qml b/tests/auto/declarative/qmlvisual/animation/loop/loop.qml new file mode 100644 index 00000000..6f625825 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/animation/loop/loop.qml @@ -0,0 +1,24 @@ +import QtQuick 1.0 + +Rectangle { + id: wrapper + width: 600 + height: 100 + + Rectangle { + id: redRect + width: 100; height: 100 + color: Qt.rgba(1,0,0) + /* This should produce an animation that starts at 0, animates smoothly + to 100, jumps to 200, animates smoothly to 400, animates smoothly + back to 100, jumps to 200, and so on. + */ + SequentialAnimation on x { + loops: Animation.Infinite + NumberAnimation { to: 100; duration: 1000 } + NumberAnimation { from: 200; to: 400; duration: 1000 } + } + + } + +} diff --git a/tests/auto/declarative/qmlvisual/animation/parallelAnimation/data/parallelAnimation-visual.0.png b/tests/auto/declarative/qmlvisual/animation/parallelAnimation/data/parallelAnimation-visual.0.png new file mode 100644 index 00000000..a45e421c Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/parallelAnimation/data/parallelAnimation-visual.0.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/parallelAnimation/data/parallelAnimation-visual.qml b/tests/auto/declarative/qmlvisual/animation/parallelAnimation/data/parallelAnimation-visual.qml new file mode 100644 index 00000000..f4991cc2 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/animation/parallelAnimation/data/parallelAnimation-visual.qml @@ -0,0 +1,243 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "parallelAnimation-visual.0.png" + } + Frame { + msec: 32 + hash: "d5eb647077598cab2f3d0c016fbbb419" + } + Frame { + msec: 48 + hash: "d5eb647077598cab2f3d0c016fbbb419" + } + Frame { + msec: 64 + hash: "d5eb647077598cab2f3d0c016fbbb419" + } + Frame { + msec: 80 + hash: "d5eb647077598cab2f3d0c016fbbb419" + } + Frame { + msec: 96 + hash: "d5eb647077598cab2f3d0c016fbbb419" + } + Frame { + msec: 112 + hash: "d5eb647077598cab2f3d0c016fbbb419" + } + Frame { + msec: 128 + hash: "d5eb647077598cab2f3d0c016fbbb419" + } + Frame { + msec: 144 + hash: "aa22c670b17a7372732f9bc85e41a082" + } + Frame { + msec: 160 + hash: "19d09945e45f74d1edd9935e855369b3" + } + Frame { + msec: 176 + hash: "ed391a3b7eba8e98d2f8e372f42e9210" + } + Frame { + msec: 192 + hash: "ac3f7547a9576e0a313e7060ed7431e9" + } + Frame { + msec: 208 + hash: "ddf41ca7289f44990d0d6d41a838bd6f" + } + Frame { + msec: 224 + hash: "42eb324d288b39fa32bf11795d6633f6" + } + Frame { + msec: 240 + hash: "8447851893d2d8f5661731761b6702fa" + } + Frame { + msec: 256 + hash: "7d86bc9b509bcd45eebf2c7e70151424" + } + Frame { + msec: 272 + hash: "c33a6731151fbce1156888129d53b8ec" + } + Frame { + msec: 288 + hash: "028cd521f75d3ecc810a0baa2e857441" + } + Frame { + msec: 304 + hash: "58e565d78d68a69b864c1d7bb8d6180f" + } + Frame { + msec: 320 + hash: "7f21037b48949c2086e7692723a90abf" + } + Frame { + msec: 336 + hash: "5c5c9101a0594bae2f5f8c5bb534a931" + } + Frame { + msec: 352 + hash: "8c010e7bd746d3865e283cc9f5fb83b7" + } + Frame { + msec: 368 + hash: "0a2b5c4aa4e8ca8b264c774e4cc90f23" + } + Frame { + msec: 384 + hash: "bf18f1e0102f471773de1cbb0b24bfc3" + } + Frame { + msec: 400 + hash: "bc8e1d5a6d38e38284313ede359582bc" + } + Frame { + msec: 416 + hash: "3a34e518882bd28d11ebdd1646737a8b" + } + Frame { + msec: 432 + hash: "df113cd7cd502c0ae8cb2dd0f0c209a0" + } + Frame { + msec: 448 + hash: "df113cd7cd502c0ae8cb2dd0f0c209a0" + } + Frame { + msec: 464 + hash: "df113cd7cd502c0ae8cb2dd0f0c209a0" + } + Frame { + msec: 480 + hash: "df113cd7cd502c0ae8cb2dd0f0c209a0" + } + Frame { + msec: 496 + hash: "df113cd7cd502c0ae8cb2dd0f0c209a0" + } + Frame { + msec: 512 + hash: "df113cd7cd502c0ae8cb2dd0f0c209a0" + } + Frame { + msec: 528 + hash: "df113cd7cd502c0ae8cb2dd0f0c209a0" + } + Frame { + msec: 544 + hash: "df113cd7cd502c0ae8cb2dd0f0c209a0" + } + Frame { + msec: 560 + hash: "df113cd7cd502c0ae8cb2dd0f0c209a0" + } + Frame { + msec: 576 + hash: "df113cd7cd502c0ae8cb2dd0f0c209a0" + } + Frame { + msec: 592 + hash: "df113cd7cd502c0ae8cb2dd0f0c209a0" + } + Frame { + msec: 608 + hash: "df113cd7cd502c0ae8cb2dd0f0c209a0" + } + Frame { + msec: 624 + hash: "df113cd7cd502c0ae8cb2dd0f0c209a0" + } + Frame { + msec: 640 + hash: "df113cd7cd502c0ae8cb2dd0f0c209a0" + } + Frame { + msec: 656 + hash: "df113cd7cd502c0ae8cb2dd0f0c209a0" + } + Frame { + msec: 672 + hash: "df113cd7cd502c0ae8cb2dd0f0c209a0" + } + Frame { + msec: 688 + hash: "df113cd7cd502c0ae8cb2dd0f0c209a0" + } + Frame { + msec: 704 + hash: "df113cd7cd502c0ae8cb2dd0f0c209a0" + } + Frame { + msec: 720 + hash: "df113cd7cd502c0ae8cb2dd0f0c209a0" + } + Frame { + msec: 736 + hash: "df113cd7cd502c0ae8cb2dd0f0c209a0" + } + Frame { + msec: 752 + hash: "df113cd7cd502c0ae8cb2dd0f0c209a0" + } + Frame { + msec: 768 + hash: "df113cd7cd502c0ae8cb2dd0f0c209a0" + } + Frame { + msec: 784 + hash: "df113cd7cd502c0ae8cb2dd0f0c209a0" + } + Frame { + msec: 800 + hash: "df113cd7cd502c0ae8cb2dd0f0c209a0" + } + Frame { + msec: 816 + hash: "df113cd7cd502c0ae8cb2dd0f0c209a0" + } + Frame { + msec: 832 + hash: "df113cd7cd502c0ae8cb2dd0f0c209a0" + } + Frame { + msec: 848 + hash: "df113cd7cd502c0ae8cb2dd0f0c209a0" + } + Frame { + msec: 864 + hash: "df113cd7cd502c0ae8cb2dd0f0c209a0" + } + Frame { + msec: 880 + hash: "df113cd7cd502c0ae8cb2dd0f0c209a0" + } + Frame { + msec: 896 + hash: "df113cd7cd502c0ae8cb2dd0f0c209a0" + } + Frame { + msec: 912 + hash: "df113cd7cd502c0ae8cb2dd0f0c209a0" + } + Frame { + msec: 928 + hash: "df113cd7cd502c0ae8cb2dd0f0c209a0" + } + Frame { + msec: 944 + hash: "df113cd7cd502c0ae8cb2dd0f0c209a0" + } +} diff --git a/tests/auto/declarative/qmlvisual/animation/parallelAnimation/parallelAnimation-visual.qml b/tests/auto/declarative/qmlvisual/animation/parallelAnimation/parallelAnimation-visual.qml new file mode 100644 index 00000000..6974adbc --- /dev/null +++ b/tests/auto/declarative/qmlvisual/animation/parallelAnimation/parallelAnimation-visual.qml @@ -0,0 +1,52 @@ +import QtQuick 1.0 + +/* + This test verifies that a single animation animating two properties is visually the same as two + animations in a parallel group animating the same properties. Visually, you should see a red + rectangle at 0,0 stretching from the top of the window to the bottom. This rect will be moved to + the right side of the window while turning purple. If the bottom half is visually different + than the top half, there is a problem. +*/ + +Rectangle { + width: 200; height: 100 + Rectangle { + id: redRect + width: 50; height: 50 + color: "red" + } + Rectangle { + id: redRect2 + width: 50; height: 50 + y: 50 + color: "red" + } + + Timer{ + interval: 100 + running: true + onTriggered: parent.state = "state1" + } + + states: State { + name: "state1" + PropertyChanges { + target: redRect + x: 150 + color: "purple" + } + PropertyChanges { + target: redRect2 + x: 150 + color: "purple" + } + } + + transitions: Transition { + PropertyAnimation { targets: redRect; properties: "x,color"; duration: 300 } + ParallelAnimation { + NumberAnimation { targets: redRect2; properties: "x"; duration: 300 } + ColorAnimation { targets: redRect2; properties: "color"; duration: 300 } + } + } +} diff --git a/tests/auto/declarative/qmlvisual/animation/parentAnimation/data/parentAnimation-visual.0.png b/tests/auto/declarative/qmlvisual/animation/parentAnimation/data/parentAnimation-visual.0.png new file mode 100644 index 00000000..41d51da0 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/parentAnimation/data/parentAnimation-visual.0.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/parentAnimation/data/parentAnimation-visual.1.png b/tests/auto/declarative/qmlvisual/animation/parentAnimation/data/parentAnimation-visual.1.png new file mode 100644 index 00000000..953e8bd4 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/parentAnimation/data/parentAnimation-visual.1.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/parentAnimation/data/parentAnimation-visual.2.png b/tests/auto/declarative/qmlvisual/animation/parentAnimation/data/parentAnimation-visual.2.png new file mode 100644 index 00000000..b311ae18 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/parentAnimation/data/parentAnimation-visual.2.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/parentAnimation/data/parentAnimation-visual.3.png b/tests/auto/declarative/qmlvisual/animation/parentAnimation/data/parentAnimation-visual.3.png new file mode 100644 index 00000000..41d51da0 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/parentAnimation/data/parentAnimation-visual.3.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/parentAnimation/data/parentAnimation-visual.4.png b/tests/auto/declarative/qmlvisual/animation/parentAnimation/data/parentAnimation-visual.4.png new file mode 100644 index 00000000..5b68a73b Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/parentAnimation/data/parentAnimation-visual.4.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/parentAnimation/data/parentAnimation-visual.qml b/tests/auto/declarative/qmlvisual/animation/parentAnimation/data/parentAnimation-visual.qml new file mode 100644 index 00000000..42968831 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/animation/parentAnimation/data/parentAnimation-visual.qml @@ -0,0 +1,1223 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "parentAnimation-visual.0.png" + } + Frame { + msec: 32 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 48 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 64 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 80 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 96 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 112 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 128 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 144 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 160 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 176 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 192 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 208 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 224 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 240 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 256 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 272 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 288 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 304 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 320 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 336 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 352 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 368 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 181; y: 122 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 384 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 400 + hash: "234b795b5dd412e4397f132f03f38175" + } + Frame { + msec: 416 + hash: "eca09aebcc15501fd348b9eb19b54ee2" + } + Frame { + msec: 432 + hash: "6ab63f771ac705439157cf0ed84bc274" + } + Frame { + msec: 448 + hash: "42212db87d03c35e96e38ac200bd9ec2" + } + Frame { + msec: 464 + hash: "46a79ff030b89a4c8791fd853a96b64f" + } + Frame { + msec: 480 + hash: "cdfee36535e491328f5045b6f3378b64" + } + Frame { + msec: 496 + hash: "5cfc7db34110aa39f296fe4475de0c08" + } + Frame { + msec: 512 + hash: "df59e3aa557a661ce513523c3059c41d" + } + Frame { + msec: 528 + hash: "2d2f8fc7d695bcd20ef682b25a22186a" + } + Frame { + msec: 544 + hash: "daac5f2d4b451501669a7767d0a19ccc" + } + Frame { + msec: 560 + hash: "e10801e6c7086eac3eaaa48a3d39bb95" + } + Frame { + msec: 576 + hash: "a5fdf57b20bf4d4aad99f02a13bbfc66" + } + Frame { + msec: 592 + hash: "b48721b169b4a1118b040a9e41c252a1" + } + Frame { + msec: 608 + hash: "242425f06d5706f0483e49812bfb4718" + } + Frame { + msec: 624 + hash: "33bdd4d71b1736055d821ee5040bfaed" + } + Frame { + msec: 640 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 656 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 672 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 688 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 704 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 720 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 736 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 752 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 768 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 784 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 800 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 816 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 832 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 848 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 864 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 880 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 896 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 912 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 928 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 944 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 960 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 976 + image: "parentAnimation-visual.1.png" + } + Frame { + msec: 992 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 1008 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 1024 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 1040 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 1056 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 1072 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 1088 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 1104 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 1120 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 1136 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 181; y: 122 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1152 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 1168 + hash: "b985be8701f0bbb73facfe745d43e32f" + } + Frame { + msec: 1184 + hash: "6b3e91ff248516656fd2efe26db6c900" + } + Frame { + msec: 1200 + hash: "40bd9296de59b3abc5b7a204a6ecff3f" + } + Frame { + msec: 1216 + hash: "615817b53baf0d0cd290b18ad9deee4d" + } + Frame { + msec: 1232 + hash: "c990d9afcebfc4dcc35457d555d7e9cb" + } + Frame { + msec: 1248 + hash: "2d1a4687abe3fd7b1911f8e5020c4378" + } + Frame { + msec: 1264 + hash: "b5e1399f1924dafa6782da6b739af882" + } + Frame { + msec: 1280 + hash: "8686a36600410f4f39f558eadfb3479f" + } + Frame { + msec: 1296 + hash: "39f1f7573198f86e1452211f62dc7f1a" + } + Frame { + msec: 1312 + hash: "fbfbbcb5637c0f90396150abb0aecb14" + } + Frame { + msec: 1328 + hash: "2c071570228d5a121a64c4c01c443ab2" + } + Frame { + msec: 1344 + hash: "4e076ea1d8f566eca9aa5eb55ce02098" + } + Frame { + msec: 1360 + hash: "72fd6c15e76fd6d74a9584be1e82399b" + } + Frame { + msec: 1376 + hash: "b519ad1958ea69fc4682c06e83f22c42" + } + Frame { + msec: 1392 + hash: "155b39717f45fe5d36348c499635e759" + } + Frame { + msec: 1408 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 1424 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 1440 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 1456 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 1472 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 1488 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 1504 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 1520 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 1536 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 1552 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 1568 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 1584 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 1600 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 1616 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 1632 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 1648 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 1664 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 181; y: 122 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1680 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 1696 + hash: "234b795b5dd412e4397f132f03f38175" + } + Frame { + msec: 1712 + hash: "eca09aebcc15501fd348b9eb19b54ee2" + } + Frame { + msec: 1728 + hash: "6ab63f771ac705439157cf0ed84bc274" + } + Frame { + msec: 1744 + hash: "42212db87d03c35e96e38ac200bd9ec2" + } + Frame { + msec: 1760 + hash: "46a79ff030b89a4c8791fd853a96b64f" + } + Frame { + msec: 1776 + hash: "cdfee36535e491328f5045b6f3378b64" + } + Frame { + msec: 1792 + hash: "5cfc7db34110aa39f296fe4475de0c08" + } + Frame { + msec: 1808 + hash: "df59e3aa557a661ce513523c3059c41d" + } + Frame { + msec: 1824 + hash: "2d2f8fc7d695bcd20ef682b25a22186a" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 181; y: 122 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1840 + hash: "2d2f8fc7d695bcd20ef682b25a22186a" + } + Frame { + msec: 1856 + hash: "f611eb7652ce078c81dba533c6c0df5e" + } + Frame { + msec: 1872 + hash: "2a4f853f3eeef5cbacc8fdacfdab3442" + } + Frame { + msec: 1888 + hash: "86a201ea5c4af2a28b4047c0732d33c8" + } + Frame { + msec: 1904 + hash: "e87f15694846a75ff3801aff063d35c7" + } + Frame { + msec: 1920 + hash: "c3d42dd4ae49a843f32a3dcc818d0b68" + } + Frame { + msec: 1936 + image: "parentAnimation-visual.2.png" + } + Frame { + msec: 1952 + hash: "46a79ff030b89a4c8791fd853a96b64f" + } + Mouse { + type: 4 + button: 1 + buttons: 1 + x: 181; y: 122 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1968 + hash: "46a79ff030b89a4c8791fd853a96b64f" + } + Frame { + msec: 1984 + hash: "079898fb015f88ba9d7cd73f356d2c37" + } + Frame { + msec: 2000 + hash: "5d03ca6d09d241bd686c878d53d9f269" + } + Frame { + msec: 2016 + hash: "d986a00663eb3dafb24bf67b3d6c7a04" + } + Frame { + msec: 2032 + hash: "4e609d8b8921428909a5b78ea1db78b9" + } + Frame { + msec: 2048 + hash: "f611eb7652ce078c81dba533c6c0df5e" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 181; y: 122 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2064 + hash: "f611eb7652ce078c81dba533c6c0df5e" + } + Frame { + msec: 2080 + hash: "2a4f853f3eeef5cbacc8fdacfdab3442" + } + Frame { + msec: 2096 + hash: "86a201ea5c4af2a28b4047c0732d33c8" + } + Frame { + msec: 2112 + hash: "2d498b4b440cd6bce6e02102dc62996d" + } + Frame { + msec: 2128 + hash: "53c55f9fc1aab5f4c552387e8cae749e" + } + Frame { + msec: 2144 + hash: "8d188a1ab2be377198142f3037d15fc3" + } + Frame { + msec: 2160 + hash: "66550b5102e2803fb3cbd85f4b2543e0" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 181; y: 122 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2176 + hash: "66550b5102e2803fb3cbd85f4b2543e0" + } + Frame { + msec: 2192 + hash: "e495d8163793da7503b9d29c6721ff6e" + } + Frame { + msec: 2208 + hash: "065e5775930146539ae589782f4e4352" + } + Frame { + msec: 2224 + hash: "7861ff76ec52f1c0408636f7b53b30b6" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 181; y: 122 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2240 + hash: "7861ff76ec52f1c0408636f7b53b30b6" + } + Frame { + msec: 2256 + hash: "e87f15694846a75ff3801aff063d35c7" + } + Frame { + msec: 2272 + hash: "67edcabe94a3968bbfe3dd1b0b2cd273" + } + Frame { + msec: 2288 + hash: "a0f8e97d347970aca868538f4294a7ce" + } + Frame { + msec: 2304 + hash: "c89421473e754235e209f35dea9afccb" + } + Mouse { + type: 4 + button: 1 + buttons: 1 + x: 181; y: 122 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2320 + hash: "c89421473e754235e209f35dea9afccb" + } + Frame { + msec: 2336 + hash: "cdfee36535e491328f5045b6f3378b64" + } + Frame { + msec: 2352 + hash: "ab31653cb8a31f753782ffff045e2b07" + } + Frame { + msec: 2368 + hash: "86a201ea5c4af2a28b4047c0732d33c8" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 181; y: 122 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2384 + hash: "86a201ea5c4af2a28b4047c0732d33c8" + } + Frame { + msec: 2400 + hash: "4bdc37cd35c71d8a25745cb0ff664fea" + } + Frame { + msec: 2416 + hash: "5d03ca6d09d241bd686c878d53d9f269" + } + Frame { + msec: 2432 + hash: "700ff7c6c4ae97b34309bd020807a0e1" + } + Frame { + msec: 2448 + hash: "e812a79fb65142f6855974f87aabdc90" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 181; y: 122 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2464 + hash: "e812a79fb65142f6855974f87aabdc90" + } + Frame { + msec: 2480 + hash: "795809181debf916afbef73c41a66dee" + } + Frame { + msec: 2496 + hash: "b61c0e25fa9f3c15f1caf91c25937d75" + } + Frame { + msec: 2512 + hash: "9dd01662ee9d0add862b3afadac72929" + } + Frame { + msec: 2528 + hash: "0a96c8fec8f6509dbbe16480fe8ebfb7" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 181; y: 122 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2544 + hash: "0a96c8fec8f6509dbbe16480fe8ebfb7" + } + Frame { + msec: 2560 + hash: "ce67814de0091d5ab5cc2172a830bc93" + } + Frame { + msec: 2576 + hash: "d986a00663eb3dafb24bf67b3d6c7a04" + } + Frame { + msec: 2592 + hash: "69e21aefb8bdbfaaa5e1e7969d827ec3" + } + Frame { + msec: 2608 + hash: "cdfee36535e491328f5045b6f3378b64" + } + Frame { + msec: 2624 + hash: "cdb20c4866bdf55bd454864a31676053" + } + Frame { + msec: 2640 + hash: "46a79ff030b89a4c8791fd853a96b64f" + } + Frame { + msec: 2656 + hash: "c2535eb78e0cf46151f15cd2ec7c4838" + } + Frame { + msec: 2672 + hash: "7a1455f07b916a63e43b89da4311a033" + } + Frame { + msec: 2688 + hash: "f9a2c0ef913ecd7026d9775648a063d6" + } + Frame { + msec: 2704 + hash: "5da8f6f7d847c174da393015dfc33537" + } + Frame { + msec: 2720 + hash: "1d5f20cb721f1e5cb067095bee1b51fe" + } + Frame { + msec: 2736 + hash: "ca7f5fa76264d1eb1182e46e371ee81c" + } + Frame { + msec: 2752 + hash: "2467dc0ffdb051e092c5bfd5d371e6b6" + } + Frame { + msec: 2768 + hash: "0b04e516eb08978914c39ec2d742e161" + } + Frame { + msec: 2784 + hash: "5abec56587da54876c204d2e32efe7ad" + } + Frame { + msec: 2800 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 2816 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 2832 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 2848 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 2864 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 2880 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 2896 + image: "parentAnimation-visual.3.png" + } + Frame { + msec: 2912 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 2928 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 2944 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 2960 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 2976 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 2992 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 3008 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 3024 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 3040 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 3056 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 3072 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 3088 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 3104 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 181; y: 122 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3120 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 3136 + hash: "234b795b5dd412e4397f132f03f38175" + } + Frame { + msec: 3152 + hash: "eca09aebcc15501fd348b9eb19b54ee2" + } + Frame { + msec: 3168 + hash: "6ab63f771ac705439157cf0ed84bc274" + } + Frame { + msec: 3184 + hash: "42212db87d03c35e96e38ac200bd9ec2" + } + Frame { + msec: 3200 + hash: "46a79ff030b89a4c8791fd853a96b64f" + } + Frame { + msec: 3216 + hash: "cdfee36535e491328f5045b6f3378b64" + } + Frame { + msec: 3232 + hash: "5cfc7db34110aa39f296fe4475de0c08" + } + Frame { + msec: 3248 + hash: "df59e3aa557a661ce513523c3059c41d" + } + Frame { + msec: 3264 + hash: "2d2f8fc7d695bcd20ef682b25a22186a" + } + Frame { + msec: 3280 + hash: "daac5f2d4b451501669a7767d0a19ccc" + } + Frame { + msec: 3296 + hash: "e10801e6c7086eac3eaaa48a3d39bb95" + } + Frame { + msec: 3312 + hash: "a5fdf57b20bf4d4aad99f02a13bbfc66" + } + Frame { + msec: 3328 + hash: "b48721b169b4a1118b040a9e41c252a1" + } + Frame { + msec: 3344 + hash: "242425f06d5706f0483e49812bfb4718" + } + Frame { + msec: 3360 + hash: "33bdd4d71b1736055d821ee5040bfaed" + } + Frame { + msec: 3376 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 3392 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 3408 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 3424 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 3440 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 3456 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 3472 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 3488 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 3504 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 3520 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 3536 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 3552 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 3568 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 3584 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 3600 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 3616 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 3632 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 181; y: 122 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3648 + hash: "dce97e76b2541bbee52b0df1c1bb3d44" + } + Frame { + msec: 3664 + hash: "b985be8701f0bbb73facfe745d43e32f" + } + Frame { + msec: 3680 + hash: "6b3e91ff248516656fd2efe26db6c900" + } + Frame { + msec: 3696 + hash: "40bd9296de59b3abc5b7a204a6ecff3f" + } + Frame { + msec: 3712 + hash: "615817b53baf0d0cd290b18ad9deee4d" + } + Frame { + msec: 3728 + hash: "c990d9afcebfc4dcc35457d555d7e9cb" + } + Frame { + msec: 3744 + hash: "2d1a4687abe3fd7b1911f8e5020c4378" + } + Frame { + msec: 3760 + hash: "b5e1399f1924dafa6782da6b739af882" + } + Frame { + msec: 3776 + hash: "8686a36600410f4f39f558eadfb3479f" + } + Frame { + msec: 3792 + hash: "39f1f7573198f86e1452211f62dc7f1a" + } + Frame { + msec: 3808 + hash: "fbfbbcb5637c0f90396150abb0aecb14" + } + Frame { + msec: 3824 + hash: "2c071570228d5a121a64c4c01c443ab2" + } + Frame { + msec: 3840 + hash: "4e076ea1d8f566eca9aa5eb55ce02098" + } + Frame { + msec: 3856 + image: "parentAnimation-visual.4.png" + } + Frame { + msec: 3872 + hash: "b519ad1958ea69fc4682c06e83f22c42" + } + Frame { + msec: 3888 + hash: "155b39717f45fe5d36348c499635e759" + } + Frame { + msec: 3904 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 3920 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 3936 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 3952 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 3968 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 3984 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 4000 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 4016 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 4032 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 4048 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 4064 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 4080 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 4096 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 4112 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 4128 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 4144 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 4160 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 4176 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 4192 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 4208 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 4224 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 4240 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 4256 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 4272 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 4288 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 4304 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 4320 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 4336 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 4352 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 4368 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 4384 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 4400 + hash: "fbf01bb217e393b79a6a2c567750de89" + } + Frame { + msec: 4416 + hash: "fbf01bb217e393b79a6a2c567750de89" + } +} diff --git a/tests/auto/declarative/qmlvisual/animation/parentAnimation/parentAnimation-visual.qml b/tests/auto/declarative/qmlvisual/animation/parentAnimation/parentAnimation-visual.qml new file mode 100644 index 00000000..025aa800 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/animation/parentAnimation/parentAnimation-visual.qml @@ -0,0 +1,68 @@ +import QtQuick 1.0 + +/* +This test shows a green rectangle moving and growing from the upper-left corner +of the black rectangle to the same position as the red rectangle (it should end up +the same height as the red rect and twice as wide). There should be no odd jumps or clipping seen. + +The test shows one full transition (to the red and back), then several partial transitions, and +then a final full transition. +*/ + +Rectangle { + width: 400; + height: 240; + color: "black"; + + Rectangle { + id: gr + color: "green" + width: 50; height: 50 + } + + MouseArea { + id: mouser + anchors.fill: parent + } + + Rectangle { + id: np + x: 150 + width: 150; height: 150 + color: "yellow" + clip: true + Rectangle { + color: "red" + x: 50; y: 50; height: 50; width: 50 + } + + } + + Rectangle { + id: vp + x: 100; y: 100 + width: 50; height: 50 + color: "blue" + rotation: 45 + scale: 2 + } + + states: State { + name: "state1" + when: mouser.pressed + ParentChange { + target: gr + parent: np + x: 50; y: 50; width: 100; + } + } + + transitions: Transition { + reversible: true + to: "state1" + ParentAnimation { + target: gr; via: vp; + NumberAnimation { properties: "x,y,rotation,scale,width" } + } + } +} diff --git a/tests/auto/declarative/qmlvisual/animation/parentAnimation2/data/parentAnimation2.0.png b/tests/auto/declarative/qmlvisual/animation/parentAnimation2/data/parentAnimation2.0.png new file mode 100644 index 00000000..03ae932a Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/parentAnimation2/data/parentAnimation2.0.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/parentAnimation2/data/parentAnimation2.1.png b/tests/auto/declarative/qmlvisual/animation/parentAnimation2/data/parentAnimation2.1.png new file mode 100644 index 00000000..175adc3c Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/parentAnimation2/data/parentAnimation2.1.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/parentAnimation2/data/parentAnimation2.2.png b/tests/auto/declarative/qmlvisual/animation/parentAnimation2/data/parentAnimation2.2.png new file mode 100644 index 00000000..4dbe6a4f Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/parentAnimation2/data/parentAnimation2.2.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/parentAnimation2/data/parentAnimation2.3.png b/tests/auto/declarative/qmlvisual/animation/parentAnimation2/data/parentAnimation2.3.png new file mode 100644 index 00000000..b9ea6b87 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/parentAnimation2/data/parentAnimation2.3.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/parentAnimation2/data/parentAnimation2.qml b/tests/auto/declarative/qmlvisual/animation/parentAnimation2/data/parentAnimation2.qml new file mode 100644 index 00000000..1d7817b6 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/animation/parentAnimation2/data/parentAnimation2.qml @@ -0,0 +1,1023 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "parentAnimation2.0.png" + } + Frame { + msec: 32 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 48 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 64 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 80 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 96 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 112 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 128 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 144 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 160 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 176 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 192 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 208 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 224 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 240 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 256 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 272 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 288 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 304 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 320 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 336 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 352 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 368 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 384 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 400 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 416 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 432 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 448 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 464 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 480 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 496 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 512 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 528 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 544 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 560 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 576 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 592 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 608 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 624 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 640 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 656 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 672 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 688 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 704 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 350; y: 182 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 720 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 736 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 752 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 768 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 784 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 800 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 350; y: 182 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 816 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 832 + hash: "9b524b546d250d239ea99dd3319f3d6a" + } + Frame { + msec: 848 + hash: "593300f166c2fd3c325cb35114ca595b" + } + Frame { + msec: 864 + hash: "4451e76e111c99faa77b5fff9a2642fa" + } + Frame { + msec: 880 + hash: "0b4a5675afba935e17eba19e29b709ee" + } + Frame { + msec: 896 + hash: "8682866f0234eebf25aca27a7737c777" + } + Frame { + msec: 912 + hash: "5b3b70dd366bb4c1b5e7d56ce50e59a6" + } + Frame { + msec: 928 + hash: "897394982c93ebcbea68c25cec6d47d3" + } + Frame { + msec: 944 + hash: "23c3c0383a517d33767adeebc53bfa3a" + } + Frame { + msec: 960 + hash: "5983f3e0800859134bff0182fe9e0142" + } + Frame { + msec: 976 + image: "parentAnimation2.1.png" + } + Frame { + msec: 992 + hash: "dbb9a5aa9f569b97711aa2c1f5ebda47" + } + Frame { + msec: 1008 + hash: "0a5a73409b019e650ea860e1a8e27328" + } + Frame { + msec: 1024 + hash: "496bd0d053522bcf71d506b497ede0d5" + } + Frame { + msec: 1040 + hash: "97a32b4a6c99ffe842c35e903bd23d79" + } + Frame { + msec: 1056 + hash: "496dfbbb0c0c28e108adf4c25341ef11" + } + Frame { + msec: 1072 + hash: "aa2e5eb88b1498f0d36897be2a36b0ff" + } + Frame { + msec: 1088 + hash: "0c6f7b54264ab36cfd5145fb7b30432f" + } + Frame { + msec: 1104 + hash: "797fc3ea1db51f12d900b4e0e4998065" + } + Frame { + msec: 1120 + hash: "2b076b8bc1ec1e2f21a4d7a77c94cfeb" + } + Frame { + msec: 1136 + hash: "8d5888ca1cfba19cea569bd38bada417" + } + Frame { + msec: 1152 + hash: "15ae94de5aa106eaa18d0faefa5d61f5" + } + Frame { + msec: 1168 + hash: "96e90d74d5a7788d5a6da6cfdb92b185" + } + Frame { + msec: 1184 + hash: "5698a5e9e628209fc28644198eac65da" + } + Frame { + msec: 1200 + hash: "074ac8f08de8f22c241e23ad8b89b0f0" + } + Frame { + msec: 1216 + hash: "a49fdf41e9ee1e5d764262d4585af2ff" + } + Frame { + msec: 1232 + hash: "accc9b6573a676a40fcf0129085f6fce" + } + Frame { + msec: 1248 + hash: "1cc956d55f0c382c2f74dcc05a05494f" + } + Frame { + msec: 1264 + hash: "38ff3121566b2c719f47d027fcef8b8e" + } + Frame { + msec: 1280 + hash: "4de97b3361a16ca1710f2e75d5c9de6f" + } + Frame { + msec: 1296 + hash: "dbd1455105630bb8f262140e79ceda1b" + } + Frame { + msec: 1312 + hash: "bcdac4ab71a29b78bfa756b56b8d8414" + } + Frame { + msec: 1328 + hash: "f02f73a85532c1dd403d64c50c7e73ca" + } + Frame { + msec: 1344 + hash: "f02f73a85532c1dd403d64c50c7e73ca" + } + Frame { + msec: 1360 + hash: "f02f73a85532c1dd403d64c50c7e73ca" + } + Frame { + msec: 1376 + hash: "f02f73a85532c1dd403d64c50c7e73ca" + } + Frame { + msec: 1392 + hash: "f02f73a85532c1dd403d64c50c7e73ca" + } + Frame { + msec: 1408 + hash: "f02f73a85532c1dd403d64c50c7e73ca" + } + Frame { + msec: 1424 + hash: "f02f73a85532c1dd403d64c50c7e73ca" + } + Frame { + msec: 1440 + hash: "f02f73a85532c1dd403d64c50c7e73ca" + } + Frame { + msec: 1456 + hash: "f02f73a85532c1dd403d64c50c7e73ca" + } + Frame { + msec: 1472 + hash: "f02f73a85532c1dd403d64c50c7e73ca" + } + Frame { + msec: 1488 + hash: "f02f73a85532c1dd403d64c50c7e73ca" + } + Frame { + msec: 1504 + hash: "f02f73a85532c1dd403d64c50c7e73ca" + } + Frame { + msec: 1520 + hash: "f02f73a85532c1dd403d64c50c7e73ca" + } + Frame { + msec: 1536 + hash: "f02f73a85532c1dd403d64c50c7e73ca" + } + Frame { + msec: 1552 + hash: "f02f73a85532c1dd403d64c50c7e73ca" + } + Frame { + msec: 1568 + hash: "f02f73a85532c1dd403d64c50c7e73ca" + } + Frame { + msec: 1584 + hash: "f02f73a85532c1dd403d64c50c7e73ca" + } + Frame { + msec: 1600 + hash: "f02f73a85532c1dd403d64c50c7e73ca" + } + Frame { + msec: 1616 + hash: "f02f73a85532c1dd403d64c50c7e73ca" + } + Frame { + msec: 1632 + hash: "f02f73a85532c1dd403d64c50c7e73ca" + } + Frame { + msec: 1648 + hash: "f02f73a85532c1dd403d64c50c7e73ca" + } + Frame { + msec: 1664 + hash: "f02f73a85532c1dd403d64c50c7e73ca" + } + Frame { + msec: 1680 + hash: "f02f73a85532c1dd403d64c50c7e73ca" + } + Frame { + msec: 1696 + hash: "f02f73a85532c1dd403d64c50c7e73ca" + } + Frame { + msec: 1712 + hash: "f02f73a85532c1dd403d64c50c7e73ca" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 415; y: 121 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1728 + hash: "f02f73a85532c1dd403d64c50c7e73ca" + } + Frame { + msec: 1744 + hash: "f02f73a85532c1dd403d64c50c7e73ca" + } + Frame { + msec: 1760 + hash: "f02f73a85532c1dd403d64c50c7e73ca" + } + Frame { + msec: 1776 + hash: "f02f73a85532c1dd403d64c50c7e73ca" + } + Frame { + msec: 1792 + hash: "f02f73a85532c1dd403d64c50c7e73ca" + } + Frame { + msec: 1808 + hash: "f02f73a85532c1dd403d64c50c7e73ca" + } + Frame { + msec: 1824 + hash: "f02f73a85532c1dd403d64c50c7e73ca" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 415; y: 121 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1840 + hash: "f02f73a85532c1dd403d64c50c7e73ca" + } + Frame { + msec: 1856 + hash: "b59fbcfb7db77cf30ea4ff039a9163ae" + } + Frame { + msec: 1872 + hash: "432a76f0663bfd35f6bbeb3fbeb91799" + } + Frame { + msec: 1888 + hash: "098e18005d3a2ff9095587954c92339c" + } + Frame { + msec: 1904 + hash: "069100bf4ec523a9e9d5bf557ffc51d1" + } + Frame { + msec: 1920 + hash: "3210f97ac2799d84fc1d872c4c2994f7" + } + Frame { + msec: 1936 + image: "parentAnimation2.2.png" + } + Frame { + msec: 1952 + hash: "79aa15dc74668d963f36f28524f4d091" + } + Frame { + msec: 1968 + hash: "6838cb2d728259adc8d91a4a69e35adf" + } + Frame { + msec: 1984 + hash: "3f73c720ce5f1e65fb8537a9beb66d26" + } + Frame { + msec: 2000 + hash: "95d990ccd3e45e780d875aae1f4654f8" + } + Frame { + msec: 2016 + hash: "5389a121571f61e73903305860e60016" + } + Frame { + msec: 2032 + hash: "66f0018b6f35c1c18b28f4959eef96a8" + } + Frame { + msec: 2048 + hash: "c0fa0560a9a5a0f773394c4fd98c9fa3" + } + Frame { + msec: 2064 + hash: "e2d665ae0ac3007520003bb4a24ca708" + } + Frame { + msec: 2080 + hash: "ab6e6976e4214c725f71a4f0ba6d3f68" + } + Frame { + msec: 2096 + hash: "642f48f731f896d0d4b66956485b615b" + } + Frame { + msec: 2112 + hash: "cdc36222978e4361dd3ddc2cba78328d" + } + Frame { + msec: 2128 + hash: "22fe869d83d9d290c4d1702e7553c7aa" + } + Frame { + msec: 2144 + hash: "3cf2b6a4fd5c73c24717a1ce901cfb19" + } + Frame { + msec: 2160 + hash: "ea7ecad2a9b7e6ca9a9d1c9c46e0f6dc" + } + Frame { + msec: 2176 + hash: "3a7e7e2145b40732ef4e18218a959536" + } + Frame { + msec: 2192 + hash: "1386046373ab246ae533aba206ffe502" + } + Frame { + msec: 2208 + hash: "2183072e2117c2bc660767bc67e6c355" + } + Frame { + msec: 2224 + hash: "659c6fedf573d19727f9852a9034e4fe" + } + Frame { + msec: 2240 + hash: "5be4e8fa87593aeb4d59768a61441c37" + } + Frame { + msec: 2256 + hash: "2030b883508d07735b20726d218fd751" + } + Frame { + msec: 2272 + hash: "fd70334fa8a1ff80369cce6aa69255c4" + } + Frame { + msec: 2288 + hash: "be666aafc8a3d2de9ffaff54d9ac15d1" + } + Frame { + msec: 2304 + hash: "3370f2246f679068e40cdb48c92decad" + } + Frame { + msec: 2320 + hash: "f0b4565fd441c071112bdc8225861f76" + } + Frame { + msec: 2336 + hash: "61babd82afc20a3023c2fe483a2e73cb" + } + Frame { + msec: 2352 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Frame { + msec: 2368 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Frame { + msec: 2384 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Frame { + msec: 2400 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Frame { + msec: 2416 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Frame { + msec: 2432 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Frame { + msec: 2448 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Frame { + msec: 2464 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Frame { + msec: 2480 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Frame { + msec: 2496 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Frame { + msec: 2512 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Frame { + msec: 2528 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Frame { + msec: 2544 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Frame { + msec: 2560 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Frame { + msec: 2576 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Frame { + msec: 2592 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Frame { + msec: 2608 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Frame { + msec: 2624 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Frame { + msec: 2640 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Frame { + msec: 2656 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Frame { + msec: 2672 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Frame { + msec: 2688 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Frame { + msec: 2704 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Frame { + msec: 2720 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Frame { + msec: 2736 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Frame { + msec: 2752 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Frame { + msec: 2768 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 207; y: 255 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2784 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Frame { + msec: 2800 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Frame { + msec: 2816 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Frame { + msec: 2832 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Frame { + msec: 2848 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Frame { + msec: 2864 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Frame { + msec: 2880 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Frame { + msec: 2896 + image: "parentAnimation2.3.png" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 207; y: 255 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2912 + hash: "acab4a79f22ebc8a45759ae282e8f3db" + } + Frame { + msec: 2928 + hash: "608af88c841d6058c3304cc134de0187" + } + Frame { + msec: 2944 + hash: "96a727d6ff02c7baf85865fda9d871bd" + } + Frame { + msec: 2960 + hash: "22cacf109e40b457041d6c2862c4f97f" + } + Frame { + msec: 2976 + hash: "ea2a53381eef8ac75fce23c518f1e261" + } + Frame { + msec: 2992 + hash: "a719237e74e9c40b46cc1f27cca5e286" + } + Frame { + msec: 3008 + hash: "804ef3519ba9852afb0bd4ef793e0006" + } + Frame { + msec: 3024 + hash: "4abc5026f0de1165717bd14630c9d9f6" + } + Frame { + msec: 3040 + hash: "1e4dd04698691932725076073a0bd2e7" + } + Frame { + msec: 3056 + hash: "12aae9dcfd9597ce600588b19bdf5a7d" + } + Frame { + msec: 3072 + hash: "9176b69f7df68d860b7d7aecc2496f09" + } + Frame { + msec: 3088 + hash: "9cba95a510685ab6367ba87246f6c922" + } + Frame { + msec: 3104 + hash: "33ef448b9485fafb7a2af319f9f6e816" + } + Frame { + msec: 3120 + hash: "791760db748e46aceb9f469c33b7bf2f" + } + Frame { + msec: 3136 + hash: "201a00feef1bb445f2fd0ba8ef9467a1" + } + Frame { + msec: 3152 + hash: "6e8962c3cb522f5a45b093f1780d2dae" + } + Frame { + msec: 3168 + hash: "d75cb08203a4f2c05b4dfdca2196e3db" + } + Frame { + msec: 3184 + hash: "0417d681c9b64e2cc252ab6fcf20148b" + } + Frame { + msec: 3200 + hash: "85993e5a91a86cedb8c88819b035b6bb" + } + Frame { + msec: 3216 + hash: "d7a0db647e641df9625b8eb5078a8ec3" + } + Frame { + msec: 3232 + hash: "fa29824ed3fd3d4e0d8036079be6bcf8" + } + Frame { + msec: 3248 + hash: "4fc84a3ae74bb6ab7b0b846c8747eb54" + } + Frame { + msec: 3264 + hash: "a172921ffe15077382db8e8915fb340b" + } + Frame { + msec: 3280 + hash: "480ee71d2407d729814a2e19d4320c59" + } + Frame { + msec: 3296 + hash: "b8cf02a1ad96d5c3354f2b658085ed28" + } + Frame { + msec: 3312 + hash: "80fc0f57f58250f63a77b1988a9e1d2e" + } + Frame { + msec: 3328 + hash: "bc283b5d7c5b88ef447be5992a77b6a9" + } + Frame { + msec: 3344 + hash: "89c86df88dc1a3188d52c1f75b80ccf1" + } + Frame { + msec: 3360 + hash: "84148139d89b45949561321bd6f6c835" + } + Frame { + msec: 3376 + hash: "9118d6933b3f77e0b5b8da2d630152e8" + } + Frame { + msec: 3392 + hash: "2b5f746225053778fb07a606ff113e64" + } + Frame { + msec: 3408 + hash: "0a1ed1bea6ed674826d0a2c3146a1c31" + } + Frame { + msec: 3424 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 3440 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 3456 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 3472 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 3488 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 3504 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 3520 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 3536 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 3552 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 3568 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 3584 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 3600 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 3616 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 3632 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 3648 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Key { + type: 6 + key: 16777249 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3664 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 3680 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 3696 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 3712 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 3728 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 3744 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 3760 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 3776 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 3792 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 3808 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 3824 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } + Frame { + msec: 3840 + hash: "b3bfd7a06d3e246f4256ab5a267360b0" + } +} diff --git a/tests/auto/declarative/qmlvisual/animation/parentAnimation2/parentAnimation2.qml b/tests/auto/declarative/qmlvisual/animation/parentAnimation2/parentAnimation2.qml new file mode 100644 index 00000000..f4979431 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/animation/parentAnimation2/parentAnimation2.qml @@ -0,0 +1,64 @@ +import QtQuick 1.0 + +/* +Blue rect fills (with 10px margin) screen, then red, then green, then screen again. +*/ + +Rectangle { + id: whiteRect + width: 640; height: 480; + + Rectangle { + id: redRect + x: 400; y: 50 + width: 100; height: 100 + color: "red" + } + + Rectangle { + id: greenRect + x: 100; y: 150 + width: 200; height: 300 + color: "green" + } + + Rectangle { + id: blueRect + x: 5; y: 5 + width: parent.width-10 + height: parent.height-10 + color: "lightblue" + + //Text { text: "Click me!"; anchors.centerIn: parent } + + MouseArea { + anchors.fill: parent + onClicked: { + switch(blueRect.state) { + case "": blueRect.state = "inRed"; break; + case "inRed": blueRect.state = "inGreen"; break; + case "inGreen": blueRect.state = ""; break; + } + } + } + + states: [ + State { + name: "inRed" + ParentChange { target: blueRect; parent: redRect; x: 5; y: 5; width: parent.width-10; height: parent.height-10 } + PropertyChanges { target: redRect; z: 1 } + }, + State { + name: "inGreen" + ParentChange { target: blueRect; parent: greenRect; x: 5; y: 5; width: parent.width-10; height: parent.height-10 } + PropertyChanges { target: greenRect; z: 1 } + } + ] + + transitions: Transition { + ParentAnimation { target: blueRect; //via: whiteRect; + NumberAnimation { properties: "x, y, width, height"; duration: 500 } + } + } + } +} diff --git a/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.0.png b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.0.png new file mode 100644 index 00000000..cb0971a6 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.0.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.1.png b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.1.png new file mode 100644 index 00000000..c579deda Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.1.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.2.png b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.2.png new file mode 100644 index 00000000..49e2b9fe Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.2.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.3.png b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.3.png new file mode 100644 index 00000000..cb0971a6 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.3.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.4.png b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.4.png new file mode 100644 index 00000000..e62485b3 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.4.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.5.png b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.5.png new file mode 100644 index 00000000..61e74631 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.5.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.6.png b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.6.png new file mode 100644 index 00000000..8c31e7da Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.6.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.qml b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.qml new file mode 100644 index 00000000..34deb9b1 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation-visual.qml @@ -0,0 +1,1619 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "pauseAnimation-visual.0.png" + } + Frame { + msec: 32 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 48 + hash: "675ebbdd22dd22ce45993df4af1acfe9" + } + Frame { + msec: 64 + hash: "dcf2867c127e041970047ec8f3edc04f" + } + Frame { + msec: 80 + hash: "41ba853c3403f68a23e708df82e21c53" + } + Frame { + msec: 96 + hash: "a725b59b4947357546bbfc7df3d830af" + } + Frame { + msec: 112 + hash: "336d31586171f22d541b989d24b95cbb" + } + Frame { + msec: 128 + hash: "6d63fb5c8a80f0280e88b2cdf8641bb9" + } + Frame { + msec: 144 + hash: "ef8941674cb61f54853dc33652bb854e" + } + Frame { + msec: 160 + hash: "b3f4a2165ec1ee971542b8ef89656cea" + } + Frame { + msec: 176 + hash: "af3120fe262d2489c0ed33fbbee1549f" + } + Frame { + msec: 192 + hash: "1373545e43fff7251cec9e8375ea267f" + } + Frame { + msec: 208 + hash: "21f0b0437a999bbde66a913032d495c2" + } + Frame { + msec: 224 + hash: "0809d32d5bc1bfce199b1f39a1c68d4f" + } + Frame { + msec: 240 + hash: "022137587b39f5123835482178a1f1cf" + } + Frame { + msec: 256 + hash: "97566ce9558d13ea0780bce233097b27" + } + Frame { + msec: 272 + hash: "96d79b07da105b7f631ed61582b26f7e" + } + Frame { + msec: 288 + hash: "f4732ff2df93fe67cb850dec34184924" + } + Frame { + msec: 304 + hash: "054e6e52f74a3e24f04e6ad0071f79f8" + } + Frame { + msec: 320 + hash: "f541af93a9fde62e4bd1c91d30f91e65" + } + Frame { + msec: 336 + hash: "c4f844ee71f23635bb3ec7375f6a134f" + } + Frame { + msec: 352 + hash: "3e52e06db2bf78762bb9816fe6b105d9" + } + Frame { + msec: 368 + hash: "d9604be23a91327e6ab454609a9d4a13" + } + Frame { + msec: 384 + hash: "dc98a9bdd99367c1e9b838d4be489dcc" + } + Frame { + msec: 400 + hash: "e87b00bfc2c2a75a4234ec02a057ad3a" + } + Frame { + msec: 416 + hash: "5be4f5c67941efb6fcea363c79f1e321" + } + Frame { + msec: 432 + hash: "6cc9de62a0c8fa5e42eac1b01e99ac32" + } + Frame { + msec: 448 + hash: "62a7133012348f2ec3a388fb685ecc3f" + } + Frame { + msec: 464 + hash: "4ac43a03cc6f2020ab5f894d704092ac" + } + Frame { + msec: 480 + hash: "c1a7b7d6d64ac5584c073c2881290696" + } + Frame { + msec: 496 + hash: "29ece1bca4d21fb5862091317d430a13" + } + Frame { + msec: 512 + hash: "29ece1bca4d21fb5862091317d430a13" + } + Frame { + msec: 528 + hash: "29ece1bca4d21fb5862091317d430a13" + } + Frame { + msec: 544 + hash: "29ece1bca4d21fb5862091317d430a13" + } + Frame { + msec: 560 + hash: "29ece1bca4d21fb5862091317d430a13" + } + Frame { + msec: 576 + hash: "c1a7b7d6d64ac5584c073c2881290696" + } + Frame { + msec: 592 + hash: "c1a7b7d6d64ac5584c073c2881290696" + } + Frame { + msec: 608 + hash: "4ac43a03cc6f2020ab5f894d704092ac" + } + Frame { + msec: 624 + hash: "4ac43a03cc6f2020ab5f894d704092ac" + } + Frame { + msec: 640 + hash: "ffd39c1122fe2f7877ef30591b539b40" + } + Frame { + msec: 656 + hash: "62a7133012348f2ec3a388fb685ecc3f" + } + Frame { + msec: 672 + hash: "45281a70021f81dbef30334b1480da1b" + } + Frame { + msec: 688 + hash: "6cc9de62a0c8fa5e42eac1b01e99ac32" + } + Frame { + msec: 704 + hash: "79ec710576427df73dd03f39fba6e2eb" + } + Frame { + msec: 720 + hash: "5be4f5c67941efb6fcea363c79f1e321" + } + Frame { + msec: 736 + hash: "7d9096b1eb940c82a37baf39ef3ccf3e" + } + Frame { + msec: 752 + hash: "e87b00bfc2c2a75a4234ec02a057ad3a" + } + Frame { + msec: 768 + hash: "da60100dc55023c3bab367d97c8f6a85" + } + Frame { + msec: 784 + hash: "dc98a9bdd99367c1e9b838d4be489dcc" + } + Frame { + msec: 800 + hash: "3f869538028a09020d5e8f528f4fb119" + } + Frame { + msec: 816 + hash: "9650fd0364c01b11e4f5dcce51d008af" + } + Frame { + msec: 832 + hash: "2cb09d9655ecc30ae6a591b28c0d355c" + } + Frame { + msec: 848 + hash: "4db9bc6c11caf1d77794c2eabb62a44e" + } + Frame { + msec: 864 + hash: "ce2b5dd7418868acf86fea6ad19cc0c5" + } + Frame { + msec: 880 + hash: "7c27ef654e645679c90520d6cf00b0c4" + } + Frame { + msec: 896 + hash: "ab3e211df3ef7f5f7a8d712edc891c0f" + } + Frame { + msec: 912 + hash: "19d2ae617a49b57dd012677e2834469c" + } + Frame { + msec: 928 + hash: "5025eb75c88f0760f637e0342b7f88a2" + } + Frame { + msec: 944 + hash: "005acbef952a8ee536e6308a48223e65" + } + Frame { + msec: 960 + hash: "f1e0301430d153fb9d15eaffdfcd5c58" + } + Frame { + msec: 976 + image: "pauseAnimation-visual.1.png" + } + Frame { + msec: 992 + hash: "bcc35497884c158396c7f60759d1fda4" + } + Frame { + msec: 1008 + hash: "7a4528b000a4ea142d1c77407fa1f581" + } + Frame { + msec: 1024 + hash: "ba967a7d810a4531e577e5f6bd2def33" + } + Frame { + msec: 1040 + hash: "f5afd9cf8ffe27e9992454b9e68688cb" + } + Frame { + msec: 1056 + hash: "51d475c7f64a86d3a18fb115297a7b6b" + } + Frame { + msec: 1072 + hash: "49f5d6fd45c195a8d245b7fefc1277ab" + } + Frame { + msec: 1088 + hash: "f9b0b278659e3a0f78611e6b7f0f2176" + } + Frame { + msec: 1104 + hash: "0809d32d5bc1bfce199b1f39a1c68d4f" + } + Frame { + msec: 1120 + hash: "b7208d103b63a936dff8dd8ed224237f" + } + Frame { + msec: 1136 + hash: "a57c81049b0dc68090ec7c3327b9922c" + } + Frame { + msec: 1152 + hash: "e553f365912586c6408c8c53b1b7d118" + } + Frame { + msec: 1168 + hash: "af3120fe262d2489c0ed33fbbee1549f" + } + Frame { + msec: 1184 + hash: "0c20d12464abbdc45041ea5d9f2719b1" + } + Frame { + msec: 1200 + hash: "dd60cbaff6f34027474e92315dbc0ebc" + } + Frame { + msec: 1216 + hash: "336d31586171f22d541b989d24b95cbb" + } + Frame { + msec: 1232 + hash: "41ba853c3403f68a23e708df82e21c53" + } + Frame { + msec: 1248 + hash: "675ebbdd22dd22ce45993df4af1acfe9" + } + Frame { + msec: 1264 + hash: "41ba853c3403f68a23e708df82e21c53" + } + Frame { + msec: 1280 + hash: "a725b59b4947357546bbfc7df3d830af" + } + Frame { + msec: 1296 + hash: "336d31586171f22d541b989d24b95cbb" + } + Frame { + msec: 1312 + hash: "f0d8132489c2f2ef760e905b3c093726" + } + Frame { + msec: 1328 + hash: "6d63fb5c8a80f0280e88b2cdf8641bb9" + } + Frame { + msec: 1344 + hash: "dd60cbaff6f34027474e92315dbc0ebc" + } + Frame { + msec: 1360 + hash: "ef8941674cb61f54853dc33652bb854e" + } + Frame { + msec: 1376 + hash: "bc426fb7c31751665b0d3f16e2cb0173" + } + Frame { + msec: 1392 + hash: "0c20d12464abbdc45041ea5d9f2719b1" + } + Frame { + msec: 1408 + hash: "53ae93140252373eaa4d9da73756bd8e" + } + Frame { + msec: 1424 + hash: "721d7061811b5439c2e8e395917494bc" + } + Frame { + msec: 1440 + hash: "af3120fe262d2489c0ed33fbbee1549f" + } + Frame { + msec: 1456 + hash: "a8b624ebfc9ab713d1ce55f318a6e90d" + } + Frame { + msec: 1472 + hash: "a88a8129259f86df5a73addc3649ad37" + } + Frame { + msec: 1488 + hash: "a88a8129259f86df5a73addc3649ad37" + } + Frame { + msec: 1504 + hash: "3db5e30ef19ea693c21ccf72892c4390" + } + Frame { + msec: 1520 + hash: "e553f365912586c6408c8c53b1b7d118" + } + Frame { + msec: 1536 + hash: "e553f365912586c6408c8c53b1b7d118" + } + Frame { + msec: 1552 + hash: "e553f365912586c6408c8c53b1b7d118" + } + Frame { + msec: 1568 + hash: "1373545e43fff7251cec9e8375ea267f" + } + Frame { + msec: 1584 + hash: "1373545e43fff7251cec9e8375ea267f" + } + Frame { + msec: 1600 + hash: "1373545e43fff7251cec9e8375ea267f" + } + Frame { + msec: 1616 + hash: "1373545e43fff7251cec9e8375ea267f" + } + Frame { + msec: 1632 + hash: "1373545e43fff7251cec9e8375ea267f" + } + Frame { + msec: 1648 + hash: "1373545e43fff7251cec9e8375ea267f" + } + Frame { + msec: 1664 + hash: "e553f365912586c6408c8c53b1b7d118" + } + Frame { + msec: 1680 + hash: "e553f365912586c6408c8c53b1b7d118" + } + Frame { + msec: 1696 + hash: "3db5e30ef19ea693c21ccf72892c4390" + } + Frame { + msec: 1712 + hash: "3db5e30ef19ea693c21ccf72892c4390" + } + Frame { + msec: 1728 + hash: "a88a8129259f86df5a73addc3649ad37" + } + Frame { + msec: 1744 + hash: "a8b624ebfc9ab713d1ce55f318a6e90d" + } + Frame { + msec: 1760 + hash: "a8b624ebfc9ab713d1ce55f318a6e90d" + } + Frame { + msec: 1776 + hash: "af3120fe262d2489c0ed33fbbee1549f" + } + Frame { + msec: 1792 + hash: "721d7061811b5439c2e8e395917494bc" + } + Frame { + msec: 1808 + hash: "b3f4a2165ec1ee971542b8ef89656cea" + } + Frame { + msec: 1824 + hash: "0c20d12464abbdc45041ea5d9f2719b1" + } + Frame { + msec: 1840 + hash: "bc426fb7c31751665b0d3f16e2cb0173" + } + Frame { + msec: 1856 + hash: "ef8941674cb61f54853dc33652bb854e" + } + Frame { + msec: 1872 + hash: "dd60cbaff6f34027474e92315dbc0ebc" + } + Frame { + msec: 1888 + hash: "6d63fb5c8a80f0280e88b2cdf8641bb9" + } + Frame { + msec: 1904 + hash: "e74fe4a6bd92cbe8629c8bc8a870104d" + } + Frame { + msec: 1920 + hash: "3042003c067b257de2cb32f650dde693" + } + Frame { + msec: 1936 + image: "pauseAnimation-visual.2.png" + } + Frame { + msec: 1952 + hash: "dcf2867c127e041970047ec8f3edc04f" + } + Frame { + msec: 1968 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 1984 + hash: "675ebbdd22dd22ce45993df4af1acfe9" + } + Frame { + msec: 2000 + hash: "dcf2867c127e041970047ec8f3edc04f" + } + Frame { + msec: 2016 + hash: "41ba853c3403f68a23e708df82e21c53" + } + Frame { + msec: 2032 + hash: "ce57e27af329eba4fac3ab891f0407ce" + } + Frame { + msec: 2048 + hash: "ce57e27af329eba4fac3ab891f0407ce" + } + Frame { + msec: 2064 + hash: "a725b59b4947357546bbfc7df3d830af" + } + Frame { + msec: 2080 + hash: "a725b59b4947357546bbfc7df3d830af" + } + Frame { + msec: 2096 + hash: "3042003c067b257de2cb32f650dde693" + } + Frame { + msec: 2112 + hash: "3042003c067b257de2cb32f650dde693" + } + Frame { + msec: 2128 + hash: "3042003c067b257de2cb32f650dde693" + } + Frame { + msec: 2144 + hash: "3042003c067b257de2cb32f650dde693" + } + Frame { + msec: 2160 + hash: "3042003c067b257de2cb32f650dde693" + } + Frame { + msec: 2176 + hash: "3042003c067b257de2cb32f650dde693" + } + Frame { + msec: 2192 + hash: "3042003c067b257de2cb32f650dde693" + } + Frame { + msec: 2208 + hash: "3042003c067b257de2cb32f650dde693" + } + Frame { + msec: 2224 + hash: "a725b59b4947357546bbfc7df3d830af" + } + Frame { + msec: 2240 + hash: "a725b59b4947357546bbfc7df3d830af" + } + Frame { + msec: 2256 + hash: "ce57e27af329eba4fac3ab891f0407ce" + } + Frame { + msec: 2272 + hash: "ce57e27af329eba4fac3ab891f0407ce" + } + Frame { + msec: 2288 + hash: "41ba853c3403f68a23e708df82e21c53" + } + Frame { + msec: 2304 + hash: "dcf2867c127e041970047ec8f3edc04f" + } + Frame { + msec: 2320 + hash: "675ebbdd22dd22ce45993df4af1acfe9" + } + Frame { + msec: 2336 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 2352 + hash: "675ebbdd22dd22ce45993df4af1acfe9" + } + Frame { + msec: 2368 + hash: "675ebbdd22dd22ce45993df4af1acfe9" + } + Frame { + msec: 2384 + hash: "675ebbdd22dd22ce45993df4af1acfe9" + } + Frame { + msec: 2400 + hash: "675ebbdd22dd22ce45993df4af1acfe9" + } + Frame { + msec: 2416 + hash: "dcf2867c127e041970047ec8f3edc04f" + } + Frame { + msec: 2432 + hash: "dcf2867c127e041970047ec8f3edc04f" + } + Frame { + msec: 2448 + hash: "675ebbdd22dd22ce45993df4af1acfe9" + } + Frame { + msec: 2464 + hash: "675ebbdd22dd22ce45993df4af1acfe9" + } + Frame { + msec: 2480 + hash: "675ebbdd22dd22ce45993df4af1acfe9" + } + Frame { + msec: 2496 + hash: "675ebbdd22dd22ce45993df4af1acfe9" + } + Frame { + msec: 2512 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 2528 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 2544 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 2560 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 2576 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 2592 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 2608 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 2624 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 2640 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 2656 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 2672 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 2688 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 2704 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 2720 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 2736 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 2752 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 2768 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 2784 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 2800 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 2816 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 2832 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 2848 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 2864 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 2880 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 2896 + image: "pauseAnimation-visual.3.png" + } + Frame { + msec: 2912 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 2928 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 2944 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 2960 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 2976 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 2992 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3008 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3024 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3040 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3056 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3072 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3088 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3104 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3120 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3136 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3152 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3168 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3184 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3200 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3216 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3232 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3248 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3264 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3280 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3296 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3312 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3328 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3344 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3360 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3376 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3392 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3408 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3424 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3440 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3456 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3472 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3488 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3504 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3520 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3536 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 3552 + hash: "675ebbdd22dd22ce45993df4af1acfe9" + } + Frame { + msec: 3568 + hash: "dcf2867c127e041970047ec8f3edc04f" + } + Frame { + msec: 3584 + hash: "ce57e27af329eba4fac3ab891f0407ce" + } + Frame { + msec: 3600 + hash: "3042003c067b257de2cb32f650dde693" + } + Frame { + msec: 3616 + hash: "e74fe4a6bd92cbe8629c8bc8a870104d" + } + Frame { + msec: 3632 + hash: "e11455d4e23a5a865e222a7aba4ba4f9" + } + Frame { + msec: 3648 + hash: "8757668e56be6449ec375f0b8fed1be3" + } + Frame { + msec: 3664 + hash: "53ae93140252373eaa4d9da73756bd8e" + } + Frame { + msec: 3680 + hash: "a88a8129259f86df5a73addc3649ad37" + } + Frame { + msec: 3696 + hash: "630d90eef2673a69e8ebc4ef1ba40e81" + } + Frame { + msec: 3712 + hash: "b7208d103b63a936dff8dd8ed224237f" + } + Frame { + msec: 3728 + hash: "1516c3547c7cf64832b3bc7da7c44521" + } + Frame { + msec: 3744 + hash: "49f5d6fd45c195a8d245b7fefc1277ab" + } + Frame { + msec: 3760 + hash: "f5afd9cf8ffe27e9992454b9e68688cb" + } + Frame { + msec: 3776 + hash: "7a4528b000a4ea142d1c77407fa1f581" + } + Frame { + msec: 3792 + hash: "5f18a81707f23d377e81a27c1fc41ce9" + } + Frame { + msec: 3808 + hash: "005acbef952a8ee536e6308a48223e65" + } + Frame { + msec: 3824 + hash: "85c135ef72d3d25658a3663e69ffb7c2" + } + Frame { + msec: 3840 + hash: "7c27ef654e645679c90520d6cf00b0c4" + } + Frame { + msec: 3856 + image: "pauseAnimation-visual.4.png" + } + Frame { + msec: 3872 + hash: "9650fd0364c01b11e4f5dcce51d008af" + } + Frame { + msec: 3888 + hash: "f340cdf60c6d4c29d26b7202a093ec70" + } + Frame { + msec: 3904 + hash: "d754d35d0793f9f7d4f6249a874e4c45" + } + Frame { + msec: 3920 + hash: "79ec710576427df73dd03f39fba6e2eb" + } + Frame { + msec: 3936 + hash: "45281a70021f81dbef30334b1480da1b" + } + Frame { + msec: 3952 + hash: "ffd39c1122fe2f7877ef30591b539b40" + } + Frame { + msec: 3968 + hash: "4ac43a03cc6f2020ab5f894d704092ac" + } + Frame { + msec: 3984 + hash: "c1a7b7d6d64ac5584c073c2881290696" + } + Frame { + msec: 4000 + hash: "29ece1bca4d21fb5862091317d430a13" + } + Frame { + msec: 4016 + hash: "29ece1bca4d21fb5862091317d430a13" + } + Frame { + msec: 4032 + hash: "29ece1bca4d21fb5862091317d430a13" + } + Frame { + msec: 4048 + hash: "29ece1bca4d21fb5862091317d430a13" + } + Frame { + msec: 4064 + hash: "29ece1bca4d21fb5862091317d430a13" + } + Frame { + msec: 4080 + hash: "c1a7b7d6d64ac5584c073c2881290696" + } + Frame { + msec: 4096 + hash: "c1a7b7d6d64ac5584c073c2881290696" + } + Frame { + msec: 4112 + hash: "4ac43a03cc6f2020ab5f894d704092ac" + } + Frame { + msec: 4128 + hash: "4ac43a03cc6f2020ab5f894d704092ac" + } + Frame { + msec: 4144 + hash: "ffd39c1122fe2f7877ef30591b539b40" + } + Frame { + msec: 4160 + hash: "62a7133012348f2ec3a388fb685ecc3f" + } + Frame { + msec: 4176 + hash: "45281a70021f81dbef30334b1480da1b" + } + Frame { + msec: 4192 + hash: "6cc9de62a0c8fa5e42eac1b01e99ac32" + } + Frame { + msec: 4208 + hash: "79ec710576427df73dd03f39fba6e2eb" + } + Frame { + msec: 4224 + hash: "5be4f5c67941efb6fcea363c79f1e321" + } + Frame { + msec: 4240 + hash: "7d9096b1eb940c82a37baf39ef3ccf3e" + } + Frame { + msec: 4256 + hash: "e87b00bfc2c2a75a4234ec02a057ad3a" + } + Frame { + msec: 4272 + hash: "da60100dc55023c3bab367d97c8f6a85" + } + Frame { + msec: 4288 + hash: "dc98a9bdd99367c1e9b838d4be489dcc" + } + Frame { + msec: 4304 + hash: "b2c778a5eff5f01edc54f03d8b4de8c7" + } + Frame { + msec: 4320 + hash: "9650fd0364c01b11e4f5dcce51d008af" + } + Frame { + msec: 4336 + hash: "2cb09d9655ecc30ae6a591b28c0d355c" + } + Frame { + msec: 4352 + hash: "4db9bc6c11caf1d77794c2eabb62a44e" + } + Frame { + msec: 4368 + hash: "ce2b5dd7418868acf86fea6ad19cc0c5" + } + Frame { + msec: 4384 + hash: "c4f844ee71f23635bb3ec7375f6a134f" + } + Frame { + msec: 4400 + hash: "4e1fda8a0495ef968c1cffb1257426d7" + } + Frame { + msec: 4416 + hash: "19d2ae617a49b57dd012677e2834469c" + } + Frame { + msec: 4432 + hash: "f438e8d2c16b5de677924c8411219b19" + } + Frame { + msec: 4448 + hash: "005acbef952a8ee536e6308a48223e65" + } + Frame { + msec: 4464 + hash: "87b71778d52cd8563d171151d4d32407" + } + Frame { + msec: 4480 + hash: "691cd8bf5c7802ff6c5024827a379fc6" + } + Frame { + msec: 4496 + hash: "ab442c0173c3d221b6782d28001dac77" + } + Frame { + msec: 4512 + hash: "6f886d4538704c2fad4d84c68214109f" + } + Frame { + msec: 4528 + hash: "56d39f233fae41c60499d6161f891cbc" + } + Frame { + msec: 4544 + hash: "95d987c3fd1352fb81c42c63634fe53b" + } + Frame { + msec: 4560 + hash: "96dc84c0c548021910e7c5b580179054" + } + Frame { + msec: 4576 + hash: "ddb71cbd57f6e43744d533d4f72b08db" + } + Frame { + msec: 4592 + hash: "f7ab4b197bea455b22f259913438d207" + } + Frame { + msec: 4608 + hash: "2ad64cb01c9d50e0118d5ece0a644df2" + } + Frame { + msec: 4624 + hash: "6579681c59dd571df0ee4429d74fb5c7" + } + Frame { + msec: 4640 + hash: "630d90eef2673a69e8ebc4ef1ba40e81" + } + Frame { + msec: 4656 + hash: "3db5e30ef19ea693c21ccf72892c4390" + } + Frame { + msec: 4672 + hash: "721d7061811b5439c2e8e395917494bc" + } + Frame { + msec: 4688 + hash: "bc426fb7c31751665b0d3f16e2cb0173" + } + Frame { + msec: 4704 + hash: "e11455d4e23a5a865e222a7aba4ba4f9" + } + Frame { + msec: 4720 + hash: "3042003c067b257de2cb32f650dde693" + } + Frame { + msec: 4736 + hash: "dcf2867c127e041970047ec8f3edc04f" + } + Frame { + msec: 4752 + hash: "675ebbdd22dd22ce45993df4af1acfe9" + } + Frame { + msec: 4768 + hash: "41ba853c3403f68a23e708df82e21c53" + } + Frame { + msec: 4784 + hash: "a725b59b4947357546bbfc7df3d830af" + } + Frame { + msec: 4800 + hash: "336d31586171f22d541b989d24b95cbb" + } + Frame { + msec: 4816 + image: "pauseAnimation-visual.5.png" + } + Frame { + msec: 4832 + hash: "e11455d4e23a5a865e222a7aba4ba4f9" + } + Frame { + msec: 4848 + hash: "dd60cbaff6f34027474e92315dbc0ebc" + } + Frame { + msec: 4864 + hash: "8757668e56be6449ec375f0b8fed1be3" + } + Frame { + msec: 4880 + hash: "bc426fb7c31751665b0d3f16e2cb0173" + } + Frame { + msec: 4896 + hash: "b3f4a2165ec1ee971542b8ef89656cea" + } + Frame { + msec: 4912 + hash: "53ae93140252373eaa4d9da73756bd8e" + } + Frame { + msec: 4928 + hash: "721d7061811b5439c2e8e395917494bc" + } + Frame { + msec: 4944 + hash: "af3120fe262d2489c0ed33fbbee1549f" + } + Frame { + msec: 4960 + hash: "a8b624ebfc9ab713d1ce55f318a6e90d" + } + Frame { + msec: 4976 + hash: "a88a8129259f86df5a73addc3649ad37" + } + Frame { + msec: 4992 + hash: "3db5e30ef19ea693c21ccf72892c4390" + } + Frame { + msec: 5008 + hash: "3db5e30ef19ea693c21ccf72892c4390" + } + Frame { + msec: 5024 + hash: "e553f365912586c6408c8c53b1b7d118" + } + Frame { + msec: 5040 + hash: "e553f365912586c6408c8c53b1b7d118" + } + Frame { + msec: 5056 + hash: "1373545e43fff7251cec9e8375ea267f" + } + Frame { + msec: 5072 + hash: "1373545e43fff7251cec9e8375ea267f" + } + Frame { + msec: 5088 + hash: "1373545e43fff7251cec9e8375ea267f" + } + Frame { + msec: 5104 + hash: "1373545e43fff7251cec9e8375ea267f" + } + Frame { + msec: 5120 + hash: "1373545e43fff7251cec9e8375ea267f" + } + Frame { + msec: 5136 + hash: "1373545e43fff7251cec9e8375ea267f" + } + Frame { + msec: 5152 + hash: "1373545e43fff7251cec9e8375ea267f" + } + Frame { + msec: 5168 + hash: "e553f365912586c6408c8c53b1b7d118" + } + Frame { + msec: 5184 + hash: "e553f365912586c6408c8c53b1b7d118" + } + Frame { + msec: 5200 + hash: "3db5e30ef19ea693c21ccf72892c4390" + } + Frame { + msec: 5216 + hash: "3db5e30ef19ea693c21ccf72892c4390" + } + Frame { + msec: 5232 + hash: "a88a8129259f86df5a73addc3649ad37" + } + Frame { + msec: 5248 + hash: "a8b624ebfc9ab713d1ce55f318a6e90d" + } + Frame { + msec: 5264 + hash: "af3120fe262d2489c0ed33fbbee1549f" + } + Frame { + msec: 5280 + hash: "721d7061811b5439c2e8e395917494bc" + } + Frame { + msec: 5296 + hash: "53ae93140252373eaa4d9da73756bd8e" + } + Frame { + msec: 5312 + hash: "b3f4a2165ec1ee971542b8ef89656cea" + } + Frame { + msec: 5328 + hash: "0c20d12464abbdc45041ea5d9f2719b1" + } + Frame { + msec: 5344 + hash: "8757668e56be6449ec375f0b8fed1be3" + } + Frame { + msec: 5360 + hash: "ef8941674cb61f54853dc33652bb854e" + } + Frame { + msec: 5376 + hash: "e11455d4e23a5a865e222a7aba4ba4f9" + } + Frame { + msec: 5392 + hash: "6d63fb5c8a80f0280e88b2cdf8641bb9" + } + Frame { + msec: 5408 + hash: "e74fe4a6bd92cbe8629c8bc8a870104d" + } + Frame { + msec: 5424 + hash: "3042003c067b257de2cb32f650dde693" + } + Frame { + msec: 5440 + hash: "ce57e27af329eba4fac3ab891f0407ce" + } + Frame { + msec: 5456 + hash: "dcf2867c127e041970047ec8f3edc04f" + } + Frame { + msec: 5472 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 5488 + hash: "675ebbdd22dd22ce45993df4af1acfe9" + } + Frame { + msec: 5504 + hash: "dcf2867c127e041970047ec8f3edc04f" + } + Frame { + msec: 5520 + hash: "41ba853c3403f68a23e708df82e21c53" + } + Frame { + msec: 5536 + hash: "ce57e27af329eba4fac3ab891f0407ce" + } + Frame { + msec: 5552 + hash: "ce57e27af329eba4fac3ab891f0407ce" + } + Frame { + msec: 5568 + hash: "a725b59b4947357546bbfc7df3d830af" + } + Frame { + msec: 5584 + hash: "a725b59b4947357546bbfc7df3d830af" + } + Frame { + msec: 5600 + hash: "3042003c067b257de2cb32f650dde693" + } + Frame { + msec: 5616 + hash: "3042003c067b257de2cb32f650dde693" + } + Frame { + msec: 5632 + hash: "3042003c067b257de2cb32f650dde693" + } + Frame { + msec: 5648 + hash: "3042003c067b257de2cb32f650dde693" + } + Frame { + msec: 5664 + hash: "3042003c067b257de2cb32f650dde693" + } + Frame { + msec: 5680 + hash: "3042003c067b257de2cb32f650dde693" + } + Frame { + msec: 5696 + hash: "3042003c067b257de2cb32f650dde693" + } + Frame { + msec: 5712 + hash: "3042003c067b257de2cb32f650dde693" + } + Frame { + msec: 5728 + hash: "a725b59b4947357546bbfc7df3d830af" + } + Frame { + msec: 5744 + hash: "a725b59b4947357546bbfc7df3d830af" + } + Frame { + msec: 5760 + hash: "ce57e27af329eba4fac3ab891f0407ce" + } + Frame { + msec: 5776 + image: "pauseAnimation-visual.6.png" + } + Frame { + msec: 5792 + hash: "41ba853c3403f68a23e708df82e21c53" + } + Frame { + msec: 5808 + hash: "dcf2867c127e041970047ec8f3edc04f" + } + Frame { + msec: 5824 + hash: "675ebbdd22dd22ce45993df4af1acfe9" + } + Frame { + msec: 5840 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 5856 + hash: "675ebbdd22dd22ce45993df4af1acfe9" + } + Frame { + msec: 5872 + hash: "675ebbdd22dd22ce45993df4af1acfe9" + } + Frame { + msec: 5888 + hash: "675ebbdd22dd22ce45993df4af1acfe9" + } + Frame { + msec: 5904 + hash: "675ebbdd22dd22ce45993df4af1acfe9" + } + Frame { + msec: 5920 + hash: "dcf2867c127e041970047ec8f3edc04f" + } + Frame { + msec: 5936 + hash: "dcf2867c127e041970047ec8f3edc04f" + } + Frame { + msec: 5952 + hash: "675ebbdd22dd22ce45993df4af1acfe9" + } + Frame { + msec: 5968 + hash: "675ebbdd22dd22ce45993df4af1acfe9" + } + Frame { + msec: 5984 + hash: "675ebbdd22dd22ce45993df4af1acfe9" + } + Frame { + msec: 6000 + hash: "675ebbdd22dd22ce45993df4af1acfe9" + } + Frame { + msec: 6016 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 6032 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 6048 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 6064 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 6080 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 6096 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 6112 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 6128 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 6144 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 6160 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 6176 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 6192 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 6208 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 6224 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 6240 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 6256 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 6272 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 6288 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 6304 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 6320 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 6336 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 6352 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 6368 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Key { + type: 6 + key: 16777249 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 6384 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 6400 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } + Frame { + msec: 6416 + hash: "a350b70c5238a340e85fd4a3ec0390a3" + } +} diff --git a/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation.0.png b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation.0.png new file mode 100644 index 00000000..693a7941 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation.0.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation.1.png b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation.1.png new file mode 100644 index 00000000..06d43f12 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation.1.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation.2.png b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation.2.png new file mode 100644 index 00000000..e619baf4 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation.2.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation.3.png b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation.3.png new file mode 100644 index 00000000..30c7671c Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation.3.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation.4.png b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation.4.png new file mode 100644 index 00000000..132803cb Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation.4.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation.5.png b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation.5.png new file mode 100644 index 00000000..8372bc30 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/data/pauseAnimation.5.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/pauseAnimation/pauseAnimation-visual.qml b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/pauseAnimation-visual.qml new file mode 100644 index 00000000..1b315b2c --- /dev/null +++ b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/pauseAnimation-visual.qml @@ -0,0 +1,36 @@ +import QtQuick 1.0 + +/* +This test shows a bouncing logo. +When the test starts the logo should be resting at the bottom. It should immediately move +to the top, and then fall down to bounce at the bottom. There should be a pause, and then +one repeat of the sequence. +*/ + +Rectangle { + id: rect + width: 120 + height: 200 + color: "white" + Image { + id: img + source: "pics/qtlogo.png" + x: 60-width/2 + y: 200-img.height + SequentialAnimation on y { + loops: Animation.Infinite + NumberAnimation { + to: 0; duration: 500 + easing.type: "InOutQuad" + } + NumberAnimation { + to: 200-img.height + easing.type: "OutBounce" + duration: 2000 + } + PauseAnimation { + duration: 1000 + } + } + } +} diff --git a/tests/auto/declarative/qmlvisual/animation/pauseAnimation/pics/qtlogo.png b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/pics/qtlogo.png new file mode 100644 index 00000000..399bd0b1 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/pauseAnimation/pics/qtlogo.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/propertyAction/data/propertyAction-visual.0.png b/tests/auto/declarative/qmlvisual/animation/propertyAction/data/propertyAction-visual.0.png new file mode 100644 index 00000000..7d2b66ef Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/propertyAction/data/propertyAction-visual.0.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/propertyAction/data/propertyAction-visual.1.png b/tests/auto/declarative/qmlvisual/animation/propertyAction/data/propertyAction-visual.1.png new file mode 100644 index 00000000..a02c063e Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/propertyAction/data/propertyAction-visual.1.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/propertyAction/data/propertyAction-visual.2.png b/tests/auto/declarative/qmlvisual/animation/propertyAction/data/propertyAction-visual.2.png new file mode 100644 index 00000000..1af3243c Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/propertyAction/data/propertyAction-visual.2.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/propertyAction/data/propertyAction-visual.3.png b/tests/auto/declarative/qmlvisual/animation/propertyAction/data/propertyAction-visual.3.png new file mode 100644 index 00000000..7d2b66ef Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/propertyAction/data/propertyAction-visual.3.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/propertyAction/data/propertyAction-visual.qml b/tests/auto/declarative/qmlvisual/animation/propertyAction/data/propertyAction-visual.qml new file mode 100644 index 00000000..3c24f590 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/animation/propertyAction/data/propertyAction-visual.qml @@ -0,0 +1,815 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "propertyAction-visual.0.png" + } + Frame { + msec: 32 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 48 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 64 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 80 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 96 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 112 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 128 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 144 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 160 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 176 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 192 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 208 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 224 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 240 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 256 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 272 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 288 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 304 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 320 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 336 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 352 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 368 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 384 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 400 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 416 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 432 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 448 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 464 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 480 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 496 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 512 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 528 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 544 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 560 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 576 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 592 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 608 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 624 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 640 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 656 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 672 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 688 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 704 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 720 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 736 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 27; y: 19 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 752 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 768 + hash: "a858eee4b2753915ec84d2ffa098260c" + } + Frame { + msec: 784 + hash: "a858eee4b2753915ec84d2ffa098260c" + } + Frame { + msec: 800 + hash: "a858eee4b2753915ec84d2ffa098260c" + } + Frame { + msec: 816 + hash: "e8e6b7d7f81895ae556936ba5e0848a5" + } + Frame { + msec: 832 + hash: "b6ee5f74a5e91bcf6b9aad3cbb5d683f" + } + Frame { + msec: 848 + hash: "b6ee5f74a5e91bcf6b9aad3cbb5d683f" + } + Frame { + msec: 864 + hash: "02e3d071d5fc0832041688950d3610b8" + } + Frame { + msec: 880 + hash: "aad38d9678bdeeed750f381a40e22a61" + } + Frame { + msec: 896 + hash: "a8753ac7d026d94224c488fa16d5774a" + } + Frame { + msec: 912 + hash: "9de26e2d70bd285116df820ca87c2e4d" + } + Frame { + msec: 928 + hash: "985c6ee9cb5f259135a4eeb3c2f1d271" + } + Frame { + msec: 944 + hash: "985c6ee9cb5f259135a4eeb3c2f1d271" + } + Frame { + msec: 960 + hash: "4ba1bf769de9bc45630485d06642dc30" + } + Frame { + msec: 976 + image: "propertyAction-visual.1.png" + } + Frame { + msec: 992 + hash: "4ba1bf769de9bc45630485d06642dc30" + } + Frame { + msec: 1008 + hash: "9dbe8b62ec467f5b95b4bb8ab9fbab68" + } + Frame { + msec: 1024 + hash: "9dbe8b62ec467f5b95b4bb8ab9fbab68" + } + Frame { + msec: 1040 + hash: "81c157daf3086b21ea2ba39277a31f3d" + } + Frame { + msec: 1056 + hash: "a19d2e389a71472929fed6691dbe40ec" + } + Frame { + msec: 1072 + hash: "0fc67582f36db63dc3df1027bf7ad90b" + } + Frame { + msec: 1088 + hash: "c53f1a42113fdc2e525c43460ed40f81" + } + Frame { + msec: 1104 + hash: "c8968753e599419bc2d70adb95b643f2" + } + Frame { + msec: 1120 + hash: "449fbda0dc3e45d022832f9d15203466" + } + Frame { + msec: 1136 + hash: "7778e32071419dd53920536bac1eb21a" + } + Frame { + msec: 1152 + hash: "279510c6ca5429a22855a08e88a1b4b5" + } + Frame { + msec: 1168 + hash: "ac86ca53dc52c7c54bd993faa2daf0b9" + } + Frame { + msec: 1184 + hash: "7e20361da8a49f9699e290673bdd60ee" + } + Frame { + msec: 1200 + hash: "aa5f6e188212cee2dbf8d1e52692ac88" + } + Frame { + msec: 1216 + hash: "14018d9d2370c46b5f0c280cb169225e" + } + Frame { + msec: 1232 + hash: "29ad10997d8045ccfd69fe78475dd2f3" + } + Frame { + msec: 1248 + hash: "29ad10997d8045ccfd69fe78475dd2f3" + } + Frame { + msec: 1264 + hash: "29ad10997d8045ccfd69fe78475dd2f3" + } + Frame { + msec: 1280 + hash: "29ad10997d8045ccfd69fe78475dd2f3" + } + Frame { + msec: 1296 + hash: "29ad10997d8045ccfd69fe78475dd2f3" + } + Frame { + msec: 1312 + hash: "29ad10997d8045ccfd69fe78475dd2f3" + } + Frame { + msec: 1328 + hash: "29ad10997d8045ccfd69fe78475dd2f3" + } + Frame { + msec: 1344 + hash: "29ad10997d8045ccfd69fe78475dd2f3" + } + Frame { + msec: 1360 + hash: "29ad10997d8045ccfd69fe78475dd2f3" + } + Frame { + msec: 1376 + hash: "29ad10997d8045ccfd69fe78475dd2f3" + } + Frame { + msec: 1392 + hash: "29ad10997d8045ccfd69fe78475dd2f3" + } + Frame { + msec: 1408 + hash: "29ad10997d8045ccfd69fe78475dd2f3" + } + Frame { + msec: 1424 + hash: "29ad10997d8045ccfd69fe78475dd2f3" + } + Frame { + msec: 1440 + hash: "29ad10997d8045ccfd69fe78475dd2f3" + } + Frame { + msec: 1456 + hash: "29ad10997d8045ccfd69fe78475dd2f3" + } + Frame { + msec: 1472 + hash: "29ad10997d8045ccfd69fe78475dd2f3" + } + Frame { + msec: 1488 + hash: "29ad10997d8045ccfd69fe78475dd2f3" + } + Frame { + msec: 1504 + hash: "29ad10997d8045ccfd69fe78475dd2f3" + } + Frame { + msec: 1520 + hash: "29ad10997d8045ccfd69fe78475dd2f3" + } + Frame { + msec: 1536 + hash: "29ad10997d8045ccfd69fe78475dd2f3" + } + Frame { + msec: 1552 + hash: "29ad10997d8045ccfd69fe78475dd2f3" + } + Frame { + msec: 1568 + hash: "29ad10997d8045ccfd69fe78475dd2f3" + } + Frame { + msec: 1584 + hash: "29ad10997d8045ccfd69fe78475dd2f3" + } + Frame { + msec: 1600 + hash: "29ad10997d8045ccfd69fe78475dd2f3" + } + Frame { + msec: 1616 + hash: "29ad10997d8045ccfd69fe78475dd2f3" + } + Frame { + msec: 1632 + hash: "29ad10997d8045ccfd69fe78475dd2f3" + } + Frame { + msec: 1648 + hash: "29ad10997d8045ccfd69fe78475dd2f3" + } + Frame { + msec: 1664 + hash: "29ad10997d8045ccfd69fe78475dd2f3" + } + Frame { + msec: 1680 + hash: "29ad10997d8045ccfd69fe78475dd2f3" + } + Frame { + msec: 1696 + hash: "29ad10997d8045ccfd69fe78475dd2f3" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 27; y: 19 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1712 + hash: "29ad10997d8045ccfd69fe78475dd2f3" + } + Frame { + msec: 1728 + hash: "29ad10997d8045ccfd69fe78475dd2f3" + } + Frame { + msec: 1744 + hash: "7b99c5dd3750291043f62479314ccb2f" + } + Frame { + msec: 1760 + hash: "d3409cf579db724440f3f59cfc902974" + } + Frame { + msec: 1776 + hash: "2ad2a4b3f933e3a27acb232adf06eb7f" + } + Frame { + msec: 1792 + hash: "35074cf4f2753c77e112092e92630c71" + } + Frame { + msec: 1808 + hash: "f7038f7e6d7b6498ff1a4098c79f9d2a" + } + Frame { + msec: 1824 + hash: "fec23135661d2368cf3cf64f7d62af73" + } + Frame { + msec: 1840 + hash: "4143603bf203319f423d21f204fac3b0" + } + Frame { + msec: 1856 + hash: "f3d41bdc8ae60f6fbf109206ac9023de" + } + Frame { + msec: 1872 + hash: "41064ea276aabfba45966130d2ec4b06" + } + Frame { + msec: 1888 + hash: "dfbe242fc8bc3c70207be901ac2db139" + } + Frame { + msec: 1904 + hash: "a8a9f435774def4255ae433646cc5263" + } + Frame { + msec: 1920 + hash: "81c157daf3086b21ea2ba39277a31f3d" + } + Frame { + msec: 1936 + image: "propertyAction-visual.2.png" + } + Frame { + msec: 1952 + hash: "9dbe8b62ec467f5b95b4bb8ab9fbab68" + } + Frame { + msec: 1968 + hash: "4ba1bf769de9bc45630485d06642dc30" + } + Frame { + msec: 1984 + hash: "4ba1bf769de9bc45630485d06642dc30" + } + Frame { + msec: 2000 + hash: "4ba1bf769de9bc45630485d06642dc30" + } + Frame { + msec: 2016 + hash: "4ba1bf769de9bc45630485d06642dc30" + } + Frame { + msec: 2032 + hash: "985c6ee9cb5f259135a4eeb3c2f1d271" + } + Frame { + msec: 2048 + hash: "9de26e2d70bd285116df820ca87c2e4d" + } + Frame { + msec: 2064 + hash: "a8753ac7d026d94224c488fa16d5774a" + } + Frame { + msec: 2080 + hash: "aad38d9678bdeeed750f381a40e22a61" + } + Frame { + msec: 2096 + hash: "abddb88af9b07e782f6c2103479abe3d" + } + Frame { + msec: 2112 + hash: "02e3d071d5fc0832041688950d3610b8" + } + Frame { + msec: 2128 + hash: "b6ee5f74a5e91bcf6b9aad3cbb5d683f" + } + Frame { + msec: 2144 + hash: "e8e6b7d7f81895ae556936ba5e0848a5" + } + Frame { + msec: 2160 + hash: "a858eee4b2753915ec84d2ffa098260c" + } + Frame { + msec: 2176 + hash: "a858eee4b2753915ec84d2ffa098260c" + } + Frame { + msec: 2192 + hash: "a858eee4b2753915ec84d2ffa098260c" + } + Frame { + msec: 2208 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2224 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2240 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2256 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2272 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2288 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2304 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2320 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2336 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2352 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2368 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2384 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2400 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2416 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2432 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2448 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2464 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2480 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2496 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2512 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2528 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2544 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2560 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2576 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2592 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2608 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2624 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2640 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2656 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2672 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2688 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2704 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2720 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2736 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2752 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2768 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2784 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2800 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2816 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2832 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2848 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2864 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2880 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2896 + image: "propertyAction-visual.3.png" + } + Frame { + msec: 2912 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2928 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2944 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2960 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2976 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 2992 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 3008 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 3024 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 3040 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 3056 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 3072 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 3088 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 3104 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 3120 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 3136 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 3152 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } + Frame { + msec: 3168 + hash: "1e5ac43e0f553886bcb2b4016f7e3414" + } +} diff --git a/tests/auto/declarative/qmlvisual/animation/propertyAction/propertyAction-visual.qml b/tests/auto/declarative/qmlvisual/animation/propertyAction/propertyAction-visual.qml new file mode 100644 index 00000000..3ff4214d --- /dev/null +++ b/tests/auto/declarative/qmlvisual/animation/propertyAction/propertyAction-visual.qml @@ -0,0 +1,40 @@ +import QtQuick 1.0 + +/* +This test starts with a 30x40 rectangle at 0,0. It should animate a width change to 40, +then jump 50 pixels right, and then animate moving 50 pixels down. Afer this it should +do an exact visual reversal (animate up 50 pixels, jump left 50 pixels, and then animate +a change back to 30px wide). +*/ + +Rectangle { + width: 100; height: 100 + Rectangle { + id: myRect + width: 30; height: 40 + color: "red" + } + MouseArea { + id: clickable + anchors.fill: parent + } + + states: State { + name: "state1" + when: clickable.pressed + PropertyChanges { + target: myRect + x: 50; y: 50; width: 40 + } + } + + transitions: Transition { + to: "state1" + reversible: true + SequentialAnimation { + NumberAnimation { properties: "width"; easing.type: "InOutQuad" } + PropertyAction { properties: "x" } + NumberAnimation { properties: "y"; easing.type: "InOutQuad" } + } + } +} diff --git a/tests/auto/declarative/qmlvisual/animation/qtbug10586/data/qtbug10586.0.png b/tests/auto/declarative/qmlvisual/animation/qtbug10586/data/qtbug10586.0.png new file mode 100644 index 00000000..4af17441 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/qtbug10586/data/qtbug10586.0.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/qtbug10586/data/qtbug10586.1.png b/tests/auto/declarative/qmlvisual/animation/qtbug10586/data/qtbug10586.1.png new file mode 100644 index 00000000..29ca02a8 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/qtbug10586/data/qtbug10586.1.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/qtbug10586/data/qtbug10586.2.png b/tests/auto/declarative/qmlvisual/animation/qtbug10586/data/qtbug10586.2.png new file mode 100644 index 00000000..c7da3597 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/qtbug10586/data/qtbug10586.2.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/qtbug10586/data/qtbug10586.3.png b/tests/auto/declarative/qmlvisual/animation/qtbug10586/data/qtbug10586.3.png new file mode 100644 index 00000000..7373951f Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/qtbug10586/data/qtbug10586.3.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/qtbug10586/data/qtbug10586.4.png b/tests/auto/declarative/qmlvisual/animation/qtbug10586/data/qtbug10586.4.png new file mode 100644 index 00000000..85524061 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/qtbug10586/data/qtbug10586.4.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/qtbug10586/data/qtbug10586.qml b/tests/auto/declarative/qmlvisual/animation/qtbug10586/data/qtbug10586.qml new file mode 100644 index 00000000..05b5c995 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/animation/qtbug10586/data/qtbug10586.qml @@ -0,0 +1,1107 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "qtbug10586.0.png" + } + Frame { + msec: 32 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 48 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 64 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 80 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 96 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 112 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 128 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 144 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 160 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 176 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 192 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 208 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 224 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 240 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 256 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 272 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 288 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 304 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 320 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 336 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 352 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 368 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 384 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 400 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 416 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 432 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 448 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 464 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 480 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 496 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 512 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 528 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 544 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 560 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 576 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 592 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 608 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 624 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 640 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 656 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 672 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 688 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 704 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 155; y: 261 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 154; y: 260 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 720 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 153; y: 260 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 144; y: 258 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 736 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 126; y: 254 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 105; y: 249 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 752 + hash: "3e70a9fcacf40284c4bbf6a8376edfec" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 76; y: 247 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 51; y: 245 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 768 + hash: "3b65fbe0980fabd4bcba5757323c8fcf" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 20; y: 243 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -25; y: 241 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 784 + hash: "0a79d810c2ff479fcc42d40125f6ccda" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -68; y: 238 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: -68; y: 238 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 800 + hash: "9e5b85c715a2a573f0dd3bc7e342625f" + } + Frame { + msec: 816 + hash: "371faa0d3bb3815470ef48713f0363b6" + } + Frame { + msec: 832 + hash: "2f948f765ec2d861841439f03e402bcf" + } + Frame { + msec: 848 + hash: "74dbda8d6d005fb8fb307fc4cf146e1e" + } + Frame { + msec: 864 + hash: "bdf1f0db0411a3456ddc0efff0584e9c" + } + Frame { + msec: 880 + hash: "cb5c7c9fc7e4707f1d8b7bbb9f19065d" + } + Frame { + msec: 896 + hash: "f60df4e47f5b9d16b576ab4107a0c11c" + } + Frame { + msec: 912 + hash: "6fcc1b9d2d1829c48cdfefba632c6a91" + } + Frame { + msec: 928 + hash: "e53272919fa23f7023ce66d3b15c2f05" + } + Frame { + msec: 944 + hash: "dc043143bf35a808fcdf2b692753dc86" + } + Frame { + msec: 960 + hash: "dff3c85f1bb42138410e9db7be98425b" + } + Frame { + msec: 976 + image: "qtbug10586.1.png" + } + Frame { + msec: 992 + hash: "d4122caf5fc8cfd59e6048b830acc3fb" + } + Frame { + msec: 1008 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 1024 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 1040 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 1056 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 1072 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 1088 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 1104 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 1120 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 1136 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 1152 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 1168 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 1184 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 1200 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 1216 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 1232 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 1248 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 1264 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 1280 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 1296 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 1312 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 1328 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 1344 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 1360 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 1376 + hash: "be218d7ebfb01cf288b284cf40337913" + } + Frame { + msec: 1392 + hash: "bd1af1e9187a58841b33862047ad4ae3" + } + Frame { + msec: 1408 + hash: "6154c00e9290393daaf1e7a0618874c7" + } + Frame { + msec: 1424 + hash: "6ed42be04df8a4cc15d9d885e4b157f5" + } + Frame { + msec: 1440 + hash: "2187c8e798b2b60567284af6923a9418" + } + Frame { + msec: 1456 + hash: "39ef8ac3108be3c5b8c85aaa06539952" + } + Frame { + msec: 1472 + hash: "a30c2d3bbebdf3ae84c8148dfff53abf" + } + Frame { + msec: 1488 + hash: "f9b5ef6675c326a3c6462f8ad173c875" + } + Frame { + msec: 1504 + hash: "eab82ad570e59a68c41450df5146aea6" + } + Frame { + msec: 1520 + hash: "2caf2dae27a5603de6665c1cafbe6576" + } + Frame { + msec: 1536 + hash: "601b397404250d01ec9e483683c32776" + } + Frame { + msec: 1552 + hash: "06dd6ec2e0f016fc0cb6bbce27e3dcd3" + } + Frame { + msec: 1568 + hash: "9ebba3740bb33db00ebb62706e1d27a5" + } + Frame { + msec: 1584 + hash: "9ebba3740bb33db00ebb62706e1d27a5" + } + Frame { + msec: 1600 + hash: "06dd6ec2e0f016fc0cb6bbce27e3dcd3" + } + Frame { + msec: 1616 + hash: "601b397404250d01ec9e483683c32776" + } + Frame { + msec: 1632 + hash: "a80dcdc8ce2c4e2653e01423ea053eba" + } + Frame { + msec: 1648 + hash: "8fe7230266084f07f8fd9c6991461163" + } + Frame { + msec: 1664 + hash: "5d9ed702af5c520f4b268077b957586a" + } + Frame { + msec: 1680 + hash: "6cccabc3a6ac3eef95794e6712404234" + } + Frame { + msec: 1696 + hash: "8bfc492064d6c93727b59fd3ca2a8dc8" + } + Frame { + msec: 1712 + hash: "e506cf18d730f4ab1e8e803b7663238a" + } + Frame { + msec: 1728 + hash: "2187c8e798b2b60567284af6923a9418" + } + Frame { + msec: 1744 + hash: "6ed42be04df8a4cc15d9d885e4b157f5" + } + Frame { + msec: 1760 + hash: "b887f64a8e44a243f11e37692d54d2d1" + } + Frame { + msec: 1776 + hash: "d5f157d073cd8de8cc58124455a38675" + } + Frame { + msec: 1792 + hash: "d39f213d4b91229bd76d48589a067623" + } + Frame { + msec: 1808 + hash: "7b2413f4fd12fd4d38fc40ebbbd893f3" + } + Frame { + msec: 1824 + hash: "bd1af1e9187a58841b33862047ad4ae3" + } + Frame { + msec: 1840 + hash: "1e54f1b5ef6bb7085a36d433af94a9b3" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 145; y: 286 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 166; y: 286 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 195; y: 288 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1856 + hash: "d84bf962449716cc64cb34b285926c48" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 224; y: 290 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 253; y: 290 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1872 + hash: "d84bf962449716cc64cb34b285926c48" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 286; y: 292 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 315; y: 292 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1888 + hash: "d84bf962449716cc64cb34b285926c48" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 346; y: 294 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 385; y: 294 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1904 + hash: "d84bf962449716cc64cb34b285926c48" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 420; y: 294 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 420; y: 294 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1920 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 1936 + image: "qtbug10586.2.png" + } + Frame { + msec: 1952 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 1968 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 1984 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 2000 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 2016 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 2032 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 2048 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 2064 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 2080 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 2096 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 2112 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 2128 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 2144 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 2160 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 2176 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 2192 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 2208 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 2224 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 2240 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 2256 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 2272 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 2288 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 2304 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 2320 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 2336 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 2352 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 2368 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 2384 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 2400 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 2416 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 2432 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 2448 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 2464 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 2480 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 2496 + hash: "d84bf962449716cc64cb34b285926c48" + } + Frame { + msec: 2512 + hash: "4c6ff9097308cb3840ef39a081bdc94f" + } + Frame { + msec: 2528 + hash: "93a2b229f21b76354a8cf94f150c69e2" + } + Frame { + msec: 2544 + hash: "e65350b411affe4274499fd577ccf842" + } + Frame { + msec: 2560 + hash: "499968d33068c7e08898a19cce691766" + } + Frame { + msec: 2576 + hash: "fe884e410a8c7b2167f814ebdf7700af" + } + Frame { + msec: 2592 + hash: "c0225009d42b670f5f1ce0871be90db6" + } + Frame { + msec: 2608 + hash: "320d205e147fa6470d71538d686ff458" + } + Frame { + msec: 2624 + hash: "ec0a1fa273e6568d041ee2497a715704" + } + Frame { + msec: 2640 + hash: "159c558e0d1b59db8e9459c4203d56f3" + } + Frame { + msec: 2656 + hash: "00d237cd7ad6df807b4f9281bbc72992" + } + Frame { + msec: 2672 + hash: "c472991635460a93f744538328cd89f4" + } + Frame { + msec: 2688 + hash: "318ba06f590d4e3a1dea6affcc60243b" + } + Frame { + msec: 2704 + hash: "d344b62df42e88e14d45def62565791a" + } + Frame { + msec: 2720 + hash: "5c2658568080a663440e09acbcf2fa8d" + } + Frame { + msec: 2736 + hash: "8e64867dabeaeae51149362c5f42545b" + } + Frame { + msec: 2752 + hash: "abd81e11370469803bad5de9a9c77f63" + } + Frame { + msec: 2768 + hash: "1cce356ebd61d7c88edb84c58a564def" + } + Frame { + msec: 2784 + hash: "0ab027423651612ceba2b35e57d75d91" + } + Frame { + msec: 2800 + hash: "515b6375cf0fefc8580d62cd5b2680f7" + } + Frame { + msec: 2816 + hash: "f44c12b701e73a7e4d35fd10ea0f5003" + } + Frame { + msec: 2832 + hash: "76bee658c9915fda03967fcb2e595683" + } + Frame { + msec: 2848 + hash: "064d5525e1fa7c8ec5f571a56e666754" + } + Frame { + msec: 2864 + hash: "ffd23fa2b1281cd120d6b11912bb8641" + } + Frame { + msec: 2880 + hash: "7454984bc5316de021b87d04daf0e8bb" + } + Frame { + msec: 2896 + image: "qtbug10586.3.png" + } + Frame { + msec: 2912 + hash: "1fcf6b150607c0ea807026f8f9e28f61" + } + Frame { + msec: 2928 + hash: "e16a333231b3c65c85ff498e941f8c05" + } + Frame { + msec: 2944 + hash: "3e49589f1b4a6b8212f5c10d234f8ffa" + } + Frame { + msec: 2960 + hash: "02ce2b719ddbd977bb933882a40024f5" + } + Frame { + msec: 2976 + hash: "a161119d1f022885db1af71ededa2b8c" + } + Frame { + msec: 2992 + hash: "62a006aab9629dc1e8359c52664ee34b" + } + Frame { + msec: 3008 + hash: "62a006aab9629dc1e8359c52664ee34b" + } + Frame { + msec: 3024 + hash: "b98a2c58933bd4f49ed7a1d72bff7e66" + } + Frame { + msec: 3040 + hash: "b98a2c58933bd4f49ed7a1d72bff7e66" + } + Frame { + msec: 3056 + hash: "b98a2c58933bd4f49ed7a1d72bff7e66" + } + Frame { + msec: 3072 + hash: "b98a2c58933bd4f49ed7a1d72bff7e66" + } + Frame { + msec: 3088 + hash: "b98a2c58933bd4f49ed7a1d72bff7e66" + } + Frame { + msec: 3104 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3120 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3136 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3152 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3168 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3184 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3200 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3216 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3232 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3248 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3264 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3280 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3296 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3312 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3328 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3344 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3360 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3376 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3392 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3408 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3424 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3440 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3456 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3472 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3488 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3504 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3520 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3536 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3552 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3568 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3584 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3600 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3616 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3632 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3648 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } + Frame { + msec: 3664 + hash: "0755ae54acb6af587bbf7ca509146e0f" + } +} diff --git a/tests/auto/declarative/qmlvisual/animation/qtbug10586/qtbug10586.qml b/tests/auto/declarative/qmlvisual/animation/qtbug10586/qtbug10586.qml new file mode 100644 index 00000000..65caedda --- /dev/null +++ b/tests/auto/declarative/qmlvisual/animation/qtbug10586/qtbug10586.qml @@ -0,0 +1,23 @@ +import QtQuick 1.0 + +/* This test checks that animations do occur while the flickable is flicking */ +Rectangle { + width: 200 + height: 400 + Flickable { + id: flick + anchors.fill: parent + contentWidth: 1000; contentHeight: parent.height + Rectangle { + border.color: "black" + border.width: 10 + width: 1000; height: 1000 + } + } + Rectangle { + color: "red" + width: 100; height: 100 + y: flick.contentX < 10 ? 300 : 0 + Behavior on y { NumberAnimation {} } + } +} diff --git a/tests/auto/declarative/qmlvisual/animation/qtbug13398/data/qtbug13398.0.png b/tests/auto/declarative/qmlvisual/animation/qtbug13398/data/qtbug13398.0.png new file mode 100644 index 00000000..29f7c750 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/qtbug13398/data/qtbug13398.0.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/qtbug13398/data/qtbug13398.1.png b/tests/auto/declarative/qmlvisual/animation/qtbug13398/data/qtbug13398.1.png new file mode 100644 index 00000000..d9a99596 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/qtbug13398/data/qtbug13398.1.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/qtbug13398/data/qtbug13398.qml b/tests/auto/declarative/qmlvisual/animation/qtbug13398/data/qtbug13398.qml new file mode 100644 index 00000000..179dbc97 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/animation/qtbug13398/data/qtbug13398.qml @@ -0,0 +1,447 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "qtbug13398.0.png" + } + Frame { + msec: 32 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Frame { + msec: 48 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Frame { + msec: 64 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Frame { + msec: 80 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Frame { + msec: 96 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Frame { + msec: 112 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Frame { + msec: 128 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Frame { + msec: 144 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Frame { + msec: 160 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Frame { + msec: 176 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Frame { + msec: 192 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Frame { + msec: 208 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Frame { + msec: 224 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Frame { + msec: 240 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Frame { + msec: 256 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Frame { + msec: 272 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Frame { + msec: 288 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Frame { + msec: 304 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Frame { + msec: 320 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Frame { + msec: 336 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Frame { + msec: 352 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Frame { + msec: 368 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Frame { + msec: 384 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Frame { + msec: 400 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Frame { + msec: 416 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Frame { + msec: 432 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Frame { + msec: 448 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Frame { + msec: 464 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Frame { + msec: 480 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Frame { + msec: 496 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 220; y: 270 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 512 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Frame { + msec: 528 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Frame { + msec: 544 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Frame { + msec: 560 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Frame { + msec: 576 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 220; y: 271 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 220; y: 271 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 592 + hash: "2452007928bf86b9c42e666c7a7afc89" + } + Frame { + msec: 608 + hash: "96e8e81d61bffe02b8f41f47a4a7e8fc" + } + Frame { + msec: 624 + hash: "75881a2779bd7d7f683f87c4a7393769" + } + Frame { + msec: 640 + hash: "2ef628328d2a6393095e78db80b0513f" + } + Frame { + msec: 656 + hash: "390926f2c2c27dfa10c9b393ee466ce6" + } + Frame { + msec: 672 + hash: "ea07d93e7d8a53f56cff19d9d3b282a4" + } + Frame { + msec: 688 + hash: "8aa6be919b1ef4b7e102a319a453707e" + } + Frame { + msec: 704 + hash: "6ebc518fb53ffe42fca20b9f16a21b36" + } + Frame { + msec: 720 + hash: "ee7a93b157e24e22efa84604e7e44fe6" + } + Frame { + msec: 736 + hash: "de3bf8f67e51b036db4976fd3b4b6c3c" + } + Frame { + msec: 752 + hash: "648be4298ebe3bbc7e5c4a4c9c46f193" + } + Frame { + msec: 768 + hash: "1ccf3b73e22a4b98ce1df098af9466f2" + } + Frame { + msec: 784 + hash: "73a2fb047728b2b8e613f0fb8dfe429d" + } + Frame { + msec: 800 + hash: "bbb4cabec4b98ea8ca94dff91a0d8c99" + } + Frame { + msec: 816 + hash: "3337e86bd9fcfbce939389928fb1fb72" + } + Frame { + msec: 832 + hash: "cb4a2a330e8470c61de9e9b6d2dc4597" + } + Frame { + msec: 848 + hash: "e09a359578935b988ac1cc8c40b25547" + } + Frame { + msec: 864 + hash: "e09a359578935b988ac1cc8c40b25547" + } + Frame { + msec: 880 + hash: "e09a359578935b988ac1cc8c40b25547" + } + Frame { + msec: 896 + hash: "e09a359578935b988ac1cc8c40b25547" + } + Frame { + msec: 912 + hash: "e09a359578935b988ac1cc8c40b25547" + } + Frame { + msec: 928 + hash: "e09a359578935b988ac1cc8c40b25547" + } + Frame { + msec: 944 + hash: "e09a359578935b988ac1cc8c40b25547" + } + Frame { + msec: 960 + hash: "e09a359578935b988ac1cc8c40b25547" + } + Frame { + msec: 976 + image: "qtbug13398.1.png" + } + Frame { + msec: 992 + hash: "e09a359578935b988ac1cc8c40b25547" + } + Frame { + msec: 1008 + hash: "e09a359578935b988ac1cc8c40b25547" + } + Frame { + msec: 1024 + hash: "e09a359578935b988ac1cc8c40b25547" + } + Frame { + msec: 1040 + hash: "e09a359578935b988ac1cc8c40b25547" + } + Frame { + msec: 1056 + hash: "e09a359578935b988ac1cc8c40b25547" + } + Frame { + msec: 1072 + hash: "e09a359578935b988ac1cc8c40b25547" + } + Frame { + msec: 1088 + hash: "e09a359578935b988ac1cc8c40b25547" + } + Frame { + msec: 1104 + hash: "e09a359578935b988ac1cc8c40b25547" + } + Frame { + msec: 1120 + hash: "e09a359578935b988ac1cc8c40b25547" + } + Frame { + msec: 1136 + hash: "e09a359578935b988ac1cc8c40b25547" + } + Frame { + msec: 1152 + hash: "e09a359578935b988ac1cc8c40b25547" + } + Frame { + msec: 1168 + hash: "e09a359578935b988ac1cc8c40b25547" + } + Frame { + msec: 1184 + hash: "e09a359578935b988ac1cc8c40b25547" + } + Frame { + msec: 1200 + hash: "e09a359578935b988ac1cc8c40b25547" + } + Frame { + msec: 1216 + hash: "e09a359578935b988ac1cc8c40b25547" + } + Frame { + msec: 1232 + hash: "e09a359578935b988ac1cc8c40b25547" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 220; y: 271 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1248 + hash: "e09a359578935b988ac1cc8c40b25547" + } + Frame { + msec: 1264 + hash: "e09a359578935b988ac1cc8c40b25547" + } + Frame { + msec: 1280 + hash: "e09a359578935b988ac1cc8c40b25547" + } + Frame { + msec: 1296 + hash: "e09a359578935b988ac1cc8c40b25547" + } + Frame { + msec: 1312 + hash: "e09a359578935b988ac1cc8c40b25547" + } + Frame { + msec: 1328 + hash: "e09a359578935b988ac1cc8c40b25547" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 220; y: 271 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1344 + hash: "e09a359578935b988ac1cc8c40b25547" + } + Frame { + msec: 1360 + hash: "697a4fd182ff90cd557f224174bad43a" + } + Frame { + msec: 1376 + hash: "99e5ca9a77df1acfed628f31b9050179" + } + Frame { + msec: 1392 + hash: "1f0dc00d3e3536b40a6becf775b31cee" + } + Frame { + msec: 1408 + hash: "5b81ddd35d74be222bc8a40d2573884b" + } + Frame { + msec: 1424 + hash: "4e236f5de69048e87add0e4380f2c3e6" + } + Frame { + msec: 1440 + hash: "a901c9c0c77e03d98a2b95267cca8514" + } + Frame { + msec: 1456 + hash: "78bbdf6781c2968c67982ffdb747dbbe" + } + Frame { + msec: 1472 + hash: "a245ca593649f60980be982eb8fda57e" + } + Frame { + msec: 1488 + hash: "c27fddc147749da24eaeb92aeaf61738" + } + Frame { + msec: 1504 + hash: "b9674af46b618dc1eedabd4f18253b11" + } + Frame { + msec: 1520 + hash: "8ae3c0cc0888fd0a607bc5b537a9ce0a" + } + Frame { + msec: 1536 + hash: "f1981bd3fb08233622a4078e2f717011" + } + Frame { + msec: 1552 + hash: "4dce834c9e3988fe535391fedc942add" + } + Frame { + msec: 1568 + hash: "ca7356dee61e156d04b0b46ea033498e" + } + Frame { + msec: 1584 + hash: "97499f6e04cbe690bc12458aef4b66a5" + } + Frame { + msec: 1600 + hash: "2452007928bf86b9c42e666c7a7afc89" + } +} diff --git a/tests/auto/declarative/qmlvisual/animation/qtbug13398/qtbug13398.qml b/tests/auto/declarative/qmlvisual/animation/qtbug13398/qtbug13398.qml new file mode 100644 index 00000000..93ecd2eb --- /dev/null +++ b/tests/auto/declarative/qmlvisual/animation/qtbug13398/qtbug13398.qml @@ -0,0 +1,68 @@ +import QtQuick 1.0 + +Item { + width: 300 + height: 400 + + Rectangle { + id: root + color: "darkkhaki" + + x: 50 + y: 50 + + width: 200 + height: 300 + + Rectangle { + id: statusbar + color: "chocolate" + + height: 30 + + anchors.top: root.top + anchors.left: root.left + anchors.right: root.right + } + + Rectangle { + id: titlebar + color: "crimson" + + height: 60 + + anchors.top: statusbar.bottom + anchors.left: root.left + anchors.right: root.right + } + + MouseArea { + anchors.fill: parent + onClicked: { + root.state = root.state ? "" : "fullscreen"; + } + } + + states: [ + State { + name: "fullscreen" + AnchorChanges { + target: statusbar + anchors.top: undefined + anchors.bottom: titlebar.top + } + AnchorChanges { + target: titlebar + anchors.top: undefined + anchors.bottom: root.top + } + } + ] + + transitions: [ + Transition { + AnchorAnimation { } + } + ] + } +} diff --git a/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.0.png b/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.0.png new file mode 100644 index 00000000..f08e0489 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.0.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.1.png b/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.1.png new file mode 100644 index 00000000..f08e0489 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.1.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.2.png b/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.2.png new file mode 100644 index 00000000..9fb2be5e Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.2.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.3.png b/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.3.png new file mode 100644 index 00000000..d229e872 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.3.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.4.png b/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.4.png new file mode 100644 index 00000000..f08e0489 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.4.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.5.png b/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.5.png new file mode 100644 index 00000000..7d1d2cda Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.5.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.6.png b/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.6.png new file mode 100644 index 00000000..b537ace2 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.6.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.7.png b/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.7.png new file mode 100644 index 00000000..f08e0489 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.7.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.8.png b/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.8.png new file mode 100644 index 00000000..d229e872 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.8.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.9.png b/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.9.png new file mode 100644 index 00000000..432f8144 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.9.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.qml b/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.qml new file mode 100644 index 00000000..5146be21 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/animation/reanchor/data/reanchor.qml @@ -0,0 +1,2471 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "reanchor.0.png" + } + Frame { + msec: 32 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 48 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 64 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 80 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 96 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 112 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 128 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 144 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 160 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 176 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 192 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 208 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 224 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 240 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 256 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 272 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 288 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 304 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 320 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 336 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 352 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 368 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 384 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 400 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 416 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 432 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 448 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 464 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 480 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 496 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 512 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 528 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 544 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 560 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 576 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 592 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 608 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 624 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 640 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 656 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 672 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 688 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 704 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 720 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 736 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 752 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 768 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 784 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 800 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 816 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 832 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 848 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 864 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 880 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 896 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 912 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 928 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 944 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 960 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 976 + image: "reanchor.1.png" + } + Frame { + msec: 992 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 1008 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 1024 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 1040 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 1056 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 1072 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 1088 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 1104 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 1120 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 1136 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 1152 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 1168 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 1184 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 1200 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 1216 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 1232 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 1248 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 1264 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 1280 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 1296 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 1312 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 1328 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 1344 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 1360 + hash: "213811853dbefdc418099721e3bf8651" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 88; y: 115 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1376 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 1392 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 1408 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 1424 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 1440 + hash: "213811853dbefdc418099721e3bf8651" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 88; y: 115 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1456 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 1472 + hash: "eb3eeb37ab7b26692cbf100adfaf3772" + } + Frame { + msec: 1488 + hash: "e1a8cdcb1f3ec097a968b3b20964c6e8" + } + Frame { + msec: 1504 + hash: "44fc52479251327d0612de17ddb056eb" + } + Frame { + msec: 1520 + hash: "fa7e4a910aa60500575a34852c0c7cb8" + } + Frame { + msec: 1536 + hash: "66d205a02e35221e7684ab995acc1312" + } + Frame { + msec: 1552 + hash: "4ebe8dba6d9f3179b610b2298a7484a2" + } + Frame { + msec: 1568 + hash: "9b2582fccffa34fe389ba427ce47619a" + } + Frame { + msec: 1584 + hash: "e6f15478bda9995f82976b9e16659c8e" + } + Frame { + msec: 1600 + hash: "f08df0885fff04819ada6c10b25dd489" + } + Frame { + msec: 1616 + hash: "0f57c152306747cfa27171f1947ca65d" + } + Frame { + msec: 1632 + hash: "89d9c988abd55063e210b81193c6a8f0" + } + Frame { + msec: 1648 + hash: "91e0d0a5d57210c790c2d2399d1f7022" + } + Frame { + msec: 1664 + hash: "267874fdc09459b3e854c06d9ae99a54" + } + Frame { + msec: 1680 + hash: "2f58a508f439c40c6f2bd7da1f30deff" + } + Frame { + msec: 1696 + hash: "1451548d9f0002a6c4765cb616ab7f59" + } + Frame { + msec: 1712 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 1728 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 1744 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 1760 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 1776 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 1792 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 1808 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 1824 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 1840 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 1856 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 1872 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 1888 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 1904 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 1920 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 1936 + image: "reanchor.2.png" + } + Frame { + msec: 1952 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 1968 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 1984 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 2000 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 2016 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 2032 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 2048 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 2064 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 2080 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 2096 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 87; y: 114 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2112 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 2128 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 2144 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 2160 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 2176 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 2192 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 2208 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 87; y: 114 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2224 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 2240 + hash: "8ceca291e28f52368346f171c2f31664" + } + Frame { + msec: 2256 + hash: "903877286f3ef112e6a661abde5c17bd" + } + Frame { + msec: 2272 + hash: "cc2d15c96571f9328b929f96849c8f9e" + } + Frame { + msec: 2288 + hash: "26e6c03b1b91b725d6e0fe9216a7413e" + } + Frame { + msec: 2304 + hash: "213e8e9905bea32ddb97d38b75cd19cc" + } + Frame { + msec: 2320 + hash: "17d5726a282d42fcde7796be84606fcd" + } + Frame { + msec: 2336 + hash: "f4629bf9f5837f687ae49008c9d28d02" + } + Frame { + msec: 2352 + hash: "fbc927cb136d8d29b2578e78c4793e41" + } + Frame { + msec: 2368 + hash: "c7099e732490dd2f3205986a7c43a165" + } + Frame { + msec: 2384 + hash: "b3b464a8e67fab05109b49604f1ce705" + } + Frame { + msec: 2400 + hash: "7629b2a77f9f87aa0ef2535aa9b8d390" + } + Frame { + msec: 2416 + hash: "6a329c289236782e095cfa6f15409726" + } + Frame { + msec: 2432 + hash: "1cfbf6f4c292e1520b44d84dd59b93a8" + } + Frame { + msec: 2448 + hash: "a8d3d838bffb39053eb705aefcb39c46" + } + Frame { + msec: 2464 + hash: "a56ad66a949e07e3174a58c80145c85e" + } + Frame { + msec: 2480 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 2496 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 2512 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 2528 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 2544 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 2560 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 2576 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 2592 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 2608 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 2624 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 2640 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 2656 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 2672 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 2688 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 2704 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 2720 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 2736 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 2752 + hash: "213811853dbefdc418099721e3bf8651" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 87; y: 114 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2768 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 2784 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 2800 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 2816 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 2832 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 2848 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 2864 + hash: "213811853dbefdc418099721e3bf8651" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 87; y: 114 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2880 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 2896 + image: "reanchor.3.png" + } + Frame { + msec: 2912 + hash: "e1a8cdcb1f3ec097a968b3b20964c6e8" + } + Frame { + msec: 2928 + hash: "44fc52479251327d0612de17ddb056eb" + } + Frame { + msec: 2944 + hash: "fa7e4a910aa60500575a34852c0c7cb8" + } + Frame { + msec: 2960 + hash: "66d205a02e35221e7684ab995acc1312" + } + Frame { + msec: 2976 + hash: "4ebe8dba6d9f3179b610b2298a7484a2" + } + Frame { + msec: 2992 + hash: "9b2582fccffa34fe389ba427ce47619a" + } + Frame { + msec: 3008 + hash: "e6f15478bda9995f82976b9e16659c8e" + } + Frame { + msec: 3024 + hash: "f08df0885fff04819ada6c10b25dd489" + } + Frame { + msec: 3040 + hash: "0f57c152306747cfa27171f1947ca65d" + } + Frame { + msec: 3056 + hash: "89d9c988abd55063e210b81193c6a8f0" + } + Frame { + msec: 3072 + hash: "91e0d0a5d57210c790c2d2399d1f7022" + } + Frame { + msec: 3088 + hash: "267874fdc09459b3e854c06d9ae99a54" + } + Frame { + msec: 3104 + hash: "2f58a508f439c40c6f2bd7da1f30deff" + } + Frame { + msec: 3120 + hash: "1451548d9f0002a6c4765cb616ab7f59" + } + Frame { + msec: 3136 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 3152 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 3168 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 3184 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 3200 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 3216 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 3232 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 3248 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 3264 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 3280 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 3296 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 3312 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 3328 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 3344 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 3360 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 87; y: 114 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3376 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 3392 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 3408 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 3424 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 3440 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 3456 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 3472 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 87; y: 114 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3488 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 3504 + hash: "8ceca291e28f52368346f171c2f31664" + } + Frame { + msec: 3520 + hash: "903877286f3ef112e6a661abde5c17bd" + } + Frame { + msec: 3536 + hash: "cc2d15c96571f9328b929f96849c8f9e" + } + Frame { + msec: 3552 + hash: "26e6c03b1b91b725d6e0fe9216a7413e" + } + Frame { + msec: 3568 + hash: "213e8e9905bea32ddb97d38b75cd19cc" + } + Frame { + msec: 3584 + hash: "17d5726a282d42fcde7796be84606fcd" + } + Frame { + msec: 3600 + hash: "f4629bf9f5837f687ae49008c9d28d02" + } + Frame { + msec: 3616 + hash: "fbc927cb136d8d29b2578e78c4793e41" + } + Frame { + msec: 3632 + hash: "c7099e732490dd2f3205986a7c43a165" + } + Frame { + msec: 3648 + hash: "b3b464a8e67fab05109b49604f1ce705" + } + Frame { + msec: 3664 + hash: "7629b2a77f9f87aa0ef2535aa9b8d390" + } + Frame { + msec: 3680 + hash: "6a329c289236782e095cfa6f15409726" + } + Frame { + msec: 3696 + hash: "1cfbf6f4c292e1520b44d84dd59b93a8" + } + Frame { + msec: 3712 + hash: "a8d3d838bffb39053eb705aefcb39c46" + } + Frame { + msec: 3728 + hash: "a56ad66a949e07e3174a58c80145c85e" + } + Frame { + msec: 3744 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 3760 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 3776 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 3792 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 3808 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 3824 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 3840 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 3856 + image: "reanchor.4.png" + } + Frame { + msec: 3872 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 3888 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 3904 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 3920 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 3936 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 3952 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 3968 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 3984 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4000 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4016 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4032 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4048 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4064 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4080 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4096 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4112 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4128 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4144 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4160 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4176 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4192 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4208 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4224 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4240 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4256 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4272 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4288 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4304 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4320 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4336 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4352 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4368 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4384 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4400 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4416 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4432 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4448 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4464 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4480 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4496 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4512 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4528 + hash: "213811853dbefdc418099721e3bf8651" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 174; y: 174 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4544 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4560 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4576 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4592 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4608 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4624 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4640 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4656 + hash: "213811853dbefdc418099721e3bf8651" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 174; y: 174 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4672 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 4688 + hash: "5d38bf4a033de31985ae9989107908af" + } + Frame { + msec: 4704 + hash: "ed1bd2abd42848ecd07f0f0654c2b80f" + } + Frame { + msec: 4720 + hash: "588de6662123733303d93f62c6481f6a" + } + Frame { + msec: 4736 + hash: "aae79c2fbb2fd1ac7efa9802bff40f95" + } + Frame { + msec: 4752 + hash: "f17512798136f67f25aaa0aeb60678e1" + } + Frame { + msec: 4768 + hash: "79578a1e0e3e9cd45c210d0c5d3e75d6" + } + Frame { + msec: 4784 + hash: "5dad4ff201744cda6ff41f89414c8d11" + } + Frame { + msec: 4800 + hash: "df51ffd71a82742af7c06f8a786f6bf2" + } + Frame { + msec: 4816 + image: "reanchor.5.png" + } + Frame { + msec: 4832 + hash: "0dff03ea9154bdb2a813358b04cfbde9" + } + Frame { + msec: 4848 + hash: "09bdf2869dee1c0cbe3c8c2e9254580b" + } + Frame { + msec: 4864 + hash: "ba7762978bbd63d624029910fe16fb6d" + } + Frame { + msec: 4880 + hash: "f00d198ab8f4f625b60e9e2071d8adfd" + } + Frame { + msec: 4896 + hash: "adcec9c9a5b0d60cf45b2915365ea09c" + } + Frame { + msec: 4912 + hash: "a65cd6fbb26d618692ef23148015a4f2" + } + Frame { + msec: 4928 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 4944 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 4960 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 4976 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 4992 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5008 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5024 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5040 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5056 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5072 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5088 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5104 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5120 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5136 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5152 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5168 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5184 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5200 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5216 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5232 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5248 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5264 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5280 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5296 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5312 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5328 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5344 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5360 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5376 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5392 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5408 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5424 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5440 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5456 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5472 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5488 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5504 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5520 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5536 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5552 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5568 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5584 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5600 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5616 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5632 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5648 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5664 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5680 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5696 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5712 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5728 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5744 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5760 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5776 + image: "reanchor.6.png" + } + Frame { + msec: 5792 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5808 + hash: "1137e22c68e043950811dee295e19b04" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 95; y: 78 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5824 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5840 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5856 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5872 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5888 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5904 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5920 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5936 + hash: "1137e22c68e043950811dee295e19b04" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 95; y: 78 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5952 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 5968 + hash: "103bbc9ce594851f5243b103f8fef1c1" + } + Frame { + msec: 5984 + hash: "c381148b052be2e6244f24c2292b89cf" + } + Frame { + msec: 6000 + hash: "2fda1d635fa47bff7de867df3dadfb4f" + } + Frame { + msec: 6016 + hash: "4d35e00af33ad5dc84998cda2d066b4e" + } + Frame { + msec: 6032 + hash: "14005d52d372acf6d3495f69bbf00b7d" + } + Frame { + msec: 6048 + hash: "29728f64d12e858d960c4e197824ef43" + } + Frame { + msec: 6064 + hash: "798822f0c20ef87cb01fe1dcd76c7585" + } + Frame { + msec: 6080 + hash: "4cdeea0f91587ef32a2c2e282f6d00e6" + } + Frame { + msec: 6096 + hash: "08ca5d16771e58da6cdd20b86dc65f03" + } + Frame { + msec: 6112 + hash: "e9aeb432709d275048ad9d84fb21db1a" + } + Frame { + msec: 6128 + hash: "3b642f27d356fd1815dc50f8e750623d" + } + Frame { + msec: 6144 + hash: "7c1db0ec278849ec044ea0aa3383075b" + } + Frame { + msec: 6160 + hash: "da902850879c95d4ddffbb1ba0060f25" + } + Frame { + msec: 6176 + hash: "e4053bd0db7752e7a47e096da645b69b" + } + Frame { + msec: 6192 + hash: "aabbb6d34399818347db265151a547b7" + } + Frame { + msec: 6208 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6224 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6240 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6256 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6272 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6288 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6304 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6320 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6336 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6352 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6368 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6384 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6400 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6416 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6432 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6448 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6464 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6480 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6496 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6512 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6528 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6544 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6560 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6576 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6592 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6608 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6624 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6640 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6656 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6672 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6688 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6704 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6720 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6736 + image: "reanchor.7.png" + } + Frame { + msec: 6752 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6768 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6784 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6800 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6816 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6832 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6848 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6864 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6880 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6896 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6912 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6928 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6944 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6960 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6976 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 6992 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7008 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7024 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7040 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7056 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7072 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7088 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7104 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7120 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7136 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7152 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7168 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7184 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7200 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7216 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7232 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7248 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7264 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7280 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7296 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7312 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7328 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7344 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7360 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7376 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7392 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7408 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7424 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7440 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7456 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7472 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7488 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7504 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7520 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7536 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7552 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7568 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7584 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7600 + hash: "213811853dbefdc418099721e3bf8651" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 86; y: 136 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7616 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7632 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7648 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7664 + hash: "213811853dbefdc418099721e3bf8651" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 86; y: 136 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7680 + hash: "213811853dbefdc418099721e3bf8651" + } + Frame { + msec: 7696 + image: "reanchor.8.png" + } + Frame { + msec: 7712 + hash: "e1a8cdcb1f3ec097a968b3b20964c6e8" + } + Frame { + msec: 7728 + hash: "44fc52479251327d0612de17ddb056eb" + } + Frame { + msec: 7744 + hash: "fa7e4a910aa60500575a34852c0c7cb8" + } + Frame { + msec: 7760 + hash: "66d205a02e35221e7684ab995acc1312" + } + Frame { + msec: 7776 + hash: "4ebe8dba6d9f3179b610b2298a7484a2" + } + Frame { + msec: 7792 + hash: "9b2582fccffa34fe389ba427ce47619a" + } + Frame { + msec: 7808 + hash: "e6f15478bda9995f82976b9e16659c8e" + } + Frame { + msec: 7824 + hash: "f08df0885fff04819ada6c10b25dd489" + } + Frame { + msec: 7840 + hash: "0f57c152306747cfa27171f1947ca65d" + } + Frame { + msec: 7856 + hash: "89d9c988abd55063e210b81193c6a8f0" + } + Frame { + msec: 7872 + hash: "91e0d0a5d57210c790c2d2399d1f7022" + } + Frame { + msec: 7888 + hash: "267874fdc09459b3e854c06d9ae99a54" + } + Frame { + msec: 7904 + hash: "2f58a508f439c40c6f2bd7da1f30deff" + } + Frame { + msec: 7920 + hash: "1451548d9f0002a6c4765cb616ab7f59" + } + Frame { + msec: 7936 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 7952 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 7968 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 7984 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 8000 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 8016 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 8032 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 8048 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 8064 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 8080 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 8096 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 8112 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 8128 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 8144 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 8160 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 8176 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 8192 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 8208 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 8224 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 8240 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 8256 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 8272 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 8288 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 8304 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 8320 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 8336 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 8352 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 8368 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 8384 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 8400 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 177; y: 173 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8416 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 8432 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 8448 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 8464 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 8480 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 8496 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 8512 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 177; y: 173 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8528 + hash: "ad3837dcf3e69274ac2918d796974f29" + } + Frame { + msec: 8544 + hash: "49a6ed64f80094b41348eda19fa5a55e" + } + Frame { + msec: 8560 + hash: "3ee42fb431d7824c1cd6ddf95af91d10" + } + Frame { + msec: 8576 + hash: "d807890cc0670eda9fac267769366771" + } + Frame { + msec: 8592 + hash: "50cb68de9ca0c3a8db1df58d7cbb0d21" + } + Frame { + msec: 8608 + hash: "0af06233156b3a469ce9e7d80a5767c0" + } + Frame { + msec: 8624 + hash: "9b2c77f004e480fd485e092c08feaf81" + } + Frame { + msec: 8640 + hash: "b36a09269dfc9173ff8583a62ae87e8a" + } + Frame { + msec: 8656 + image: "reanchor.9.png" + } + Frame { + msec: 8672 + hash: "4d3aa8219edffe6fda316482821d4a64" + } + Frame { + msec: 8688 + hash: "ea8a7104840254ac2706ca2635b8a95f" + } + Frame { + msec: 8704 + hash: "a8569ef3287da9699809a2ad107b87b1" + } + Frame { + msec: 8720 + hash: "91d09653dbced4ecb3d711737cb89ca1" + } + Frame { + msec: 8736 + hash: "d5391f3b40f2dfada0336d889d438d69" + } + Frame { + msec: 8752 + hash: "27cd9690607f97cc84c2a0a4455feccb" + } + Frame { + msec: 8768 + hash: "f885588779a5de5d7d47f48bf9a2a6ee" + } + Frame { + msec: 8784 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 8800 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 8816 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 8832 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 8848 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 8864 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 8880 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 8896 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 8912 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 8928 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 8944 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 8960 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 8976 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 8992 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 9008 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 9024 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 9040 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 9056 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 9072 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 9088 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 9104 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 9120 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 9136 + hash: "1137e22c68e043950811dee295e19b04" + } + Key { + type: 6 + key: 16777249 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 9152 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 9168 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 9184 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 9200 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 9216 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 9232 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 9248 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 9264 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 9280 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 9296 + hash: "1137e22c68e043950811dee295e19b04" + } + Frame { + msec: 9312 + hash: "1137e22c68e043950811dee295e19b04" + } +} diff --git a/tests/auto/declarative/qmlvisual/animation/reanchor/reanchor.qml b/tests/auto/declarative/qmlvisual/animation/reanchor/reanchor.qml new file mode 100644 index 00000000..e0a5a6da --- /dev/null +++ b/tests/auto/declarative/qmlvisual/animation/reanchor/reanchor.qml @@ -0,0 +1,69 @@ +import QtQuick 1.0 + +Rectangle { + id: container + width: 200; height: 200 + Rectangle { + id: myRect + objectName: "MyRect" + color: "green"; + anchors.left: parent.left + anchors.right: rightGuideline.left + anchors.top: topGuideline.top + anchors.bottom: container.bottom + } + Item { id: leftGuideline; x: 10 } + Item { id: rightGuideline; x: 150 } + Item { id: topGuideline; y: 10 } + Item { id: bottomGuideline; y: 150 } + Item { id: topGuideline2; y: 50 } + Item { id: bottomGuideline2; y: 175 } + + MouseArea { + id: wholeArea + anchors.fill: parent + onClicked: { + if (container.state == "") { + container.state = "reanchored"; + } else if (container.state == "reanchored") { + container.state = "reanchored2"; + } else if (container.state == "reanchored2") + container.state = "reanchored"; + } + } + + states: [ State { + name: "reanchored" + AnchorChanges { + target: myRect; + anchors.left: leftGuideline.left + anchors.right: container.right + anchors.top: container.top + anchors.bottom: bottomGuideline.bottom + } + }, State { + name: "reanchored2" + AnchorChanges { + target: myRect; + anchors.left: undefined + anchors.right: undefined + anchors.top: topGuideline2.top + anchors.bottom: bottomGuideline2.bottom + } + }] + + transitions: Transition { + AnchorAnimation { } + } + + MouseArea { + width: 50; height: 50 + anchors.right: parent.right + anchors.bottom: parent.bottom + onClicked: { + container.state = ""; + } + } + + state: "reanchored" +} diff --git a/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.0.png b/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.0.png new file mode 100644 index 00000000..160155e6 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.0.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.1.png b/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.1.png new file mode 100644 index 00000000..160155e6 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.1.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.10.png b/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.10.png new file mode 100644 index 00000000..1ccab413 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.10.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.11.png b/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.11.png new file mode 100644 index 00000000..160155e6 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.11.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.12.png b/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.12.png new file mode 100644 index 00000000..f25bd7c8 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.12.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.2.png b/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.2.png new file mode 100644 index 00000000..f25bd7c8 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.2.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.3.png b/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.3.png new file mode 100644 index 00000000..dad1de44 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.3.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.4.png b/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.4.png new file mode 100644 index 00000000..cd4f23a8 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.4.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.5.png b/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.5.png new file mode 100644 index 00000000..160155e6 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.5.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.6.png b/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.6.png new file mode 100644 index 00000000..160155e6 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.6.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.7.png b/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.7.png new file mode 100644 index 00000000..f25bd7c8 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.7.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.8.png b/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.8.png new file mode 100644 index 00000000..160155e6 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.8.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.9.png b/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.9.png new file mode 100644 index 00000000..160155e6 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.9.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.qml b/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.qml new file mode 100644 index 00000000..e858c11f --- /dev/null +++ b/tests/auto/declarative/qmlvisual/animation/reanchorRTL/data/reanchor.qml @@ -0,0 +1,1499 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "reanchor.0.png" + } + Frame { + msec: 32 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 48 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 64 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 80 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 96 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 112 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 128 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 144 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 160 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 176 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 192 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 208 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 224 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 240 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 256 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 272 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 288 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 304 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 320 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 336 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 352 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 368 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 384 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 400 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 416 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 432 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 448 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 464 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 480 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 496 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 512 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 528 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 544 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 560 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 576 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 592 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 608 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 624 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 640 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 656 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 672 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 688 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 704 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 720 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 736 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 752 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 768 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 784 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 800 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 816 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 832 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 848 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 864 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 880 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 896 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 912 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 928 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 944 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 960 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 976 + image: "reanchor.1.png" + } + Frame { + msec: 992 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 1008 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 1024 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 1040 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 1056 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 164; y: 196 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1072 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 1088 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 1104 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 1120 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 1136 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 164; y: 196 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1152 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 1168 + hash: "f7814217626627ce70ca0e9487354ba9" + } + Frame { + msec: 1184 + hash: "7825b2b77e441ca6f46dbca80c7fe602" + } + Frame { + msec: 1200 + hash: "0ac443a9946b0bcf8db768af7d16d51e" + } + Frame { + msec: 1216 + hash: "c943d5d46f0d527690f38a9c8bd7be51" + } + Frame { + msec: 1232 + hash: "38151db0c9964d33bcb2ff155ebd468c" + } + Frame { + msec: 1248 + hash: "0fb8c53587a95a12cced6d30018edec1" + } + Frame { + msec: 1264 + hash: "2c684a649652270a638aca41a80e327c" + } + Frame { + msec: 1280 + hash: "60dd5c448ef8b97ec13ad3140a584229" + } + Frame { + msec: 1296 + hash: "d564f28f9d528daca729db6fab163b6c" + } + Frame { + msec: 1312 + hash: "4c07b33632ec4f30ee31141099c15a88" + } + Frame { + msec: 1328 + hash: "9facfd27fa16ee9d493e7fb7bcfadbf8" + } + Frame { + msec: 1344 + hash: "fc0fbb8aac8f389841e615be1e7b06de" + } + Frame { + msec: 1360 + hash: "579c18fa201b5609276c761ffd42df33" + } + Frame { + msec: 1376 + hash: "5b3630c37acfc2599a5a8b2e11aaa34c" + } + Frame { + msec: 1392 + hash: "2c1ee8aca06dccf0d39287721bf76aa7" + } + Frame { + msec: 1408 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1424 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1440 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1456 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1472 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1488 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1504 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1520 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1536 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1552 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1568 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1584 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1600 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1616 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1632 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1648 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1664 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1680 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1696 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1712 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1728 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1744 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1760 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1776 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1792 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1808 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1824 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1840 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1856 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1872 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1888 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1904 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1920 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1936 + image: "reanchor.2.png" + } + Frame { + msec: 1952 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1968 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 1984 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 2000 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 2016 + hash: "c03bb338fff252a100b080366ac907b5" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 170; y: 120 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2032 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 2048 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 2064 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 2080 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 2096 + hash: "c03bb338fff252a100b080366ac907b5" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 170; y: 120 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2112 + hash: "c03bb338fff252a100b080366ac907b5" + } + Frame { + msec: 2128 + hash: "e9d7372c17ca1510eb15faff5d0794b2" + } + Frame { + msec: 2144 + hash: "60f897e2b9594c4b5c02ce2fbdf9ae3c" + } + Frame { + msec: 2160 + hash: "c35ead9a8e682e8f3c0a091d232310f7" + } + Frame { + msec: 2176 + hash: "272632b0568391022590edc09ea30e28" + } + Frame { + msec: 2192 + hash: "9d4cdb31b01e86a31627e3ff9bb64100" + } + Frame { + msec: 2208 + hash: "5ee65b0290721fe47508c6435c18554b" + } + Frame { + msec: 2224 + hash: "8dd65e1a9417318d793d2027de4fe6ae" + } + Frame { + msec: 2240 + hash: "bcce6d1fd7d2c1539ad9ac42c0552d5e" + } + Frame { + msec: 2256 + hash: "e01f5850113c178da3383406fe73d6e0" + } + Frame { + msec: 2272 + hash: "968fc6b2bf6b7d43e05254339cf6123f" + } + Frame { + msec: 2288 + hash: "30f25fdde31e13934e328fa1d2655ccb" + } + Frame { + msec: 2304 + hash: "f58a21e96037813c9dd7f933405c9b11" + } + Frame { + msec: 2320 + hash: "1fe42c887f2eaf7696fcf0b8b884d0fd" + } + Frame { + msec: 2336 + hash: "848a27b9e4f4c0bcc1a11d6dba7ce92b" + } + Frame { + msec: 2352 + hash: "ca92736257db83e39f54b04325201942" + } + Frame { + msec: 2368 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 2384 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 134; y: 106 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2400 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 2416 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 2432 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 2448 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 2464 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 134; y: 106 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2480 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 2496 + hash: "9082504eee5e0c3cbef9fd9545f09dcb" + } + Frame { + msec: 2512 + hash: "dbe5169edb4400c74841a8af64e0949f" + } + Frame { + msec: 2528 + hash: "d588405fc5e2423cdb954c5624172209" + } + Frame { + msec: 2544 + hash: "ed2b273ea36fb7d8feaca4d5dae72f81" + } + Frame { + msec: 2560 + hash: "5249e4824eb169b5ee3f7fb52fe09aa7" + } + Frame { + msec: 2576 + hash: "2838eff2a1a299c9e47cf78be99172ca" + } + Frame { + msec: 2592 + hash: "c47f6a937a4a6ef045159d7ba04de8af" + } + Frame { + msec: 2608 + hash: "fd3bc1b9ba2629bccb0fec04deffcdad" + } + Frame { + msec: 2624 + hash: "54c9b8599a32ac95aff324977b34f7e6" + } + Frame { + msec: 2640 + hash: "cc5652a05828146cdc9c9b8430f5f59c" + } + Frame { + msec: 2656 + hash: "ce5815fb51a4bd697a2fde46084e118b" + } + Frame { + msec: 2672 + hash: "01dfd2604263f1fd24382ce876af10f9" + } + Frame { + msec: 2688 + hash: "45ea282d20ee9e345eb2cac8c22c42e0" + } + Frame { + msec: 2704 + hash: "afd26ac9776e57c94e4b52ebfeb7206c" + } + Frame { + msec: 2720 + hash: "97aeed321d4d92cb1ec236d2a98fbe9b" + } + Mouse { + type: 4 + button: 1 + buttons: 1 + x: 134; y: 106 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2736 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 2752 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 2768 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 2784 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 2800 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 134; y: 106 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2816 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 2832 + hash: "81b8228c6aeefe8072b7704f11e6707e" + } + Frame { + msec: 2848 + hash: "617e416bf117a51b756c90321ebb1449" + } + Frame { + msec: 2864 + hash: "656d8d5d54c9ee137aceb519aff72cce" + } + Frame { + msec: 2880 + hash: "94ba3b6f558c010cdd32f54cce436388" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 134; y: 106 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2896 + image: "reanchor.3.png" + } + Frame { + msec: 2912 + hash: "0bc822fdd4caac17aab80e8601d3a523" + } + Frame { + msec: 2928 + hash: "886d0407ac76d7344f7a314f07b3efff" + } + Frame { + msec: 2944 + hash: "eb6c46af5037f24348edbe0dda48fb62" + } + Frame { + msec: 2960 + hash: "1c578a1eeb67c6833241bcb3214f06fb" + } + Frame { + msec: 2976 + hash: "55f1631ef567217a5945b2a23c59b549" + } + Frame { + msec: 2992 + hash: "25fdd4d54ddb035b082dc3a0d0816114" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 134; y: 106 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3008 + hash: "25fdd4d54ddb035b082dc3a0d0816114" + } + Frame { + msec: 3024 + hash: "efd61e7c1aaffec77bd3d2de6645b2c0" + } + Frame { + msec: 3040 + hash: "02ac5ca0fa7d2ec3903fccd5dc556fa5" + } + Frame { + msec: 3056 + hash: "daf52e45b8fc68f74e424554074678cc" + } + Frame { + msec: 3072 + hash: "9e2def87e83b0c4b9f26684665aa1e51" + } + Frame { + msec: 3088 + hash: "0e72fc762cc9a061e91692376d65d292" + } + Frame { + msec: 3104 + hash: "c5ac37e4a5250b35a4976bcb31505cca" + } + Frame { + msec: 3120 + hash: "eefe6bb7963c580c68198ee6098a36f4" + } + Frame { + msec: 3136 + hash: "7b78d77ac11b72d1fb827ebb66a04c8e" + } + Frame { + msec: 3152 + hash: "ce5815fb51a4bd697a2fde46084e118b" + } + Frame { + msec: 3168 + hash: "94ba3b6f558c010cdd32f54cce436388" + } + Frame { + msec: 3184 + hash: "61a56140e5a6a2bfcee5c6322b37e130" + } + Frame { + msec: 3200 + hash: "a67b22c0a966fe3fbe869497dc00960f" + } + Frame { + msec: 3216 + hash: "4edd212676ac93ae761039e80f989349" + } + Frame { + msec: 3232 + hash: "fea5797441d65625c400238f73d94807" + } + Frame { + msec: 3248 + hash: "23e9209ff0257343016cffdf7ea6571c" + } + Frame { + msec: 3264 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3280 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3296 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3312 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3328 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3344 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3360 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3376 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3392 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3408 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3424 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3440 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3456 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3472 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3488 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3504 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3520 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3536 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3552 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3568 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3584 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3600 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3616 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3632 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3648 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3664 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3680 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3696 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3712 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3728 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3744 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3760 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3776 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3792 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3808 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3824 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3840 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3856 + image: "reanchor.4.png" + } + Frame { + msec: 3872 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3888 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3904 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3920 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3936 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3952 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3968 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 3984 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 4000 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 4016 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 4032 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 4048 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 4064 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 4080 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 4096 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 4112 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 4128 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 4144 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 4160 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 4176 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 124; y: 113 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4192 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 4208 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 4224 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 4240 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 4256 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 124; y: 113 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4272 + hash: "3a1fc9be558078e35a9828e411847c19" + } + Frame { + msec: 4288 + hash: "81b8228c6aeefe8072b7704f11e6707e" + } + Frame { + msec: 4304 + hash: "617e416bf117a51b756c90321ebb1449" + } + Frame { + msec: 4320 + hash: "656d8d5d54c9ee137aceb519aff72cce" + } + Frame { + msec: 4336 + hash: "94ba3b6f558c010cdd32f54cce436388" + } + Frame { + msec: 4352 + hash: "5b0679ff3730cba4ac026e89c7811fbe" + } + Frame { + msec: 4368 + hash: "0bc822fdd4caac17aab80e8601d3a523" + } + Frame { + msec: 4384 + hash: "886d0407ac76d7344f7a314f07b3efff" + } + Frame { + msec: 4400 + hash: "eb6c46af5037f24348edbe0dda48fb62" + } + Frame { + msec: 4416 + hash: "1c578a1eeb67c6833241bcb3214f06fb" + } + Frame { + msec: 4432 + hash: "55f1631ef567217a5945b2a23c59b549" + } + Frame { + msec: 4448 + hash: "25fdd4d54ddb035b082dc3a0d0816114" + } + Frame { + msec: 4464 + hash: "295ea6ff4d3c2c7de0cfbc29b2bd2c38" + } + Frame { + msec: 4480 + hash: "26b978ab645c04731703bcf15ac34a11" + } + Frame { + msec: 4496 + hash: "0db4c2515b89506df51732c4b9bf75dc" + } + Frame { + msec: 4512 + hash: "3cf30f3a06e325e195a4a7dec1e04c01" + } + Frame { + msec: 4528 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 4544 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 4560 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 4576 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 4592 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 4608 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 4624 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 4640 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 4656 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 4672 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 4688 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 4704 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 4720 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 4736 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 4752 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 4768 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 4784 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 4800 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 4816 + image: "reanchor.5.png" + } + Frame { + msec: 4832 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 4848 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 4864 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 4880 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 4896 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 4912 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 4928 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 4944 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 4960 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 4976 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 4992 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5008 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5024 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5040 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5056 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5072 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5088 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5104 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5120 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5136 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5152 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5168 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5184 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5200 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5216 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5232 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5248 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5264 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5280 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5296 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5312 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5328 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5344 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5360 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5376 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5392 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5408 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5424 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5440 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5456 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5472 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5488 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5504 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5520 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5536 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5552 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5568 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } + Frame { + msec: 5584 + hash: "0009d8bfdfaed2a4f05aacb7a7992234" + } +} diff --git a/tests/auto/declarative/qmlvisual/animation/reanchorRTL/reanchor.qml b/tests/auto/declarative/qmlvisual/animation/reanchorRTL/reanchor.qml new file mode 100644 index 00000000..ba377370 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/animation/reanchorRTL/reanchor.qml @@ -0,0 +1,69 @@ +import QtQuick 1.1 + +Rectangle { + id: container + width: 200; height: 200 + Rectangle { + id: myRect + anchors.layoutDirection: Qt.RightToLeft + objectName: "MyRect" + color: "green"; + anchors.left: parent.left + anchors.right: rightGuideline.left + anchors.top: topGuideline.top + anchors.bottom: container.bottom + } + Item { id: leftGuideline; x: 10 } + Item { id: rightGuideline; x: 150 } + Item { id: topGuideline; y: 10 } + Item { id: bottomGuideline; y: 150 } + Item { id: topGuideline2; y: 50 } + Item { id: bottomGuideline2; y: 175 } + MouseArea { + id: wholeArea + anchors.fill: parent + onClicked: { + if (container.state == "") { + container.state = "reanchored"; + } else if (container.state == "reanchored") { + container.state = "reanchored2"; + } else if (container.state == "reanchored2") + container.state = "reanchored"; + } + } + + states: [ State { + name: "reanchored" + AnchorChanges { + target: myRect; + anchors.left: leftGuideline.left + anchors.right: container.right + anchors.top: container.top + anchors.bottom: bottomGuideline.bottom + } + }, State { + name: "reanchored2" + AnchorChanges { + target: myRect; + anchors.left: undefined + anchors.right: undefined + anchors.top: topGuideline2.top + anchors.bottom: bottomGuideline2.bottom + } + }] + + transitions: Transition { + AnchorAnimation { } + } + + MouseArea { + width: 50; height: 50 + anchors.right: parent.right + anchors.bottom: parent.bottom + onClicked: { + container.state = ""; + } + } + + state: "reanchored" +} diff --git a/tests/auto/declarative/qmlvisual/animation/scriptAction/data/scriptAction-visual.0.png b/tests/auto/declarative/qmlvisual/animation/scriptAction/data/scriptAction-visual.0.png new file mode 100644 index 00000000..5bf32dda Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/scriptAction/data/scriptAction-visual.0.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/scriptAction/data/scriptAction-visual.1.png b/tests/auto/declarative/qmlvisual/animation/scriptAction/data/scriptAction-visual.1.png new file mode 100644 index 00000000..e7571f24 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/scriptAction/data/scriptAction-visual.1.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/scriptAction/data/scriptAction-visual.2.png b/tests/auto/declarative/qmlvisual/animation/scriptAction/data/scriptAction-visual.2.png new file mode 100644 index 00000000..60d09e92 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/animation/scriptAction/data/scriptAction-visual.2.png differ diff --git a/tests/auto/declarative/qmlvisual/animation/scriptAction/data/scriptAction-visual.qml b/tests/auto/declarative/qmlvisual/animation/scriptAction/data/scriptAction-visual.qml new file mode 100644 index 00000000..f93458dc --- /dev/null +++ b/tests/auto/declarative/qmlvisual/animation/scriptAction/data/scriptAction-visual.qml @@ -0,0 +1,515 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "scriptAction-visual.0.png" + } + Frame { + msec: 32 + hash: "c5d2b291578c11c11452c29dc02bcad9" + } + Frame { + msec: 48 + hash: "c5d2b291578c11c11452c29dc02bcad9" + } + Frame { + msec: 64 + hash: "c5d2b291578c11c11452c29dc02bcad9" + } + Frame { + msec: 80 + hash: "c5d2b291578c11c11452c29dc02bcad9" + } + Frame { + msec: 96 + hash: "c5d2b291578c11c11452c29dc02bcad9" + } + Frame { + msec: 112 + hash: "c5d2b291578c11c11452c29dc02bcad9" + } + Frame { + msec: 128 + hash: "c5d2b291578c11c11452c29dc02bcad9" + } + Frame { + msec: 144 + hash: "c5d2b291578c11c11452c29dc02bcad9" + } + Frame { + msec: 160 + hash: "c5d2b291578c11c11452c29dc02bcad9" + } + Frame { + msec: 176 + hash: "c5d2b291578c11c11452c29dc02bcad9" + } + Frame { + msec: 192 + hash: "c5d2b291578c11c11452c29dc02bcad9" + } + Frame { + msec: 208 + hash: "c5d2b291578c11c11452c29dc02bcad9" + } + Frame { + msec: 224 + hash: "c5d2b291578c11c11452c29dc02bcad9" + } + Frame { + msec: 240 + hash: "c5d2b291578c11c11452c29dc02bcad9" + } + Frame { + msec: 256 + hash: "c5d2b291578c11c11452c29dc02bcad9" + } + Frame { + msec: 272 + hash: "c5d2b291578c11c11452c29dc02bcad9" + } + Frame { + msec: 288 + hash: "c5d2b291578c11c11452c29dc02bcad9" + } + Frame { + msec: 304 + hash: "c5d2b291578c11c11452c29dc02bcad9" + } + Frame { + msec: 320 + hash: "c5d2b291578c11c11452c29dc02bcad9" + } + Frame { + msec: 336 + hash: "c5d2b291578c11c11452c29dc02bcad9" + } + Frame { + msec: 352 + hash: "c5d2b291578c11c11452c29dc02bcad9" + } + Frame { + msec: 368 + hash: "c5d2b291578c11c11452c29dc02bcad9" + } + Frame { + msec: 384 + hash: "c5d2b291578c11c11452c29dc02bcad9" + } + Frame { + msec: 400 + hash: "c5d2b291578c11c11452c29dc02bcad9" + } + Frame { + msec: 416 + hash: "c5d2b291578c11c11452c29dc02bcad9" + } + Frame { + msec: 432 + hash: "c5d2b291578c11c11452c29dc02bcad9" + } + Frame { + msec: 448 + hash: "c5d2b291578c11c11452c29dc02bcad9" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 54; y: 52 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 464 + hash: "c5d2b291578c11c11452c29dc02bcad9" + } + Frame { + msec: 480 + hash: "650770d62a63031754b3c68f666a5805" + } + Frame { + msec: 496 + hash: "eb28945becabee0dffe618632d4db061" + } + Frame { + msec: 512 + hash: "6c7b66dff531723362418dacd23ea59e" + } + Frame { + msec: 528 + hash: "093bd3dd02a6d9f4dbd75a329bbf63f5" + } + Frame { + msec: 544 + hash: "5328b1f3932c8bf817a5031102e21c25" + } + Frame { + msec: 560 + hash: "ee2b8dc4ebdaaed41ae820385f56db83" + } + Frame { + msec: 576 + hash: "adf71c703dff4514d6ae247fd6b89030" + } + Frame { + msec: 592 + hash: "c93d78e604406a3c61c2b34e5e0893a4" + } + Frame { + msec: 608 + hash: "c91dbb897289d2949d08c6381583ad5e" + } + Frame { + msec: 624 + hash: "1e3a370e3d390e8d73731d659fae5908" + } + Frame { + msec: 640 + hash: "e6d3505120260677f5f1355abf0f2b1d" + } + Frame { + msec: 656 + hash: "251d68b91b37ef95ff61055f7b2ba0b5" + } + Frame { + msec: 672 + hash: "333a25691bafa88fbc92a153886c3b47" + } + Frame { + msec: 688 + hash: "e63367e5001732975bc4c002c079dbd8" + } + Frame { + msec: 704 + hash: "04e25f2fd913c38ee24558b52fb3ed37" + } + Frame { + msec: 720 + hash: "739f155ad3d703fa0255afed51baf51c" + } + Frame { + msec: 736 + hash: "739f155ad3d703fa0255afed51baf51c" + } + Frame { + msec: 752 + hash: "16de427e26afa1a1d91541fca1537033" + } + Frame { + msec: 768 + hash: "11a874ab1c429e1bcf5498808f3c42f7" + } + Frame { + msec: 784 + hash: "e97f33a71bf889815782c17067bcd736" + } + Frame { + msec: 800 + hash: "9f2f0728689a5ff76f87b13c92e9fd40" + } + Frame { + msec: 816 + hash: "9186cd14c3d9f2ad560be047cc483b50" + } + Frame { + msec: 832 + hash: "af2eb37824ad3567ce9db0329f647d50" + } + Frame { + msec: 848 + hash: "f09d264ed5f44313c19f2f985a26b9cd" + } + Frame { + msec: 864 + hash: "3ed8b3051d0d603bd514783fe04124a7" + } + Frame { + msec: 880 + hash: "38c7f8d39fd9a77400138da4e3ebb963" + } + Frame { + msec: 896 + hash: "6682f53fdda2d8662a31b725d23b08f6" + } + Frame { + msec: 912 + hash: "0f16d2640b51c9ada08c7aa0e8853d86" + } + Frame { + msec: 928 + hash: "22b9025d523dd1adb87f9b4c89295b29" + } + Frame { + msec: 944 + hash: "1761f6606bbdf5772594cf96412337ca" + } + Frame { + msec: 960 + hash: "1761f6606bbdf5772594cf96412337ca" + } + Frame { + msec: 976 + image: "scriptAction-visual.1.png" + } + Frame { + msec: 992 + hash: "1761f6606bbdf5772594cf96412337ca" + } + Frame { + msec: 1008 + hash: "1761f6606bbdf5772594cf96412337ca" + } + Frame { + msec: 1024 + hash: "1761f6606bbdf5772594cf96412337ca" + } + Frame { + msec: 1040 + hash: "1761f6606bbdf5772594cf96412337ca" + } + Frame { + msec: 1056 + hash: "1761f6606bbdf5772594cf96412337ca" + } + Frame { + msec: 1072 + hash: "1761f6606bbdf5772594cf96412337ca" + } + Frame { + msec: 1088 + hash: "1761f6606bbdf5772594cf96412337ca" + } + Frame { + msec: 1104 + hash: "1761f6606bbdf5772594cf96412337ca" + } + Frame { + msec: 1120 + hash: "1761f6606bbdf5772594cf96412337ca" + } + Frame { + msec: 1136 + hash: "1761f6606bbdf5772594cf96412337ca" + } + Frame { + msec: 1152 + hash: "1761f6606bbdf5772594cf96412337ca" + } + Frame { + msec: 1168 + hash: "1761f6606bbdf5772594cf96412337ca" + } + Frame { + msec: 1184 + hash: "1761f6606bbdf5772594cf96412337ca" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 54; y: 52 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1200 + hash: "1761f6606bbdf5772594cf96412337ca" + } + Frame { + msec: 1216 + hash: "1761f6606bbdf5772594cf96412337ca" + } + Frame { + msec: 1232 + hash: "77ab7b0bad67c80c5f685b02e264d333" + } + Frame { + msec: 1248 + hash: "27c3099b0e9f0607e9ebc983b2613eb9" + } + Frame { + msec: 1264 + hash: "81bd467b2314fb877825323a6120de4a" + } + Frame { + msec: 1280 + hash: "5cd632ac5399826249137ff2f27ef734" + } + Frame { + msec: 1296 + hash: "3b6732d7539d7b9b6ac13b6f8291b993" + } + Frame { + msec: 1312 + hash: "6bde822175f1ee22a8bb0528d6170a5a" + } + Frame { + msec: 1328 + hash: "a8401f0c19db5c395cf122f3fe6f3be2" + } + Frame { + msec: 1344 + hash: "10e5126a9f97caf19df3d0ec4485222f" + } + Frame { + msec: 1360 + hash: "f7b0bde6f4c9e9c9aecdbf11f0ec525c" + } + Frame { + msec: 1376 + hash: "7501da757e6b0ba3923635765ef63f5b" + } + Frame { + msec: 1392 + hash: "c66f5f30f7a545fcf0b52debd68d96c1" + } + Frame { + msec: 1408 + hash: "ea679c31fd51733076716a325d2d4dc1" + } + Frame { + msec: 1424 + hash: "01ffc159e0d0796e4de7cffd46685481" + } + Frame { + msec: 1440 + hash: "c53b75720a772a43a6c7d046ffb4d39b" + } + Frame { + msec: 1456 + hash: "1338c0458f32869e35163a2dcb950b8e" + } + Frame { + msec: 1472 + hash: "1338c0458f32869e35163a2dcb950b8e" + } + Frame { + msec: 1488 + hash: "d894739536bb7033d321f8862264b5e6" + } + Frame { + msec: 1504 + hash: "52d5556f4b2404ae896ae36e0bc866ed" + } + Frame { + msec: 1520 + hash: "5ff9d9ab8099b2b9469df9efe672f46d" + } + Frame { + msec: 1536 + hash: "acadb950bd78c6fade9161f8e53628e7" + } + Frame { + msec: 1552 + hash: "7583b99a5f3aede70fc10728d77f57cc" + } + Frame { + msec: 1568 + hash: "f72881eb92792727985482996bf689f9" + } + Frame { + msec: 1584 + hash: "26e0d64d5afeecdc4d93492f1eaaa54f" + } + Frame { + msec: 1600 + hash: "93206a830cf787d00a6bb2d3c91d40bc" + } + Frame { + msec: 1616 + hash: "af0a99b072a754cd0ecb75a7198849c1" + } + Frame { + msec: 1632 + hash: "84adc92e299feeb494b108a009d1b662" + } + Frame { + msec: 1648 + hash: "4fac6d471517625d4f5ce6ed6aaebe0b" + } + Frame { + msec: 1664 + hash: "6952c27025740aca006a13da87379f9f" + } + Frame { + msec: 1680 + hash: "3297ed7bffb48a4f2ca90dd81eaf7c7a" + } + Frame { + msec: 1696 + hash: "3297ed7bffb48a4f2ca90dd81eaf7c7a" + } + Frame { + msec: 1712 + hash: "6741d853f099a5a98fcdf87053b69ec8" + } + Frame { + msec: 1728 + hash: "6741d853f099a5a98fcdf87053b69ec8" + } + Frame { + msec: 1744 + hash: "6741d853f099a5a98fcdf87053b69ec8" + } + Frame { + msec: 1760 + hash: "6741d853f099a5a98fcdf87053b69ec8" + } + Frame { + msec: 1776 + hash: "6741d853f099a5a98fcdf87053b69ec8" + } + Frame { + msec: 1792 + hash: "6741d853f099a5a98fcdf87053b69ec8" + } + Frame { + msec: 1808 + hash: "6741d853f099a5a98fcdf87053b69ec8" + } + Frame { + msec: 1824 + hash: "6741d853f099a5a98fcdf87053b69ec8" + } + Frame { + msec: 1840 + hash: "6741d853f099a5a98fcdf87053b69ec8" + } + Frame { + msec: 1856 + hash: "6741d853f099a5a98fcdf87053b69ec8" + } + Frame { + msec: 1872 + hash: "6741d853f099a5a98fcdf87053b69ec8" + } + Frame { + msec: 1888 + hash: "6741d853f099a5a98fcdf87053b69ec8" + } + Frame { + msec: 1904 + hash: "6741d853f099a5a98fcdf87053b69ec8" + } + Frame { + msec: 1920 + hash: "6741d853f099a5a98fcdf87053b69ec8" + } + Frame { + msec: 1936 + image: "scriptAction-visual.2.png" + } + Frame { + msec: 1952 + hash: "6741d853f099a5a98fcdf87053b69ec8" + } + Frame { + msec: 1968 + hash: "6741d853f099a5a98fcdf87053b69ec8" + } +} diff --git a/tests/auto/declarative/qmlvisual/animation/scriptAction/scriptAction-visual.qml b/tests/auto/declarative/qmlvisual/animation/scriptAction/scriptAction-visual.qml new file mode 100644 index 00000000..0a14542a --- /dev/null +++ b/tests/auto/declarative/qmlvisual/animation/scriptAction/scriptAction-visual.qml @@ -0,0 +1,40 @@ +import QtQuick 1.0 + +/* +This test starts with a red rectangle at 0,0. It should animate moving 50 pixels right, +then immediately change blue, and then animate moving 50 pixels down. +*/ + +Rectangle { + width: 100; height: 100 + Rectangle { + id: myRect + width: 50; height: 50 + color: "red" + } + MouseArea { + id: clickable + anchors.fill: parent + } + + states: State { + name: "state1" + when: clickable.pressed + PropertyChanges { + target: myRect + x: 50; y: 50 + } + StateChangeScript { + name: "setColor" + script: myRect.color = "blue" + } + } + + transitions: Transition { + SequentialAnimation { + NumberAnimation { properties: "x"; easing.type: "InOutQuad" } + ScriptAction { scriptName: "setColor" } + NumberAnimation { properties: "y"; easing.type: "InOutQuad" } + } + } +} diff --git a/tests/auto/declarative/qmlvisual/fillmode/data/fillmode.0.png b/tests/auto/declarative/qmlvisual/fillmode/data/fillmode.0.png new file mode 100644 index 00000000..52fd55c3 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/fillmode/data/fillmode.0.png differ diff --git a/tests/auto/declarative/qmlvisual/fillmode/data/fillmode.qml b/tests/auto/declarative/qmlvisual/fillmode/data/fillmode.qml new file mode 100644 index 00000000..b1871ce4 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/fillmode/data/fillmode.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "fillmode.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/fillmode/face.png b/tests/auto/declarative/qmlvisual/fillmode/face.png new file mode 100644 index 00000000..e0873168 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/fillmode/face.png differ diff --git a/tests/auto/declarative/qmlvisual/fillmode/fillmode.qml b/tests/auto/declarative/qmlvisual/fillmode/fillmode.qml new file mode 100644 index 00000000..b2ecfee4 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/fillmode/fillmode.qml @@ -0,0 +1,21 @@ +import QtQuick 1.0 + +/* + This is a static display test of the various Image fill modes. See the png file in the data + subdirectory to see what the image should look like. +*/ + +Rectangle { + id: screen; width: 360; height: 200; color: "gray" + property string source: "face.png" + + Grid { + columns: 3 + Image { width: 120; height: 100; source: screen.source; fillMode: Image.Stretch } + Image { width: 120; height: 100; source: screen.source; fillMode: Image.PreserveAspectFit; smooth: true } + Image { width: 120; height: 100; source: screen.source; fillMode: Image.PreserveAspectCrop } + Image { width: 120; height: 100; source: screen.source; fillMode: Image.Tile; smooth: true } + Image { width: 120; height: 100; source: screen.source; fillMode: Image.TileHorizontally } + Image { width: 120; height: 100; source: screen.source; fillMode: Image.TileVertically } + } +} diff --git a/tests/auto/declarative/qmlvisual/focusscope/data/test.0.png b/tests/auto/declarative/qmlvisual/focusscope/data/test.0.png new file mode 100644 index 00000000..fd28a931 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/focusscope/data/test.0.png differ diff --git a/tests/auto/declarative/qmlvisual/focusscope/data/test.1.png b/tests/auto/declarative/qmlvisual/focusscope/data/test.1.png new file mode 100644 index 00000000..986a1646 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/focusscope/data/test.1.png differ diff --git a/tests/auto/declarative/qmlvisual/focusscope/data/test.2.png b/tests/auto/declarative/qmlvisual/focusscope/data/test.2.png new file mode 100644 index 00000000..986a1646 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/focusscope/data/test.2.png differ diff --git a/tests/auto/declarative/qmlvisual/focusscope/data/test.3.png b/tests/auto/declarative/qmlvisual/focusscope/data/test.3.png new file mode 100644 index 00000000..fd28a931 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/focusscope/data/test.3.png differ diff --git a/tests/auto/declarative/qmlvisual/focusscope/data/test.qml b/tests/auto/declarative/qmlvisual/focusscope/data/test.qml new file mode 100644 index 00000000..e2bf23fd --- /dev/null +++ b/tests/auto/declarative/qmlvisual/focusscope/data/test.qml @@ -0,0 +1,923 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "test.0.png" + } + Frame { + msec: 32 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 48 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 64 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 80 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 96 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 112 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 128 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 144 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 160 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 176 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 192 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 208 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 224 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 240 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 256 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 272 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 288 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 304 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 320 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 336 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 352 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 368 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Key { + type: 6 + key: 16777237 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 384 + hash: "7d929804a37a70ffd487e95a3be8ea5f" + } + Frame { + msec: 400 + hash: "7d929804a37a70ffd487e95a3be8ea5f" + } + Frame { + msec: 416 + hash: "7d929804a37a70ffd487e95a3be8ea5f" + } + Frame { + msec: 432 + hash: "7d929804a37a70ffd487e95a3be8ea5f" + } + Frame { + msec: 448 + hash: "7d929804a37a70ffd487e95a3be8ea5f" + } + Frame { + msec: 464 + hash: "7d929804a37a70ffd487e95a3be8ea5f" + } + Frame { + msec: 480 + hash: "7d929804a37a70ffd487e95a3be8ea5f" + } + Key { + type: 7 + key: 16777237 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 496 + hash: "7d929804a37a70ffd487e95a3be8ea5f" + } + Frame { + msec: 512 + hash: "7d929804a37a70ffd487e95a3be8ea5f" + } + Frame { + msec: 528 + hash: "7d929804a37a70ffd487e95a3be8ea5f" + } + Frame { + msec: 544 + hash: "7d929804a37a70ffd487e95a3be8ea5f" + } + Frame { + msec: 560 + hash: "7d929804a37a70ffd487e95a3be8ea5f" + } + Frame { + msec: 576 + hash: "7d929804a37a70ffd487e95a3be8ea5f" + } + Frame { + msec: 592 + hash: "7d929804a37a70ffd487e95a3be8ea5f" + } + Key { + type: 6 + key: 16777235 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 608 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 624 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 640 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 656 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 672 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 688 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Key { + type: 7 + key: 16777235 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 704 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 720 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 736 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 752 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 768 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 784 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 800 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 816 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 832 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 848 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 864 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 880 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 896 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 912 + hash: "f369109744055d30eadf2832a028a104" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 928 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 944 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 960 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 976 + image: "test.1.png" + } + Frame { + msec: 992 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 1008 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 1024 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 1040 + hash: "f369109744055d30eadf2832a028a104" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1056 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 1072 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 1088 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 1104 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 1120 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 1136 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1152 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 1168 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 1184 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 1200 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 1216 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 1232 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 1248 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1264 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 1280 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 1296 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 1312 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 1328 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 1344 + hash: "f369109744055d30eadf2832a028a104" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1360 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 1376 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 1392 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 1408 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 1424 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 1440 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 1456 + hash: "f369109744055d30eadf2832a028a104" + } + Key { + type: 6 + key: 16777237 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1472 + hash: "0914d1f71cdaf1f1a37b95ea41c57d4f" + } + Frame { + msec: 1488 + hash: "0914d1f71cdaf1f1a37b95ea41c57d4f" + } + Frame { + msec: 1504 + hash: "0914d1f71cdaf1f1a37b95ea41c57d4f" + } + Frame { + msec: 1520 + hash: "0914d1f71cdaf1f1a37b95ea41c57d4f" + } + Frame { + msec: 1536 + hash: "0914d1f71cdaf1f1a37b95ea41c57d4f" + } + Key { + type: 7 + key: 16777237 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1552 + hash: "0914d1f71cdaf1f1a37b95ea41c57d4f" + } + Frame { + msec: 1568 + hash: "0914d1f71cdaf1f1a37b95ea41c57d4f" + } + Frame { + msec: 1584 + hash: "0914d1f71cdaf1f1a37b95ea41c57d4f" + } + Frame { + msec: 1600 + hash: "0914d1f71cdaf1f1a37b95ea41c57d4f" + } + Frame { + msec: 1616 + hash: "0914d1f71cdaf1f1a37b95ea41c57d4f" + } + Frame { + msec: 1632 + hash: "0914d1f71cdaf1f1a37b95ea41c57d4f" + } + Frame { + msec: 1648 + hash: "0914d1f71cdaf1f1a37b95ea41c57d4f" + } + Frame { + msec: 1664 + hash: "0914d1f71cdaf1f1a37b95ea41c57d4f" + } + Frame { + msec: 1680 + hash: "0914d1f71cdaf1f1a37b95ea41c57d4f" + } + Frame { + msec: 1696 + hash: "0914d1f71cdaf1f1a37b95ea41c57d4f" + } + Frame { + msec: 1712 + hash: "0914d1f71cdaf1f1a37b95ea41c57d4f" + } + Frame { + msec: 1728 + hash: "0914d1f71cdaf1f1a37b95ea41c57d4f" + } + Key { + type: 6 + key: 16777235 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1744 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 1760 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 1776 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 1792 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 1808 + hash: "f369109744055d30eadf2832a028a104" + } + Key { + type: 7 + key: 16777235 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1824 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 1840 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 1856 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 1872 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 1888 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 1904 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 1920 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 1936 + image: "test.2.png" + } + Frame { + msec: 1952 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 1968 + hash: "f369109744055d30eadf2832a028a104" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1984 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2000 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2016 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2032 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2048 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2064 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2080 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2096 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2112 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2128 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2144 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2160 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2176 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2192 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 2208 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 2224 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 2240 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 2256 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 2272 + hash: "f369109744055d30eadf2832a028a104" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2288 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 2304 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 2320 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 2336 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 2352 + hash: "f369109744055d30eadf2832a028a104" + } + Frame { + msec: 2368 + hash: "f369109744055d30eadf2832a028a104" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2384 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2400 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2416 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2432 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2448 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2464 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2480 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2496 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2512 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2528 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2544 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2560 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2576 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2592 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2608 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2624 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2640 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2656 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2672 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2688 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2704 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2720 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2736 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2752 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2768 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2784 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2800 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2816 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2832 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2848 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2864 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2880 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2896 + image: "test.3.png" + } + Frame { + msec: 2912 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2928 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2944 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2960 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2976 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 2992 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 3008 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } + Frame { + msec: 3024 + hash: "94675f9c9afb6834b91a69fd0ce35a22" + } +} diff --git a/tests/auto/declarative/qmlvisual/focusscope/data/test2.0.png b/tests/auto/declarative/qmlvisual/focusscope/data/test2.0.png new file mode 100644 index 00000000..396bf2d1 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/focusscope/data/test2.0.png differ diff --git a/tests/auto/declarative/qmlvisual/focusscope/data/test2.1.png b/tests/auto/declarative/qmlvisual/focusscope/data/test2.1.png new file mode 100644 index 00000000..396bf2d1 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/focusscope/data/test2.1.png differ diff --git a/tests/auto/declarative/qmlvisual/focusscope/data/test2.qml b/tests/auto/declarative/qmlvisual/focusscope/data/test2.qml new file mode 100644 index 00000000..8669071c --- /dev/null +++ b/tests/auto/declarative/qmlvisual/focusscope/data/test2.qml @@ -0,0 +1,323 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "test2.0.png" + } + Frame { + msec: 32 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 48 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 64 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 80 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 96 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 112 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 128 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 144 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 160 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 176 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 192 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 208 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 224 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 240 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 256 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 272 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 288 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 304 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 320 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 336 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 352 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 368 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 384 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 400 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 416 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 432 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 448 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 464 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 480 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 496 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 512 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 528 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 544 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 560 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 576 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 592 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 608 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 624 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 640 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 656 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 672 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 688 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 704 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 720 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 736 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 752 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 768 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 784 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 800 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 816 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 832 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 848 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 864 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 880 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 896 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 912 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 928 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 944 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 960 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 976 + image: "test2.1.png" + } + Frame { + msec: 992 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 1008 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 1024 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 1040 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 1056 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 1072 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 1088 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 1104 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 1120 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 1136 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 1152 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 1168 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 1184 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 1200 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 1216 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 1232 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 1248 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } + Frame { + msec: 1264 + hash: "f4041fcc91346361df95e344a0ee8e2d" + } +} diff --git a/tests/auto/declarative/qmlvisual/focusscope/data/test3.0.png b/tests/auto/declarative/qmlvisual/focusscope/data/test3.0.png new file mode 100644 index 00000000..c0925352 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/focusscope/data/test3.0.png differ diff --git a/tests/auto/declarative/qmlvisual/focusscope/data/test3.1.png b/tests/auto/declarative/qmlvisual/focusscope/data/test3.1.png new file mode 100644 index 00000000..861b4592 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/focusscope/data/test3.1.png differ diff --git a/tests/auto/declarative/qmlvisual/focusscope/data/test3.2.png b/tests/auto/declarative/qmlvisual/focusscope/data/test3.2.png new file mode 100644 index 00000000..2ede7c90 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/focusscope/data/test3.2.png differ diff --git a/tests/auto/declarative/qmlvisual/focusscope/data/test3.3.png b/tests/auto/declarative/qmlvisual/focusscope/data/test3.3.png new file mode 100644 index 00000000..055f1846 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/focusscope/data/test3.3.png differ diff --git a/tests/auto/declarative/qmlvisual/focusscope/data/test3.4.png b/tests/auto/declarative/qmlvisual/focusscope/data/test3.4.png new file mode 100644 index 00000000..c0925352 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/focusscope/data/test3.4.png differ diff --git a/tests/auto/declarative/qmlvisual/focusscope/data/test3.qml b/tests/auto/declarative/qmlvisual/focusscope/data/test3.qml new file mode 100644 index 00000000..8ed9c7dd --- /dev/null +++ b/tests/auto/declarative/qmlvisual/focusscope/data/test3.qml @@ -0,0 +1,1327 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "test3.0.png" + } + Frame { + msec: 32 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 48 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 64 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 80 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 96 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 112 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 128 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 144 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 160 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 176 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 192 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 208 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 224 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 240 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 256 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 272 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 288 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 304 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 320 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 336 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 352 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 368 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 384 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 400 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 416 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 432 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 448 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 464 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 480 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 496 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 512 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 528 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 544 + hash: "e24319b7e562a668e86ac17f4914bcb7" + } + Frame { + msec: 560 + hash: "742f87f00d2d7e64b4a579823fa99df2" + } + Frame { + msec: 576 + hash: "db6793df1b6d00f4b6286253173ee2b5" + } + Frame { + msec: 592 + hash: "3da67f52ad1bc0ee55f8d6637286f420" + } + Frame { + msec: 608 + hash: "89e8c8fd913cb229f5adc221090d789c" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 624 + hash: "d47cc2fe207628f4deddd58c3697171a" + } + Frame { + msec: 640 + hash: "9ab1f939324602533b14b20d6160ae57" + } + Frame { + msec: 656 + hash: "798b200076ec6688cda78fd273a9fde1" + } + Frame { + msec: 672 + hash: "5c485ac62f637db9e3aa327dd1bee801" + } + Frame { + msec: 688 + hash: "5c485ac62f637db9e3aa327dd1bee801" + } + Frame { + msec: 704 + hash: "5c485ac62f637db9e3aa327dd1bee801" + } + Frame { + msec: 720 + hash: "5c485ac62f637db9e3aa327dd1bee801" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 736 + hash: "75bbe5082eebec814c726adc8fc076ec" + } + Frame { + msec: 752 + hash: "58d8051766872d54831bec4c8c7cbd63" + } + Frame { + msec: 768 + hash: "f474b747b4b7bb2a5b2c418f35aa1b09" + } + Frame { + msec: 784 + hash: "d561cf0dbded0b2bd85c7c88fb3afdd6" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 800 + hash: "49c0616c4d5cedeb9fdb12fb7d7f504d" + } + Frame { + msec: 816 + hash: "9e5c66cfc3af51b7a10f6a969452dafe" + } + Frame { + msec: 832 + hash: "72d765f52ce8ab3748cd43d859285ca7" + } + Frame { + msec: 848 + hash: "732987bbdc421c4650d7503387acd4de" + } + Frame { + msec: 864 + hash: "439456ecedad4674b6ecef415e53334b" + } + Frame { + msec: 880 + hash: "439456ecedad4674b6ecef415e53334b" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 896 + hash: "5f2d5dc55b551713c4219bc55124f7db" + } + Frame { + msec: 912 + hash: "54e2150829c6201b3ba8eb61f4142de7" + } + Frame { + msec: 928 + hash: "f916ac803817b7cd7e29c05ac23449fc" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 944 + hash: "590b45a3fb1571428c8da48f026fab3b" + } + Frame { + msec: 960 + hash: "b5a811e6d1b956af67c6df4c9eabd0a3" + } + Frame { + msec: 976 + image: "test3.1.png" + } + Frame { + msec: 992 + hash: "877ca6b70b6535f868d3a450045f70a0" + } + Frame { + msec: 1008 + hash: "559a5c06ed2d1030d21f56aaaded8869" + } + Frame { + msec: 1024 + hash: "559a5c06ed2d1030d21f56aaaded8869" + } + Frame { + msec: 1040 + hash: "559a5c06ed2d1030d21f56aaaded8869" + } + Frame { + msec: 1056 + hash: "559a5c06ed2d1030d21f56aaaded8869" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1072 + hash: "f6d3d4fd5d9d1be96646891cbf0740e5" + } + Frame { + msec: 1088 + hash: "2ba5d4da68051a96fed2b54804854a8e" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1104 + hash: "2b1b72dfac63903377b427ef4149dfd7" + } + Frame { + msec: 1120 + hash: "7ada77586dd0583a66c801b6faf78e2a" + } + Frame { + msec: 1136 + hash: "a5c527fa2095e2d8949d36351994624a" + } + Frame { + msec: 1152 + hash: "f89bf3f20d3f7284ba52338c1cfb91e1" + } + Frame { + msec: 1168 + hash: "e7de3174a111f26f4d92a273e2c43b61" + } + Frame { + msec: 1184 + hash: "d9ef1156a1f7bfe86f97717a600b31c9" + } + Frame { + msec: 1200 + hash: "0b216b28513d00939531e409aac328e8" + } + Frame { + msec: 1216 + hash: "0b216b28513d00939531e409aac328e8" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1232 + hash: "d92131f183e9d926a2718559f58f17cb" + } + Frame { + msec: 1248 + hash: "9e5985271ddec748803ea3c72d40ad97" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1264 + hash: "2462ddfcf93f96ad6a3164c7f21e2948" + } + Frame { + msec: 1280 + hash: "4ce27e3e77d9c80982c5197c2a440dc4" + } + Frame { + msec: 1296 + hash: "e4afa6dc35ddd52876af514ec151900e" + } + Frame { + msec: 1312 + hash: "3e542da8a83e53c66fd96d2c003a8b67" + } + Frame { + msec: 1328 + hash: "6b0afb12551ada7501346125ac29071c" + } + Frame { + msec: 1344 + hash: "202d4ca464f73e28a286ebed05e86d9d" + } + Frame { + msec: 1360 + hash: "202d4ca464f73e28a286ebed05e86d9d" + } + Frame { + msec: 1376 + hash: "202d4ca464f73e28a286ebed05e86d9d" + } + Frame { + msec: 1392 + hash: "202d4ca464f73e28a286ebed05e86d9d" + } + Frame { + msec: 1408 + hash: "202d4ca464f73e28a286ebed05e86d9d" + } + Frame { + msec: 1424 + hash: "202d4ca464f73e28a286ebed05e86d9d" + } + Frame { + msec: 1440 + hash: "202d4ca464f73e28a286ebed05e86d9d" + } + Frame { + msec: 1456 + hash: "202d4ca464f73e28a286ebed05e86d9d" + } + Frame { + msec: 1472 + hash: "202d4ca464f73e28a286ebed05e86d9d" + } + Frame { + msec: 1488 + hash: "202d4ca464f73e28a286ebed05e86d9d" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1504 + hash: "ca6c00b583f88efb6efe285a0903392b" + } + Frame { + msec: 1520 + hash: "2a2fcb90a6a7ae6d3d08f49c7a7177c0" + } + Frame { + msec: 1536 + hash: "3a7cd960ff367793e09d73302e57b6e4" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1552 + hash: "581121ab5334a6122bf9ca4489c9b971" + } + Frame { + msec: 1568 + hash: "8690456fa25a12ef28f014b86cc94c81" + } + Frame { + msec: 1584 + hash: "27a395e2e25eedba8f361a20f917590b" + } + Frame { + msec: 1600 + hash: "5eae6bbdd6acd7f21eccf277f21f4893" + } + Frame { + msec: 1616 + hash: "f5ebab53b77dcea32e821c8e551077e4" + } + Frame { + msec: 1632 + hash: "738278d39b73bfa15fc8b19b5720bbd7" + } + Frame { + msec: 1648 + hash: "738278d39b73bfa15fc8b19b5720bbd7" + } + Frame { + msec: 1664 + hash: "738278d39b73bfa15fc8b19b5720bbd7" + } + Frame { + msec: 1680 + hash: "738278d39b73bfa15fc8b19b5720bbd7" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1696 + hash: "7c83c13e1d9e6456023ba7e2a1f3875c" + } + Frame { + msec: 1712 + hash: "f12f6c5111de654e90d462a4d44f12ec" + } + Frame { + msec: 1728 + hash: "dcb7712d8320bf4096a3af794facad4d" + } + Frame { + msec: 1744 + hash: "84f7c046592d31f403b56ee1fd6fcbc4" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1760 + hash: "1b05381e85ec8bbf69edacbedce01fb8" + } + Frame { + msec: 1776 + hash: "b2c148675ffe1ef5110602f7a4feab74" + } + Frame { + msec: 1792 + hash: "d082931d05d2b2dc24ccfa5d7a703291" + } + Frame { + msec: 1808 + hash: "99783e2541d03a7ce9ee4e69a2b21993" + } + Frame { + msec: 1824 + hash: "503ff7e940ac59006c1486e3d2027d35" + } + Frame { + msec: 1840 + hash: "503ff7e940ac59006c1486e3d2027d35" + } + Frame { + msec: 1856 + hash: "503ff7e940ac59006c1486e3d2027d35" + } + Frame { + msec: 1872 + hash: "503ff7e940ac59006c1486e3d2027d35" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1888 + hash: "06fbf3d840cbf170c94377d767d1d49f" + } + Frame { + msec: 1904 + hash: "34f538738046a1d6932ef1a6f59eb6be" + } + Frame { + msec: 1920 + hash: "2553f91e5ea5a4da70eb3825a0cdfa10" + } + Frame { + msec: 1936 + image: "test3.2.png" + } + Frame { + msec: 1952 + hash: "115f1c37d6492bbc4848cc4be6ddd2b0" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1968 + hash: "40d5255e7e5ca12b90f5cbede1e9b2cd" + } + Frame { + msec: 1984 + hash: "3a6f6b4cee75f8b1b0b2b5674c3df0a8" + } + Frame { + msec: 2000 + hash: "2c24eab593d56a7554f9ba925f858d5b" + } + Frame { + msec: 2016 + hash: "bb10ef1703674147351968121ebe0154" + } + Frame { + msec: 2032 + hash: "bb10ef1703674147351968121ebe0154" + } + Frame { + msec: 2048 + hash: "bb10ef1703674147351968121ebe0154" + } + Frame { + msec: 2064 + hash: "bb10ef1703674147351968121ebe0154" + } + Frame { + msec: 2080 + hash: "bb10ef1703674147351968121ebe0154" + } + Frame { + msec: 2096 + hash: "bb10ef1703674147351968121ebe0154" + } + Frame { + msec: 2112 + hash: "bb10ef1703674147351968121ebe0154" + } + Frame { + msec: 2128 + hash: "bb10ef1703674147351968121ebe0154" + } + Frame { + msec: 2144 + hash: "bb10ef1703674147351968121ebe0154" + } + Frame { + msec: 2160 + hash: "bb10ef1703674147351968121ebe0154" + } + Frame { + msec: 2176 + hash: "bb10ef1703674147351968121ebe0154" + } + Frame { + msec: 2192 + hash: "bb10ef1703674147351968121ebe0154" + } + Frame { + msec: 2208 + hash: "bb10ef1703674147351968121ebe0154" + } + Frame { + msec: 2224 + hash: "bb10ef1703674147351968121ebe0154" + } + Frame { + msec: 2240 + hash: "bb10ef1703674147351968121ebe0154" + } + Frame { + msec: 2256 + hash: "bb10ef1703674147351968121ebe0154" + } + Frame { + msec: 2272 + hash: "bb10ef1703674147351968121ebe0154" + } + Frame { + msec: 2288 + hash: "bb10ef1703674147351968121ebe0154" + } + Frame { + msec: 2304 + hash: "bb10ef1703674147351968121ebe0154" + } + Frame { + msec: 2320 + hash: "bb10ef1703674147351968121ebe0154" + } + Frame { + msec: 2336 + hash: "bb10ef1703674147351968121ebe0154" + } + Frame { + msec: 2352 + hash: "bb10ef1703674147351968121ebe0154" + } + Frame { + msec: 2368 + hash: "bb10ef1703674147351968121ebe0154" + } + Frame { + msec: 2384 + hash: "bb10ef1703674147351968121ebe0154" + } + Frame { + msec: 2400 + hash: "bb10ef1703674147351968121ebe0154" + } + Frame { + msec: 2416 + hash: "bb10ef1703674147351968121ebe0154" + } + Frame { + msec: 2432 + hash: "bb10ef1703674147351968121ebe0154" + } + Frame { + msec: 2448 + hash: "bb10ef1703674147351968121ebe0154" + } + Frame { + msec: 2464 + hash: "bb10ef1703674147351968121ebe0154" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2480 + hash: "1e61fbb8c054c6b8fdb895d236514bfa" + } + Frame { + msec: 2496 + hash: "3a1b093963a0cb898a68f87a3c2056a9" + } + Frame { + msec: 2512 + hash: "9fe3eb5cbc621401be9ab7bc7d28bb24" + } + Frame { + msec: 2528 + hash: "1bb16e3d17506913e295d68e8d4ffa88" + } + Frame { + msec: 2544 + hash: "19389ae4da2ad3bc7076632366db55c7" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2560 + hash: "5f1731dd62f61ddafb7cfe66167b7408" + } + Frame { + msec: 2576 + hash: "e37b8399f9ea92a91b0d98b01a4ef72b" + } + Frame { + msec: 2592 + hash: "e1282e3afc46fa8828a138e4722707b5" + } + Frame { + msec: 2608 + hash: "503ff7e940ac59006c1486e3d2027d35" + } + Frame { + msec: 2624 + hash: "503ff7e940ac59006c1486e3d2027d35" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2640 + hash: "925852b350354bb596d749fe31828147" + } + Frame { + msec: 2656 + hash: "1e302775a002185b888b590cc6533b28" + } + Frame { + msec: 2672 + hash: "b147169c3688148bda5b82afa1f5d2dc" + } + Frame { + msec: 2688 + hash: "34964e45ff808595845f4a868be3782e" + } + Frame { + msec: 2704 + hash: "b86ef7d97f20c3894dc5a551f41ab9c4" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2720 + hash: "dc9981cb1833b34fc4fc9b833281348e" + } + Frame { + msec: 2736 + hash: "b28644e06195849afd44143bd60aa27d" + } + Frame { + msec: 2752 + hash: "738278d39b73bfa15fc8b19b5720bbd7" + } + Frame { + msec: 2768 + hash: "738278d39b73bfa15fc8b19b5720bbd7" + } + Frame { + msec: 2784 + hash: "738278d39b73bfa15fc8b19b5720bbd7" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2800 + hash: "745230d107911d033ebeb58dc8a94445" + } + Frame { + msec: 2816 + hash: "81cc4ac88a51518cf50cd6b46c3e0cb7" + } + Frame { + msec: 2832 + hash: "10b7cff34298222ee305c9895bcdef21" + } + Frame { + msec: 2848 + hash: "622a027091c1577a646ece0331016783" + } + Frame { + msec: 2864 + hash: "ab527747f9918774c7a4cfb476cc31f4" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2880 + hash: "1bf8a37b5aeb9df37f97083ce19a0c1a" + } + Frame { + msec: 2896 + image: "test3.3.png" + } + Frame { + msec: 2912 + hash: "19a2f59bfe96a0a33ff45ab72cc2a2fc" + } + Frame { + msec: 2928 + hash: "202d4ca464f73e28a286ebed05e86d9d" + } + Frame { + msec: 2944 + hash: "202d4ca464f73e28a286ebed05e86d9d" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2960 + hash: "6b172121f35f9667f40b0006d5875685" + } + Frame { + msec: 2976 + hash: "6e65dfe717a69de65d58e059904bb00a" + } + Frame { + msec: 2992 + hash: "e660212f2d7d477213ef8b8262e8f2b1" + } + Frame { + msec: 3008 + hash: "df1e770a7177b7871cf734c47e1227ba" + } + Frame { + msec: 3024 + hash: "9d103d49ea30b04f3e97ecad3c13a816" + } + Frame { + msec: 3040 + hash: "4602aaf8b65c4ff5b9c8d4ba8d5b89d5" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3056 + hash: "bf029f1cb5ddf0dc3931b47895a2141d" + } + Frame { + msec: 3072 + hash: "0b216b28513d00939531e409aac328e8" + } + Frame { + msec: 3088 + hash: "0b216b28513d00939531e409aac328e8" + } + Frame { + msec: 3104 + hash: "0b216b28513d00939531e409aac328e8" + } + Frame { + msec: 3120 + hash: "0b216b28513d00939531e409aac328e8" + } + Frame { + msec: 3136 + hash: "0b216b28513d00939531e409aac328e8" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3152 + hash: "807fe46158fdc72c45cd6c8024ce705d" + } + Frame { + msec: 3168 + hash: "58dc1ca8e39488479acdb79762000ad5" + } + Frame { + msec: 3184 + hash: "48dd97d986ee545f6727128b7a06529f" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3200 + hash: "a7f0c00cb4bbbd65c02b3949c90564ad" + } + Frame { + msec: 3216 + hash: "3f1c40e8d17b83ff3a251d9284bd4282" + } + Frame { + msec: 3232 + hash: "d7527558128467c64cf0a07289158238" + } + Frame { + msec: 3248 + hash: "3af9f7618d0c9ffedb942ae422d61dcb" + } + Frame { + msec: 3264 + hash: "eb1703107106afc54d47d8600ea40f18" + } + Frame { + msec: 3280 + hash: "559a5c06ed2d1030d21f56aaaded8869" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3296 + hash: "c9a69d9ad499e6537ef047382dc01460" + } + Frame { + msec: 3312 + hash: "594911681db91c825b93633b6aa3fe1f" + } + Frame { + msec: 3328 + hash: "f566d5e728e9a45c7d339282c0c6709c" + } + Frame { + msec: 3344 + hash: "49f1d0164a1ae3c361421635a2038697" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3360 + hash: "a22b4ea9973c03042a3cfa5d23a79c86" + } + Frame { + msec: 3376 + hash: "abab27079cd52caaaf421d1b4d8d8066" + } + Frame { + msec: 3392 + hash: "e528a9ab6ae13518fa541d7f2c6e09a8" + } + Frame { + msec: 3408 + hash: "439456ecedad4674b6ecef415e53334b" + } + Frame { + msec: 3424 + hash: "439456ecedad4674b6ecef415e53334b" + } + Frame { + msec: 3440 + hash: "439456ecedad4674b6ecef415e53334b" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3456 + hash: "57543f91e958840efcad1948a19aa8e1" + } + Frame { + msec: 3472 + hash: "534fc45fdace49ebf444e393b57c1315" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3488 + hash: "0eee986f096e3ebddf61d3b0a18f2eff" + } + Frame { + msec: 3504 + hash: "74f702ca61d97d31f79d8ce3be53eee7" + } + Frame { + msec: 3520 + hash: "1f0b630548fe93f93550439b4945bdda" + } + Frame { + msec: 3536 + hash: "1eb442ca5e7e1f476d8297c3bdb7bbd1" + } + Frame { + msec: 3552 + hash: "1689cba06c74a6204d80cc651b1d2150" + } + Frame { + msec: 3568 + hash: "8711b6647c4146dfa3e3c680fbd1bf08" + } + Frame { + msec: 3584 + hash: "5c485ac62f637db9e3aa327dd1bee801" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3600 + hash: "0ac2726d000ba2ef1097a49f37d5c209" + } + Frame { + msec: 3616 + hash: "83d00571e499039b7f577e393eed881a" + } + Frame { + msec: 3632 + hash: "46724d427a8f6d7737abcacd76701259" + } + Frame { + msec: 3648 + hash: "a63554a4839e8874cbebe5204d43c6d5" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3664 + hash: "5946c98c4204d454a41575242db5fd45" + } + Frame { + msec: 3680 + hash: "a3d0107e71a6b454f8fdc7557eb9ce18" + } + Frame { + msec: 3696 + hash: "86d9ad1831acc4a73075e6792efb7db4" + } + Frame { + msec: 3712 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 3728 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 3744 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 3760 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 3776 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 3792 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 3808 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 3824 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 3840 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 3856 + image: "test3.4.png" + } + Frame { + msec: 3872 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 3888 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 3904 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 3920 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 3936 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 3952 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 3968 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 3984 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 4000 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 4016 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 4032 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 4048 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 4064 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 4080 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 4096 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 4112 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 4128 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 4144 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 4160 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 4176 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 4192 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 4208 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 4224 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 4240 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } + Frame { + msec: 4256 + hash: "cb3a3cca07a49fadf8bb00834ea24f73" + } +} diff --git a/tests/auto/declarative/qmlvisual/focusscope/test.qml b/tests/auto/declarative/qmlvisual/focusscope/test.qml new file mode 100644 index 00000000..7342e353 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/focusscope/test.qml @@ -0,0 +1,81 @@ +import QtQuick 1.0 + +/* + Blue border indicates scoped focus + Black border indicates NOT scoped focus + Red box indicates active focus + Use arrow keys to navigate + Press "9" to print currently focused item +*/ +Rectangle { + color: "white" + width: 480 + height: 480 + + Keys.onDigit9Pressed: console.log("Error - Root") + + FocusScope { + id: myScope + focus: true + + Keys.onDigit9Pressed: console.log("Error - FocusScope") + + Rectangle { + height: 120 + width: 420 + + color: "transparent" + border.width: 5 + border.color: myScope.activeFocus?"blue":"black" + + Rectangle { + id: item1 + x: 10; y: 10 + width: 100; height: 100; color: "green" + border.width: 5 + border.color: activeFocus?"blue":"black" + Keys.onDigit9Pressed: console.log("Top Left"); + KeyNavigation.right: item2 + focus: true + + Rectangle { + width: 50; height: 50; anchors.centerIn: parent + color: parent.focus?"red":"transparent" + } + } + + Rectangle { + id: item2 + x: 310; y: 10 + width: 100; height: 100; color: "green" + border.width: 5 + border.color: activeFocus?"blue":"black" + KeyNavigation.left: item1 + Keys.onDigit9Pressed: console.log("Top Right"); + + Rectangle { + width: 50; height: 50; anchors.centerIn: parent + color: parent.focus?"red":"transparent" + } + } + } + KeyNavigation.down: item3 + } + + Rectangle { + id: item3 + x: 10; y: 300 + width: 100; height: 100; color: "green" + border.width: 5 + border.color: activeFocus?"blue":"black" + + Keys.onDigit9Pressed: console.log("Bottom Left"); + KeyNavigation.up: myScope + + Rectangle { + width: 50; height: 50; anchors.centerIn: parent + color: parent.focus?"red":"transparent" + } + } + +} diff --git a/tests/auto/declarative/qmlvisual/focusscope/test2.qml b/tests/auto/declarative/qmlvisual/focusscope/test2.qml new file mode 100644 index 00000000..072eddbf --- /dev/null +++ b/tests/auto/declarative/qmlvisual/focusscope/test2.qml @@ -0,0 +1,38 @@ +import QtQuick 1.0 + +Rectangle { + color: "white" + width: 400 + height: 50 + + //All five rectangles should be red + FocusScope { + focus: true + Rectangle { width: 40; height: 40; color: parent.activeFocus?"red":"blue" } + + FocusScope { + x: 80 + focus: true + Rectangle { width: 40; height: 40; color: parent.activeFocus?"red":"blue" } + + FocusScope { + x: 80 + focus: true + Rectangle { width: 40; height: 40; color: parent.activeFocus?"red":"blue" } + + FocusScope { + x: 80 + focus: true + Rectangle { width: 40; height: 40; color: parent.activeFocus?"red":"blue" } + + FocusScope { + x: 80 + focus: true + Rectangle { width: 40; height: 40; color: parent.activeFocus?"red":"blue" } + } + } + } + } + } + +} diff --git a/tests/auto/declarative/qmlvisual/focusscope/test3.qml b/tests/auto/declarative/qmlvisual/focusscope/test3.qml new file mode 100644 index 00000000..90c23573 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/focusscope/test3.qml @@ -0,0 +1,52 @@ +import QtQuick 1.0 + +/* + Currently selected element should be red + Pressing "9" should print the number of the currently selected item + Be sure to scroll all the way to the right, pause, and then all the way to the left +*/ +Rectangle { + color: "white" + width: 400 + height: 100 + + ListModel { + id: model + ListElement { name: "red" } + ListElement { name: "orange" } + ListElement { name: "yellow" } + ListElement { name: "green" } + ListElement { name: "cyan" } + ListElement { name: "blue" } + ListElement { name: "indigo" } + ListElement { name: "violet" } + ListElement { name: "pink" } + } + + Component { + id: verticalDelegate + FocusScope { + id: root + width: 50; height: 50; + Keys.onDigit9Pressed: console.log("Error - " + name) + Rectangle { + focus: true + Keys.onDigit9Pressed: console.log(name) + width: 50; height: 50; + color: root.ListView.isCurrentItem?"black":name + } + } + } + + ListView { + width: 800; height: 50; orientation: "Horizontal" + focus: true + model: model + delegate: verticalDelegate + preferredHighlightBegin: 100 + preferredHighlightEnd: 101 + highlightRangeMode: ListView.StrictlyEnforceRange + } + + +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/animated-smooth.qml b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/animated-smooth.qml new file mode 100644 index 00000000..33d8cb85 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/animated-smooth.qml @@ -0,0 +1,66 @@ +import QtQuick 1.0 +import "content" + +Rectangle { + id: page + color: "white" + width: 520; height: 260 + Grid{ + columns: 4 + spacing: 4 + MyBorderImage { + minWidth: 60; maxWidth: 120 + minHeight: 60; maxHeight: 120 + source: "content/colors.png"; margin: 15 + antialiased: true + } + MyBorderImage { + minWidth: 60; maxWidth: 120 + minHeight: 60; maxHeight: 120 + source: "content/colors.png"; margin: 15 + horizontalMode: BorderImage.Repeat; verticalMode: BorderImage.Repeat + antialiased: true + } + MyBorderImage { + minWidth: 60; maxWidth: 120 + minHeight: 60; maxHeight: 120 + source: "content/colors.png"; margin: 15 + horizontalMode: BorderImage.Stretch; verticalMode: BorderImage.Repeat + antialiased: true + } + MyBorderImage { + minWidth: 60; maxWidth: 120 + minHeight: 60; maxHeight: 120 + source: "content/colors.png"; margin: 15 + horizontalMode: BorderImage.Round; verticalMode: BorderImage.Round + antialiased: true + } + MyBorderImage { + minWidth: 60; maxWidth: 120 + minHeight: 40; maxHeight: 120 + source: "content/bw.png"; margin: 10 + antialiased: true + } + MyBorderImage { + minWidth: 60; maxWidth: 120 + minHeight: 40; maxHeight: 120 + source: "content/bw.png"; margin: 10 + horizontalMode: BorderImage.Repeat; verticalMode: BorderImage.Repeat + antialiased: true + } + MyBorderImage { + minWidth: 60; maxWidth: 120 + minHeight: 40; maxHeight: 120 + source: "content/bw.png"; margin: 10 + horizontalMode: BorderImage.Stretch; verticalMode: BorderImage.Repeat + antialiased: true + } + MyBorderImage { + minWidth: 60; maxWidth: 120 + minHeight: 40; maxHeight: 120 + source: "content/bw.png"; margin: 10 + horizontalMode: BorderImage.Round; verticalMode: BorderImage.Round + antialiased: true + } + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/animated.qml b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/animated.qml new file mode 100644 index 00000000..21f6b5f9 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/animated.qml @@ -0,0 +1,58 @@ +import QtQuick 1.0 +import "content" + +Rectangle { + id: page + color: "white" + width: 520; height: 260 + Grid{ + columns: 4 + spacing: 4 + MyBorderImage { + minWidth: 60; maxWidth: 120 + minHeight: 60; maxHeight: 120 + source: "content/colors.png"; margin: 15 + } + MyBorderImage { + minWidth: 60; maxWidth: 120 + minHeight: 60; maxHeight: 120 + source: "content/colors.png"; margin: 15 + horizontalMode: BorderImage.Repeat; verticalMode: BorderImage.Repeat + } + MyBorderImage { + minWidth: 60; maxWidth: 120 + minHeight: 60; maxHeight: 120 + source: "content/colors.png"; margin: 15 + horizontalMode: BorderImage.Stretch; verticalMode: BorderImage.Repeat + } + MyBorderImage { + minWidth: 60; maxWidth: 120 + minHeight: 60; maxHeight: 120 + source: "content/colors.png"; margin: 15 + horizontalMode: BorderImage.Round; verticalMode: BorderImage.Round + } + MyBorderImage { + minWidth: 60; maxWidth: 120 + minHeight: 40; maxHeight: 120 + source: "content/bw.png"; margin: 10 + } + MyBorderImage { + minWidth: 60; maxWidth: 120 + minHeight: 40; maxHeight: 120 + source: "content/bw.png"; margin: 10 + horizontalMode: BorderImage.Repeat; verticalMode: BorderImage.Repeat + } + MyBorderImage { + minWidth: 60; maxWidth: 120 + minHeight: 40; maxHeight: 120 + source: "content/bw.png"; margin: 10 + horizontalMode: BorderImage.Stretch; verticalMode: BorderImage.Repeat + } + MyBorderImage { + minWidth: 60; maxWidth: 120 + minHeight: 40; maxHeight: 120 + source: "content/bw.png"; margin: 10 + horizontalMode: BorderImage.Round; verticalMode: BorderImage.Round + } + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/borders.qml b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/borders.qml new file mode 100644 index 00000000..1a8b7a59 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/borders.qml @@ -0,0 +1,18 @@ +import QtQuick 1.0 + +Rectangle { + id: page + color: "white" + width: 520; height: 280 + + BorderImage { + x: 20; y: 20; width: 230; height: 240 + smooth: true + source: "content/colors-stretch.sci" + } + BorderImage { + x: 270; y: 20; width: 230; height: 240 + smooth: true + source: "content/colors-round.sci" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/content/MyBorderImage.qml b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/content/MyBorderImage.qml new file mode 100644 index 00000000..923db47b --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/content/MyBorderImage.qml @@ -0,0 +1,38 @@ +import QtQuick 1.0 + +Item { + property alias horizontalMode: image.horizontalTileMode + property alias verticalMode: image.verticalTileMode + property alias source: image.source + property alias antialiased: image.smooth + + property int minWidth + property int minHeight + property int maxWidth + property int maxHeight + property int margin + + id: container + width: maxWidth; height: maxHeight + + BorderImage { + id: image; x: container.width / 2 - width / 2; y: container.height / 2 - height / 2 + + SequentialAnimation on width { + loops: Animation.Infinite + NumberAnimation { from: container.minWidth; to: container.maxWidth; duration: 600; easing.type: "InOutQuad"} + NumberAnimation { from: container.maxWidth; to: container.minWidth; duration: 600; easing.type: "InOutQuad" } + } + + SequentialAnimation on height { + loops: Animation.Infinite + NumberAnimation { from: container.minHeight; to: container.maxHeight; duration: 600; easing.type: "InOutQuad"} + NumberAnimation { from: container.maxHeight; to: container.minHeight; duration: 600; easing.type: "InOutQuad" } + } + + border.top: container.margin + border.left: container.margin + border.bottom: container.margin + border.right: container.margin + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/content/bw.png b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/content/bw.png new file mode 100644 index 00000000..486eaae9 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/content/bw.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/content/colors-round.sci b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/content/colors-round.sci new file mode 100644 index 00000000..0d917645 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/content/colors-round.sci @@ -0,0 +1,7 @@ +border.left:15 +border.top:15 +border.right:15 +border.bottom:15 +horizontalTileRule:Round +verticalTileRule:Round +source:colors.png diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/content/colors-stretch.sci b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/content/colors-stretch.sci new file mode 100644 index 00000000..16ac8ccd --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/content/colors-stretch.sci @@ -0,0 +1,5 @@ +border.left:15 +border.top:15 +border.right:15 +border.bottom:15 +source:colors.png diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/content/colors.png b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/content/colors.png new file mode 100644 index 00000000..116907d2 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/content/colors.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/content/qmldir b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/content/qmldir new file mode 100644 index 00000000..0c732d2d --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/content/qmldir @@ -0,0 +1 @@ +MyBorderImage 1.0 MyBorderImage.qml diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated-smooth.0.png b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated-smooth.0.png new file mode 100644 index 00000000..b7d06e48 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated-smooth.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated-smooth.1.png b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated-smooth.1.png new file mode 100644 index 00000000..d904aa0d Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated-smooth.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated-smooth.qml b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated-smooth.qml new file mode 100644 index 00000000..6c7a9408 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated-smooth.qml @@ -0,0 +1,319 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "animated-smooth.0.png" + } + Frame { + msec: 32 + hash: "a2467396d7318a93d35aa314896d3d05" + } + Frame { + msec: 48 + hash: "a2467396d7318a93d35aa314896d3d05" + } + Frame { + msec: 64 + hash: "8ba2cebd7b80bd58612ce46470e7763b" + } + Frame { + msec: 80 + hash: "9ab9c8f788bbca58552bbb6009386d69" + } + Frame { + msec: 96 + hash: "7f4b50df7848ad07fb75cb19f2c4b04a" + } + Frame { + msec: 112 + hash: "425e48ae492190eb6b8028be11352d7e" + } + Frame { + msec: 128 + hash: "183e1f8321edb7b8d1cc2cc858039360" + } + Frame { + msec: 144 + hash: "83d82bc27b0e3387dddb8e7e09380e02" + } + Frame { + msec: 160 + hash: "bca94a64a283e7e30ec8c1fe3249f981" + } + Frame { + msec: 176 + hash: "26cbcf6233c8fd222a857a8ae801749a" + } + Frame { + msec: 192 + hash: "ac1d21dba648ab729e1670ead441b173" + } + Frame { + msec: 208 + hash: "e42811f8029c6cd70041f8492a31ff27" + } + Frame { + msec: 224 + hash: "f0b06b2ccf1be47ab7c5f6863ccdc495" + } + Frame { + msec: 240 + hash: "9b398166d385facb2d02c86cd92ab85f" + } + Frame { + msec: 256 + hash: "a4414a5ae4e44320383d49441d7acb51" + } + Frame { + msec: 272 + hash: "f09208fa210f3b0b271af9ef6f3741e8" + } + Frame { + msec: 288 + hash: "054f7aebcef583f9c8469aaa2e62f9ea" + } + Frame { + msec: 304 + hash: "1331b1218fa6134922ab248bfde5d3f6" + } + Frame { + msec: 320 + hash: "601b97220c77c185d9ed3ae3726815a5" + } + Frame { + msec: 336 + hash: "487c739f3849834e3d7fa2885bb28375" + } + Frame { + msec: 352 + hash: "c41dc19ab7f3c80349ac52ab2c3b410d" + } + Frame { + msec: 368 + hash: "c6e8b055e5919aecbf2ef4d88de6cabd" + } + Frame { + msec: 384 + hash: "f9d99999cccd8a3a9d7cb74cadb08059" + } + Frame { + msec: 400 + hash: "c466c57cda1c7666a46bab9478031c86" + } + Frame { + msec: 416 + hash: "02f9c85d8cbd9041ed18d2fe0071c526" + } + Frame { + msec: 432 + hash: "355d2b1b30a721a26f80c414bd9164f6" + } + Frame { + msec: 448 + hash: "bfc8b1bdb53f4a4c44285a5c10819ae7" + } + Frame { + msec: 464 + hash: "c272ac121fe5392f12ef3180d4c694c8" + } + Frame { + msec: 480 + hash: "83324ab9209ac5246c39274ecec2dbcf" + } + Frame { + msec: 496 + hash: "b128fd583f5fa460bcd1c062226274fb" + } + Frame { + msec: 512 + hash: "f46f1f1069806b1e17f340140e82bfd3" + } + Frame { + msec: 528 + hash: "dff621d5da5f4d008a8f874914f90637" + } + Frame { + msec: 544 + hash: "c5920a84e215f4bbda3032bbfbca4070" + } + Frame { + msec: 560 + hash: "ecc23f198a4bf346bf6eee51f7adea69" + } + Frame { + msec: 576 + hash: "dcc8f5b1b6aac31c3c5856560b37c501" + } + Frame { + msec: 592 + hash: "203fa4bd23440aa88fc2a27b66ee091d" + } + Frame { + msec: 608 + hash: "a2662209c8f9aa7bd9c5b4066b289cde" + } + Frame { + msec: 624 + hash: "a2662209c8f9aa7bd9c5b4066b289cde" + } + Frame { + msec: 640 + hash: "203fa4bd23440aa88fc2a27b66ee091d" + } + Frame { + msec: 656 + hash: "dcc8f5b1b6aac31c3c5856560b37c501" + } + Frame { + msec: 672 + hash: "ecc23f198a4bf346bf6eee51f7adea69" + } + Frame { + msec: 688 + hash: "c5920a84e215f4bbda3032bbfbca4070" + } + Frame { + msec: 704 + hash: "dff621d5da5f4d008a8f874914f90637" + } + Frame { + msec: 720 + hash: "f46f1f1069806b1e17f340140e82bfd3" + } + Frame { + msec: 736 + hash: "b128fd583f5fa460bcd1c062226274fb" + } + Frame { + msec: 752 + hash: "83324ab9209ac5246c39274ecec2dbcf" + } + Frame { + msec: 768 + hash: "c272ac121fe5392f12ef3180d4c694c8" + } + Frame { + msec: 784 + hash: "bfc8b1bdb53f4a4c44285a5c10819ae7" + } + Frame { + msec: 800 + hash: "355d2b1b30a721a26f80c414bd9164f6" + } + Frame { + msec: 816 + hash: "02f9c85d8cbd9041ed18d2fe0071c526" + } + Frame { + msec: 832 + hash: "c466c57cda1c7666a46bab9478031c86" + } + Frame { + msec: 848 + hash: "f9d99999cccd8a3a9d7cb74cadb08059" + } + Frame { + msec: 864 + hash: "c6e8b055e5919aecbf2ef4d88de6cabd" + } + Frame { + msec: 880 + hash: "c41dc19ab7f3c80349ac52ab2c3b410d" + } + Frame { + msec: 896 + hash: "487c739f3849834e3d7fa2885bb28375" + } + Frame { + msec: 912 + hash: "601b97220c77c185d9ed3ae3726815a5" + } + Frame { + msec: 928 + hash: "1331b1218fa6134922ab248bfde5d3f6" + } + Frame { + msec: 944 + hash: "054f7aebcef583f9c8469aaa2e62f9ea" + } + Frame { + msec: 960 + hash: "f09208fa210f3b0b271af9ef6f3741e8" + } + Frame { + msec: 976 + image: "animated-smooth.1.png" + } + Frame { + msec: 992 + hash: "9b398166d385facb2d02c86cd92ab85f" + } + Frame { + msec: 1008 + hash: "f0b06b2ccf1be47ab7c5f6863ccdc495" + } + Frame { + msec: 1024 + hash: "e42811f8029c6cd70041f8492a31ff27" + } + Frame { + msec: 1040 + hash: "ac1d21dba648ab729e1670ead441b173" + } + Frame { + msec: 1056 + hash: "26cbcf6233c8fd222a857a8ae801749a" + } + Frame { + msec: 1072 + hash: "bca94a64a283e7e30ec8c1fe3249f981" + } + Frame { + msec: 1088 + hash: "83d82bc27b0e3387dddb8e7e09380e02" + } + Frame { + msec: 1104 + hash: "183e1f8321edb7b8d1cc2cc858039360" + } + Frame { + msec: 1120 + hash: "425e48ae492190eb6b8028be11352d7e" + } + Frame { + msec: 1136 + hash: "7f4b50df7848ad07fb75cb19f2c4b04a" + } + Frame { + msec: 1152 + hash: "9ab9c8f788bbca58552bbb6009386d69" + } + Frame { + msec: 1168 + hash: "8ba2cebd7b80bd58612ce46470e7763b" + } + Frame { + msec: 1184 + hash: "a2467396d7318a93d35aa314896d3d05" + } + Frame { + msec: 1200 + hash: "a2467396d7318a93d35aa314896d3d05" + } + Frame { + msec: 1216 + hash: "a2467396d7318a93d35aa314896d3d05" + } + Frame { + msec: 1232 + hash: "a2467396d7318a93d35aa314896d3d05" + } + Frame { + msec: 1248 + hash: "a2467396d7318a93d35aa314896d3d05" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated.0.png b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated.0.png new file mode 100644 index 00000000..b7d06e48 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated.1.png b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated.1.png new file mode 100644 index 00000000..a0081a95 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated.qml b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated.qml new file mode 100644 index 00000000..87be9f06 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/animated.qml @@ -0,0 +1,343 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "animated.0.png" + } + Frame { + msec: 32 + hash: "a2467396d7318a93d35aa314896d3d05" + } + Frame { + msec: 48 + hash: "a2467396d7318a93d35aa314896d3d05" + } + Frame { + msec: 64 + hash: "ed19378ea8f51f5ecbd4c89ee5c905c2" + } + Frame { + msec: 80 + hash: "3dc69d5d1b6c524a74e7cec619df5ee3" + } + Frame { + msec: 96 + hash: "ab8d9aa7290be2134a6ef10ca1e1bfe7" + } + Frame { + msec: 112 + hash: "8091f4ff6f68e178b7a2a76ba2b38df3" + } + Frame { + msec: 128 + hash: "a94ad01eb63609b5e4a9e6570e1dc25c" + } + Frame { + msec: 144 + hash: "21692407cdfeeb20ff81d5d8a8ba3b7e" + } + Frame { + msec: 160 + hash: "b1d5e860ea311dce4a46fd6d46f9ed58" + } + Frame { + msec: 176 + hash: "a2ef453b88ee01c70a4312ab6dd26685" + } + Frame { + msec: 192 + hash: "6ce1f7da3994a51ad06afa0afb789752" + } + Frame { + msec: 208 + hash: "dccf9c55dfe7ae652b0e659893465158" + } + Frame { + msec: 224 + hash: "18b00b462711676fdf61ef1819f9f73a" + } + Frame { + msec: 240 + hash: "981011b01c3dbde098b1a3d0de4026cd" + } + Frame { + msec: 256 + hash: "86389b057e84c4dd4cf75d4e33d5e282" + } + Frame { + msec: 272 + hash: "6802146ad90b2921856c103246f4bca9" + } + Frame { + msec: 288 + hash: "7ab7d71199e883192e28fc150646128c" + } + Frame { + msec: 304 + hash: "3d2298cc655318029a2467813f8d75f4" + } + Frame { + msec: 320 + hash: "74a1ed7250f85e7ed4d811b5b697ecb3" + } + Frame { + msec: 336 + hash: "2cc6d5e8f4ebde059ffe31fffb2b359d" + } + Frame { + msec: 352 + hash: "b08aec6d9f82e0d530d57f592c25e91a" + } + Frame { + msec: 368 + hash: "9f4272d24685a9fbe5c48186932cac07" + } + Frame { + msec: 384 + hash: "4cde877841640aa89949c1369c3b6fd0" + } + Frame { + msec: 400 + hash: "bdbbd0b6a309b63d152b7f9b34b51d80" + } + Frame { + msec: 416 + hash: "531708677915c1e094ece6f1acac6d1f" + } + Frame { + msec: 432 + hash: "7213628b1f66f1dc47fa63eb2aad2d81" + } + Frame { + msec: 448 + hash: "0ff58a47d524fae956431efc21364ed2" + } + Frame { + msec: 464 + hash: "1e940cc44e00f05bad28bcf934b40b1c" + } + Frame { + msec: 480 + hash: "0f76be39637e8b6ac15c40ea95890189" + } + Frame { + msec: 496 + hash: "e23cf00dbd05677815e7e38f6f8e3a4a" + } + Frame { + msec: 512 + hash: "3d7e81620d169800f6a251fa3875f23d" + } + Frame { + msec: 528 + hash: "9e04076e283a3a71407488e94d84861f" + } + Frame { + msec: 544 + hash: "f4fc58740d6b5cf392e117164d859c0b" + } + Frame { + msec: 560 + hash: "8f041ba2a82618c1545aac6f50c95384" + } + Frame { + msec: 576 + hash: "759368622bc25c7ae1cb8d2c44affe6a" + } + Frame { + msec: 592 + hash: "90314671aab8165c7c1b35dcf5aaa6b9" + } + Frame { + msec: 608 + hash: "ecd1d2fe087a36fc58290c0c249a7ea0" + } + Frame { + msec: 624 + hash: "ecd1d2fe087a36fc58290c0c249a7ea0" + } + Frame { + msec: 640 + hash: "90314671aab8165c7c1b35dcf5aaa6b9" + } + Frame { + msec: 656 + hash: "759368622bc25c7ae1cb8d2c44affe6a" + } + Frame { + msec: 672 + hash: "8f041ba2a82618c1545aac6f50c95384" + } + Frame { + msec: 688 + hash: "f4fc58740d6b5cf392e117164d859c0b" + } + Frame { + msec: 704 + hash: "9e04076e283a3a71407488e94d84861f" + } + Frame { + msec: 720 + hash: "3d7e81620d169800f6a251fa3875f23d" + } + Frame { + msec: 736 + hash: "e23cf00dbd05677815e7e38f6f8e3a4a" + } + Frame { + msec: 752 + hash: "0f76be39637e8b6ac15c40ea95890189" + } + Frame { + msec: 768 + hash: "1e940cc44e00f05bad28bcf934b40b1c" + } + Frame { + msec: 784 + hash: "0ff58a47d524fae956431efc21364ed2" + } + Frame { + msec: 800 + hash: "7213628b1f66f1dc47fa63eb2aad2d81" + } + Frame { + msec: 816 + hash: "531708677915c1e094ece6f1acac6d1f" + } + Frame { + msec: 832 + hash: "bdbbd0b6a309b63d152b7f9b34b51d80" + } + Frame { + msec: 848 + hash: "4cde877841640aa89949c1369c3b6fd0" + } + Frame { + msec: 864 + hash: "9f4272d24685a9fbe5c48186932cac07" + } + Frame { + msec: 880 + hash: "b08aec6d9f82e0d530d57f592c25e91a" + } + Frame { + msec: 896 + hash: "2cc6d5e8f4ebde059ffe31fffb2b359d" + } + Frame { + msec: 912 + hash: "74a1ed7250f85e7ed4d811b5b697ecb3" + } + Frame { + msec: 928 + hash: "3d2298cc655318029a2467813f8d75f4" + } + Frame { + msec: 944 + hash: "7ab7d71199e883192e28fc150646128c" + } + Frame { + msec: 960 + hash: "6802146ad90b2921856c103246f4bca9" + } + Frame { + msec: 976 + image: "animated.1.png" + } + Frame { + msec: 992 + hash: "981011b01c3dbde098b1a3d0de4026cd" + } + Frame { + msec: 1008 + hash: "18b00b462711676fdf61ef1819f9f73a" + } + Frame { + msec: 1024 + hash: "dccf9c55dfe7ae652b0e659893465158" + } + Frame { + msec: 1040 + hash: "6ce1f7da3994a51ad06afa0afb789752" + } + Frame { + msec: 1056 + hash: "a2ef453b88ee01c70a4312ab6dd26685" + } + Frame { + msec: 1072 + hash: "b1d5e860ea311dce4a46fd6d46f9ed58" + } + Frame { + msec: 1088 + hash: "21692407cdfeeb20ff81d5d8a8ba3b7e" + } + Frame { + msec: 1104 + hash: "a94ad01eb63609b5e4a9e6570e1dc25c" + } + Frame { + msec: 1120 + hash: "8091f4ff6f68e178b7a2a76ba2b38df3" + } + Frame { + msec: 1136 + hash: "ab8d9aa7290be2134a6ef10ca1e1bfe7" + } + Frame { + msec: 1152 + hash: "3dc69d5d1b6c524a74e7cec619df5ee3" + } + Frame { + msec: 1168 + hash: "ed19378ea8f51f5ecbd4c89ee5c905c2" + } + Frame { + msec: 1184 + hash: "a2467396d7318a93d35aa314896d3d05" + } + Frame { + msec: 1200 + hash: "a2467396d7318a93d35aa314896d3d05" + } + Frame { + msec: 1216 + hash: "a2467396d7318a93d35aa314896d3d05" + } + Frame { + msec: 1232 + hash: "a2467396d7318a93d35aa314896d3d05" + } + Frame { + msec: 1248 + hash: "a2467396d7318a93d35aa314896d3d05" + } + Frame { + msec: 1264 + hash: "ed19378ea8f51f5ecbd4c89ee5c905c2" + } + Frame { + msec: 1280 + hash: "3dc69d5d1b6c524a74e7cec619df5ee3" + } + Frame { + msec: 1296 + hash: "ab8d9aa7290be2134a6ef10ca1e1bfe7" + } + Frame { + msec: 1312 + hash: "8091f4ff6f68e178b7a2a76ba2b38df3" + } + Frame { + msec: 1328 + hash: "a94ad01eb63609b5e4a9e6570e1dc25c" + } + Frame { + msec: 1344 + hash: "21692407cdfeeb20ff81d5d8a8ba3b7e" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/borders.0.png b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/borders.0.png new file mode 100644 index 00000000..8d435541 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/borders.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/borders.qml b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/borders.qml new file mode 100644 index 00000000..eb40fcb5 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativeborderimage/data/borders.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "borders.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.0.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.0.png new file mode 100644 index 00000000..9a81b29a Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.1.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.1.png new file mode 100644 index 00000000..2d9c4fdf Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.2.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.2.png new file mode 100644 index 00000000..2bb0cb0f Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.3.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.3.png new file mode 100644 index 00000000..8260a65d Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.4.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.4.png new file mode 100644 index 00000000..0abcbc2f Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.qml b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.qml new file mode 100644 index 00000000..f1bb4282 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data-MAC/flickable-horizontal.qml @@ -0,0 +1,1575 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "flickable-horizontal.0.png" + } + Frame { + msec: 32 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 48 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 64 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 80 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 96 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 112 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 128 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 144 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 160 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 176 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 192 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 208 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 224 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 240 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 256 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 272 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 288 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 304 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 320 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 336 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 352 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 368 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 384 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 400 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 416 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 432 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 448 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 464 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 480 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 496 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 512 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 528 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 544 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 560 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 576 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 592 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 608 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 624 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 640 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 656 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 672 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 688 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 704 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 720 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 447; y: 145 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 736 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 752 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 768 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 446; y: 145 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 784 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 440; y: 146 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 800 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 425; y: 151 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 407; y: 157 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 816 + hash: "c92e345e4ffdb30c28d9d5aa5400bd30" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 359; y: 169 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 832 + hash: "90f94986ab44ab59618e9a5da17b8cc9" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 309; y: 181 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 848 + hash: "0154a65f8693b98576101ac1c2fc8761" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 282; y: 187 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 282; y: 187 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 864 + hash: "792c1b5267f14c891dae2348a8188a92" + } + Frame { + msec: 880 + hash: "15ce9e88d4ad2e698bf167d1432c0b8a" + } + Frame { + msec: 896 + hash: "8f4109ef4c24d286d73f689565a0d056" + } + Frame { + msec: 912 + hash: "f5728190bf5c94742686f063b4a4b09b" + } + Frame { + msec: 928 + hash: "a38c7527a9a818b7bc25466b0e4939f9" + } + Frame { + msec: 944 + hash: "ed3902455fc31a4e3232308b815a4daa" + } + Frame { + msec: 960 + hash: "a2093589363ac2d50491412e99e0193a" + } + Frame { + msec: 976 + image: "flickable-horizontal.1.png" + } + Frame { + msec: 992 + hash: "c32349580e3a9586cc1133c935607cf0" + } + Frame { + msec: 1008 + hash: "cd2068492e346eb20d50aee69e3a3559" + } + Frame { + msec: 1024 + hash: "f43a1a38894b8ffad009ba995d84b0ee" + } + Frame { + msec: 1040 + hash: "2d5c4a73df2a054801571f1ce119e31f" + } + Frame { + msec: 1056 + hash: "b8825cc6bdca8102a655d797ea41b5b1" + } + Frame { + msec: 1072 + hash: "3f0be15b85220743d004f2d54b6e137c" + } + Frame { + msec: 1088 + hash: "4b0952d33149b44ffa0a06723a4116c7" + } + Frame { + msec: 1104 + hash: "9056bda43259e92cfe56fdf394e2ca54" + } + Frame { + msec: 1120 + hash: "82ec9f09d2303e5b0b9c05b9a10a84db" + } + Frame { + msec: 1136 + hash: "751a9b3054c09d900364d7c9cac8bc2b" + } + Frame { + msec: 1152 + hash: "17dfdfef20f9da7e8b6f16df974baea9" + } + Frame { + msec: 1168 + hash: "108e6d9a5a81df32823bfd7a90a000a7" + } + Frame { + msec: 1184 + hash: "71dd0d55a3e837d3a8e4b4e318579ade" + } + Frame { + msec: 1200 + hash: "8013cdb2615bca89134ea040409af509" + } + Frame { + msec: 1216 + hash: "4b2826ad4c755690bd837994133f5fac" + } + Frame { + msec: 1232 + hash: "52d0da7f138bd37ac587a448d6402aca" + } + Frame { + msec: 1248 + hash: "e634724c5bb294d338210845bf64d2cf" + } + Frame { + msec: 1264 + hash: "59bc5f0d057ee431f289806377f19213" + } + Frame { + msec: 1280 + hash: "6ef2c5f7766c2cc77b30d636bfaa4422" + } + Frame { + msec: 1296 + hash: "578d056c3db094420dbaa51bd08ced20" + } + Frame { + msec: 1312 + hash: "14c6f7a04a52caffefa07af556ccb262" + } + Frame { + msec: 1328 + hash: "7cb63d56fec144d0509ce219fc6fe459" + } + Frame { + msec: 1344 + hash: "462dafa7f6427aecf6c28a5dcf5a10cc" + } + Frame { + msec: 1360 + hash: "45360814f985ed780a443568a91fc170" + } + Frame { + msec: 1376 + hash: "0d18ceb2436e4f7eb56a3443fab706e6" + } + Frame { + msec: 1392 + hash: "1d83f367ba9f7f1d4496208271e925ed" + } + Frame { + msec: 1408 + hash: "fdbd00ee4c122aef779df42ea53f403a" + } + Frame { + msec: 1424 + hash: "bedd1cb304efd4851813b39a746198a4" + } + Frame { + msec: 1440 + hash: "9aa7bed86efa9634466736f20ee0ab5b" + } + Frame { + msec: 1456 + hash: "00fc8186a7ae44e10195a7b13defa0d2" + } + Frame { + msec: 1472 + hash: "42d6e8e0bbed879ed63644c83e61e7bd" + } + Frame { + msec: 1488 + hash: "df074f8c210249e5ef652349479b6325" + } + Frame { + msec: 1504 + hash: "4f94020437e35cf44dd3576997990ab7" + } + Frame { + msec: 1520 + hash: "8ca6c3b4fa3be73ac35073356b680a35" + } + Frame { + msec: 1536 + hash: "c25eee1c5791383ebc59974e7754eacb" + } + Frame { + msec: 1552 + hash: "f4917ada78942428cc6b9aa5e56c013d" + } + Frame { + msec: 1568 + hash: "23e1e607101fc7260a4ac841344f5fe0" + } + Frame { + msec: 1584 + hash: "2dcc7d187d8e0493e5766efbf09ef37c" + } + Frame { + msec: 1600 + hash: "c1e5602753e80cf44d7b330140c6912e" + } + Frame { + msec: 1616 + hash: "febaf72d01a3763461b4b7d2ddd7a23e" + } + Frame { + msec: 1632 + hash: "071262b911b61576f451be25691a57cf" + } + Frame { + msec: 1648 + hash: "44705db9289fd8753b9d63e8bc963b38" + } + Frame { + msec: 1664 + hash: "0c41d7b7d36bd083abfc0b83b862cad9" + } + Frame { + msec: 1680 + hash: "0c41d7b7d36bd083abfc0b83b862cad9" + } + Frame { + msec: 1696 + hash: "071262b911b61576f451be25691a57cf" + } + Frame { + msec: 1712 + hash: "a00aa90e894b48203b0446ca287ee712" + } + Frame { + msec: 1728 + hash: "26c9ca53ee4b084c6595ad65bf4880df" + } + Frame { + msec: 1744 + hash: "f4917ada78942428cc6b9aa5e56c013d" + } + Frame { + msec: 1760 + hash: "ffedee7bf2d8099e361b8b1706b03f88" + } + Frame { + msec: 1776 + hash: "1778ef1629ce977015b641448b46634f" + } + Frame { + msec: 1792 + hash: "42d6e8e0bbed879ed63644c83e61e7bd" + } + Frame { + msec: 1808 + hash: "99e843ec69b79b79b0792e0a2f28cd1b" + } + Frame { + msec: 1824 + hash: "8b3ebca70b50a6a93823e015ea80f0f9" + } + Frame { + msec: 1840 + hash: "8eaa7f076064ce55051237b04861e408" + } + Frame { + msec: 1856 + hash: "6acc0ca5e5808d911287edfa78c8ac02" + } + Frame { + msec: 1872 + hash: "e9f05899e0b53c21f6efe834095a3ea4" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 91; y: 208 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 93; y: 209 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1888 + hash: "e9f05899e0b53c21f6efe834095a3ea4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 99; y: 210 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 108; y: 210 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1904 + hash: "d2dece405f5f6ed1de2acb6615a931de" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 142; y: 214 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1920 + hash: "21e0f21edc77424e8327c9a3350ecc1d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 198; y: 216 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1936 + image: "flickable-horizontal.2.png" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 229; y: 218 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 266; y: 220 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1952 + hash: "c10c8b0c94f899414d8b3ef0b7c97646" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 322; y: 223 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 322; y: 223 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1968 + hash: "807aff4e6c96a9d0de7fa55e233446b1" + } + Frame { + msec: 1984 + hash: "dbd02848cefacbb26f4bcb7d8f073d6c" + } + Frame { + msec: 2000 + hash: "9a60608d8ea1b39fa2d3851873f2f08e" + } + Frame { + msec: 2016 + hash: "e7b3e3a40281f63889808211d6746374" + } + Frame { + msec: 2032 + hash: "188c225c46ec00105df230bfeea09974" + } + Frame { + msec: 2048 + hash: "e2e977b42e91d8c5dee57fd8245692eb" + } + Frame { + msec: 2064 + hash: "ca2f12fb173c405f95e608858ab982ad" + } + Frame { + msec: 2080 + hash: "fa86ee5f25fa425cf2569c8ef570b9d8" + } + Frame { + msec: 2096 + hash: "9b74656866fb8c7394bbbecec6414aca" + } + Frame { + msec: 2112 + hash: "87147326d1baab174c0f9a5ccdc2cb84" + } + Frame { + msec: 2128 + hash: "c0d00f98c71bf3f8e5954b45fbab95a8" + } + Frame { + msec: 2144 + hash: "c087d1d62e56e573b55c1d8599bba8a6" + } + Frame { + msec: 2160 + hash: "dd5a94c6febdee58e8f115cb75131aaa" + } + Frame { + msec: 2176 + hash: "a7465d6137f865f512ce65ceb29533b4" + } + Frame { + msec: 2192 + hash: "409086f6bb661aab8b548fea56d7e6b1" + } + Frame { + msec: 2208 + hash: "6a22911e0fb58df31271baa463ff599d" + } + Frame { + msec: 2224 + hash: "c4f6dd30d5fdfcf91a8b29cf5c622423" + } + Frame { + msec: 2240 + hash: "5a95b83f237c7243a198a43e9a587179" + } + Frame { + msec: 2256 + hash: "d79ed290efc6dbd976d574bf0b14a6a3" + } + Frame { + msec: 2272 + hash: "a7bcb436e96d7c981852239462573495" + } + Frame { + msec: 2288 + hash: "f63cc82e351daab503e316f8b516990f" + } + Frame { + msec: 2304 + hash: "4ea63cd25a1424042ffc60549a78563c" + } + Frame { + msec: 2320 + hash: "ef0fb776012575b3b0dbf6e5f4dee571" + } + Frame { + msec: 2336 + hash: "e2508faec7737be2666d87ad715b5f74" + } + Frame { + msec: 2352 + hash: "9fe4e897c6b853f774d11817a0eb53bf" + } + Frame { + msec: 2368 + hash: "c122ce2e73cbfedcc99d649c21d91f9d" + } + Frame { + msec: 2384 + hash: "883b8b180853f1f432ae98ddfe1b6ce3" + } + Frame { + msec: 2400 + hash: "d0808284e431da60f61d571c257a3011" + } + Frame { + msec: 2416 + hash: "df90f19450bf4d9496aab987a89e3a02" + } + Frame { + msec: 2432 + hash: "5640c1e64556b90e7fbd4448fa9db462" + } + Frame { + msec: 2448 + hash: "6d9b5c2f7d0dedbbc444e69bb39fed08" + } + Frame { + msec: 2464 + hash: "485c4a8049068cf73bf22db5fd3618be" + } + Frame { + msec: 2480 + hash: "9e25da59c9e7e4cf7796902e8e2ff92a" + } + Frame { + msec: 2496 + hash: "bd45e8f2442d7c1a1b16a762bc29e7cf" + } + Frame { + msec: 2512 + hash: "ec1013d23e581dbb39b1549d2e1b3b32" + } + Frame { + msec: 2528 + hash: "1ea3c2fde8ee3a14406e027f2124d793" + } + Frame { + msec: 2544 + hash: "3c3f31a05fb2f32538872c9fa158aaab" + } + Frame { + msec: 2560 + hash: "05a84d9c55e634ec01edd2a63e13613b" + } + Frame { + msec: 2576 + hash: "0f7ccd2da58e2e73b0ab18bb681dafd5" + } + Frame { + msec: 2592 + hash: "e481ff78029f8bc4bf7c697db6824f6a" + } + Frame { + msec: 2608 + hash: "efb92b8b7a90acabeb4a8d5cae52fe3c" + } + Frame { + msec: 2624 + hash: "4728dd0fac4edf40cfd5ef5a422b4ed9" + } + Frame { + msec: 2640 + hash: "27641dcd772c979ae22d12bfbadbb67f" + } + Frame { + msec: 2656 + hash: "26268714105bc4832d336a38a859fc50" + } + Frame { + msec: 2672 + hash: "caf0d351d3b6914ca52853a30643ea48" + } + Frame { + msec: 2688 + hash: "319824b1143925162f04aaddcfaa65d9" + } + Frame { + msec: 2704 + hash: "73aa36815f34bf5e005000e7da38555e" + } + Frame { + msec: 2720 + hash: "73aa36815f34bf5e005000e7da38555e" + } + Frame { + msec: 2736 + hash: "319824b1143925162f04aaddcfaa65d9" + } + Frame { + msec: 2752 + hash: "caf0d351d3b6914ca52853a30643ea48" + } + Frame { + msec: 2768 + hash: "6608412ee80d14e13a1a05fb4716e719" + } + Frame { + msec: 2784 + hash: "f4f6f002fb76407a5120329972285dc4" + } + Frame { + msec: 2800 + hash: "474d8b566b9e4ef7dc125a8df30ccbb1" + } + Frame { + msec: 2816 + hash: "0133138f30be4ffc7f3af3d9f477c4b4" + } + Frame { + msec: 2832 + hash: "e9ee9d7d0ab9dcea3f28ae71ee19270f" + } + Frame { + msec: 2848 + hash: "9fd9eb665a42b48583bc28c6c0118799" + } + Frame { + msec: 2864 + hash: "94231107bc4a7e900fe5f4eb823bd9bf" + } + Frame { + msec: 2880 + hash: "6011b10728fb1c83f10d3c27366ea3a5" + } + Frame { + msec: 2896 + image: "flickable-horizontal.3.png" + } + Frame { + msec: 2912 + hash: "e456c5fddb5fbcb02662716f19755622" + } + Frame { + msec: 2928 + hash: "88cef15940302e2b8b43e73234fd7b9c" + } + Frame { + msec: 2944 + hash: "041aecec2b0b0d59a56e1dd26b45cab1" + } + Frame { + msec: 2960 + hash: "0d519463c713f3da46ecacd155e1a0f3" + } + Frame { + msec: 2976 + hash: "5dd0c855b97d298244fb599c9f781651" + } + Frame { + msec: 2992 + hash: "8677cec5e559e51095d89abfeda8e542" + } + Frame { + msec: 3008 + hash: "b05fb6e798ab3fed940b5ac4d88ca378" + } + Frame { + msec: 3024 + hash: "6bc9cc0d3b11ea91856296b0ec934a8b" + } + Frame { + msec: 3040 + hash: "f4e63f3af69dacbf2d1d719d4d03a266" + } + Frame { + msec: 3056 + hash: "31ab08997eb86fab062a3128aecbccb5" + } + Frame { + msec: 3072 + hash: "90736b240ba1e634bd0ea86423908e16" + } + Frame { + msec: 3088 + hash: "90736b240ba1e634bd0ea86423908e16" + } + Frame { + msec: 3104 + hash: "e74982557dc06aac572078840c7e889a" + } + Frame { + msec: 3120 + hash: "e74982557dc06aac572078840c7e889a" + } + Frame { + msec: 3136 + hash: "ca30c14c7344d1711a35c707f8804f6e" + } + Frame { + msec: 3152 + hash: "e616110d39009f0d636b816828cc0ccb" + } + Frame { + msec: 3168 + hash: "e616110d39009f0d636b816828cc0ccb" + } + Frame { + msec: 3184 + hash: "e616110d39009f0d636b816828cc0ccb" + } + Frame { + msec: 3200 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 412; y: 214 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3216 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 3232 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 3248 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 408; y: 214 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 407; y: 214 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3264 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 403; y: 214 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3280 + hash: "1991cbb0fb053937f922731d5716032c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 398; y: 214 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3296 + hash: "df447575a4734bb5bd9badc6e27d98e4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 391; y: 214 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3312 + hash: "0fbfe1e0d7fb54450188398aa40690cd" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 383; y: 214 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3328 + hash: "cb62e60296046c73d301d7186e14faed" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 369; y: 213 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3344 + hash: "909cbd1292476584554e22232cb43639" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 352; y: 211 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3360 + hash: "e63b7e502dfb2834c06a969b683b9bd3" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 331; y: 210 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3376 + hash: "4ea63cd25a1424042ffc60549a78563c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 314; y: 210 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3392 + hash: "77e39d2d4bfcacecdae4f014e4506d71" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 300; y: 210 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3408 + hash: "db576eca8bad67cb8b994f12fc448969" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 288; y: 210 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3424 + hash: "efeb3f616da9d78505c3c82fc34ee31c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 278; y: 210 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3440 + hash: "e4f8bb02f8ac6bc40e1801cc8f360078" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 266; y: 210 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3456 + hash: "82118ef71809e3867717232c4d9c5518" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 252; y: 208 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3472 + hash: "5363451c696f6c6eb792b23d086243d7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 238; y: 208 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3488 + hash: "fe6afe8ae8a7c216a1cffc5515f273d5" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 227; y: 206 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3504 + hash: "9b165741d86c70380c15e15cff3fabb6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 224; y: 206 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3520 + hash: "f5e176355468f4fa224d4dfcdd7525a3" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 222; y: 206 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3536 + hash: "8c5a14a76e052cc6503a3e78245d1da3" + } + Frame { + msec: 3552 + hash: "8c5a14a76e052cc6503a3e78245d1da3" + } + Frame { + msec: 3568 + hash: "8c5a14a76e052cc6503a3e78245d1da3" + } + Frame { + msec: 3584 + hash: "8c5a14a76e052cc6503a3e78245d1da3" + } + Frame { + msec: 3600 + hash: "8c5a14a76e052cc6503a3e78245d1da3" + } + Frame { + msec: 3616 + hash: "8c5a14a76e052cc6503a3e78245d1da3" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 224; y: 206 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3632 + hash: "f5e176355468f4fa224d4dfcdd7525a3" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 232; y: 204 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3648 + hash: "acf538fce5f1b90b83474d9898b7cdd7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 246; y: 203 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3664 + hash: "5a0ee016b8732fbc36064e8a35d91215" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 265; y: 203 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3680 + hash: "8fd06a14c1de175813845ce8f07db6ec" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 292; y: 201 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3696 + hash: "26b0ff6ffda0725e0800f7ea3af510ef" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 310; y: 201 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3712 + hash: "80443f134511be0356a687c9b542b3e7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 321; y: 199 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3728 + hash: "3eeb98a829d29b3dc52f3d145ac49d58" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 323; y: 199 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3744 + hash: "f4d43069b16f41a30e5549aae911d4cd" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 324; y: 199 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3760 + hash: "661c89fa832f0abdcf4ae0c9e8e2d18f" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 324; y: 199 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3776 + hash: "661c89fa832f0abdcf4ae0c9e8e2d18f" + } + Frame { + msec: 3792 + hash: "1520f54b6c8606b9e8372c5c06180453" + } + Frame { + msec: 3808 + hash: "0fcf5e2ce47348cbb5bb485f101fe5ac" + } + Frame { + msec: 3824 + hash: "2eb070e69de07c89830543e0475fc110" + } + Frame { + msec: 3840 + hash: "d73c1059219c0655968af268d22e2c18" + } + Frame { + msec: 3856 + image: "flickable-horizontal.4.png" + } + Frame { + msec: 3872 + hash: "cc969b2c64839ca6d3b5069c0ed938d0" + } + Frame { + msec: 3888 + hash: "1f819e18d1297a1c7eeebb7b040bdef8" + } + Frame { + msec: 3904 + hash: "3643b99afbd8af0953cb39b2c8c04b9f" + } + Frame { + msec: 3920 + hash: "713fd2e2fa38ab27604cb9cae59f1777" + } + Frame { + msec: 3936 + hash: "e2508faec7737be2666d87ad715b5f74" + } + Frame { + msec: 3952 + hash: "fc33b1c7479caeff676ffd885a18d618" + } + Frame { + msec: 3968 + hash: "aca01143db4f870a56bb7546e84cbc5e" + } + Frame { + msec: 3984 + hash: "442b58c39fd3745c61a1eb5043fcbb53" + } + Frame { + msec: 4000 + hash: "7983d7183cc11d6819fa0a006c2d67b4" + } + Frame { + msec: 4016 + hash: "9fe4e897c6b853f774d11817a0eb53bf" + } + Frame { + msec: 4032 + hash: "43f528c81ccfa5b9921dfa3564a24c68" + } + Frame { + msec: 4048 + hash: "dfe04ff0b3ccf205bb38beeab58a4411" + } + Frame { + msec: 4064 + hash: "32ff30b50b500e9feb51e8eef205783c" + } + Frame { + msec: 4080 + hash: "7d83ab4c336b05bcf2cde4e7d8031f6c" + } + Frame { + msec: 4096 + hash: "c92e345e4ffdb30c28d9d5aa5400bd30" + } + Frame { + msec: 4112 + hash: "02eec604d0c00965aae4ac61b91bdc22" + } + Frame { + msec: 4128 + hash: "df447575a4734bb5bd9badc6e27d98e4" + } + Frame { + msec: 4144 + hash: "bac10d8f94a39573313b3b8b2f871c49" + } + Frame { + msec: 4160 + hash: "e5944c5dc6dec8f0c28b7ec3cd58723d" + } + Frame { + msec: 4176 + hash: "1991cbb0fb053937f922731d5716032c" + } + Frame { + msec: 4192 + hash: "50d6538bcaffc343f6626635a3e5899c" + } + Frame { + msec: 4208 + hash: "f3613f57cdb9ed38d8e3fa636962aa99" + } + Frame { + msec: 4224 + hash: "10a89da9887cb4bbd812c090a8a56797" + } + Frame { + msec: 4240 + hash: "89ba74d46970ad2edff701475c059ec8" + } + Frame { + msec: 4256 + hash: "6e8b84c70e81578a2216e9e975b35434" + } + Frame { + msec: 4272 + hash: "6e8b84c70e81578a2216e9e975b35434" + } + Frame { + msec: 4288 + hash: "883b8b180853f1f432ae98ddfe1b6ce3" + } + Frame { + msec: 4304 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 4320 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 4336 + hash: "e616110d39009f0d636b816828cc0ccb" + } + Frame { + msec: 4352 + hash: "e616110d39009f0d636b816828cc0ccb" + } + Frame { + msec: 4368 + hash: "e616110d39009f0d636b816828cc0ccb" + } + Frame { + msec: 4384 + hash: "e616110d39009f0d636b816828cc0ccb" + } + Frame { + msec: 4400 + hash: "e616110d39009f0d636b816828cc0ccb" + } + Frame { + msec: 4416 + hash: "e616110d39009f0d636b816828cc0ccb" + } + Frame { + msec: 4432 + hash: "e616110d39009f0d636b816828cc0ccb" + } + Frame { + msec: 4448 + hash: "e616110d39009f0d636b816828cc0ccb" + } + Frame { + msec: 4464 + hash: "e616110d39009f0d636b816828cc0ccb" + } + Frame { + msec: 4480 + hash: "e616110d39009f0d636b816828cc0ccb" + } + Frame { + msec: 4496 + hash: "e616110d39009f0d636b816828cc0ccb" + } + Frame { + msec: 4512 + hash: "e616110d39009f0d636b816828cc0ccb" + } + Frame { + msec: 4528 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 4544 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 4560 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 4576 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 4592 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 4608 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 4624 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 4640 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 4656 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 4672 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 4688 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } + Frame { + msec: 4704 + hash: "244c12e82ee0b2528a0dbb02a8b8134a" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.0.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.0.png new file mode 100644 index 00000000..968a78f7 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.1.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.1.png new file mode 100644 index 00000000..55ab3b71 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.2.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.2.png new file mode 100644 index 00000000..a6ec6d18 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.3.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.3.png new file mode 100644 index 00000000..e6755aca Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.4.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.4.png new file mode 100644 index 00000000..4c4d17c9 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.qml b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.qml new file mode 100644 index 00000000..106d108a --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-horizontal.qml @@ -0,0 +1,1575 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "flickable-horizontal.0.png" + } + Frame { + msec: 32 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 48 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 64 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 80 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 96 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 112 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 128 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 144 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 160 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 176 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 192 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 208 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 224 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 240 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 256 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 272 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 288 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 304 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 320 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 336 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 352 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 368 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 384 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 400 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 416 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 432 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 448 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 464 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 480 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 496 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 512 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 528 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 544 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 560 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 576 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 592 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 608 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 624 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 640 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 656 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 672 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 688 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 704 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 720 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 447; y: 145 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 736 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 752 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 768 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 446; y: 145 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 784 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 440; y: 146 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 800 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 425; y: 151 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 407; y: 157 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 816 + hash: "49372aa66b86904d587b72c6c2cfd467" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 359; y: 169 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 832 + hash: "06519aabcc86c5fd961c80a65d2cf67c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 309; y: 181 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 848 + hash: "c3b182c37393ea0468c06474e84f127f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 282; y: 187 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 282; y: 187 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 864 + hash: "dce4bcca20e89c40a603394515f679b1" + } + Frame { + msec: 880 + hash: "dabf2b63bedd0073f761a858f048df5a" + } + Frame { + msec: 896 + hash: "c51ca7786b7346b3e62b774c01a67f98" + } + Frame { + msec: 912 + hash: "d1628aa2fd1ec92021fa37f9960fb06a" + } + Frame { + msec: 928 + hash: "4e571776c8a01d1ab79ff1c3affc0474" + } + Frame { + msec: 944 + hash: "85a3c22ecaed87c119202b76e22f2b2e" + } + Frame { + msec: 960 + hash: "42d345e97b0a8e5cbcfdf4243ccafcdc" + } + Frame { + msec: 976 + image: "flickable-horizontal.1.png" + } + Frame { + msec: 992 + hash: "1a651405076d8980b03cc8279a379fff" + } + Frame { + msec: 1008 + hash: "8c4f3c6a4c67c76fe92ff401114892e7" + } + Frame { + msec: 1024 + hash: "447a817e33cd8213e362192ffe663272" + } + Frame { + msec: 1040 + hash: "eed6ba9be5f7869101068afd1d46cb69" + } + Frame { + msec: 1056 + hash: "15ae5acff4211f97802c6c50649ad487" + } + Frame { + msec: 1072 + hash: "e30b0a23e215c0b9b71b083381a8523e" + } + Frame { + msec: 1088 + hash: "6fad48a7d3a2480468aca07e6760de94" + } + Frame { + msec: 1104 + hash: "998bd191ac5bac1f300e247514a112d7" + } + Frame { + msec: 1120 + hash: "9245e8bf2fb38f491aa7f0da4400e190" + } + Frame { + msec: 1136 + hash: "7565ea1f01cd9ad5d92e2a0ee7fc947d" + } + Frame { + msec: 1152 + hash: "898c6e226787391340099910ee128ed6" + } + Frame { + msec: 1168 + hash: "bafd74d70e99cf4053d3c00d18915762" + } + Frame { + msec: 1184 + hash: "6456a5ca9bb90b2d0fb99bae63a8db35" + } + Frame { + msec: 1200 + hash: "2b34216c9f7c76133ef4889b74df7ad9" + } + Frame { + msec: 1216 + hash: "cbc75068017b378f277c2692f2cb1709" + } + Frame { + msec: 1232 + hash: "8c72d80a5a2776ee2d805c089f5c534d" + } + Frame { + msec: 1248 + hash: "d5a248b9177e078cad40af72b3cbceb5" + } + Frame { + msec: 1264 + hash: "1a9b246f8223bbcf6421a22e8a1fb50e" + } + Frame { + msec: 1280 + hash: "ea9b292eb000a9e4c5b46a8d94b8e80e" + } + Frame { + msec: 1296 + hash: "ac059cd45cd1936a7ff3fd0fc9fa688b" + } + Frame { + msec: 1312 + hash: "fda383d47ffb1e2fd633793594831cfb" + } + Frame { + msec: 1328 + hash: "a4c7709f3642088e4be48ec607d0a0fe" + } + Frame { + msec: 1344 + hash: "08d0268402d4a410f5f8c9bb8ba7b306" + } + Frame { + msec: 1360 + hash: "ecc8f3c4faf86362e45b465b0f4d6dc2" + } + Frame { + msec: 1376 + hash: "3107a4b522744a643dd107da5e5e13c2" + } + Frame { + msec: 1392 + hash: "44c1731d0433aac53edc2e88a38c66b0" + } + Frame { + msec: 1408 + hash: "d86e9dfb38be51b2fa9cf44271eddc3e" + } + Frame { + msec: 1424 + hash: "0c33ce00df6fbb848d300aa510ad80d9" + } + Frame { + msec: 1440 + hash: "48ff92aaa0c797c10ca8dbc5b2240736" + } + Frame { + msec: 1456 + hash: "8582fd8c3643d9a5c1993e1607c6fae8" + } + Frame { + msec: 1472 + hash: "2390e374160ec5bc99613a463aa98fb2" + } + Frame { + msec: 1488 + hash: "369a11c32596b668a4f275232c45ac68" + } + Frame { + msec: 1504 + hash: "0b0d82d523a77a925ee00cf457326034" + } + Frame { + msec: 1520 + hash: "48e7a92905761d7f0b8b9ac95bb5ff45" + } + Frame { + msec: 1536 + hash: "2cdccfd2cdf56728fa07a49de34142d9" + } + Frame { + msec: 1552 + hash: "83a8166805523ee8426d88ef80c8f3a9" + } + Frame { + msec: 1568 + hash: "20ac2e68a5c733dc6128921c34f033e5" + } + Frame { + msec: 1584 + hash: "836963a1ed3084606b80b7f82fee09ef" + } + Frame { + msec: 1600 + hash: "ee49c684d788558e20a10899ebe0b6c2" + } + Frame { + msec: 1616 + hash: "e00c0b340165d335cb49730890eca301" + } + Frame { + msec: 1632 + hash: "fba2c2adeef04e6c1a764c4d8a1a97bc" + } + Frame { + msec: 1648 + hash: "8160bd2a6daa2757b948d038fa754c77" + } + Frame { + msec: 1664 + hash: "10130d0b75ce420f5c9af6f181500783" + } + Frame { + msec: 1680 + hash: "10130d0b75ce420f5c9af6f181500783" + } + Frame { + msec: 1696 + hash: "fba2c2adeef04e6c1a764c4d8a1a97bc" + } + Frame { + msec: 1712 + hash: "fec5477699ba60da129866e1c3727e08" + } + Frame { + msec: 1728 + hash: "12076b96a177bd24be8ad4a3dc179d79" + } + Frame { + msec: 1744 + hash: "83a8166805523ee8426d88ef80c8f3a9" + } + Frame { + msec: 1760 + hash: "e9016d43624060ef4efbad2b7bc53b1b" + } + Frame { + msec: 1776 + hash: "483700c4ba07a9f01d2a226a3efde15f" + } + Frame { + msec: 1792 + hash: "2390e374160ec5bc99613a463aa98fb2" + } + Frame { + msec: 1808 + hash: "094df49593f0cd1d6de4a0b91c459d15" + } + Frame { + msec: 1824 + hash: "0a60ed609c7fcb2d485f393ea309527a" + } + Frame { + msec: 1840 + hash: "d4e0f07c2f298626ae800d5d7b5f098b" + } + Frame { + msec: 1856 + hash: "ff249c1301704da0b82b023558512c6a" + } + Frame { + msec: 1872 + hash: "42883458efeb17ff1e52296ae7228fb2" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 91; y: 208 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 93; y: 209 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1888 + hash: "42883458efeb17ff1e52296ae7228fb2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 99; y: 210 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 108; y: 210 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1904 + hash: "36a4b0d745ee8fa53e906b7a23b7ab88" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 142; y: 214 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1920 + hash: "826187b1a24fd09e1abcb6a01c59c059" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 198; y: 216 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1936 + image: "flickable-horizontal.2.png" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 229; y: 218 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 266; y: 220 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1952 + hash: "426f9459ac16c2903f85d618b366a475" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 322; y: 223 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 322; y: 223 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1968 + hash: "d43dc1cfeaac1da281f2cdbffda93d17" + } + Frame { + msec: 1984 + hash: "766dd54cdb6253ead664b6ab852e934b" + } + Frame { + msec: 2000 + hash: "1db59868779a357917a5d4859130108e" + } + Frame { + msec: 2016 + hash: "1da33a5f6a001915464f34799a651f7a" + } + Frame { + msec: 2032 + hash: "868a6e445623378b6590789156e4b7e0" + } + Frame { + msec: 2048 + hash: "46ae42a4b7f00e24a10ffdfd7a076b68" + } + Frame { + msec: 2064 + hash: "2a91ffdfec461f573784cfaed2150e33" + } + Frame { + msec: 2080 + hash: "2cbaa11e8589c806e65e52ce59ad1c42" + } + Frame { + msec: 2096 + hash: "3b93b1e1fa7963d5a75103814f93a0a2" + } + Frame { + msec: 2112 + hash: "a2e59dc9459a7afb6916638d08330dff" + } + Frame { + msec: 2128 + hash: "cb3e8334babe3abffa202c2ba2d3b21f" + } + Frame { + msec: 2144 + hash: "07882f5f098e59c479f089dbc74612bf" + } + Frame { + msec: 2160 + hash: "e9ad84bf0c7f83bfe1bff3afed591bfd" + } + Frame { + msec: 2176 + hash: "1839c26fda8710dc3fa7f5abd8136eee" + } + Frame { + msec: 2192 + hash: "15e3bdd811c390ad3a9cf22949568ed7" + } + Frame { + msec: 2208 + hash: "61ede9a7ef29997627bb08070fea65a4" + } + Frame { + msec: 2224 + hash: "fac89040e757522117e3792625ca6a19" + } + Frame { + msec: 2240 + hash: "1dc01a1118681f8606768fcf246397f7" + } + Frame { + msec: 2256 + hash: "2b243094b7f25368a8fb4a9014968cad" + } + Frame { + msec: 2272 + hash: "c6677acf9b9d632bc99caa8626448c49" + } + Frame { + msec: 2288 + hash: "9035988b0dc0b7065fe4f1d1a4737801" + } + Frame { + msec: 2304 + hash: "cd34e7118d43968cfcf52ed9ce58fc0a" + } + Frame { + msec: 2320 + hash: "7142aeaed61722424e184c55bb8d047c" + } + Frame { + msec: 2336 + hash: "9113c68cf5689e1f4690e58bbf824ae6" + } + Frame { + msec: 2352 + hash: "2f9ec963d6f06f8252a69760965df2ee" + } + Frame { + msec: 2368 + hash: "07373282f0337437944dc8fff1e32343" + } + Frame { + msec: 2384 + hash: "4769fa4ba0c08baefa431b94b47a7ffc" + } + Frame { + msec: 2400 + hash: "390cd7786aa1989b590033682472f604" + } + Frame { + msec: 2416 + hash: "482e2969bc1a877ba63c3df65ec04b7e" + } + Frame { + msec: 2432 + hash: "e3dc252a3a0b35398bf3d91c37d6b5e9" + } + Frame { + msec: 2448 + hash: "5bce3aac5cc049d81a74e7f71e2cf522" + } + Frame { + msec: 2464 + hash: "390edc00756c4e92e94a7a75f3d65c45" + } + Frame { + msec: 2480 + hash: "285397b2ff5a64d2a112c458d6ec5aba" + } + Frame { + msec: 2496 + hash: "ed0889dc439d66e6b5a81059956ef564" + } + Frame { + msec: 2512 + hash: "cb804da0db92d879a5cb8f138c546f88" + } + Frame { + msec: 2528 + hash: "523fe4d3d9c11631f41d96bcc604103b" + } + Frame { + msec: 2544 + hash: "cc4717c4233f9a2f2380bfad6dc89075" + } + Frame { + msec: 2560 + hash: "65c4171ff3e98aa04667606d9f6bd9b3" + } + Frame { + msec: 2576 + hash: "b2994136a603206c8013158fd67ca6bd" + } + Frame { + msec: 2592 + hash: "44ad0d4645a01243b9d9be0faaf6d6ee" + } + Frame { + msec: 2608 + hash: "3b7b06f5f3f028fbae21dfedf821e696" + } + Frame { + msec: 2624 + hash: "b86466e530c3bd51353074cbb9da9ec3" + } + Frame { + msec: 2640 + hash: "2528deb04bae8b89a85dc6fcea05dbbd" + } + Frame { + msec: 2656 + hash: "e0ff5e36bff2b9e08244fc7f79cecee6" + } + Frame { + msec: 2672 + hash: "34ca311d2e3462da3779324419c027e7" + } + Frame { + msec: 2688 + hash: "75aae68f21f68364a897c504f26ee655" + } + Frame { + msec: 2704 + hash: "8039e52e7f1977433596c1a34a41cc9f" + } + Frame { + msec: 2720 + hash: "8039e52e7f1977433596c1a34a41cc9f" + } + Frame { + msec: 2736 + hash: "75aae68f21f68364a897c504f26ee655" + } + Frame { + msec: 2752 + hash: "34ca311d2e3462da3779324419c027e7" + } + Frame { + msec: 2768 + hash: "d3649eb8f8232b0e64b0cb476313b63c" + } + Frame { + msec: 2784 + hash: "cdb30549933d3778e74dbd419b474a5f" + } + Frame { + msec: 2800 + hash: "3a43d652bb85d3f562bd5eaec386107f" + } + Frame { + msec: 2816 + hash: "df6771eb2afa24b6e3250b05b180fa4d" + } + Frame { + msec: 2832 + hash: "cc4717c4233f9a2f2380bfad6dc89075" + } + Frame { + msec: 2848 + hash: "76e04278dab430d5860306830b73ab6f" + } + Frame { + msec: 2864 + hash: "8f70f69731fe8b8f4aa397a667f4c5c0" + } + Frame { + msec: 2880 + hash: "25b72be5ca16c246bfc6adc4bf19871c" + } + Frame { + msec: 2896 + image: "flickable-horizontal.3.png" + } + Frame { + msec: 2912 + hash: "e3dc252a3a0b35398bf3d91c37d6b5e9" + } + Frame { + msec: 2928 + hash: "ce0d8b3f0f0b235eaedc932f4514ea00" + } + Frame { + msec: 2944 + hash: "f6b030effcca891ab20073f106b22d73" + } + Frame { + msec: 2960 + hash: "2cfafd1f686f5794d5bf99ec4aaa1d08" + } + Frame { + msec: 2976 + hash: "502a23fd9a3bcccb29c496e7edeb5d66" + } + Frame { + msec: 2992 + hash: "82ac348a63a4e358a877a2e45d48e2b1" + } + Frame { + msec: 3008 + hash: "0d321f4ca15f09d849c4a28f032cc1cc" + } + Frame { + msec: 3024 + hash: "5c995f84415ea7a260647f946b8963ee" + } + Frame { + msec: 3040 + hash: "ee4ecac449c4a2ad4e11ad1d560b3ec3" + } + Frame { + msec: 3056 + hash: "0bc3d5b91d781bcf10041eb1557f0d6a" + } + Frame { + msec: 3072 + hash: "321297177b354e0cc435b3eae49331a3" + } + Frame { + msec: 3088 + hash: "321297177b354e0cc435b3eae49331a3" + } + Frame { + msec: 3104 + hash: "de00148fe89be44237af32d929432655" + } + Frame { + msec: 3120 + hash: "de00148fe89be44237af32d929432655" + } + Frame { + msec: 3136 + hash: "756c8068009e9780428bd3ae35df19fe" + } + Frame { + msec: 3152 + hash: "afec5604967bc19a2bb8fc7e899c1e11" + } + Frame { + msec: 3168 + hash: "afec5604967bc19a2bb8fc7e899c1e11" + } + Frame { + msec: 3184 + hash: "afec5604967bc19a2bb8fc7e899c1e11" + } + Frame { + msec: 3200 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 412; y: 214 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3216 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 3232 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 3248 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 408; y: 214 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 407; y: 214 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3264 + hash: "96a78749a57bdb87cf28a3804b63793f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 403; y: 214 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3280 + hash: "b8f158a8694f2b922faf818d469230e4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 398; y: 214 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3296 + hash: "257a298bec9589037e3022cc2fe7a775" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 391; y: 214 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3312 + hash: "391d17c09dd33b3dcfc9a619fbb500dc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 383; y: 214 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3328 + hash: "b645a1808de7a5d2ce7944ab66a7c233" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 369; y: 213 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3344 + hash: "54ddfe85ca8923bcf7f3b6ccab0560de" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 352; y: 211 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3360 + hash: "5c1169e17ee96b817e66b4a6097f790c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 331; y: 210 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3376 + hash: "cd34e7118d43968cfcf52ed9ce58fc0a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 314; y: 210 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3392 + hash: "f3d9d5cd228914b2e1323f19c22aa6f9" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 300; y: 210 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3408 + hash: "10e63c46f4b970a9c997126906c01cf9" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 288; y: 210 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3424 + hash: "c9b412087f7b744096bf995c6a9ddf15" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 278; y: 210 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3440 + hash: "70cdc34e22c7a031c2e28898f7edea72" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 266; y: 210 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3456 + hash: "d0ea5c1f9050499d944ba7e61d354e40" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 252; y: 208 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3472 + hash: "d9fc23e14a170b68264721dc18be4fb1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 238; y: 208 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3488 + hash: "d59ccdfdb179f2c8c2636a64aecf2a6a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 227; y: 206 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3504 + hash: "6d21752283210371faf2f757c7a972b3" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 224; y: 206 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3520 + hash: "1338a54d3b980a6868ba7d167cfdbdf7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 222; y: 206 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3536 + hash: "0be430c9e6058be2aee599d4182bc0d0" + } + Frame { + msec: 3552 + hash: "0be430c9e6058be2aee599d4182bc0d0" + } + Frame { + msec: 3568 + hash: "0be430c9e6058be2aee599d4182bc0d0" + } + Frame { + msec: 3584 + hash: "0be430c9e6058be2aee599d4182bc0d0" + } + Frame { + msec: 3600 + hash: "0be430c9e6058be2aee599d4182bc0d0" + } + Frame { + msec: 3616 + hash: "0be430c9e6058be2aee599d4182bc0d0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 224; y: 206 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3632 + hash: "1338a54d3b980a6868ba7d167cfdbdf7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 232; y: 204 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3648 + hash: "b58a71e761abe238de0e90c1c756cd37" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 246; y: 203 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3664 + hash: "3383dc4a9b1f8267d145d22f9d825dc0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 265; y: 203 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3680 + hash: "95df7fbe18630d9b8ffa83850bc5bec5" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 292; y: 201 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3696 + hash: "96c625b6854a862c83ead3fbb32df3b0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 310; y: 201 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3712 + hash: "f48f12540c60bc7b60279db8e67ff91b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 321; y: 199 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3728 + hash: "98353745244809a583c93c1fd87b9a56" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 323; y: 199 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3744 + hash: "09a1bb3238282c80cc40fccb6e45ba28" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 324; y: 199 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3760 + hash: "9e50b6fc980c66698a35178e2520e13c" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 324; y: 199 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3776 + hash: "9e50b6fc980c66698a35178e2520e13c" + } + Frame { + msec: 3792 + hash: "006c37d9d6b5a8470d74909b9646d5f1" + } + Frame { + msec: 3808 + hash: "24cf52f7c3cf095be20393757dfaaa6b" + } + Frame { + msec: 3824 + hash: "2189799d060770928f1feaaa44728ec8" + } + Frame { + msec: 3840 + hash: "b8a6375f0303ec8b66cf14f59888c273" + } + Frame { + msec: 3856 + image: "flickable-horizontal.4.png" + } + Frame { + msec: 3872 + hash: "1fd391b060c84ac99c6e94d2d3647c31" + } + Frame { + msec: 3888 + hash: "8b594f115e8158b931a9da42fa6829a5" + } + Frame { + msec: 3904 + hash: "8f93fdffed4bfd31f9f5977b09074f6a" + } + Frame { + msec: 3920 + hash: "d0f3eae785732bf24c363fd189672eb2" + } + Frame { + msec: 3936 + hash: "9113c68cf5689e1f4690e58bbf824ae6" + } + Frame { + msec: 3952 + hash: "44dd376f3d5f61ec71b7c488c3a6ee58" + } + Frame { + msec: 3968 + hash: "4555e295bd6de22abcbaecf797ec8902" + } + Frame { + msec: 3984 + hash: "eb343f3e69f205a240c0425873ea6db1" + } + Frame { + msec: 4000 + hash: "37a5b81894c16cacd13312f7113a5445" + } + Frame { + msec: 4016 + hash: "2f9ec963d6f06f8252a69760965df2ee" + } + Frame { + msec: 4032 + hash: "dec984b2a5cdd85f2dfb8983da5cdee4" + } + Frame { + msec: 4048 + hash: "a95f51c3e172ee76b5b74e94532cdfaf" + } + Frame { + msec: 4064 + hash: "62d73e875875329c886d2eb540a9c2d9" + } + Frame { + msec: 4080 + hash: "63c70a0ea1f43d92c717ff23dcfebe81" + } + Frame { + msec: 4096 + hash: "49372aa66b86904d587b72c6c2cfd467" + } + Frame { + msec: 4112 + hash: "523c18f3c7bbaaf9c625835ddf0d8435" + } + Frame { + msec: 4128 + hash: "257a298bec9589037e3022cc2fe7a775" + } + Frame { + msec: 4144 + hash: "d777e4b06791bda82cf1e8e84b1cff5c" + } + Frame { + msec: 4160 + hash: "c31de5bfff431b13dcbf2b8b4c503bc3" + } + Frame { + msec: 4176 + hash: "b8f158a8694f2b922faf818d469230e4" + } + Frame { + msec: 4192 + hash: "5fd4cd0c335cecc7468d44d188e1669d" + } + Frame { + msec: 4208 + hash: "77b003c8f72498ed295678158adf417c" + } + Frame { + msec: 4224 + hash: "96a78749a57bdb87cf28a3804b63793f" + } + Frame { + msec: 4240 + hash: "f497ed7bc98daea35a9ae4838427207e" + } + Frame { + msec: 4256 + hash: "35a7221f2888ab3afec443b2c1060c80" + } + Frame { + msec: 4272 + hash: "35a7221f2888ab3afec443b2c1060c80" + } + Frame { + msec: 4288 + hash: "4769fa4ba0c08baefa431b94b47a7ffc" + } + Frame { + msec: 4304 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 4320 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 4336 + hash: "afec5604967bc19a2bb8fc7e899c1e11" + } + Frame { + msec: 4352 + hash: "afec5604967bc19a2bb8fc7e899c1e11" + } + Frame { + msec: 4368 + hash: "afec5604967bc19a2bb8fc7e899c1e11" + } + Frame { + msec: 4384 + hash: "afec5604967bc19a2bb8fc7e899c1e11" + } + Frame { + msec: 4400 + hash: "afec5604967bc19a2bb8fc7e899c1e11" + } + Frame { + msec: 4416 + hash: "afec5604967bc19a2bb8fc7e899c1e11" + } + Frame { + msec: 4432 + hash: "afec5604967bc19a2bb8fc7e899c1e11" + } + Frame { + msec: 4448 + hash: "afec5604967bc19a2bb8fc7e899c1e11" + } + Frame { + msec: 4464 + hash: "afec5604967bc19a2bb8fc7e899c1e11" + } + Frame { + msec: 4480 + hash: "afec5604967bc19a2bb8fc7e899c1e11" + } + Frame { + msec: 4496 + hash: "afec5604967bc19a2bb8fc7e899c1e11" + } + Frame { + msec: 4512 + hash: "afec5604967bc19a2bb8fc7e899c1e11" + } + Frame { + msec: 4528 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 4544 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 4560 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 4576 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 4592 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 4608 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 4624 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 4640 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 4656 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 4672 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 4688 + hash: "66d988259c52db9bd85f60ed598469f7" + } + Frame { + msec: 4704 + hash: "66d988259c52db9bd85f60ed598469f7" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.0.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.0.png new file mode 100644 index 00000000..464d9133 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.1.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.1.png new file mode 100644 index 00000000..464d9133 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.2.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.2.png new file mode 100644 index 00000000..b16b9f0e Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.3.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.3.png new file mode 100644 index 00000000..c3d2a6f5 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.4.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.4.png new file mode 100644 index 00000000..d074e733 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.5.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.5.png new file mode 100644 index 00000000..0cac34ce Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.5.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.qml b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.qml new file mode 100644 index 00000000..c418cc80 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-nested.qml @@ -0,0 +1,2159 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "flickable-nested.0.png" + } + Frame { + msec: 32 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 48 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 64 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 80 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 96 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 112 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 128 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 144 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 160 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 176 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 192 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 208 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 224 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 240 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 256 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 272 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 288 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 304 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 320 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 336 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 352 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 368 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 384 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 400 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 416 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 432 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 448 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 464 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 480 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 496 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 512 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 528 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 544 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 560 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 576 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 592 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 608 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 624 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 640 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 656 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 672 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 688 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 704 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 720 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 736 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 752 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 768 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 784 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 800 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 816 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 832 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 848 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 864 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 880 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 896 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 912 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 928 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 206; y: 205 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 944 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Frame { + msec: 960 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 206; y: 204 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 976 + image: "flickable-nested.1.png" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 206; y: 203 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 206; y: 202 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 992 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 205; y: 201 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 205; y: 199 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1008 + hash: "7523750f0fd21aff13e6ab379e87640d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 204; y: 197 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 202; y: 196 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1024 + hash: "bddf8ca2638c9a04f7029d6982152d11" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 198; y: 191 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 197; y: 189 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1040 + hash: "bc15f1b562879d5058d3b1336fb9074e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 194; y: 185 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 194; y: 184 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1056 + hash: "3572c62d7d2b9b23a8d9d3e5037591dd" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 194; y: 182 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 194; y: 182 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1072 + hash: "ce9658887cca581a88e7db14b92d46f2" + } + Frame { + msec: 1088 + hash: "e1fe1a2e1669a200e20468b4aa98dd3d" + } + Frame { + msec: 1104 + hash: "b7582829bf01223e6641ce82f62047df" + } + Frame { + msec: 1120 + hash: "80bd41fe22fb84efb011acf50ec38574" + } + Frame { + msec: 1136 + hash: "04c8d6c3922ce9777ee27d8df59d4729" + } + Frame { + msec: 1152 + hash: "f84dba18e525f1c06548c0232a244b6d" + } + Frame { + msec: 1168 + hash: "26c74b95835e8e0da5aadc7c42cac81c" + } + Frame { + msec: 1184 + hash: "1b4fcb1f0bd83a683cfe0ac303be0033" + } + Frame { + msec: 1200 + hash: "1b4fcb1f0bd83a683cfe0ac303be0033" + } + Frame { + msec: 1216 + hash: "4df47f90656fff253883e3e2d33506dc" + } + Frame { + msec: 1232 + hash: "4df47f90656fff253883e3e2d33506dc" + } + Frame { + msec: 1248 + hash: "7d0d94c4a7a9330f5bd17782ca484848" + } + Frame { + msec: 1264 + hash: "7d0d94c4a7a9330f5bd17782ca484848" + } + Frame { + msec: 1280 + hash: "7d0d94c4a7a9330f5bd17782ca484848" + } + Frame { + msec: 1296 + hash: "7d0d94c4a7a9330f5bd17782ca484848" + } + Frame { + msec: 1312 + hash: "7d0d94c4a7a9330f5bd17782ca484848" + } + Frame { + msec: 1328 + hash: "7d0d94c4a7a9330f5bd17782ca484848" + } + Frame { + msec: 1344 + hash: "7d0d94c4a7a9330f5bd17782ca484848" + } + Frame { + msec: 1360 + hash: "7d0d94c4a7a9330f5bd17782ca484848" + } + Frame { + msec: 1376 + hash: "7d0d94c4a7a9330f5bd17782ca484848" + } + Frame { + msec: 1392 + hash: "7d0d94c4a7a9330f5bd17782ca484848" + } + Frame { + msec: 1408 + hash: "7d0d94c4a7a9330f5bd17782ca484848" + } + Frame { + msec: 1424 + hash: "7d0d94c4a7a9330f5bd17782ca484848" + } + Frame { + msec: 1440 + hash: "7d0d94c4a7a9330f5bd17782ca484848" + } + Frame { + msec: 1456 + hash: "7d0d94c4a7a9330f5bd17782ca484848" + } + Frame { + msec: 1472 + hash: "7d0d94c4a7a9330f5bd17782ca484848" + } + Frame { + msec: 1488 + hash: "7d0d94c4a7a9330f5bd17782ca484848" + } + Frame { + msec: 1504 + hash: "7d0d94c4a7a9330f5bd17782ca484848" + } + Frame { + msec: 1520 + hash: "7d0d94c4a7a9330f5bd17782ca484848" + } + Frame { + msec: 1536 + hash: "7d0d94c4a7a9330f5bd17782ca484848" + } + Frame { + msec: 1552 + hash: "7d0d94c4a7a9330f5bd17782ca484848" + } + Frame { + msec: 1568 + hash: "7d0d94c4a7a9330f5bd17782ca484848" + } + Frame { + msec: 1584 + hash: "7d0d94c4a7a9330f5bd17782ca484848" + } + Frame { + msec: 1600 + hash: "7d0d94c4a7a9330f5bd17782ca484848" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 226; y: 218 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1616 + hash: "7d0d94c4a7a9330f5bd17782ca484848" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 225; y: 218 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1632 + hash: "7d0d94c4a7a9330f5bd17782ca484848" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 223; y: 217 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 222; y: 217 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1648 + hash: "7d0d94c4a7a9330f5bd17782ca484848" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 220; y: 216 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 218; y: 214 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1664 + hash: "7d0d94c4a7a9330f5bd17782ca484848" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 214; y: 212 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 212; y: 211 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1680 + hash: "54b41609ba43f710b08ba63f0b96df99" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 208; y: 208 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 207; y: 207 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1696 + hash: "8910b66b9eb1b2be80e36ed2824df1a0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 205; y: 205 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 205; y: 205 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1712 + hash: "38df31933f34f961a9b7020ad0d469c2" + } + Frame { + msec: 1728 + hash: "7702a7f710991225d9f411e8f410b515" + } + Frame { + msec: 1744 + hash: "c90d402e68208ccfd2c7345a2bf650cd" + } + Frame { + msec: 1760 + hash: "2630ed37aaf37907d1ee48efb0239615" + } + Frame { + msec: 1776 + hash: "527725818699ce3425b5cb95a25610d5" + } + Frame { + msec: 1792 + hash: "7bd6e37853946a835973c3da213beddc" + } + Frame { + msec: 1808 + hash: "e3c5e113d992e5e50b6780185891edd7" + } + Frame { + msec: 1824 + hash: "e3c5e113d992e5e50b6780185891edd7" + } + Frame { + msec: 1840 + hash: "20ced2b9960931c4c0cbe8bcc1f9e52a" + } + Frame { + msec: 1856 + hash: "09710c8964c8b010a90c67f126acdefa" + } + Frame { + msec: 1872 + hash: "09710c8964c8b010a90c67f126acdefa" + } + Frame { + msec: 1888 + hash: "09710c8964c8b010a90c67f126acdefa" + } + Frame { + msec: 1904 + hash: "e80b03bd168ec62aba64cdf75dcd1d5f" + } + Frame { + msec: 1920 + hash: "e80b03bd168ec62aba64cdf75dcd1d5f" + } + Frame { + msec: 1936 + image: "flickable-nested.2.png" + } + Frame { + msec: 1952 + hash: "e80b03bd168ec62aba64cdf75dcd1d5f" + } + Frame { + msec: 1968 + hash: "e80b03bd168ec62aba64cdf75dcd1d5f" + } + Frame { + msec: 1984 + hash: "e80b03bd168ec62aba64cdf75dcd1d5f" + } + Frame { + msec: 2000 + hash: "e80b03bd168ec62aba64cdf75dcd1d5f" + } + Frame { + msec: 2016 + hash: "e80b03bd168ec62aba64cdf75dcd1d5f" + } + Frame { + msec: 2032 + hash: "e80b03bd168ec62aba64cdf75dcd1d5f" + } + Frame { + msec: 2048 + hash: "e80b03bd168ec62aba64cdf75dcd1d5f" + } + Frame { + msec: 2064 + hash: "e80b03bd168ec62aba64cdf75dcd1d5f" + } + Frame { + msec: 2080 + hash: "e80b03bd168ec62aba64cdf75dcd1d5f" + } + Frame { + msec: 2096 + hash: "e80b03bd168ec62aba64cdf75dcd1d5f" + } + Frame { + msec: 2112 + hash: "e80b03bd168ec62aba64cdf75dcd1d5f" + } + Frame { + msec: 2128 + hash: "e80b03bd168ec62aba64cdf75dcd1d5f" + } + Frame { + msec: 2144 + hash: "e80b03bd168ec62aba64cdf75dcd1d5f" + } + Frame { + msec: 2160 + hash: "e80b03bd168ec62aba64cdf75dcd1d5f" + } + Frame { + msec: 2176 + hash: "e80b03bd168ec62aba64cdf75dcd1d5f" + } + Frame { + msec: 2192 + hash: "e80b03bd168ec62aba64cdf75dcd1d5f" + } + Frame { + msec: 2208 + hash: "e80b03bd168ec62aba64cdf75dcd1d5f" + } + Frame { + msec: 2224 + hash: "e80b03bd168ec62aba64cdf75dcd1d5f" + } + Frame { + msec: 2240 + hash: "e80b03bd168ec62aba64cdf75dcd1d5f" + } + Frame { + msec: 2256 + hash: "e80b03bd168ec62aba64cdf75dcd1d5f" + } + Frame { + msec: 2272 + hash: "e80b03bd168ec62aba64cdf75dcd1d5f" + } + Frame { + msec: 2288 + hash: "e80b03bd168ec62aba64cdf75dcd1d5f" + } + Frame { + msec: 2304 + hash: "e80b03bd168ec62aba64cdf75dcd1d5f" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 274; y: 218 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2320 + hash: "e80b03bd168ec62aba64cdf75dcd1d5f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 273; y: 218 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 273; y: 217 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2336 + hash: "e80b03bd168ec62aba64cdf75dcd1d5f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 272; y: 215 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 272; y: 213 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2352 + hash: "e80b03bd168ec62aba64cdf75dcd1d5f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 271; y: 210 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 270; y: 208 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2368 + hash: "79a132ab719ccdf48d367cca443cd835" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 269; y: 204 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 269; y: 202 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2384 + hash: "1f19e7d2c7494f5b603dee16e211d65d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 268; y: 196 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 268; y: 193 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2400 + hash: "64fd22407c77fac28d13035ce78c67b2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 268; y: 186 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 266; y: 177 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2416 + hash: "f05a0f956b4964d4ebff056b63252297" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 265; y: 173 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 264; y: 167 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2432 + hash: "3de1e9a2b33e37b0fe3b799b68ec22d6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 263; y: 164 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 263; y: 164 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2448 + hash: "71f115c60d4f20422e4ac3f319644c48" + } + Frame { + msec: 2464 + hash: "c3995ac89f0a4b3fb07401479538d338" + } + Frame { + msec: 2480 + hash: "950e83408adf55f4e7fc1c0c127caa89" + } + Frame { + msec: 2496 + hash: "5b335621a76a527d058708384c2e5635" + } + Frame { + msec: 2512 + hash: "a201ae31d5bb778bd44a49dd21951c1b" + } + Frame { + msec: 2528 + hash: "550e6708a8999d56d1f57c121228692f" + } + Frame { + msec: 2544 + hash: "d8eb4dd2b3cf50273cb7dfbb5bd658b9" + } + Frame { + msec: 2560 + hash: "aa1fd0a990e42175acc84de96b384e9d" + } + Frame { + msec: 2576 + hash: "0236fb15db30da5ec794444affee1169" + } + Frame { + msec: 2592 + hash: "a7445a70874a9767462e79e1dff88dbc" + } + Frame { + msec: 2608 + hash: "339ea6bd5b486ff85272e19e07669f0b" + } + Frame { + msec: 2624 + hash: "2b24d9d17c77cd0ac52989328dcf499b" + } + Frame { + msec: 2640 + hash: "2b24d9d17c77cd0ac52989328dcf499b" + } + Frame { + msec: 2656 + hash: "e2fcfe4f3e14e46404eb6955502180a1" + } + Frame { + msec: 2672 + hash: "5d0c9601b871690047f4df91723ccfb1" + } + Frame { + msec: 2688 + hash: "5d0c9601b871690047f4df91723ccfb1" + } + Frame { + msec: 2704 + hash: "5b5d7e880e9f4942f52a3cde738dc7fb" + } + Frame { + msec: 2720 + hash: "5b5d7e880e9f4942f52a3cde738dc7fb" + } + Frame { + msec: 2736 + hash: "5b5d7e880e9f4942f52a3cde738dc7fb" + } + Frame { + msec: 2752 + hash: "5b5d7e880e9f4942f52a3cde738dc7fb" + } + Frame { + msec: 2768 + hash: "5b5d7e880e9f4942f52a3cde738dc7fb" + } + Frame { + msec: 2784 + hash: "5b5d7e880e9f4942f52a3cde738dc7fb" + } + Frame { + msec: 2800 + hash: "5b5d7e880e9f4942f52a3cde738dc7fb" + } + Frame { + msec: 2816 + hash: "5b5d7e880e9f4942f52a3cde738dc7fb" + } + Frame { + msec: 2832 + hash: "5b5d7e880e9f4942f52a3cde738dc7fb" + } + Frame { + msec: 2848 + hash: "5b5d7e880e9f4942f52a3cde738dc7fb" + } + Frame { + msec: 2864 + hash: "5b5d7e880e9f4942f52a3cde738dc7fb" + } + Frame { + msec: 2880 + hash: "5b5d7e880e9f4942f52a3cde738dc7fb" + } + Frame { + msec: 2896 + image: "flickable-nested.3.png" + } + Frame { + msec: 2912 + hash: "5b5d7e880e9f4942f52a3cde738dc7fb" + } + Frame { + msec: 2928 + hash: "5b5d7e880e9f4942f52a3cde738dc7fb" + } + Frame { + msec: 2944 + hash: "5b5d7e880e9f4942f52a3cde738dc7fb" + } + Frame { + msec: 2960 + hash: "5b5d7e880e9f4942f52a3cde738dc7fb" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 268; y: 102 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2976 + hash: "5b5d7e880e9f4942f52a3cde738dc7fb" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 268; y: 103 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 268; y: 104 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2992 + hash: "5b5d7e880e9f4942f52a3cde738dc7fb" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 268; y: 105 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 269; y: 108 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3008 + hash: "5b5d7e880e9f4942f52a3cde738dc7fb" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 270; y: 111 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 270; y: 114 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3024 + hash: "2b24d9d17c77cd0ac52989328dcf499b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 271; y: 119 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 272; y: 122 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3040 + hash: "550e6708a8999d56d1f57c121228692f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 273; y: 130 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 274; y: 138 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3056 + hash: "57f3c0a49cef2137e3cfa435396c099e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 274; y: 142 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 274; y: 149 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3072 + hash: "0fffc659a270cc614d16ddf3fa2ab51d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 274; y: 153 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 274; y: 161 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3088 + hash: "a8d937c8379950299a6e3611ff313415" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 273; y: 165 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 272; y: 172 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3104 + hash: "46cfebbf821a08aa30055bfa8fffd137" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 271; y: 175 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 270; y: 180 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 270; y: 180 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3120 + hash: "20a32ee8ae2cf88a2cfdb2dd8552255a" + } + Frame { + msec: 3136 + hash: "20a32ee8ae2cf88a2cfdb2dd8552255a" + } + Frame { + msec: 3152 + hash: "20a32ee8ae2cf88a2cfdb2dd8552255a" + } + Frame { + msec: 3168 + hash: "20a32ee8ae2cf88a2cfdb2dd8552255a" + } + Frame { + msec: 3184 + hash: "20a32ee8ae2cf88a2cfdb2dd8552255a" + } + Frame { + msec: 3200 + hash: "20a32ee8ae2cf88a2cfdb2dd8552255a" + } + Frame { + msec: 3216 + hash: "20a32ee8ae2cf88a2cfdb2dd8552255a" + } + Frame { + msec: 3232 + hash: "20a32ee8ae2cf88a2cfdb2dd8552255a" + } + Frame { + msec: 3248 + hash: "20a32ee8ae2cf88a2cfdb2dd8552255a" + } + Frame { + msec: 3264 + hash: "20a32ee8ae2cf88a2cfdb2dd8552255a" + } + Frame { + msec: 3280 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 3296 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 3312 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 3328 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 3344 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 3360 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 3376 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 3392 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 3408 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 3424 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 3440 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 3456 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 3472 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 3488 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 3504 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 3520 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 3536 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 3552 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 3568 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 3584 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 352; y: 206 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3600 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 352; y: 205 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 352; y: 204 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3616 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 352; y: 201 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 352; y: 196 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3632 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 352; y: 193 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 352; y: 185 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3648 + hash: "eb718f97648438dae1440e2089434b0a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 352; y: 176 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 352; y: 172 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3664 + hash: "e4a2b82752939f351ac46032f2d3333e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 353; y: 163 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 354; y: 158 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3680 + hash: "ab1099a146433a5ec77b336673d0527c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 356; y: 148 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 356; y: 142 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3696 + hash: "7e4ca5ba45d5de10d72ef5ab1171ead5" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 357; y: 130 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 357; y: 130 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3712 + hash: "417bb78fc4f255194a71193e388b752f" + } + Frame { + msec: 3728 + hash: "be63b1e57006d881a345db3ca66e7097" + } + Frame { + msec: 3744 + hash: "e1b96137c2cc0ef18e224a32f665de9d" + } + Frame { + msec: 3760 + hash: "6157ba3962fc7829e8693e2456fd6e8e" + } + Frame { + msec: 3776 + hash: "951ae231b7b18517f8d6504ce7f01b3d" + } + Frame { + msec: 3792 + hash: "57f60f9da1a204cc7eb930575de45ae4" + } + Frame { + msec: 3808 + hash: "008323603b48a55b589af7cbb2f1c8b0" + } + Frame { + msec: 3824 + hash: "b8447e994280cba5ccddc36e7ad3c927" + } + Frame { + msec: 3840 + hash: "98dfc2d6573e5cb7a56a893b8fecf422" + } + Frame { + msec: 3856 + image: "flickable-nested.4.png" + } + Frame { + msec: 3872 + hash: "09dabc3ef85dc857719e7d20111e6023" + } + Frame { + msec: 3888 + hash: "5864c4197fe3269c3f1ad05caf25832e" + } + Frame { + msec: 3904 + hash: "370a471a614d22d281d9987a5b6a42bf" + } + Frame { + msec: 3920 + hash: "36c74e2e325807c7c06e941581613f48" + } + Frame { + msec: 3936 + hash: "e1e2b69992294dc611e6eef7e259d4cd" + } + Frame { + msec: 3952 + hash: "e1e2b69992294dc611e6eef7e259d4cd" + } + Frame { + msec: 3968 + hash: "e1e2b69992294dc611e6eef7e259d4cd" + } + Frame { + msec: 3984 + hash: "36c74e2e325807c7c06e941581613f48" + } + Frame { + msec: 4000 + hash: "36c74e2e325807c7c06e941581613f48" + } + Frame { + msec: 4016 + hash: "bd8f39423d96fceaf577c7f792b61211" + } + Frame { + msec: 4032 + hash: "370a471a614d22d281d9987a5b6a42bf" + } + Frame { + msec: 4048 + hash: "c8fe4424d96460a2503632e3a54d4f6a" + } + Frame { + msec: 4064 + hash: "09dabc3ef85dc857719e7d20111e6023" + } + Frame { + msec: 4080 + hash: "22bff1406eba529d58320b8b19be76d9" + } + Frame { + msec: 4096 + hash: "478bc04322b93b75b5185d047c2898b7" + } + Frame { + msec: 4112 + hash: "98dfc2d6573e5cb7a56a893b8fecf422" + } + Frame { + msec: 4128 + hash: "03b96d3e148e86f1150b09696012d07c" + } + Frame { + msec: 4144 + hash: "735b24d2811beef969477c8b0f400d32" + } + Frame { + msec: 4160 + hash: "b8399d2a7a6de0b5f81e68e8f8825622" + } + Frame { + msec: 4176 + hash: "766a97e0881b623a0de93babfa841125" + } + Frame { + msec: 4192 + hash: "008323603b48a55b589af7cbb2f1c8b0" + } + Frame { + msec: 4208 + hash: "3da913235e4916b4691e3d089dc7b52f" + } + Frame { + msec: 4224 + hash: "3da913235e4916b4691e3d089dc7b52f" + } + Frame { + msec: 4240 + hash: "8c7f6ff7b3db65d7dd9ac4d18545f0d1" + } + Frame { + msec: 4256 + hash: "8c7f6ff7b3db65d7dd9ac4d18545f0d1" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 346; y: 95 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4272 + hash: "8c7f6ff7b3db65d7dd9ac4d18545f0d1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 346; y: 98 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 346; y: 103 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4288 + hash: "951ae231b7b18517f8d6504ce7f01b3d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 348; y: 110 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 348; y: 115 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4304 + hash: "364283bbbcedabc87689ec174ae29818" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 351; y: 124 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 353; y: 129 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4320 + hash: "6a8a59ba8cf0539704fc035d7d5def41" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 358; y: 141 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 361; y: 145 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4336 + hash: "d4626b39fbf24cc6a4e23ef33a570add" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 370; y: 163 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4352 + hash: "255604ac684a18e272dccfa9a81fa1bb" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 376; y: 172 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4368 + hash: "2696641e48ea2a0ccfc65057b283814f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 377; y: 175 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 377; y: 175 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4384 + hash: "4ae011d8d81c57f9e2495d32a90fb5c0" + } + Frame { + msec: 4400 + hash: "c07f57059244b1164e698430b20aac8e" + } + Frame { + msec: 4416 + hash: "d39c21bc6fc079c76ea78d1a3fb0c974" + } + Frame { + msec: 4432 + hash: "f955985ee02fcb810ab8c5f4790f5c12" + } + Frame { + msec: 4448 + hash: "d06b83769bf0f0331e53c270f5dc294c" + } + Frame { + msec: 4464 + hash: "a49ef3866e3f71c26c57fcd616a6dc4c" + } + Frame { + msec: 4480 + hash: "086f4bb966b2076f51b1f615368afda5" + } + Frame { + msec: 4496 + hash: "898de0b200cb83c9724869dd2b74ed52" + } + Frame { + msec: 4512 + hash: "47833f93c5c55f57de5733950ba53714" + } + Frame { + msec: 4528 + hash: "0ced71db7e8c5b8ce8e195a7b821507d" + } + Frame { + msec: 4544 + hash: "84888b8748e297ed4e0525019865ea2b" + } + Frame { + msec: 4560 + hash: "0f62d1aaa0fec0dd90351258a3745869" + } + Frame { + msec: 4576 + hash: "e34a874942161ea830907f94040fc0a5" + } + Frame { + msec: 4592 + hash: "9031e4ad8ee57a8b826d6a6394f0feb9" + } + Frame { + msec: 4608 + hash: "9031e4ad8ee57a8b826d6a6394f0feb9" + } + Frame { + msec: 4624 + hash: "cc8a2477368001015b68c99db95ebaa1" + } + Frame { + msec: 4640 + hash: "01c0f4d5b155eb16ac364b24d5085bac" + } + Frame { + msec: 4656 + hash: "4c4f318b03e0da461bcecb61f43ef3cd" + } + Frame { + msec: 4672 + hash: "dffd22d719f18c943cd0c30afe272434" + } + Frame { + msec: 4688 + hash: "4f7ab0450512ae1319dad22a6e0400b7" + } + Frame { + msec: 4704 + hash: "ea29e23bdb49a30694640dfb078c796a" + } + Frame { + msec: 4720 + hash: "80739ed287906d0b55297be4b74a54cb" + } + Frame { + msec: 4736 + hash: "8d9117cf841c4b158f30b79ac8f2afb0" + } + Frame { + msec: 4752 + hash: "1850e9117160b2bd1865274092f9ec84" + } + Frame { + msec: 4768 + hash: "07945c8954860895f95f8e352c49e0a5" + } + Frame { + msec: 4784 + hash: "d0fa6087d2859446ff8f317c9d7dafe1" + } + Frame { + msec: 4800 + hash: "8ebba2084793d90a640ec2fb12dc0547" + } + Frame { + msec: 4816 + image: "flickable-nested.5.png" + } + Frame { + msec: 4832 + hash: "77d479675c36ecda0926061449f5a60b" + } + Frame { + msec: 4848 + hash: "77d479675c36ecda0926061449f5a60b" + } + Frame { + msec: 4864 + hash: "b968c1528ce7ecf80008fbd56f0ca9a9" + } + Frame { + msec: 4880 + hash: "b968c1528ce7ecf80008fbd56f0ca9a9" + } + Frame { + msec: 4896 + hash: "b968c1528ce7ecf80008fbd56f0ca9a9" + } + Frame { + msec: 4912 + hash: "b968c1528ce7ecf80008fbd56f0ca9a9" + } + Frame { + msec: 4928 + hash: "b968c1528ce7ecf80008fbd56f0ca9a9" + } + Frame { + msec: 4944 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 4960 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 4976 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 4992 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5008 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5024 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5040 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5056 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5072 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5088 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5104 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5120 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5136 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5152 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5168 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5184 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5200 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5216 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5232 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5248 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5264 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5280 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5296 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5312 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5328 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5344 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5360 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5376 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5392 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5408 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5424 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5440 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5456 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5472 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5488 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5504 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5520 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5536 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5552 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5568 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5584 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5600 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5616 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5632 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5648 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5664 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5680 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } + Frame { + msec: 5696 + hash: "38f29e86bd9bfe4df04c6411374f76ae" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.0.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.0.png new file mode 100644 index 00000000..5af9306b Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.1.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.1.png new file mode 100644 index 00000000..61acc87e Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.2.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.2.png new file mode 100644 index 00000000..bc6ac347 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.3.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.3.png new file mode 100644 index 00000000..bc6ac347 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.4.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.4.png new file mode 100644 index 00000000..c970488b Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.5.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.5.png new file mode 100644 index 00000000..0af1424c Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.5.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.6.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.6.png new file mode 100644 index 00000000..c826907d Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.6.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.7.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.7.png new file mode 100644 index 00000000..5af9306b Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.7.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.8.png b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.8.png new file mode 100644 index 00000000..f714fa5d Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.8.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.qml b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.qml new file mode 100644 index 00000000..8ad3029b --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/data/flickable-vertical.qml @@ -0,0 +1,3647 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "flickable-vertical.0.png" + } + Frame { + msec: 32 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 48 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 64 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 80 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 96 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 112 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 128 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 144 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 160 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 176 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 192 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 208 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 224 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 240 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 256 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 272 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 288 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 159; y: 207 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 304 + hash: "71a0273e7582419e07937fe701d8e027" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 159; y: 206 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 320 + hash: "71a0273e7582419e07937fe701d8e027" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 159; y: 205 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 159; y: 203 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 336 + hash: "71a0273e7582419e07937fe701d8e027" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 159; y: 199 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 157; y: 190 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 352 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 155; y: 176 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 153; y: 158 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 368 + hash: "a8d53f622836800e43157685ce21fad4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 151; y: 141 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 148; y: 118 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 384 + hash: "99c8215fbd87e45836908a85748dccc7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 146; y: 94 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 141; y: 70 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 400 + hash: "d56ff1a2994f1acb5ad06b0468672a29" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 136; y: 46 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 136; y: 46 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 416 + hash: "85ba01e36cc978459451887facbc3260" + } + Frame { + msec: 432 + hash: "958d223a6b27ecc87febd860168d5aa5" + } + Frame { + msec: 448 + hash: "851ef5f56b7b05d3feb0a1a357f96007" + } + Frame { + msec: 464 + hash: "4d90460d3b6c46075ffda426bc6ceaa6" + } + Frame { + msec: 480 + hash: "bb67acd602414cf59e27b5ff19f69169" + } + Frame { + msec: 496 + hash: "acce28653f8bf46c09067254774fb126" + } + Frame { + msec: 512 + hash: "91ea2538dfe0f9af7b4732cb4474215b" + } + Frame { + msec: 528 + hash: "e7fd52f25a4a9c31a2f2fabd59c31160" + } + Frame { + msec: 544 + hash: "6acdb4852ef9091382030998e28d02a5" + } + Frame { + msec: 560 + hash: "10c7eaab96a538a7111b054a403132a3" + } + Frame { + msec: 576 + hash: "4ebb31f7945bb5542f9e5146888b1065" + } + Frame { + msec: 592 + hash: "b98d594580ad701afb4d2ef186853bc4" + } + Frame { + msec: 608 + hash: "2700eb44f9b7400f3c1bd11d878e078d" + } + Frame { + msec: 624 + hash: "b8a8c4db8325b3e0292e6473084347d9" + } + Frame { + msec: 640 + hash: "88ff05697e82e78847794b153be12c46" + } + Frame { + msec: 656 + hash: "06970943c3cd12f07b1d661de0ab730f" + } + Frame { + msec: 672 + hash: "5804b412094ab17424de4ba12b2e2e32" + } + Frame { + msec: 688 + hash: "8ff038b364f065e67430b2a312a10101" + } + Frame { + msec: 704 + hash: "8a9a1c725b80af8fd3ffb9d8bc7328ac" + } + Frame { + msec: 720 + hash: "83c3481ec7a1dddcbc36d6fb9b7d6149" + } + Frame { + msec: 736 + hash: "abf102e5d88bef8ed429c222284907da" + } + Frame { + msec: 752 + hash: "e9bcb3268f705e708ffbcf707c78c889" + } + Frame { + msec: 768 + hash: "918c60c1ed90f5803d24ea515f21f8fa" + } + Frame { + msec: 784 + hash: "f3064485083025aba09224faafcede14" + } + Frame { + msec: 800 + hash: "9f36e5b91e6abc9f991625cc52afdd4e" + } + Frame { + msec: 816 + hash: "70a50039fbd67d4b56c0c7ec3d7aecd1" + } + Frame { + msec: 832 + hash: "90bbef58e2e59021f68b878db477f74b" + } + Frame { + msec: 848 + hash: "21480d7b949acba033f4686c666d3f85" + } + Frame { + msec: 864 + hash: "b622d2cea2428fb92a8e37715a60f195" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 109; y: 69 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 880 + hash: "b622d2cea2428fb92a8e37715a60f195" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 110; y: 70 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 110; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 896 + hash: "b622d2cea2428fb92a8e37715a60f195" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 110; y: 74 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 111; y: 79 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 912 + hash: "8b537cd0481c1a9bf84f4855ae5697ad" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 111; y: 89 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 113; y: 104 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 928 + hash: "f5aba503b2c155401d26be068724e28a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 115; y: 119 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 115; y: 135 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 944 + hash: "1aca5a9415dd669a0ff76ef4da9c9a56" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 118; y: 160 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 120; y: 183 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 960 + hash: "b046e18396cd3d2da6505fa783bd2b89" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 122; y: 205 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 124; y: 230 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 124; y: 230 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 976 + image: "flickable-vertical.1.png" + } + Frame { + msec: 992 + hash: "c4506098417f905871a43d183cd5904d" + } + Frame { + msec: 1008 + hash: "fe8014819e6fe41fa109f5b0ff2e9764" + } + Frame { + msec: 1024 + hash: "6acdb4852ef9091382030998e28d02a5" + } + Frame { + msec: 1040 + hash: "d5a9739669a9a641c0c1f44b777cb9b8" + } + Frame { + msec: 1056 + hash: "a4006cb90c69313b9b04a6b7b8734855" + } + Frame { + msec: 1072 + hash: "23b447e486a6354354505171cf3c45ec" + } + Frame { + msec: 1088 + hash: "ad172b89d9764bd568d9127c91547c0b" + } + Frame { + msec: 1104 + hash: "0003fb6329e0bf293d56af63265bf0ca" + } + Frame { + msec: 1120 + hash: "dd62960e62800219c179fcd481e4504d" + } + Frame { + msec: 1136 + hash: "7fe6c7bd1bc9e46d3e520178a2309e87" + } + Frame { + msec: 1152 + hash: "bb67acd602414cf59e27b5ff19f69169" + } + Frame { + msec: 1168 + hash: "3170c18b8dd74429b0f366ec07f4870b" + } + Frame { + msec: 1184 + hash: "249e4e489236e3f0748ba63c7a105b33" + } + Frame { + msec: 1200 + hash: "bd2fb97c583e6fe653a32fa610d6ac83" + } + Frame { + msec: 1216 + hash: "95ca2f988370075070c6a98e5e680206" + } + Frame { + msec: 1232 + hash: "851ef5f56b7b05d3feb0a1a357f96007" + } + Frame { + msec: 1248 + hash: "80f599f50af9e601536f62ea93f4e429" + } + Frame { + msec: 1264 + hash: "485d719d81429e63be4de1ba81d53996" + } + Frame { + msec: 1280 + hash: "745f3c2e0baede59a52805eddac5b01f" + } + Frame { + msec: 1296 + hash: "fea3fa6e26eb150ab37fe96a34d3be3b" + } + Frame { + msec: 1312 + hash: "29c8004517294539adf3243533381436" + } + Frame { + msec: 1328 + hash: "85ba01e36cc978459451887facbc3260" + } + Frame { + msec: 1344 + hash: "deedb9ddcc2f5354a2356178db54d971" + } + Frame { + msec: 1360 + hash: "9e1fb461c13b4affa39e5909d3ade168" + } + Frame { + msec: 1376 + hash: "684a543d7afc5a5cac2bb823bbb94893" + } + Frame { + msec: 1392 + hash: "636f04661a0418c1fdcaaaba28092671" + } + Frame { + msec: 1408 + hash: "89cac82b6751208654d1e4ef4df8ef28" + } + Frame { + msec: 1424 + hash: "a974415dcf31bee79874c4a6e84cf796" + } + Frame { + msec: 1440 + hash: "f74c075e8cf2aef501b7115427b3b221" + } + Frame { + msec: 1456 + hash: "7efcd27e34db1d3adc3d31e0b9ebe432" + } + Frame { + msec: 1472 + hash: "c8747327ae3370b04a996aa6b5e373c6" + } + Frame { + msec: 1488 + hash: "b7b32b5e782f8f5b1cbd6f581f90004a" + } + Frame { + msec: 1504 + hash: "5fda56f77948e183557ff54690030746" + } + Frame { + msec: 1520 + hash: "6e43987a8db7a6231887cf5883d381bf" + } + Frame { + msec: 1536 + hash: "901e1f9851d05ff300fa2d52a38829ec" + } + Frame { + msec: 1552 + hash: "abda2edf3c9f1aa28f41bf28083d081f" + } + Frame { + msec: 1568 + hash: "5e324e90e4056f59730db9fbc941609a" + } + Frame { + msec: 1584 + hash: "d98ec6ad7e6f2df6796f975cdf06ea2c" + } + Frame { + msec: 1600 + hash: "fa62c8154b5aba9fa6daa0a50229e752" + } + Frame { + msec: 1616 + hash: "c03b7e52c7da4f1cb6a4a2cab119a1a1" + } + Frame { + msec: 1632 + hash: "57c1149d35ed84de63bac7accdb30c77" + } + Frame { + msec: 1648 + hash: "48823d7e5b72ff6e11bbe877962c9884" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 44; y: 282 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1664 + hash: "99c8215fbd87e45836908a85748dccc7" + } + Frame { + msec: 1680 + hash: "45e2cf43322f038d2b322dea82e829f1" + } + Frame { + msec: 1696 + hash: "6473a0dc426bf118674d09b281fb6c38" + } + Frame { + msec: 1712 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 44; y: 282 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1728 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 1744 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 1760 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 1776 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 1792 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 1808 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 1824 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 1840 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 1856 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 1872 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 1888 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 1904 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 1920 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 1936 + image: "flickable-vertical.2.png" + } + Frame { + msec: 1952 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 1968 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 1984 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2000 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2016 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2032 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2048 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2064 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2080 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 95; y: 222 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 95; y: 221 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2096 + hash: "5f6ed58401fddd692503810f22b23e93" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 95; y: 220 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 95; y: 218 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2112 + hash: "5f6ed58401fddd692503810f22b23e93" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 95; y: 216 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 95; y: 212 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2128 + hash: "5f6ed58401fddd692503810f22b23e93" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 96; y: 205 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 96; y: 195 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2144 + hash: "5f6ed58401fddd692503810f22b23e93" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 97; y: 184 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 97; y: 168 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2160 + hash: "5f6ed58401fddd692503810f22b23e93" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 99; y: 153 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 99; y: 139 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2176 + hash: "5f6ed58401fddd692503810f22b23e93" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 101; y: 125 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 101; y: 112 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2192 + hash: "5f6ed58401fddd692503810f22b23e93" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 101; y: 99 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 101; y: 85 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2208 + hash: "5f6ed58401fddd692503810f22b23e93" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 103; y: 75 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 103; y: 62 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2224 + hash: "5f6ed58401fddd692503810f22b23e93" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 103; y: 53 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 103; y: 45 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 103; y: 45 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2240 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2256 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2272 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2288 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2304 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2320 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2336 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2352 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2368 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2384 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2400 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2416 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2432 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2448 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2464 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2480 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2496 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2512 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2528 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 90; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2544 + hash: "defd2e26ba579dffd2273bcc86c54a94" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 90; y: 39 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2560 + hash: "defd2e26ba579dffd2273bcc86c54a94" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 90; y: 40 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 90; y: 41 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2576 + hash: "defd2e26ba579dffd2273bcc86c54a94" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 91; y: 43 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 91; y: 46 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2592 + hash: "defd2e26ba579dffd2273bcc86c54a94" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 92; y: 50 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 92; y: 55 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2608 + hash: "defd2e26ba579dffd2273bcc86c54a94" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 94; y: 65 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 96; y: 79 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2624 + hash: "defd2e26ba579dffd2273bcc86c54a94" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 97; y: 95 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 99; y: 112 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2640 + hash: "defd2e26ba579dffd2273bcc86c54a94" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 101; y: 129 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 103; y: 148 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2656 + hash: "defd2e26ba579dffd2273bcc86c54a94" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 105; y: 165 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 105; y: 180 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2672 + hash: "defd2e26ba579dffd2273bcc86c54a94" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 107; y: 192 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 109; y: 205 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2688 + hash: "defd2e26ba579dffd2273bcc86c54a94" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 109; y: 219 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 109; y: 230 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2704 + hash: "defd2e26ba579dffd2273bcc86c54a94" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 111; y: 235 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 111; y: 238 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2720 + hash: "defd2e26ba579dffd2273bcc86c54a94" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 111; y: 240 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 111; y: 240 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2736 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2752 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2768 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2784 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2800 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2816 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2832 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2848 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2864 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2880 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2896 + image: "flickable-vertical.3.png" + } + Frame { + msec: 2912 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2928 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2944 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2960 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2976 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 2992 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3008 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3024 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3040 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3056 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3072 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3088 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3104 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3120 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3136 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 43; y: 269 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3152 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3168 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3184 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3200 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3216 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 43; y: 269 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3232 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3248 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3264 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3280 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3296 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3312 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3328 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3344 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3360 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3376 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3392 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3408 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3424 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3440 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3456 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3472 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 75; y: 279 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3488 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3504 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3520 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3536 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 75; y: 279 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3552 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3568 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3584 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3600 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3616 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3632 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3648 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3664 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3680 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3696 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3712 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3728 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Frame { + msec: 3744 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 116; y: 200 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3760 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 116; y: 199 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 117; y: 198 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3776 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 117; y: 195 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 117; y: 190 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3792 + hash: "8caa38000edef97a8276022b5da19ecc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 118; y: 183 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 120; y: 166 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3808 + hash: "abda2edf3c9f1aa28f41bf28083d081f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 122; y: 146 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 124; y: 123 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3824 + hash: "1a0305de0a8156f3f059d74891b71846" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 126; y: 94 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 128; y: 67 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3840 + hash: "04c2fbbb1df6ca9d03c105fcfa5c0770" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 130; y: 41 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 133; y: 15 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3856 + image: "flickable-vertical.4.png" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 135; y: -6 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 138; y: -27 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3872 + hash: "4ebb31f7945bb5542f9e5146888b1065" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 140; y: -48 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 140; y: -48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3888 + hash: "2a731429c6d5c4ee1f1fa8f3ca07f0c2" + } + Frame { + msec: 3904 + hash: "b8a8c4db8325b3e0292e6473084347d9" + } + Frame { + msec: 3920 + hash: "fae53bd8bc9d05f343968c7006723207" + } + Frame { + msec: 3936 + hash: "fe2fc28a79609af32ea1043f3c988b08" + } + Frame { + msec: 3952 + hash: "18f77a48b14347b2ab41eb39c9de3be4" + } + Frame { + msec: 3968 + hash: "93e83c35d34715ee703a0d79d51bc145" + } + Frame { + msec: 3984 + hash: "4ae9d80d6079b92be66fcc099209d779" + } + Frame { + msec: 4000 + hash: "bd8c0a924552cb4dfc5ddc1451931b01" + } + Frame { + msec: 4016 + hash: "6a1874cdac6f754b36f022c583834d32" + } + Frame { + msec: 4032 + hash: "f3064485083025aba09224faafcede14" + } + Frame { + msec: 4048 + hash: "8e82568ac62969dfedbf1c2082101661" + } + Frame { + msec: 4064 + hash: "4e447efea0dd139787c7aa9018327206" + } + Frame { + msec: 4080 + hash: "ed23778ce6843053cd4af6df7262bdd0" + } + Frame { + msec: 4096 + hash: "fe1118cc51b4cd25d775b5d1c1d66540" + } + Frame { + msec: 4112 + hash: "02a59ccc15df26abe5612f13ce926286" + } + Frame { + msec: 4128 + hash: "71c43a208e3dfbce6cb461f8ff0d2f17" + } + Frame { + msec: 4144 + hash: "404b8155f17dff084c2da1407d6915a9" + } + Frame { + msec: 4160 + hash: "ab0dba54c469dea461cd1619161edd82" + } + Frame { + msec: 4176 + hash: "e6f158712a7afe1844acc1a1cd9385ec" + } + Frame { + msec: 4192 + hash: "b9d8fcc3d68ebc6d4d4f60e4652befe3" + } + Frame { + msec: 4208 + hash: "9005a49b3ac2ef2344d78ef68595ea26" + } + Frame { + msec: 4224 + hash: "aad3dd90f766320ad68b62b97559ec02" + } + Frame { + msec: 4240 + hash: "a39008d78d188e8bd3571f80f679a915" + } + Frame { + msec: 4256 + hash: "cedc580acc63d6a069442bb83f17b6f8" + } + Frame { + msec: 4272 + hash: "f63f5d20e3b5a4b6247339d0ec518449" + } + Frame { + msec: 4288 + hash: "f63f5d20e3b5a4b6247339d0ec518449" + } + Frame { + msec: 4304 + hash: "cedc580acc63d6a069442bb83f17b6f8" + } + Frame { + msec: 4320 + hash: "bccf94c11e92af36f418dbee1b797a86" + } + Frame { + msec: 4336 + hash: "a39008d78d188e8bd3571f80f679a915" + } + Frame { + msec: 4352 + hash: "02d38396737a262fa983511a40514b38" + } + Frame { + msec: 4368 + hash: "9005a49b3ac2ef2344d78ef68595ea26" + } + Frame { + msec: 4384 + hash: "c05dad606a9b5b501a201bfead974f03" + } + Frame { + msec: 4400 + hash: "27846f086c13e1b06e89a8a395802678" + } + Frame { + msec: 4416 + hash: "f919b09b6f7f4f09b5d9b123b686a442" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 136; y: 176 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4432 + hash: "f919b09b6f7f4f09b5d9b123b686a442" + } + Frame { + msec: 4448 + hash: "f919b09b6f7f4f09b5d9b123b686a442" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 136; y: 175 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4464 + hash: "f919b09b6f7f4f09b5d9b123b686a442" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 136; y: 173 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 136; y: 168 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4480 + hash: "ab0dba54c469dea461cd1619161edd82" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 134; y: 159 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 133; y: 142 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4496 + hash: "aad3dd90f766320ad68b62b97559ec02" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 130; y: 119 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 128; y: 98 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4512 + hash: "09e110197afc9350dbbaf3e19e24dbe8" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 126; y: 78 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 124; y: 59 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4528 + hash: "c50fa7aa75b947d065109c97a0db4c02" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 122; y: 44 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 120; y: 30 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4544 + hash: "e701f8ef23f576f10c286191ea4caaf1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 120; y: 21 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 118; y: 12 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 118; y: 12 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4560 + hash: "c24daebe9c5ba9bd46ef674c49edd160" + } + Frame { + msec: 4576 + hash: "fc762235395c772666d2529a5e9bff98" + } + Frame { + msec: 4592 + hash: "7f4f4420fde62e6126f0c3bf604425dc" + } + Frame { + msec: 4608 + hash: "0e9978b0f60cba7bf599571b97f2f751" + } + Frame { + msec: 4624 + hash: "ff19d1b0a0d7d0cc5dd8919606c17fc8" + } + Frame { + msec: 4640 + hash: "7c61e0a6c354b4f30db6c861b9250be2" + } + Frame { + msec: 4656 + hash: "bd1196ce51f5abd53f6052f17d926a81" + } + Frame { + msec: 4672 + hash: "ab2b1c33a5f60690fe2724a0ddd3bb67" + } + Frame { + msec: 4688 + hash: "0a0709d2649d649ab52eaddbe60c1dc9" + } + Frame { + msec: 4704 + hash: "ef3b3099811cc2e26d823d94c5b66f1d" + } + Frame { + msec: 4720 + hash: "522683305b2706b6e22d0e1770f285d6" + } + Frame { + msec: 4736 + hash: "c08d933b3dbda5fc476ed673cd7a2e4a" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 111; y: 67 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4752 + hash: "c08d933b3dbda5fc476ed673cd7a2e4a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 111; y: 70 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 111; y: 74 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4768 + hash: "ab0dba54c469dea461cd1619161edd82" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 111; y: 79 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 112; y: 86 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4784 + hash: "d23653a4e1651babdbb3561fb7029df2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 112; y: 95 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 114; y: 105 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4800 + hash: "702d94cbca1ba235a5a2cc30c552d8b7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 114; y: 115 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 115; y: 126 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4816 + image: "flickable-vertical.5.png" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 115; y: 142 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 117; y: 159 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4832 + hash: "f53134176897d55299ab723ab20ba3fc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 120; y: 180 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 122; y: 202 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4848 + hash: "84146c913b41215c4bab1f36471f2b7b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 127; y: 224 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 129; y: 243 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 129; y: 243 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4864 + hash: "2a731429c6d5c4ee1f1fa8f3ca07f0c2" + } + Frame { + msec: 4880 + hash: "a1e960ffef391daecb52d31698c7b06c" + } + Frame { + msec: 4896 + hash: "adca54c132f170c517f1ef17c45006c8" + } + Frame { + msec: 4912 + hash: "4ebb31f7945bb5542f9e5146888b1065" + } + Frame { + msec: 4928 + hash: "c43ebd04137e379216c94b4c57cab3d9" + } + Frame { + msec: 4944 + hash: "c0218c548f5e3eb74ef33cb2921dbc96" + } + Frame { + msec: 4960 + hash: "e6a15947574c7ac8e5a2454a5f8b043d" + } + Frame { + msec: 4976 + hash: "ec9aca63b61a8c3beb4ad476d4e38568" + } + Frame { + msec: 4992 + hash: "28f0447e8107d7fac9ec29b83808d2cb" + } + Frame { + msec: 5008 + hash: "74e28cddf8dd7bd7593c7185e09ea752" + } + Frame { + msec: 5024 + hash: "23b447e486a6354354505171cf3c45ec" + } + Frame { + msec: 5040 + hash: "3e3948addc7236ff8638863786dfe045" + } + Frame { + msec: 5056 + hash: "49885ec2f3242fc3ba9c9b808b3bb491" + } + Frame { + msec: 5072 + hash: "0c12fc65a0298af1a1ec3bccfcdb20ab" + } + Frame { + msec: 5088 + hash: "49c71089343b963fd8b3587eb1d5d457" + } + Frame { + msec: 5104 + hash: "f083682e9bce74022baeafcb26870adb" + } + Frame { + msec: 5120 + hash: "5bd49eab3fd8b246659b51d4602ea391" + } + Frame { + msec: 5136 + hash: "3170c18b8dd74429b0f366ec07f4870b" + } + Frame { + msec: 5152 + hash: "d82de8b7c5a144b20085f447cf041350" + } + Frame { + msec: 5168 + hash: "60e520c52c5b87c686294a23d96dbd11" + } + Frame { + msec: 5184 + hash: "bb5b6cb5862e28a7f309ef5c7cf2b5dd" + } + Frame { + msec: 5200 + hash: "b9e255376ad0b74b2c9be6e694f84d90" + } + Frame { + msec: 5216 + hash: "e7527c7c8cb2f8c9e5ce32be98612837" + } + Frame { + msec: 5232 + hash: "8f8547a6508b156d514c6d4a61d18424" + } + Frame { + msec: 5248 + hash: "99b4220101d400b49346ca023799c8fe" + } + Frame { + msec: 5264 + hash: "2d83cf7c5f93aad4f9dcadcfdbb08fa3" + } + Frame { + msec: 5280 + hash: "c9ea64aa7000008ad9032cddd898767c" + } + Frame { + msec: 5296 + hash: "4c37b188261e927f72725484d08ac9e1" + } + Frame { + msec: 5312 + hash: "29c8004517294539adf3243533381436" + } + Frame { + msec: 5328 + hash: "b5126298ebb61d6ab5ae58822c9380ca" + } + Frame { + msec: 5344 + hash: "7b546c089dca57353b4867af724ea370" + } + Frame { + msec: 5360 + hash: "deedb9ddcc2f5354a2356178db54d971" + } + Frame { + msec: 5376 + hash: "9e1fb461c13b4affa39e5909d3ade168" + } + Frame { + msec: 5392 + hash: "dbb54d7d203c99d466b1a173fb90c148" + } + Frame { + msec: 5408 + hash: "0a67ef028264551c1122f4d8a0b07c20" + } + Frame { + msec: 5424 + hash: "636f04661a0418c1fdcaaaba28092671" + } + Frame { + msec: 5440 + hash: "de8946eb6317277b580cbf6a38a85a29" + } + Frame { + msec: 5456 + hash: "45dd5e856c10ef2e5a9b968044802096" + } + Frame { + msec: 5472 + hash: "a974415dcf31bee79874c4a6e84cf796" + } + Frame { + msec: 5488 + hash: "58dab05300d4c83ba084c8bef6a04958" + } + Frame { + msec: 5504 + hash: "f74c075e8cf2aef501b7115427b3b221" + } + Frame { + msec: 5520 + hash: "7fd3e958115134b2f15cc6d3e01cbcfe" + } + Frame { + msec: 5536 + hash: "7efcd27e34db1d3adc3d31e0b9ebe432" + } + Frame { + msec: 5552 + hash: "2229621b9ad55dddce371061584a4dfd" + } + Frame { + msec: 5568 + hash: "c8747327ae3370b04a996aa6b5e373c6" + } + Frame { + msec: 5584 + hash: "677f52c273dda1f878bfea43b6353aaa" + } + Frame { + msec: 5600 + hash: "d29de2f0505bdaca1e3443812a588fb1" + } + Frame { + msec: 5616 + hash: "71f3088ea8794a232ee08c6b0ad72e98" + } + Frame { + msec: 5632 + hash: "3733ba52e740ea8438967cb03c619368" + } + Frame { + msec: 5648 + hash: "5fda56f77948e183557ff54690030746" + } + Frame { + msec: 5664 + hash: "5996c2fc31ff3a13e1f3a23a230aad9a" + } + Frame { + msec: 5680 + hash: "90b9b19f9f6aef7279b1199ca7b34b07" + } + Frame { + msec: 5696 + hash: "05b4559167ff77d07bb3063b87c4e621" + } + Frame { + msec: 5712 + hash: "6e43987a8db7a6231887cf5883d381bf" + } + Frame { + msec: 5728 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 5744 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 5760 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 5776 + image: "flickable-vertical.6.png" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 102; y: 279 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5792 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 5808 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 5824 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 5840 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 102; y: 279 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5856 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 5872 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 5888 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 5904 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 5920 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 5936 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 5952 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 5968 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 5984 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 6000 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 6016 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 6032 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 6048 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 6064 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 148; y: 276 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6080 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 6096 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 6112 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 6128 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 6144 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 148; y: 276 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6160 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 6176 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 6192 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 6208 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 6224 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 6240 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 6256 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 6272 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 6288 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 6304 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 6320 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 6336 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 6352 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 6368 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Frame { + msec: 6384 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 129; y: 101 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6400 + hash: "9b748b3b85f63d7f62cd916b0bf4357c" + } + Frame { + msec: 6416 + hash: "9b748b3b85f63d7f62cd916b0bf4357c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 129; y: 103 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 129; y: 105 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6432 + hash: "9b748b3b85f63d7f62cd916b0bf4357c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 130; y: 110 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 132; y: 123 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6448 + hash: "351d95ba7bc01ea8d4991883885ca537" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 132; y: 133 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 134; y: 145 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6464 + hash: "2c84bdd7066c8fd8c66b022783c6fcfe" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 136; y: 159 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 138; y: 172 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6480 + hash: "ffe18300d9ce72e2d4e191c473a6973c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 138; y: 187 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 140; y: 203 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6496 + hash: "427720fdd38ff4310c8040b1a5a5f84f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 140; y: 214 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 141; y: 224 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6512 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 143; y: 235 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 143; y: 246 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6528 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 143; y: 257 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 145; y: 269 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6544 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 145; y: 278 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 145; y: 289 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6560 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 147; y: 299 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 147; y: 308 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6576 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 149; y: 316 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 149; y: 318 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6592 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 149; y: 320 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 149; y: 321 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 149; y: 321 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6608 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 6624 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 6640 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 6656 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 6672 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 6688 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 6704 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 6720 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 6736 + image: "flickable-vertical.7.png" + } + Frame { + msec: 6752 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 6768 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 6784 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 6800 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 6816 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 6832 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 6848 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 6864 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 6880 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 6896 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 6912 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 6928 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 6944 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 6960 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 6976 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Frame { + msec: 6992 + hash: "08a827d109c78ff0d82ed7b6ef8d55b9" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 166; y: 191 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7008 + hash: "ff198f6b27379e64b901b37e0cf1e98b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 167; y: 190 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 167; y: 189 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7024 + hash: "ff198f6b27379e64b901b37e0cf1e98b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 167; y: 188 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 168; y: 185 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7040 + hash: "ff198f6b27379e64b901b37e0cf1e98b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 169; y: 183 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 169; y: 179 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7056 + hash: "61d410fdbe0ee8a41e9c7b25eb2901a7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 170; y: 172 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 170; y: 162 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7072 + hash: "8e27d1db841047a115561861a1c20e67" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 168; y: 150 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 167; y: 139 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7088 + hash: "7599e2f206da8b46dcaf35a4a7858747" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 165; y: 125 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 163; y: 113 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7104 + hash: "45e2cf43322f038d2b322dea82e829f1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 161; y: 103 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 160; y: 92 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7120 + hash: "0170b6aff2eab67213fc4f2883be1db9" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 158; y: 80 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 156; y: 66 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7136 + hash: "23ef985de50ae4600d8f62ed4c91edc9" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 154; y: 52 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 154; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7152 + hash: "a69e534df84e406e06ca94e2221c97f1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 152; y: 27 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 150; y: 18 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 150; y: 18 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7168 + hash: "99b4220101d400b49346ca023799c8fe" + } + Frame { + msec: 7184 + hash: "80f599f50af9e601536f62ea93f4e429" + } + Frame { + msec: 7200 + hash: "e211b4a9e0059eaf7a3654121ed6b7a4" + } + Frame { + msec: 7216 + hash: "ef0997291fb3323c877b65847905f7c3" + } + Frame { + msec: 7232 + hash: "95ca2f988370075070c6a98e5e680206" + } + Frame { + msec: 7248 + hash: "bb5b6cb5862e28a7f309ef5c7cf2b5dd" + } + Frame { + msec: 7264 + hash: "958e9074dfa2392db05fb3f532573519" + } + Frame { + msec: 7280 + hash: "4d90460d3b6c46075ffda426bc6ceaa6" + } + Frame { + msec: 7296 + hash: "d82de8b7c5a144b20085f447cf041350" + } + Frame { + msec: 7312 + hash: "4d5d1c8470df16097c51517e750ef6be" + } + Frame { + msec: 7328 + hash: "3170c18b8dd74429b0f366ec07f4870b" + } + Frame { + msec: 7344 + hash: "35b4e282089b4f7e8cc60aaf6635a0f7" + } + Frame { + msec: 7360 + hash: "bb67acd602414cf59e27b5ff19f69169" + } + Frame { + msec: 7376 + hash: "0135220633c5aebe964b596f3c1bae27" + } + Frame { + msec: 7392 + hash: "b4a996bdc1ccae96f84e285b212a19a3" + } + Frame { + msec: 7408 + hash: "7fe6c7bd1bc9e46d3e520178a2309e87" + } + Frame { + msec: 7424 + hash: "b803764915a58bd59aed1223bd7c67d7" + } + Frame { + msec: 7440 + hash: "49c71089343b963fd8b3587eb1d5d457" + } + Frame { + msec: 7456 + hash: "d2e577eecdf6fc9ecadf500896e0ff46" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 109; y: 172 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7472 + hash: "d2e577eecdf6fc9ecadf500896e0ff46" + } + Frame { + msec: 7488 + hash: "d2e577eecdf6fc9ecadf500896e0ff46" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 109; y: 170 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 109; y: 168 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7504 + hash: "d2e577eecdf6fc9ecadf500896e0ff46" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 109; y: 165 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 109; y: 152 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7520 + hash: "21bf0affeaf1033e59a99bed9efeb80d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 109; y: 135 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 109; y: 116 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7536 + hash: "c4506098417f905871a43d183cd5904d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 106; y: 91 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 104; y: 66 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7552 + hash: "fdf8dfa53431f930b01e667b3b86c7a1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 102; y: 42 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 100; y: 17 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7568 + hash: "a94e05f80f0f8d3af13678318fd91416" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 100; y: -2 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 100; y: -2 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7584 + hash: "bd8c0a924552cb4dfc5ddc1451931b01" + } + Frame { + msec: 7600 + hash: "ed5bab2126fb459989b7ea0e44da6776" + } + Frame { + msec: 7616 + hash: "756fc80a88e6f5d28f9c6bba771355c5" + } + Frame { + msec: 7632 + hash: "640c092db0d2a523ce0cdc961e64124a" + } + Frame { + msec: 7648 + hash: "097582f1b42c16d41f4413755ac15c3e" + } + Frame { + msec: 7664 + hash: "67ef5e3297fe5605bd41a72681899f48" + } + Frame { + msec: 7680 + hash: "91452c52c309b7d90c7ccca3fc9ae8b2" + } + Frame { + msec: 7696 + image: "flickable-vertical.8.png" + } + Frame { + msec: 7712 + hash: "ebef3c7095abadf45855fe75cbf3d358" + } + Frame { + msec: 7728 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 7744 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 7760 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 7776 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 7792 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 7808 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 7824 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 7840 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 7856 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 7872 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 7888 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 7904 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 7920 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 7936 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 7952 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 7968 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 7984 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 8000 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 8016 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 8032 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 8048 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 8064 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 8080 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 8096 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 8112 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 8128 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 8144 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 8160 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 8176 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 8192 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 8208 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 8224 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 8240 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 8256 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 8272 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 8288 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 8304 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 8320 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 8336 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 8352 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 8368 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 8384 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 8400 + hash: "97b167a5a76d6b71713d25508ed360f0" + } + Frame { + msec: 8416 + hash: "97b167a5a76d6b71713d25508ed360f0" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/flickable-horizontal.qml b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/flickable-horizontal.qml new file mode 100644 index 00000000..8aa2389a --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/flickable-horizontal.qml @@ -0,0 +1,37 @@ +import QtQuick 1.0 + +Rectangle { + color: "lightSteelBlue" + width: 600; height: 300 + + ListModel { + id: list + ListElement { dayColor: "steelblue" } + ListElement { dayColor: "blue" } + ListElement { dayColor: "yellow" } + ListElement { dayColor: "purple" } + ListElement { dayColor: "red" } + ListElement { dayColor: "green" } + ListElement { dayColor: "orange" } + } + + Flickable { + id: flickable + anchors.fill: parent; contentWidth: row.width + + Row { + id: row + Repeater { + model: list + Rectangle { width: 200; height: 300; color: dayColor } + } + } + } + Rectangle { + radius: 3 + y: flickable.height-8 + height: 8 + x: flickable.visibleArea.xPosition * flickable.width + width: flickable.visibleArea.widthRatio * flickable.width + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/flickable-nested.qml b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/flickable-nested.qml new file mode 100644 index 00000000..9335b9e3 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/flickable-nested.qml @@ -0,0 +1,50 @@ +import QtQuick 1.0 + +Item { + width: 640 + height: 400 + + Flickable { + objectName: "flick 1" + anchors.fill: parent + contentWidth: width + 100 + contentHeight: height + 100 + + Rectangle { + width: 300 + height: 300 + color: "blue" + + Flickable { + objectName: "flick 2" + width: 300 + height: 300 + clip: true + contentWidth: 400 + contentHeight: 400 + + Rectangle { + width: 100 + height: 100 + anchors.centerIn: parent + color: "yellow" + + Flickable { + objectName: "flick 3" + anchors.fill: parent + clip: true + contentWidth: 150 + contentHeight: 150 + Rectangle { + x: 80 + y: 80 + width: 50 + height: 50 + color: "green" + } + } + } + } + } + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflickable/flickable-vertical.qml b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/flickable-vertical.qml new file mode 100644 index 00000000..1fd65d17 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativeflickable/flickable-vertical.qml @@ -0,0 +1,90 @@ +import QtQuick 1.0 + +Rectangle { + color: "lightSteelBlue" + width: 200; height: 300 + + ListModel { + id: list + ListElement { dayColor: "steelblue" } + ListElement { dayColor: "blue" } + ListElement { dayColor: "yellow" } + ListElement { dayColor: "purple" } + ListElement { dayColor: "red" } + ListElement { dayColor: "green" } + ListElement { dayColor: "orange" } + } + + Flickable { + id: flick + height: parent.height-50 + width: parent.width; contentHeight: column.height + + Column { + id: column + Repeater { + model: list + Rectangle { width: 200; height: 100; color: mr.pressed ? "black" : dayColor + MouseArea { + id: mr + anchors.fill: parent + } + } + } + } + clip: true + } + Rectangle { + radius: 3 + x: flick.width-8 + width: 8 + y: flick.visibleArea.yPosition * flick.height + height: flick.visibleArea.heightRatio * flick.height + } + + // click to toggle interactive flag + Rectangle { + width: 64 + height: 48 + y: parent.height - 50 + color: "red" + MouseArea { + anchors.fill: parent + onClicked: flick.interactive = flick.interactive ? false : true + } + } + + // click to toggle click delay + Rectangle { + width: 64 + height: 48 + x: 66 + y: parent.height - 50 + color: "green" + MouseArea { + anchors.fill: parent + onClicked: flick.pressDelay = flick.pressDelay > 0 ? 0 : 500 + } + } + + // click to toggle overshoot + Rectangle { + width: 64 + height: 48 + x: 130 + y: parent.height - 50 + color: "yellow" + MouseArea { + anchors.fill: parent + onClicked: flick.boundsBehavior = flick.boundsBehavior == Flickable.StopAtBounds ? Flickable.DragAndOvershootBounds : Flickable.StopAtBounds + } + } + + Rectangle { + width: Math.abs(flick.verticalVelocity)/100 + height: 50 + x: 200 + y: parent.height - 50 + color: "blue" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.0.png b/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.0.png new file mode 100644 index 00000000..b3ae1bcc Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.1.png b/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.1.png new file mode 100644 index 00000000..0458d82d Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.2.png b/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.2.png new file mode 100644 index 00000000..0e01afc3 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.3.png b/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.3.png new file mode 100644 index 00000000..b256bc23 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.4.png b/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.4.png new file mode 100644 index 00000000..8454ed24 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.5.png b/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.5.png new file mode 100644 index 00000000..177a0fe9 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.5.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.6.png b/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.6.png new file mode 100644 index 00000000..a51cffeb Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.6.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.qml b/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.qml new file mode 100644 index 00000000..2d362a42 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test-flipable.qml @@ -0,0 +1,1623 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "test-flipable.0.png" + } + 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 + hash: "c03406106847c03c73f5897e65690925" + } + Frame { + msec: 976 + image: "test-flipable.1.png" + } + 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 + hash: "1e8348fbb51871dffe9543fca19bb452" + } + Frame { + msec: 1936 + image: "test-flipable.2.png" + } + 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 + hash: "373141f99bc88c40ead161502c9750e9" + } + Frame { + msec: 2896 + image: "test-flipable.3.png" + } + 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 + hash: "464a78e75e10b62773ab64af4fc4c7aa" + } + Frame { + msec: 3856 + image: "test-flipable.4.png" + } + 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 + hash: "03f17b2cd781f2ee0ae5664a0491166c" + } + Frame { + msec: 4816 + image: "test-flipable.5.png" + } + 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 + hash: "73c06997014af4e008b546b53fe349fb" + } + Frame { + msec: 5776 + image: "test-flipable.6.png" + } + 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: 67108864 + 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/qmlvisual/qdeclarativeflipable/data/test_flipable_resize.0.png b/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test_flipable_resize.0.png new file mode 100644 index 00000000..814cc892 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test_flipable_resize.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test_flipable_resize.qml b/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test_flipable_resize.qml new file mode 100644 index 00000000..d211832b --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativeflipable/data/test_flipable_resize.qml @@ -0,0 +1,207 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "test_flipable_resize.0.png" + } + Frame { + msec: 32 + hash: "8d8c6a3c37ba3cb77afcc7ed4234d40f" + } + Frame { + msec: 48 + hash: "93ab01494e2229c0921c25d3acbcffe6" + } + Frame { + msec: 64 + hash: "5036bf3c842e5ad09b7bac5512e433ad" + } + Frame { + msec: 80 + hash: "ef02ef4598fbe6390391b7f2c17ec99d" + } + Frame { + msec: 96 + hash: "7fa83afca86cfec48a4986ba3df08e3b" + } + Frame { + msec: 112 + hash: "d9388827bd7755bb9bc1ef78507cc0ac" + } + Frame { + msec: 128 + hash: "d18778f4f748f7ee54404db334831ff7" + } + Frame { + msec: 144 + hash: "fee69ae3b4d79b795d4443b055a8a91a" + } + Frame { + msec: 160 + hash: "f80fa0131c859286e900071b51e74784" + } + Frame { + msec: 176 + hash: "b654e51ea71ec118e6b985743281b6a1" + } + Frame { + msec: 192 + hash: "91c771226e9c97e0f00c6f7c6fc6c95c" + } + Frame { + msec: 208 + hash: "0f612f81541b093442e68d99e00c288c" + } + Frame { + msec: 224 + hash: "246b619598606fef9f0442439cee4ec6" + } + Frame { + msec: 240 + hash: "1d2f34459b2128877218cef340f46f06" + } + Frame { + msec: 256 + hash: "af3c2eef734da05d45484bbb19646425" + } + Frame { + msec: 272 + hash: "85dfe5680e47919500728de6e93c8290" + } + Frame { + msec: 288 + hash: "8fd7d439bafa07461a65a3c97cf8602a" + } + Frame { + msec: 304 + hash: "1ebf543a84aae4abfd480f24ad362cb0" + } + Frame { + msec: 320 + hash: "60a9c9300981282986659e7c73d381b0" + } + Frame { + msec: 336 + hash: "686f3ff048f2b214033988d989ed087a" + } + Frame { + msec: 352 + hash: "24694e17476b0ffe9848159aa282e931" + } + Frame { + msec: 368 + hash: "c05e1bdf62e3e58972f868b930823a58" + } + Frame { + msec: 384 + hash: "cbc1a3c78b8f79047d1221d5ae06f0f8" + } + Frame { + msec: 400 + hash: "05ad366e74bf30b1619cf2ef1f530d82" + } + Frame { + msec: 416 + hash: "4c5c536f2c03ecfb7d3d8f56638001ec" + } + Frame { + msec: 432 + hash: "9754048ffcb7863a8a676e5bee4a7991" + } + Frame { + msec: 448 + hash: "047aa8203ad18023f5af340a41f1084e" + } + Frame { + msec: 464 + hash: "1351b7c92cd873db387e93dc74cca848" + } + Frame { + msec: 480 + hash: "4066f52fae753013396195dc98311058" + } + Frame { + msec: 496 + hash: "21d969b92993e428e79babb574e9203d" + } + Frame { + msec: 512 + hash: "62c00f52e8b0592fbb59f88deb3b022e" + } + Frame { + msec: 528 + hash: "322719dee40d3495e9b4d2faac351e89" + } + Frame { + msec: 544 + hash: "322719dee40d3495e9b4d2faac351e89" + } + Frame { + msec: 560 + hash: "322719dee40d3495e9b4d2faac351e89" + } + Frame { + msec: 576 + hash: "322719dee40d3495e9b4d2faac351e89" + } + Frame { + msec: 592 + hash: "322719dee40d3495e9b4d2faac351e89" + } + Frame { + msec: 608 + hash: "322719dee40d3495e9b4d2faac351e89" + } + Frame { + msec: 624 + hash: "322719dee40d3495e9b4d2faac351e89" + } + Frame { + msec: 640 + hash: "322719dee40d3495e9b4d2faac351e89" + } + Frame { + msec: 656 + hash: "322719dee40d3495e9b4d2faac351e89" + } + Frame { + msec: 672 + hash: "322719dee40d3495e9b4d2faac351e89" + } + Frame { + msec: 688 + hash: "322719dee40d3495e9b4d2faac351e89" + } + Frame { + msec: 704 + hash: "322719dee40d3495e9b4d2faac351e89" + } + Frame { + msec: 720 + hash: "322719dee40d3495e9b4d2faac351e89" + } + Key { + type: 6 + key: 16777249 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 736 + hash: "322719dee40d3495e9b4d2faac351e89" + } + Frame { + msec: 752 + hash: "322719dee40d3495e9b4d2faac351e89" + } + Frame { + msec: 768 + hash: "322719dee40d3495e9b4d2faac351e89" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeflipable/test-flipable.qml b/tests/auto/declarative/qmlvisual/qdeclarativeflipable/test-flipable.qml new file mode 100644 index 00000000..8a178b3f --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativeflipable/test-flipable.qml @@ -0,0 +1,79 @@ +import QtQuick 1.0 + +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.type: "InOutQuad"; properties: "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.type: "InOutQuad"; properties: "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/qmlvisual/qdeclarativeflipable/test_flipable_resize.qml b/tests/auto/declarative/qmlvisual/qdeclarativeflipable/test_flipable_resize.qml new file mode 100644 index 00000000..8aeb6c8f --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativeflipable/test_flipable_resize.qml @@ -0,0 +1,62 @@ +import QtQuick 1.0 +Item { //realWindow + width: 370 + height: 480 + Item { + id: window + NumberAnimation on width{ from:320; to:370; duration: 500 } + NumberAnimation on height{ from:480; to:320; duration: 500 } + Flipable { + id: flipable + x: 0 + y: window.height / 3.0 - 40 + width: parent.width + height: parent.height + transform: Rotation { + id: transform + origin.x: window.width / 2.0 + origin.y: 0 + origin.z: 0 + axis.x: 0 + axis.y: 1 + axis.z: 0 + angle: 0; + } + front: Rectangle{ + width: parent.width + height: 80 + color: "blue" + }back: Rectangle{ + width: parent.width + height: 80 + color: "red" + } + } + Flipable { + id: flipableBack + x: 0 + y: 2.0 * window.height / 3.0 - 40 + width: parent.width + height: parent.height + transform: Rotation { + id: transformBack + origin.x: window.width / 2.0 + origin.y: 0 + origin.z: 0 + axis.x: 0 + axis.y: 1 + axis.z: 0 + angle: 180; + } + front: Rectangle{ + width: parent.width + height: 80 + color: "blue" + }back: Rectangle{ + width: parent.width + height: 80 + color: "red" + } + } + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.0.png b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.0.png new file mode 100644 index 00000000..b053048f Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.1.png b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.1.png new file mode 100644 index 00000000..c675be72 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.10.png b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.10.png new file mode 100644 index 00000000..c675be72 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.10.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.2.png b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.2.png new file mode 100644 index 00000000..9f605c35 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.3.png b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.3.png new file mode 100644 index 00000000..767d7a9f Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.4.png b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.4.png new file mode 100644 index 00000000..20146c93 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.5.png b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.5.png new file mode 100644 index 00000000..85fac891 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.5.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.6.png b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.6.png new file mode 100644 index 00000000..e522baee Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.6.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.7.png b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.7.png new file mode 100644 index 00000000..f9192e46 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.7.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.8.png b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.8.png new file mode 100644 index 00000000..ad187bdd Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.8.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.9.png b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.9.png new file mode 100644 index 00000000..96c63257 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.9.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.qml b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.qml new file mode 100644 index 00000000..6f0352d8 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview.qml @@ -0,0 +1,2859 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "gridview.0.png" + } + Frame { + msec: 32 + hash: "c33447c78ea64452ec3cd1696fb502eb" + } + Frame { + msec: 48 + hash: "c33447c78ea64452ec3cd1696fb502eb" + } + Frame { + msec: 64 + hash: "c33447c78ea64452ec3cd1696fb502eb" + } + Frame { + msec: 80 + hash: "c33447c78ea64452ec3cd1696fb502eb" + } + Frame { + msec: 96 + hash: "c33447c78ea64452ec3cd1696fb502eb" + } + Frame { + msec: 112 + hash: "c33447c78ea64452ec3cd1696fb502eb" + } + Frame { + msec: 128 + hash: "c33447c78ea64452ec3cd1696fb502eb" + } + Frame { + msec: 144 + hash: "c33447c78ea64452ec3cd1696fb502eb" + } + Frame { + msec: 160 + hash: "c33447c78ea64452ec3cd1696fb502eb" + } + Frame { + msec: 176 + hash: "c33447c78ea64452ec3cd1696fb502eb" + } + Frame { + msec: 192 + hash: "c33447c78ea64452ec3cd1696fb502eb" + } + Frame { + msec: 208 + hash: "c33447c78ea64452ec3cd1696fb502eb" + } + Frame { + msec: 224 + hash: "c33447c78ea64452ec3cd1696fb502eb" + } + Frame { + msec: 240 + hash: "c33447c78ea64452ec3cd1696fb502eb" + } + Frame { + msec: 256 + hash: "c33447c78ea64452ec3cd1696fb502eb" + } + Frame { + msec: 272 + hash: "c33447c78ea64452ec3cd1696fb502eb" + } + Frame { + msec: 288 + hash: "c33447c78ea64452ec3cd1696fb502eb" + } + Frame { + msec: 304 + hash: "c33447c78ea64452ec3cd1696fb502eb" + } + Frame { + msec: 320 + hash: "c33447c78ea64452ec3cd1696fb502eb" + } + Frame { + msec: 336 + hash: "c33447c78ea64452ec3cd1696fb502eb" + } + Frame { + msec: 352 + hash: "c33447c78ea64452ec3cd1696fb502eb" + } + Frame { + msec: 368 + hash: "c33447c78ea64452ec3cd1696fb502eb" + } + Frame { + msec: 384 + hash: "c33447c78ea64452ec3cd1696fb502eb" + } + Frame { + msec: 400 + hash: "c33447c78ea64452ec3cd1696fb502eb" + } + Frame { + msec: 416 + hash: "c33447c78ea64452ec3cd1696fb502eb" + } + Frame { + msec: 432 + hash: "c33447c78ea64452ec3cd1696fb502eb" + } + Key { + type: 6 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 448 + hash: "c33447c78ea64452ec3cd1696fb502eb" + } + Frame { + msec: 464 + hash: "159004854f8c07144034e1265cf6f44a" + } + Frame { + msec: 480 + hash: "a3f2471ef4ceac77a1c20ac327550d8d" + } + Frame { + msec: 496 + hash: "1121efa0df5057387be08fced62fe9eb" + } + Frame { + msec: 512 + hash: "67ad85cda0b8fb382cb536ef880f715b" + } + Frame { + msec: 528 + hash: "4de18d32c93ca5cd77cb45c8c4f3b4fc" + } + Key { + type: 7 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 544 + hash: "de26f0243101d57f4acf42b256ad75f9" + } + Frame { + msec: 560 + hash: "119ea359724d5f4ba1e1aa120cddf3ea" + } + Frame { + msec: 576 + hash: "65fbee28f9ea68a6f2736d75a65b3ee2" + } + Frame { + msec: 592 + hash: "7b1893397b76b0c95094eeca1dd21446" + } + Frame { + msec: 608 + hash: "7b1893397b76b0c95094eeca1dd21446" + } + Frame { + msec: 624 + hash: "7b1893397b76b0c95094eeca1dd21446" + } + Frame { + msec: 640 + hash: "7b1893397b76b0c95094eeca1dd21446" + } + Frame { + msec: 656 + hash: "7b1893397b76b0c95094eeca1dd21446" + } + Frame { + msec: 672 + hash: "7b1893397b76b0c95094eeca1dd21446" + } + Frame { + msec: 688 + hash: "7b1893397b76b0c95094eeca1dd21446" + } + Frame { + msec: 704 + hash: "7b1893397b76b0c95094eeca1dd21446" + } + Key { + type: 6 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 720 + hash: "7b1893397b76b0c95094eeca1dd21446" + } + Frame { + msec: 736 + hash: "6123118055b4d0678eb2b7cdf8b12592" + } + Frame { + msec: 752 + hash: "fe4b009abe081a6eaeab6ef9e996f3fd" + } + Frame { + msec: 768 + hash: "2f23f647daa1c11637d6a21c2668be49" + } + Frame { + msec: 784 + hash: "62d995a1feb7f600669c1c7ef5f6a5da" + } + Frame { + msec: 800 + hash: "66e881ee93f4722605a63dccd083635d" + } + Frame { + msec: 816 + hash: "27ac08cc4f62552a9d1c1cbf781a00f9" + } + Key { + type: 7 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 832 + hash: "792be2ec5a08ad74cda4c19b6bc209d0" + } + Frame { + msec: 848 + hash: "0d28add40afd81f768603ea3e396f0b3" + } + Frame { + msec: 864 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 880 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 896 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 912 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 928 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 944 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 960 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 976 + image: "gridview.1.png" + } + Frame { + msec: 992 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 1008 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 1024 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 1040 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 1056 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 1072 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 1088 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 1104 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 1120 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 1136 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 1152 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Key { + type: 6 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 1168 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 1184 + hash: "eac6b1299cb386f2be244b43a0be26ae" + } + Frame { + msec: 1200 + hash: "14350c877f5259a3cb3836fa5f8ff563" + } + Key { + type: 7 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 1216 + hash: "582bfeca87cba0dee21b9551e583ec93" + } + Frame { + msec: 1232 + hash: "cefe1139141fa381e55f1254713a1380" + } + Frame { + msec: 1248 + hash: "72e966a995c818b16b48bb193eda241a" + } + Frame { + msec: 1264 + hash: "8dfeefd93687861158ca4496e56cdbb9" + } + Frame { + msec: 1280 + hash: "daf8474f1f583039f6a14b822e5dff5e" + } + Frame { + msec: 1296 + hash: "eb2b4ba7ffab22660d0b9de4226ea88f" + } + Frame { + msec: 1312 + hash: "f0f00d22d15ed9828db7b5f3a3669fe9" + } + Frame { + msec: 1328 + hash: "caa3c1a106d549e6bb94a1746bd7a53c" + } + Frame { + msec: 1344 + hash: "caa3c1a106d549e6bb94a1746bd7a53c" + } + Frame { + msec: 1360 + hash: "caa3c1a106d549e6bb94a1746bd7a53c" + } + Frame { + msec: 1376 + hash: "caa3c1a106d549e6bb94a1746bd7a53c" + } + Frame { + msec: 1392 + hash: "caa3c1a106d549e6bb94a1746bd7a53c" + } + Frame { + msec: 1408 + hash: "caa3c1a106d549e6bb94a1746bd7a53c" + } + Frame { + msec: 1424 + hash: "caa3c1a106d549e6bb94a1746bd7a53c" + } + Frame { + msec: 1440 + hash: "caa3c1a106d549e6bb94a1746bd7a53c" + } + Frame { + msec: 1456 + hash: "caa3c1a106d549e6bb94a1746bd7a53c" + } + Frame { + msec: 1472 + hash: "caa3c1a106d549e6bb94a1746bd7a53c" + } + Frame { + msec: 1488 + hash: "caa3c1a106d549e6bb94a1746bd7a53c" + } + Frame { + msec: 1504 + hash: "caa3c1a106d549e6bb94a1746bd7a53c" + } + Frame { + msec: 1520 + hash: "caa3c1a106d549e6bb94a1746bd7a53c" + } + Frame { + msec: 1536 + hash: "caa3c1a106d549e6bb94a1746bd7a53c" + } + Frame { + msec: 1552 + hash: "caa3c1a106d549e6bb94a1746bd7a53c" + } + Frame { + msec: 1568 + hash: "caa3c1a106d549e6bb94a1746bd7a53c" + } + Frame { + msec: 1584 + hash: "caa3c1a106d549e6bb94a1746bd7a53c" + } + Frame { + msec: 1600 + hash: "caa3c1a106d549e6bb94a1746bd7a53c" + } + Frame { + msec: 1616 + hash: "caa3c1a106d549e6bb94a1746bd7a53c" + } + Frame { + msec: 1632 + hash: "caa3c1a106d549e6bb94a1746bd7a53c" + } + Frame { + msec: 1648 + hash: "caa3c1a106d549e6bb94a1746bd7a53c" + } + Key { + type: 6 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 1664 + hash: "caa3c1a106d549e6bb94a1746bd7a53c" + } + Frame { + msec: 1680 + hash: "66e158aa7dd78362dffddf2a9e7375ef" + } + Frame { + msec: 1696 + hash: "8c23d5245774ab5252c98c19c33f8171" + } + Frame { + msec: 1712 + hash: "bf37dc941e49af9bd1e0e182a4ef6f0a" + } + Frame { + msec: 1728 + hash: "3fc025193fa6d6db0428ae1fa179bf55" + } + Frame { + msec: 1744 + hash: "9efef22e6e29e18b2896982440c7bbae" + } + Frame { + msec: 1760 + hash: "380e92b30430d3f589a88e67b7b959bd" + } + Key { + type: 7 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 1776 + hash: "80329cd1548c4ff9ee589d56e9d8cd90" + } + Frame { + msec: 1792 + hash: "6030c139032fc80abb5aabb85d8dfa4d" + } + Frame { + msec: 1808 + hash: "8304d2432168a2ea8a887d9a135b40b4" + } + Frame { + msec: 1824 + hash: "8304d2432168a2ea8a887d9a135b40b4" + } + Frame { + msec: 1840 + hash: "8304d2432168a2ea8a887d9a135b40b4" + } + Frame { + msec: 1856 + hash: "8304d2432168a2ea8a887d9a135b40b4" + } + Frame { + msec: 1872 + hash: "8304d2432168a2ea8a887d9a135b40b4" + } + Frame { + msec: 1888 + hash: "8304d2432168a2ea8a887d9a135b40b4" + } + Frame { + msec: 1904 + hash: "8304d2432168a2ea8a887d9a135b40b4" + } + Frame { + msec: 1920 + hash: "8304d2432168a2ea8a887d9a135b40b4" + } + Frame { + msec: 1936 + image: "gridview.2.png" + } + Frame { + msec: 1952 + hash: "8304d2432168a2ea8a887d9a135b40b4" + } + Frame { + msec: 1968 + hash: "8304d2432168a2ea8a887d9a135b40b4" + } + Frame { + msec: 1984 + hash: "8304d2432168a2ea8a887d9a135b40b4" + } + Key { + type: 6 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 2000 + hash: "8304d2432168a2ea8a887d9a135b40b4" + } + Frame { + msec: 2016 + hash: "719eabf9ad7e15d5429630c7f7136980" + } + Frame { + msec: 2032 + hash: "a1bd870fffd95a0604dd8e170e571632" + } + Frame { + msec: 2048 + hash: "b406160dda839ee34002190e05ceffac" + } + Frame { + msec: 2064 + hash: "a139784af7675281f0f3760a932aef0c" + } + Frame { + msec: 2080 + hash: "2c7d2f857919deae0a8ad6dc2f7d806f" + } + Key { + type: 7 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 2096 + hash: "80af5431f6d9a77f98c23d913c6caad4" + } + Frame { + msec: 2112 + hash: "b3ccaf648e09dbfcbaa7609440c63fc9" + } + Frame { + msec: 2128 + hash: "d267f9f4dd471be1cf4718d212c79887" + } + Frame { + msec: 2144 + hash: "570da61e2d48acd11474fe005110ab4b" + } + Frame { + msec: 2160 + hash: "570da61e2d48acd11474fe005110ab4b" + } + Frame { + msec: 2176 + hash: "570da61e2d48acd11474fe005110ab4b" + } + Frame { + msec: 2192 + hash: "570da61e2d48acd11474fe005110ab4b" + } + Frame { + msec: 2208 + hash: "570da61e2d48acd11474fe005110ab4b" + } + Frame { + msec: 2224 + hash: "570da61e2d48acd11474fe005110ab4b" + } + Frame { + msec: 2240 + hash: "570da61e2d48acd11474fe005110ab4b" + } + Frame { + msec: 2256 + hash: "570da61e2d48acd11474fe005110ab4b" + } + Frame { + msec: 2272 + hash: "570da61e2d48acd11474fe005110ab4b" + } + Frame { + msec: 2288 + hash: "570da61e2d48acd11474fe005110ab4b" + } + Frame { + msec: 2304 + hash: "570da61e2d48acd11474fe005110ab4b" + } + Frame { + msec: 2320 + hash: "570da61e2d48acd11474fe005110ab4b" + } + Frame { + msec: 2336 + hash: "570da61e2d48acd11474fe005110ab4b" + } + Key { + type: 6 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 2352 + hash: "570da61e2d48acd11474fe005110ab4b" + } + Frame { + msec: 2368 + hash: "db27d4cc92c09148675e76459d8ecb15" + } + Frame { + msec: 2384 + hash: "2c6f60eb170588a8450c679f3b16a6a4" + } + Frame { + msec: 2400 + hash: "024a4d4fc9a11d352d1e0f5ee7f7dbc8" + } + Frame { + msec: 2416 + hash: "c966b518b881f85a2d1cc86f5284ee1b" + } + Frame { + msec: 2432 + hash: "db15811f2d2cff0949213823649ef1d4" + } + Frame { + msec: 2448 + hash: "bbd9fad235aa2843bf2b64f3cf24f4e3" + } + Key { + type: 7 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 2464 + hash: "ccbc2f09ed263375e7b52f556fb2836f" + } + Frame { + msec: 2480 + hash: "c3b74e90fa99f4357762b57b9317b6f5" + } + Frame { + msec: 2496 + hash: "4f2fafdb59db544352e3067d67c0a714" + } + Frame { + msec: 2512 + hash: "043583b19c921740dbc990afd4f508ed" + } + Frame { + msec: 2528 + hash: "043583b19c921740dbc990afd4f508ed" + } + Frame { + msec: 2544 + hash: "043583b19c921740dbc990afd4f508ed" + } + Frame { + msec: 2560 + hash: "043583b19c921740dbc990afd4f508ed" + } + Frame { + msec: 2576 + hash: "043583b19c921740dbc990afd4f508ed" + } + Frame { + msec: 2592 + hash: "043583b19c921740dbc990afd4f508ed" + } + Frame { + msec: 2608 + hash: "043583b19c921740dbc990afd4f508ed" + } + Frame { + msec: 2624 + hash: "043583b19c921740dbc990afd4f508ed" + } + Frame { + msec: 2640 + hash: "043583b19c921740dbc990afd4f508ed" + } + Frame { + msec: 2656 + hash: "043583b19c921740dbc990afd4f508ed" + } + Frame { + msec: 2672 + hash: "043583b19c921740dbc990afd4f508ed" + } + Frame { + msec: 2688 + hash: "043583b19c921740dbc990afd4f508ed" + } + Frame { + msec: 2704 + hash: "043583b19c921740dbc990afd4f508ed" + } + Frame { + msec: 2720 + hash: "043583b19c921740dbc990afd4f508ed" + } + Frame { + msec: 2736 + hash: "043583b19c921740dbc990afd4f508ed" + } + Frame { + msec: 2752 + hash: "043583b19c921740dbc990afd4f508ed" + } + Frame { + msec: 2768 + hash: "043583b19c921740dbc990afd4f508ed" + } + Frame { + msec: 2784 + hash: "043583b19c921740dbc990afd4f508ed" + } + Key { + type: 6 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 2800 + hash: "043583b19c921740dbc990afd4f508ed" + } + Frame { + msec: 2816 + hash: "64fdbc9a930e44dcc38542f720b41b0a" + } + Frame { + msec: 2832 + hash: "257d3d8bcf78671d35a898befec091cb" + } + Frame { + msec: 2848 + hash: "92a51faf52bdc7f895bdc08f049f6ed3" + } + Frame { + msec: 2864 + hash: "5aec71e84a4e9c4962ed73c39d337910" + } + Frame { + msec: 2880 + hash: "e9112eea445585b17d58b6f9ba039c39" + } + Frame { + msec: 2896 + image: "gridview.3.png" + } + Key { + type: 7 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 2912 + hash: "32faa54e636773747a2ec4065a11c337" + } + Frame { + msec: 2928 + hash: "ebe24b814e27cd8a8db78da58c8f86d7" + } + Frame { + msec: 2944 + hash: "e67ae32a47213b360c1a445bf645dde2" + } + Frame { + msec: 2960 + hash: "e67ae32a47213b360c1a445bf645dde2" + } + Frame { + msec: 2976 + hash: "e67ae32a47213b360c1a445bf645dde2" + } + Frame { + msec: 2992 + hash: "e67ae32a47213b360c1a445bf645dde2" + } + Frame { + msec: 3008 + hash: "e67ae32a47213b360c1a445bf645dde2" + } + Frame { + msec: 3024 + hash: "e67ae32a47213b360c1a445bf645dde2" + } + Frame { + msec: 3040 + hash: "e67ae32a47213b360c1a445bf645dde2" + } + Frame { + msec: 3056 + hash: "e67ae32a47213b360c1a445bf645dde2" + } + Frame { + msec: 3072 + hash: "e67ae32a47213b360c1a445bf645dde2" + } + Frame { + msec: 3088 + hash: "e67ae32a47213b360c1a445bf645dde2" + } + Frame { + msec: 3104 + hash: "e67ae32a47213b360c1a445bf645dde2" + } + Key { + type: 6 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 3120 + hash: "e67ae32a47213b360c1a445bf645dde2" + } + Frame { + msec: 3136 + hash: "d446b94a2e3d9f7091c5520852d1a215" + } + Frame { + msec: 3152 + hash: "79d1a3489be95d113e8c611a2ba63456" + } + Frame { + msec: 3168 + hash: "95601b7d8ab689142ca89343743b55b2" + } + Frame { + msec: 3184 + hash: "ad67049e51eafbbc33d1e3763d78b5f9" + } + Frame { + msec: 3200 + hash: "69b1d558065ee9b9719c3ae8f08b52ab" + } + Key { + type: 7 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 3216 + hash: "858fd65adb231bf2002bcc25075be261" + } + Frame { + msec: 3232 + hash: "2dc6fb114e1d2a606efe48f349251504" + } + Frame { + msec: 3248 + hash: "e4819f09d6640021408e03c50090e849" + } + Frame { + msec: 3264 + hash: "5fa3ec31176bed2de8cb076b87e0be74" + } + Frame { + msec: 3280 + hash: "5fa3ec31176bed2de8cb076b87e0be74" + } + Frame { + msec: 3296 + hash: "5fa3ec31176bed2de8cb076b87e0be74" + } + Frame { + msec: 3312 + hash: "5fa3ec31176bed2de8cb076b87e0be74" + } + Frame { + msec: 3328 + hash: "5fa3ec31176bed2de8cb076b87e0be74" + } + Frame { + msec: 3344 + hash: "5fa3ec31176bed2de8cb076b87e0be74" + } + Frame { + msec: 3360 + hash: "5fa3ec31176bed2de8cb076b87e0be74" + } + Frame { + msec: 3376 + hash: "5fa3ec31176bed2de8cb076b87e0be74" + } + Frame { + msec: 3392 + hash: "5fa3ec31176bed2de8cb076b87e0be74" + } + Frame { + msec: 3408 + hash: "5fa3ec31176bed2de8cb076b87e0be74" + } + Frame { + msec: 3424 + hash: "5fa3ec31176bed2de8cb076b87e0be74" + } + Frame { + msec: 3440 + hash: "5fa3ec31176bed2de8cb076b87e0be74" + } + Frame { + msec: 3456 + hash: "5fa3ec31176bed2de8cb076b87e0be74" + } + Key { + type: 6 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 3472 + hash: "5fa3ec31176bed2de8cb076b87e0be74" + } + Frame { + msec: 3488 + hash: "6c84f5e6d352ed345a0bed12c50bf7a9" + } + Frame { + msec: 3504 + hash: "15690df807a7c1e9aa9d7e9154c1a492" + } + Frame { + msec: 3520 + hash: "3d6cc3e0d93ddf4b66321fda361f05c0" + } + Frame { + msec: 3536 + hash: "8e3526ffeb9873b55b3bae2827391628" + } + Frame { + msec: 3552 + hash: "33097267d43a7e16a78102cb91c9fd42" + } + Frame { + msec: 3568 + hash: "17ab2623432bba92dc9d99e5764e626e" + } + Key { + type: 7 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 3584 + hash: "9945a723d9a3399bb5311eea3d9b0b77" + } + Frame { + msec: 3600 + hash: "e6e9251cd6d941a050beaa36b851e314" + } + Frame { + msec: 3616 + hash: "a61dbcb7d914afe34009085bf37fb8e2" + } + Frame { + msec: 3632 + hash: "e63d987ba303a42046827f14941b444a" + } + Frame { + msec: 3648 + hash: "e63d987ba303a42046827f14941b444a" + } + Frame { + msec: 3664 + hash: "e63d987ba303a42046827f14941b444a" + } + Frame { + msec: 3680 + hash: "e63d987ba303a42046827f14941b444a" + } + Frame { + msec: 3696 + hash: "e63d987ba303a42046827f14941b444a" + } + Frame { + msec: 3712 + hash: "e63d987ba303a42046827f14941b444a" + } + Frame { + msec: 3728 + hash: "e63d987ba303a42046827f14941b444a" + } + Frame { + msec: 3744 + hash: "e63d987ba303a42046827f14941b444a" + } + Frame { + msec: 3760 + hash: "e63d987ba303a42046827f14941b444a" + } + Frame { + msec: 3776 + hash: "e63d987ba303a42046827f14941b444a" + } + Frame { + msec: 3792 + hash: "e63d987ba303a42046827f14941b444a" + } + Frame { + msec: 3808 + hash: "e63d987ba303a42046827f14941b444a" + } + Frame { + msec: 3824 + hash: "e63d987ba303a42046827f14941b444a" + } + Frame { + msec: 3840 + hash: "e63d987ba303a42046827f14941b444a" + } + Frame { + msec: 3856 + image: "gridview.4.png" + } + Frame { + msec: 3872 + hash: "e63d987ba303a42046827f14941b444a" + } + Frame { + msec: 3888 + hash: "e63d987ba303a42046827f14941b444a" + } + Frame { + msec: 3904 + hash: "e63d987ba303a42046827f14941b444a" + } + Frame { + msec: 3920 + hash: "e63d987ba303a42046827f14941b444a" + } + Key { + type: 6 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 3936 + hash: "e63d987ba303a42046827f14941b444a" + } + Frame { + msec: 3952 + hash: "9942059cb380dbae191850d2e7175906" + } + Frame { + msec: 3968 + hash: "ca5af7d98a008eccba1e21be0da61f3c" + } + Frame { + msec: 3984 + hash: "abb95ac1408d34e2eb319e5396511d65" + } + Frame { + msec: 4000 + hash: "183df6d4be489280181f01a0c0ed3cde" + } + Frame { + msec: 4016 + hash: "64733a4d609c621765d114a6b482dc57" + } + Frame { + msec: 4032 + hash: "897aa5b42e48a7235ab4fdded5876da2" + } + Key { + type: 7 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 4048 + hash: "c80f01a1e683d84bfa0821832c113820" + } + Frame { + msec: 4064 + hash: "e7065bf6934c7fb7b160ae5c169633e4" + } + Frame { + msec: 4080 + hash: "db3d030de94b19ea1db5c60be7c7ca5c" + } + Frame { + msec: 4096 + hash: "db3d030de94b19ea1db5c60be7c7ca5c" + } + Frame { + msec: 4112 + hash: "db3d030de94b19ea1db5c60be7c7ca5c" + } + Frame { + msec: 4128 + hash: "db3d030de94b19ea1db5c60be7c7ca5c" + } + Frame { + msec: 4144 + hash: "db3d030de94b19ea1db5c60be7c7ca5c" + } + Frame { + msec: 4160 + hash: "db3d030de94b19ea1db5c60be7c7ca5c" + } + Frame { + msec: 4176 + hash: "db3d030de94b19ea1db5c60be7c7ca5c" + } + Frame { + msec: 4192 + hash: "db3d030de94b19ea1db5c60be7c7ca5c" + } + Frame { + msec: 4208 + hash: "db3d030de94b19ea1db5c60be7c7ca5c" + } + Frame { + msec: 4224 + hash: "db3d030de94b19ea1db5c60be7c7ca5c" + } + Key { + type: 6 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 4240 + hash: "db3d030de94b19ea1db5c60be7c7ca5c" + } + Frame { + msec: 4256 + hash: "917c11b16c6286bea7a37990d7fa078f" + } + Frame { + msec: 4272 + hash: "1616c6def28659d51905564ff83cc112" + } + Frame { + msec: 4288 + hash: "fce04972557736a8dfa8de5f1a605ddb" + } + Frame { + msec: 4304 + hash: "6acffcea115f8a777f62c1f68cd25fa6" + } + Frame { + msec: 4320 + hash: "f96ae6a4f437cf98b268fc0b0611ddc4" + } + Frame { + msec: 4336 + hash: "c9e14157dca547623497a6107f14b73d" + } + Key { + type: 7 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 4352 + hash: "6489766ed84c4b6ff26de24cb74848cb" + } + Frame { + msec: 4368 + hash: "9d229c10853b30ed048b892953c5d86c" + } + Frame { + msec: 4384 + hash: "2476aa1a7191b485a76c76e98c9be2b0" + } + Frame { + msec: 4400 + hash: "2476aa1a7191b485a76c76e98c9be2b0" + } + Frame { + msec: 4416 + hash: "2476aa1a7191b485a76c76e98c9be2b0" + } + Frame { + msec: 4432 + hash: "2476aa1a7191b485a76c76e98c9be2b0" + } + Frame { + msec: 4448 + hash: "2476aa1a7191b485a76c76e98c9be2b0" + } + Frame { + msec: 4464 + hash: "2476aa1a7191b485a76c76e98c9be2b0" + } + Frame { + msec: 4480 + hash: "2476aa1a7191b485a76c76e98c9be2b0" + } + Frame { + msec: 4496 + hash: "2476aa1a7191b485a76c76e98c9be2b0" + } + Frame { + msec: 4512 + hash: "2476aa1a7191b485a76c76e98c9be2b0" + } + Frame { + msec: 4528 + hash: "2476aa1a7191b485a76c76e98c9be2b0" + } + Frame { + msec: 4544 + hash: "2476aa1a7191b485a76c76e98c9be2b0" + } + Frame { + msec: 4560 + hash: "2476aa1a7191b485a76c76e98c9be2b0" + } + Frame { + msec: 4576 + hash: "2476aa1a7191b485a76c76e98c9be2b0" + } + Frame { + msec: 4592 + hash: "2476aa1a7191b485a76c76e98c9be2b0" + } + Key { + type: 6 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 4608 + hash: "2476aa1a7191b485a76c76e98c9be2b0" + } + Frame { + msec: 4624 + hash: "12f17d727d70269fd98a0f6524c9f750" + } + Frame { + msec: 4640 + hash: "e73d64ebe242eae0f412ca463c76085d" + } + Frame { + msec: 4656 + hash: "f37a468e04155c880e707d1d12f71f94" + } + Frame { + msec: 4672 + hash: "3789293a6b8791d8e60b5160fc457345" + } + Frame { + msec: 4688 + hash: "7d8377c816f19fa32d847a30d1c71da9" + } + Frame { + msec: 4704 + hash: "b9867dbb6f03d5970076251e10e47f16" + } + Key { + type: 7 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 4720 + hash: "0604bbd1afdfee5881d9d9d79a67a3df" + } + Frame { + msec: 4736 + hash: "93401cdfa6cc7fbbfc479faa0bc1d63f" + } + Frame { + msec: 4752 + hash: "aa379c70dd6a94a55fd8c065331ad47b" + } + Frame { + msec: 4768 + hash: "11150995098af8516513230360d40108" + } + Frame { + msec: 4784 + hash: "11150995098af8516513230360d40108" + } + Frame { + msec: 4800 + hash: "11150995098af8516513230360d40108" + } + Frame { + msec: 4816 + image: "gridview.5.png" + } + Frame { + msec: 4832 + hash: "11150995098af8516513230360d40108" + } + Frame { + msec: 4848 + hash: "11150995098af8516513230360d40108" + } + Frame { + msec: 4864 + hash: "11150995098af8516513230360d40108" + } + Frame { + msec: 4880 + hash: "11150995098af8516513230360d40108" + } + Frame { + msec: 4896 + hash: "11150995098af8516513230360d40108" + } + Frame { + msec: 4912 + hash: "11150995098af8516513230360d40108" + } + Frame { + msec: 4928 + hash: "11150995098af8516513230360d40108" + } + Frame { + msec: 4944 + hash: "11150995098af8516513230360d40108" + } + Frame { + msec: 4960 + hash: "11150995098af8516513230360d40108" + } + Frame { + msec: 4976 + hash: "11150995098af8516513230360d40108" + } + Frame { + msec: 4992 + hash: "11150995098af8516513230360d40108" + } + Frame { + msec: 5008 + hash: "11150995098af8516513230360d40108" + } + Frame { + msec: 5024 + hash: "11150995098af8516513230360d40108" + } + Frame { + msec: 5040 + hash: "11150995098af8516513230360d40108" + } + Frame { + msec: 5056 + hash: "11150995098af8516513230360d40108" + } + Frame { + msec: 5072 + hash: "11150995098af8516513230360d40108" + } + Frame { + msec: 5088 + hash: "11150995098af8516513230360d40108" + } + Frame { + msec: 5104 + hash: "11150995098af8516513230360d40108" + } + Frame { + msec: 5120 + hash: "11150995098af8516513230360d40108" + } + Frame { + msec: 5136 + hash: "11150995098af8516513230360d40108" + } + Frame { + msec: 5152 + hash: "11150995098af8516513230360d40108" + } + Key { + type: 6 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 5168 + hash: "11150995098af8516513230360d40108" + } + Frame { + msec: 5184 + hash: "c58f071ae4efde5cd265fa6e82dda56b" + } + Frame { + msec: 5200 + hash: "bea9eadda7b015d0e9a0f05924e723f7" + } + Frame { + msec: 5216 + hash: "c255da63dc59ca7555c91701ed373fd5" + } + Frame { + msec: 5232 + hash: "fa0a697341baae4b3aa4dee721ef10a2" + } + Frame { + msec: 5248 + hash: "2d2148840143772fab6b2405bf5eb609" + } + Frame { + msec: 5264 + hash: "3716705b5f7caa86eecc1dfafe31ebcf" + } + Key { + type: 7 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 5280 + hash: "35cfea054566eae3bcc9c8a41caadcdc" + } + Frame { + msec: 5296 + hash: "916858ff0ca4370840d072c389242a2b" + } + Frame { + msec: 5312 + hash: "417f4bce58783f0e677b17b05147a663" + } + Frame { + msec: 5328 + hash: "417f4bce58783f0e677b17b05147a663" + } + Frame { + msec: 5344 + hash: "417f4bce58783f0e677b17b05147a663" + } + Frame { + msec: 5360 + hash: "417f4bce58783f0e677b17b05147a663" + } + Frame { + msec: 5376 + hash: "417f4bce58783f0e677b17b05147a663" + } + Frame { + msec: 5392 + hash: "417f4bce58783f0e677b17b05147a663" + } + Frame { + msec: 5408 + hash: "417f4bce58783f0e677b17b05147a663" + } + Frame { + msec: 5424 + hash: "417f4bce58783f0e677b17b05147a663" + } + Frame { + msec: 5440 + hash: "417f4bce58783f0e677b17b05147a663" + } + Frame { + msec: 5456 + hash: "417f4bce58783f0e677b17b05147a663" + } + Key { + type: 6 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 5472 + hash: "417f4bce58783f0e677b17b05147a663" + } + Frame { + msec: 5488 + hash: "191f2c80617cef61a2890977c3079ad2" + } + Frame { + msec: 5504 + hash: "0902ef220363ad2c08f09199278cecf8" + } + Frame { + msec: 5520 + hash: "d28ea1b1e01588bbb767a5599c5345d2" + } + Frame { + msec: 5536 + hash: "36eeaf2755fffefc32bcd580fade6305" + } + Frame { + msec: 5552 + hash: "51560b23e44e5548875b13ff6dc6ee8d" + } + Frame { + msec: 5568 + hash: "082abbc9ecd0bf39619819aa526c021c" + } + Key { + type: 7 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 5584 + hash: "ab956d21f8ea55dad590b3cafc887585" + } + Frame { + msec: 5600 + hash: "9501050f547de1de0d280a839e35e120" + } + Frame { + msec: 5616 + hash: "3de570332e8a1e01f409d892feb7930e" + } + Frame { + msec: 5632 + hash: "3de570332e8a1e01f409d892feb7930e" + } + Frame { + msec: 5648 + hash: "3de570332e8a1e01f409d892feb7930e" + } + Frame { + msec: 5664 + hash: "3de570332e8a1e01f409d892feb7930e" + } + Frame { + msec: 5680 + hash: "3de570332e8a1e01f409d892feb7930e" + } + Frame { + msec: 5696 + hash: "3de570332e8a1e01f409d892feb7930e" + } + Frame { + msec: 5712 + hash: "3de570332e8a1e01f409d892feb7930e" + } + Frame { + msec: 5728 + hash: "3de570332e8a1e01f409d892feb7930e" + } + Frame { + msec: 5744 + hash: "3de570332e8a1e01f409d892feb7930e" + } + Frame { + msec: 5760 + hash: "3de570332e8a1e01f409d892feb7930e" + } + Frame { + msec: 5776 + image: "gridview.6.png" + } + Frame { + msec: 5792 + hash: "3de570332e8a1e01f409d892feb7930e" + } + Frame { + msec: 5808 + hash: "3de570332e8a1e01f409d892feb7930e" + } + Key { + type: 6 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 5824 + hash: "3de570332e8a1e01f409d892feb7930e" + } + Frame { + msec: 5840 + hash: "6aefcf9976f5910376a583b020c8dd4b" + } + Frame { + msec: 5856 + hash: "971ca1e2537d52f352c889817e353736" + } + Frame { + msec: 5872 + hash: "f1f0599e7f4ba2fb869e886a2e7ff216" + } + Frame { + msec: 5888 + hash: "8bf62b11cd4ec99ae41752e1a9a9c7ca" + } + Frame { + msec: 5904 + hash: "f2fcf6ad484b240373822c2450dd5305" + } + Key { + type: 7 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 5920 + hash: "f999073e6303ff5658012dabbef4ee8e" + } + Frame { + msec: 5936 + hash: "c35ef3056155d8d30dd4b9e6299ac68f" + } + Frame { + msec: 5952 + hash: "0326908135c0d693f2fc99c9e02d8f94" + } + Frame { + msec: 5968 + hash: "b0def7204463648dac117ddcc2241c3e" + } + Frame { + msec: 5984 + hash: "5e88aeab16a0ccca400163889851bc45" + } + Frame { + msec: 6000 + hash: "5e88aeab16a0ccca400163889851bc45" + } + Frame { + msec: 6016 + hash: "5e88aeab16a0ccca400163889851bc45" + } + Frame { + msec: 6032 + hash: "5e88aeab16a0ccca400163889851bc45" + } + Frame { + msec: 6048 + hash: "5e88aeab16a0ccca400163889851bc45" + } + Frame { + msec: 6064 + hash: "5e88aeab16a0ccca400163889851bc45" + } + Frame { + msec: 6080 + hash: "5e88aeab16a0ccca400163889851bc45" + } + Frame { + msec: 6096 + hash: "5e88aeab16a0ccca400163889851bc45" + } + Frame { + msec: 6112 + hash: "5e88aeab16a0ccca400163889851bc45" + } + Frame { + msec: 6128 + hash: "5e88aeab16a0ccca400163889851bc45" + } + Frame { + msec: 6144 + hash: "5e88aeab16a0ccca400163889851bc45" + } + Frame { + msec: 6160 + hash: "5e88aeab16a0ccca400163889851bc45" + } + Frame { + msec: 6176 + hash: "5e88aeab16a0ccca400163889851bc45" + } + Frame { + msec: 6192 + hash: "5e88aeab16a0ccca400163889851bc45" + } + Frame { + msec: 6208 + hash: "5e88aeab16a0ccca400163889851bc45" + } + Frame { + msec: 6224 + hash: "5e88aeab16a0ccca400163889851bc45" + } + Frame { + msec: 6240 + hash: "5e88aeab16a0ccca400163889851bc45" + } + Frame { + msec: 6256 + hash: "5e88aeab16a0ccca400163889851bc45" + } + Frame { + msec: 6272 + hash: "5e88aeab16a0ccca400163889851bc45" + } + Frame { + msec: 6288 + hash: "5e88aeab16a0ccca400163889851bc45" + } + Frame { + msec: 6304 + hash: "5e88aeab16a0ccca400163889851bc45" + } + Frame { + msec: 6320 + hash: "5e88aeab16a0ccca400163889851bc45" + } + Frame { + msec: 6336 + hash: "5e88aeab16a0ccca400163889851bc45" + } + Frame { + msec: 6352 + hash: "5e88aeab16a0ccca400163889851bc45" + } + Frame { + msec: 6368 + hash: "5e88aeab16a0ccca400163889851bc45" + } + Frame { + msec: 6384 + hash: "5e88aeab16a0ccca400163889851bc45" + } + Frame { + msec: 6400 + hash: "5e88aeab16a0ccca400163889851bc45" + } + Frame { + msec: 6416 + hash: "5e88aeab16a0ccca400163889851bc45" + } + Key { + type: 6 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 6432 + hash: "5e88aeab16a0ccca400163889851bc45" + } + Frame { + msec: 6448 + hash: "5531bf9affacf58945c6c54c5d14c9c9" + } + Frame { + msec: 6464 + hash: "ebc8f36eb0fc7d40bf9f268ef03522a0" + } + Frame { + msec: 6480 + hash: "621a3c318fc259ed27ae050d70d46d39" + } + Frame { + msec: 6496 + hash: "688bea0c0c864d9bc4204cf06b480d3a" + } + Frame { + msec: 6512 + hash: "8419262c19c40172b93c74d34cad12cb" + } + Frame { + msec: 6528 + hash: "57ce65a4ebe51c14ee69083f90ed5b80" + } + Key { + type: 7 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 6544 + hash: "43827ad5cb4173a8a5d434b167f68761" + } + Frame { + msec: 6560 + hash: "13e3e00ec3c11d6ca3e51a7aba0e1a97" + } + Frame { + msec: 6576 + hash: "dcf8c3078973ad99fbbcc763e433de11" + } + Frame { + msec: 6592 + hash: "dcf8c3078973ad99fbbcc763e433de11" + } + Frame { + msec: 6608 + hash: "dcf8c3078973ad99fbbcc763e433de11" + } + Frame { + msec: 6624 + hash: "dcf8c3078973ad99fbbcc763e433de11" + } + Frame { + msec: 6640 + hash: "dcf8c3078973ad99fbbcc763e433de11" + } + Frame { + msec: 6656 + hash: "dcf8c3078973ad99fbbcc763e433de11" + } + Frame { + msec: 6672 + hash: "dcf8c3078973ad99fbbcc763e433de11" + } + Frame { + msec: 6688 + hash: "dcf8c3078973ad99fbbcc763e433de11" + } + Frame { + msec: 6704 + hash: "dcf8c3078973ad99fbbcc763e433de11" + } + Key { + type: 6 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 6720 + hash: "dcf8c3078973ad99fbbcc763e433de11" + } + Frame { + msec: 6736 + image: "gridview.7.png" + } + Frame { + msec: 6752 + hash: "bb4674d0de11e4f625e6db940b4ec06c" + } + Frame { + msec: 6768 + hash: "26f602a711cea77e5c7be08a93981306" + } + Frame { + msec: 6784 + hash: "5346bc8b1711a6679867d81efb9da563" + } + Frame { + msec: 6800 + hash: "3aa4d335a91be2bf2616d61fa7719ce5" + } + Frame { + msec: 6816 + hash: "2bad8dd039a35f11ba86b409bbcea6fe" + } + Frame { + msec: 6832 + hash: "20e4b381a6bed27e9e64d2eeda7870da" + } + Key { + type: 7 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 6848 + hash: "e96eb16671f26f04a72498bc3ab54f06" + } + Frame { + msec: 6864 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 6880 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 6896 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 6912 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 6928 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 6944 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 6960 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 6976 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 6992 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7008 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7024 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Key { + type: 6 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 7040 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7056 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7072 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7088 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7104 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7120 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7136 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7152 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Key { + type: 7 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 7168 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7184 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7200 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7216 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7232 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7248 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7264 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7280 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7296 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7312 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7328 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7344 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7360 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7376 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7392 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7408 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7424 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7440 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7456 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7472 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7488 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7504 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7520 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7536 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7552 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7568 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7584 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Key { + type: 6 + key: 16777235 + modifiers: 536870912 + text: "1e" + autorep: false + count: 1 + } + Frame { + msec: 7600 + hash: "f0e0fe7c155bbee3957a80077703fadc" + } + Frame { + msec: 7616 + hash: "6e26f05f7a2531620ed4a25073e0f0c5" + } + Frame { + msec: 7632 + hash: "9fe693b6b53763ffc1b94d157252b18c" + } + Frame { + msec: 7648 + hash: "49aae47da204d4104757b4420df7413e" + } + Frame { + msec: 7664 + hash: "ecd7456cb5ba2034c766e1ec298c2ebf" + } + Frame { + msec: 7680 + hash: "2a5a7dfcd64200864abfa9267e802f4e" + } + Frame { + msec: 7696 + image: "gridview.8.png" + } + Key { + type: 7 + key: 16777235 + modifiers: 536870912 + text: "1e" + autorep: false + count: 1 + } + Frame { + msec: 7712 + hash: "e11fcb0e62d7f6bfb40b7336e89ff014" + } + Frame { + msec: 7728 + hash: "5a07fa8768ebfb938204e500f4a09253" + } + Frame { + msec: 7744 + hash: "1ee3a4780979f69cd7926df3d4c18731" + } + Frame { + msec: 7760 + hash: "ca4edfecdfc410aca6557b9a3095d92b" + } + Frame { + msec: 7776 + hash: "ca4edfecdfc410aca6557b9a3095d92b" + } + Frame { + msec: 7792 + hash: "ca4edfecdfc410aca6557b9a3095d92b" + } + Frame { + msec: 7808 + hash: "ca4edfecdfc410aca6557b9a3095d92b" + } + Frame { + msec: 7824 + hash: "ca4edfecdfc410aca6557b9a3095d92b" + } + Frame { + msec: 7840 + hash: "ca4edfecdfc410aca6557b9a3095d92b" + } + Frame { + msec: 7856 + hash: "ca4edfecdfc410aca6557b9a3095d92b" + } + Frame { + msec: 7872 + hash: "ca4edfecdfc410aca6557b9a3095d92b" + } + Frame { + msec: 7888 + hash: "ca4edfecdfc410aca6557b9a3095d92b" + } + Frame { + msec: 7904 + hash: "ca4edfecdfc410aca6557b9a3095d92b" + } + Frame { + msec: 7920 + hash: "ca4edfecdfc410aca6557b9a3095d92b" + } + Frame { + msec: 7936 + hash: "ca4edfecdfc410aca6557b9a3095d92b" + } + Frame { + msec: 7952 + hash: "ca4edfecdfc410aca6557b9a3095d92b" + } + Frame { + msec: 7968 + hash: "ca4edfecdfc410aca6557b9a3095d92b" + } + Key { + type: 6 + key: 16777235 + modifiers: 536870912 + text: "1e" + autorep: false + count: 1 + } + Frame { + msec: 7984 + hash: "ca4edfecdfc410aca6557b9a3095d92b" + } + Frame { + msec: 8000 + hash: "1306bb76c161e84e2e5307a0ebc34393" + } + Frame { + msec: 8016 + hash: "a97cbb851cf1fdeb428ee36042be52e1" + } + Key { + type: 7 + key: 16777235 + modifiers: 536870912 + text: "1e" + autorep: false + count: 1 + } + Frame { + msec: 8032 + hash: "e79ccbe112066ded3276aa7feb2e7848" + } + Frame { + msec: 8048 + hash: "9cc673f743e2018cf9a6d815fe76dc80" + } + Frame { + msec: 8064 + hash: "8179262829f88ee4bbb9537b29ab56ee" + } + Frame { + msec: 8080 + hash: "3810cc1b5902259c22bce0118497aaf3" + } + Frame { + msec: 8096 + hash: "d41c5a6fdfafb2263e7c35a927f7753c" + } + Frame { + msec: 8112 + hash: "e54d0179d62b7cdec96218c3a0ef110d" + } + Frame { + msec: 8128 + hash: "da89e8408417b99582ffd825c2226bf4" + } + Frame { + msec: 8144 + hash: "5d7b9247aecd4adc939c6fb89d5eac2c" + } + Frame { + msec: 8160 + hash: "5d7b9247aecd4adc939c6fb89d5eac2c" + } + Frame { + msec: 8176 + hash: "5d7b9247aecd4adc939c6fb89d5eac2c" + } + Frame { + msec: 8192 + hash: "5d7b9247aecd4adc939c6fb89d5eac2c" + } + Frame { + msec: 8208 + hash: "5d7b9247aecd4adc939c6fb89d5eac2c" + } + Frame { + msec: 8224 + hash: "5d7b9247aecd4adc939c6fb89d5eac2c" + } + Frame { + msec: 8240 + hash: "5d7b9247aecd4adc939c6fb89d5eac2c" + } + Key { + type: 6 + key: 16777235 + modifiers: 536870912 + text: "1e" + autorep: false + count: 1 + } + Frame { + msec: 8256 + hash: "5d7b9247aecd4adc939c6fb89d5eac2c" + } + Frame { + msec: 8272 + hash: "2fcac6c204d45d6fbab76c3d07e2c8ad" + } + Frame { + msec: 8288 + hash: "78602c9ac9dbd6c34ef539799513d874" + } + Frame { + msec: 8304 + hash: "02f8d434d50af8fa6063a4f03dabe2b1" + } + Frame { + msec: 8320 + hash: "ff5da7b1a1467418bc712c0ac33c878f" + } + Frame { + msec: 8336 + hash: "2aed8048e5040ebda3bdfdf4a57d08eb" + } + Key { + type: 7 + key: 16777235 + modifiers: 536870912 + text: "1e" + autorep: false + count: 1 + } + Frame { + msec: 8352 + hash: "c6b50c1a6a843aa9484c48e4bf073e4b" + } + Frame { + msec: 8368 + hash: "a08ef172dfb72151108e81cacfaa964f" + } + Frame { + msec: 8384 + hash: "a2a755231d0eee686aa38cd4d4b417f2" + } + Frame { + msec: 8400 + hash: "5c598e26c1b65796b8e68c7d27abbc0f" + } + Frame { + msec: 8416 + hash: "290662cda876fccc87971d2cebc69d52" + } + Frame { + msec: 8432 + hash: "290662cda876fccc87971d2cebc69d52" + } + Frame { + msec: 8448 + hash: "290662cda876fccc87971d2cebc69d52" + } + Frame { + msec: 8464 + hash: "290662cda876fccc87971d2cebc69d52" + } + Frame { + msec: 8480 + hash: "290662cda876fccc87971d2cebc69d52" + } + Frame { + msec: 8496 + hash: "290662cda876fccc87971d2cebc69d52" + } + Frame { + msec: 8512 + hash: "290662cda876fccc87971d2cebc69d52" + } + Frame { + msec: 8528 + hash: "290662cda876fccc87971d2cebc69d52" + } + Frame { + msec: 8544 + hash: "290662cda876fccc87971d2cebc69d52" + } + Key { + type: 6 + key: 16777235 + modifiers: 536870912 + text: "1e" + autorep: false + count: 1 + } + Frame { + msec: 8560 + hash: "290662cda876fccc87971d2cebc69d52" + } + Frame { + msec: 8576 + hash: "1aface9c3746488496af48caf23af1a5" + } + Frame { + msec: 8592 + hash: "c08f9756c9cc453a2544052b15beab5d" + } + Frame { + msec: 8608 + hash: "b70544dc0d5cc18181f0bf40c068410b" + } + Frame { + msec: 8624 + hash: "7e8fbce1337b0b04beda76ee54c98285" + } + Frame { + msec: 8640 + hash: "fb8acbfc93b64d960abb17f097fe36fe" + } + Key { + type: 7 + key: 16777235 + modifiers: 536870912 + text: "1e" + autorep: false + count: 1 + } + Frame { + msec: 8656 + image: "gridview.9.png" + } + Frame { + msec: 8672 + hash: "16013089bfe18b35efbd8cd36d37bb0a" + } + Frame { + msec: 8688 + hash: "57a857a48922cb252bb4ddc77b29825e" + } + Frame { + msec: 8704 + hash: "10a46ba67a0c7abe08ea8f80a75040e8" + } + Frame { + msec: 8720 + hash: "72759bd1e2618c61c42bbe4de3ad3a96" + } + Frame { + msec: 8736 + hash: "72759bd1e2618c61c42bbe4de3ad3a96" + } + Frame { + msec: 8752 + hash: "72759bd1e2618c61c42bbe4de3ad3a96" + } + Frame { + msec: 8768 + hash: "72759bd1e2618c61c42bbe4de3ad3a96" + } + Frame { + msec: 8784 + hash: "72759bd1e2618c61c42bbe4de3ad3a96" + } + Frame { + msec: 8800 + hash: "72759bd1e2618c61c42bbe4de3ad3a96" + } + Frame { + msec: 8816 + hash: "72759bd1e2618c61c42bbe4de3ad3a96" + } + Frame { + msec: 8832 + hash: "72759bd1e2618c61c42bbe4de3ad3a96" + } + Frame { + msec: 8848 + hash: "72759bd1e2618c61c42bbe4de3ad3a96" + } + Frame { + msec: 8864 + hash: "72759bd1e2618c61c42bbe4de3ad3a96" + } + Key { + type: 6 + key: 16777235 + modifiers: 536870912 + text: "1e" + autorep: false + count: 1 + } + Frame { + msec: 8880 + hash: "72759bd1e2618c61c42bbe4de3ad3a96" + } + Frame { + msec: 8896 + hash: "df1797772003dc3dbdd0e245c447bf20" + } + Frame { + msec: 8912 + hash: "70dd7fd50388196706f72a48ac96963c" + } + Frame { + msec: 8928 + hash: "439e43c26fc22a6c3a2b8568bfddbfa3" + } + Frame { + msec: 8944 + hash: "77e9ea697690a3e5c3965c0bf76055b0" + } + Frame { + msec: 8960 + hash: "30226190fa4466b3450ff1f810e85635" + } + Key { + type: 7 + key: 16777235 + modifiers: 536870912 + text: "1e" + autorep: false + count: 1 + } + Frame { + msec: 8976 + hash: "9a69afa4de272f00d8a26141fa974f6e" + } + Frame { + msec: 8992 + hash: "1883a34a21ecc690022a6623c67c8ba1" + } + Frame { + msec: 9008 + hash: "e5be5b7e7060fffacaf93b6bf8d051a4" + } + Frame { + msec: 9024 + hash: "2667c2596de97dc15353158eba03495f" + } + Frame { + msec: 9040 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9056 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9072 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9088 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9104 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9120 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9136 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9152 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9168 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9184 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9200 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9216 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9232 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9248 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9264 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Key { + type: 6 + key: 16777235 + modifiers: 536870912 + text: "1e" + autorep: false + count: 1 + } + Frame { + msec: 9280 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9296 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9312 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9328 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9344 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9360 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9376 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Key { + type: 7 + key: 16777235 + modifiers: 536870912 + text: "1e" + autorep: false + count: 1 + } + Frame { + msec: 9392 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9408 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9424 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9440 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9456 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9472 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9488 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9504 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9520 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9536 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9552 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9568 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9584 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9600 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9616 + image: "gridview.10.png" + } + Frame { + msec: 9632 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9648 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9664 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9680 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9696 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9712 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9728 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9744 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9760 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Key { + type: 6 + key: 16777249 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 9776 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9792 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9808 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9824 + hash: "02c632713d0dc64bff9d8e58f745df95" + } + Frame { + msec: 9840 + hash: "02c632713d0dc64bff9d8e58f745df95" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.0.png b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.0.png new file mode 100644 index 00000000..27e07834 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.1.png b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.1.png new file mode 100644 index 00000000..27e07834 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.10.png b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.10.png new file mode 100644 index 00000000..b0486e59 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.10.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.2.png b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.2.png new file mode 100644 index 00000000..b0348ab4 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.3.png b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.3.png new file mode 100644 index 00000000..c3113e97 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.4.png b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.4.png new file mode 100644 index 00000000..725d4e9b Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.5.png b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.5.png new file mode 100644 index 00000000..cc6d8d63 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.5.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.6.png b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.6.png new file mode 100644 index 00000000..ccf9f5ff Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.6.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.7.png b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.7.png new file mode 100644 index 00000000..2f7f4758 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.7.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.8.png b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.8.png new file mode 100644 index 00000000..fff1b40c Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.8.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.9.png b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.9.png new file mode 100644 index 00000000..27e07834 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.9.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.qml b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.qml new file mode 100644 index 00000000..2c43f7d3 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativegridview/data/gridview2.qml @@ -0,0 +1,2479 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "gridview2.0.png" + } + Frame { + msec: 32 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 48 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 64 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 80 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 96 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 112 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 128 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 144 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 160 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 176 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 192 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 208 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 224 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 240 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 256 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 272 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 288 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 304 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 320 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 336 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 352 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 368 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 384 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 400 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 416 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 432 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 448 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 464 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 480 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 496 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 512 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 528 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 544 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 560 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 576 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 592 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 608 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 624 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 640 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 656 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 672 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 688 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 704 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 720 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 736 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 752 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 768 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 784 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 800 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 816 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 832 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 848 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 864 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 880 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 896 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 912 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 928 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 944 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 960 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 976 + image: "gridview2.1.png" + } + Frame { + msec: 992 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 1008 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 1024 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 1040 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 1056 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 1072 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 1088 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 1104 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 1120 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 1136 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 1152 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 1168 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 1184 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 1200 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 1216 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 1232 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 1248 + hash: "33d81c39d16c6a326012499796e50e03" + } + Key { + type: 6 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 1264 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 1280 + hash: "4ffd56d59c14ba676393686d753951d7" + } + Frame { + msec: 1296 + hash: "e2f7702ed749330b2f027aa73967a4cf" + } + Frame { + msec: 1312 + hash: "3f4dcee547e925db9b3da1fa08bab3c9" + } + Frame { + msec: 1328 + hash: "12b0bf8abbb9b6a0597eccebe5322551" + } + Frame { + msec: 1344 + hash: "23da2f9a800b805ce7b77ff08218907d" + } + Frame { + msec: 1360 + hash: "9c039c94a4202b99bf913891bdcb3698" + } + Key { + type: 7 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 1376 + hash: "dd7c95ca98c4f37837c2ff7f03243fc3" + } + Frame { + msec: 1392 + hash: "6f31f7af4e68ab0eab101e7ae840b4b6" + } + Frame { + msec: 1408 + hash: "29943a44b9830bb64b3e5a3b6abd8c42" + } + Frame { + msec: 1424 + hash: "93d37221e8e022c84e35c7bd44b0644e" + } + Frame { + msec: 1440 + hash: "9ce3cd471dba7fe94de4e9ad321803b2" + } + Frame { + msec: 1456 + hash: "0d30916c7e05ff8609af5894f47a89bb" + } + Frame { + msec: 1472 + hash: "0d30916c7e05ff8609af5894f47a89bb" + } + Frame { + msec: 1488 + hash: "0d30916c7e05ff8609af5894f47a89bb" + } + Frame { + msec: 1504 + hash: "0d30916c7e05ff8609af5894f47a89bb" + } + Frame { + msec: 1520 + hash: "0d30916c7e05ff8609af5894f47a89bb" + } + Frame { + msec: 1536 + hash: "0d30916c7e05ff8609af5894f47a89bb" + } + Frame { + msec: 1552 + hash: "0d30916c7e05ff8609af5894f47a89bb" + } + Frame { + msec: 1568 + hash: "0d30916c7e05ff8609af5894f47a89bb" + } + Frame { + msec: 1584 + hash: "0d30916c7e05ff8609af5894f47a89bb" + } + Key { + type: 6 + key: 16777237 + modifiers: 536870912 + text: "1f" + autorep: false + count: 1 + } + Frame { + msec: 1600 + hash: "0d30916c7e05ff8609af5894f47a89bb" + } + Frame { + msec: 1616 + hash: "6775c78beca0f078c5f2c57370de1946" + } + Frame { + msec: 1632 + hash: "898709f3871e13825baf48861930f26c" + } + Frame { + msec: 1648 + hash: "c1a568599592a3f455ad550c2e4878a8" + } + Frame { + msec: 1664 + hash: "a80d8cbf0c6fe8383badbb2badb361ad" + } + Frame { + msec: 1680 + hash: "310eaf71fe8d3807606e58a666c65ccd" + } + Key { + type: 7 + key: 16777237 + modifiers: 536870912 + text: "1f" + autorep: false + count: 1 + } + Frame { + msec: 1696 + hash: "0f317f50b0d2a4c5daf819431527416e" + } + Frame { + msec: 1712 + hash: "d251b64b794902fe2c5da3cee43ff82d" + } + Frame { + msec: 1728 + hash: "757adc256e1b5d739c29ee82bdacfa16" + } + Frame { + msec: 1744 + hash: "1c20e69e033a5fa4825fd46f51d1e348" + } + Frame { + msec: 1760 + hash: "03cbcd361ec24925222802c8ece99793" + } + Frame { + msec: 1776 + hash: "dffaa2dd4d6dd89a1b26d5db38906059" + } + Frame { + msec: 1792 + hash: "77d5193bc5f53fe5cb98a236c55f841e" + } + Frame { + msec: 1808 + hash: "77d5193bc5f53fe5cb98a236c55f841e" + } + Frame { + msec: 1824 + hash: "77d5193bc5f53fe5cb98a236c55f841e" + } + Frame { + msec: 1840 + hash: "77d5193bc5f53fe5cb98a236c55f841e" + } + Frame { + msec: 1856 + hash: "77d5193bc5f53fe5cb98a236c55f841e" + } + Frame { + msec: 1872 + hash: "77d5193bc5f53fe5cb98a236c55f841e" + } + Frame { + msec: 1888 + hash: "77d5193bc5f53fe5cb98a236c55f841e" + } + Frame { + msec: 1904 + hash: "77d5193bc5f53fe5cb98a236c55f841e" + } + Frame { + msec: 1920 + hash: "77d5193bc5f53fe5cb98a236c55f841e" + } + Frame { + msec: 1936 + image: "gridview2.2.png" + } + Frame { + msec: 1952 + hash: "77d5193bc5f53fe5cb98a236c55f841e" + } + Frame { + msec: 1968 + hash: "77d5193bc5f53fe5cb98a236c55f841e" + } + Frame { + msec: 1984 + hash: "77d5193bc5f53fe5cb98a236c55f841e" + } + Frame { + msec: 2000 + hash: "77d5193bc5f53fe5cb98a236c55f841e" + } + Frame { + msec: 2016 + hash: "77d5193bc5f53fe5cb98a236c55f841e" + } + Key { + type: 6 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 2032 + hash: "77d5193bc5f53fe5cb98a236c55f841e" + } + Frame { + msec: 2048 + hash: "1f046afe50ee5e1fc07e89a40528351c" + } + Frame { + msec: 2064 + hash: "132fbaa8fc2890d48f1916a25cb09887" + } + Frame { + msec: 2080 + hash: "e904c892dc27ff1700009470f234ce0d" + } + Frame { + msec: 2096 + hash: "0968397c7a209059cd466c61ac891081" + } + Frame { + msec: 2112 + hash: "d5b4fc1b568a4a1b63a91b422272c704" + } + Key { + type: 7 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 2128 + hash: "a980a2e7bd10328fbd4400e799aa7c24" + } + Frame { + msec: 2144 + hash: "b74be5349822d52ced201d7f34a96122" + } + Frame { + msec: 2160 + hash: "f7c6dbcd7d55b3230af463098f346bd8" + } + Frame { + msec: 2176 + hash: "393358a0ee7636a535f14f0dc9c3d609" + } + Frame { + msec: 2192 + hash: "cad337b87b629b1eee78407aacfd279e" + } + Frame { + msec: 2208 + hash: "d90b762e62867e3ff928160bed85d2ff" + } + Frame { + msec: 2224 + hash: "520445d8619ad9bdde0db0e61f17567c" + } + Frame { + msec: 2240 + hash: "520445d8619ad9bdde0db0e61f17567c" + } + Frame { + msec: 2256 + hash: "520445d8619ad9bdde0db0e61f17567c" + } + Frame { + msec: 2272 + hash: "520445d8619ad9bdde0db0e61f17567c" + } + Frame { + msec: 2288 + hash: "520445d8619ad9bdde0db0e61f17567c" + } + Frame { + msec: 2304 + hash: "520445d8619ad9bdde0db0e61f17567c" + } + Frame { + msec: 2320 + hash: "520445d8619ad9bdde0db0e61f17567c" + } + Frame { + msec: 2336 + hash: "520445d8619ad9bdde0db0e61f17567c" + } + Frame { + msec: 2352 + hash: "520445d8619ad9bdde0db0e61f17567c" + } + Frame { + msec: 2368 + hash: "520445d8619ad9bdde0db0e61f17567c" + } + Key { + type: 6 + key: 16777237 + modifiers: 536870912 + text: "1f" + autorep: false + count: 1 + } + Frame { + msec: 2384 + hash: "520445d8619ad9bdde0db0e61f17567c" + } + Frame { + msec: 2400 + hash: "5c9801ffdb07be53524cf0a4f8709ee4" + } + Frame { + msec: 2416 + hash: "adef25d77f816e40ec02886187f456bf" + } + Frame { + msec: 2432 + hash: "56290066fa32054bb7e1669bbda3f3bb" + } + Frame { + msec: 2448 + hash: "101b94bcf3f536bd64f0ac50f21cd5de" + } + Frame { + msec: 2464 + hash: "edaee946a2e25fed6de9acfda0d44a14" + } + Frame { + msec: 2480 + hash: "b170b60632b17595713dd911afc46fcc" + } + Frame { + msec: 2496 + hash: "57550914cd214025c6b1f3dfa446417f" + } + Key { + type: 7 + key: 16777237 + modifiers: 536870912 + text: "1f" + autorep: false + count: 1 + } + Frame { + msec: 2512 + hash: "3fd7252f5e61e3c348219a54fd5b95d9" + } + Frame { + msec: 2528 + hash: "c6c27dd386e40bc0a02ad8104301d391" + } + Frame { + msec: 2544 + hash: "dd476c04d3612f940e1959030ee8e264" + } + Frame { + msec: 2560 + hash: "f2f8d9bb8a1865237398421f6a6d89dc" + } + Frame { + msec: 2576 + hash: "d4a48ee79a18cc5c0bc123fbb40c3efd" + } + Frame { + msec: 2592 + hash: "d4a48ee79a18cc5c0bc123fbb40c3efd" + } + Frame { + msec: 2608 + hash: "d4a48ee79a18cc5c0bc123fbb40c3efd" + } + Frame { + msec: 2624 + hash: "d4a48ee79a18cc5c0bc123fbb40c3efd" + } + Frame { + msec: 2640 + hash: "d4a48ee79a18cc5c0bc123fbb40c3efd" + } + Frame { + msec: 2656 + hash: "d4a48ee79a18cc5c0bc123fbb40c3efd" + } + Frame { + msec: 2672 + hash: "d4a48ee79a18cc5c0bc123fbb40c3efd" + } + Frame { + msec: 2688 + hash: "d4a48ee79a18cc5c0bc123fbb40c3efd" + } + Frame { + msec: 2704 + hash: "d4a48ee79a18cc5c0bc123fbb40c3efd" + } + Frame { + msec: 2720 + hash: "d4a48ee79a18cc5c0bc123fbb40c3efd" + } + Frame { + msec: 2736 + hash: "d4a48ee79a18cc5c0bc123fbb40c3efd" + } + Key { + type: 6 + key: 16777234 + modifiers: 536870912 + text: "1c" + autorep: false + count: 1 + } + Frame { + msec: 2752 + hash: "d4a48ee79a18cc5c0bc123fbb40c3efd" + } + Frame { + msec: 2768 + hash: "f13bc957329adad9dcb1ce0c408eeaaf" + } + Frame { + msec: 2784 + hash: "9a676805f3474f924cbe7ea21ee9dcab" + } + Frame { + msec: 2800 + hash: "f0161b0d27757137bcb7fd3e6db2280c" + } + Frame { + msec: 2816 + hash: "c7034a0e8956c9f483c128a934d68fa7" + } + Frame { + msec: 2832 + hash: "19664de1a738458810896959ba4087ad" + } + Key { + type: 7 + key: 16777234 + modifiers: 536870912 + text: "1c" + autorep: false + count: 1 + } + Frame { + msec: 2848 + hash: "c5d5ff1884dd0ede23097530c249678c" + } + Frame { + msec: 2864 + hash: "131ae4a26ad06bbef105668d30e154aa" + } + Frame { + msec: 2880 + hash: "5d6ba09a5038e00007af0fa3f89b67b8" + } + Frame { + msec: 2896 + image: "gridview2.3.png" + } + Frame { + msec: 2912 + hash: "9d5ee2458abc5dfd56abfd42c906270f" + } + Frame { + msec: 2928 + hash: "823b5d63768f5a18e795d5ed61f4dec8" + } + Frame { + msec: 2944 + hash: "1b7ebcf0e3d68e429cb04966120985e5" + } + Frame { + msec: 2960 + hash: "1b7ebcf0e3d68e429cb04966120985e5" + } + Frame { + msec: 2976 + hash: "1b7ebcf0e3d68e429cb04966120985e5" + } + Frame { + msec: 2992 + hash: "1b7ebcf0e3d68e429cb04966120985e5" + } + Frame { + msec: 3008 + hash: "1b7ebcf0e3d68e429cb04966120985e5" + } + Frame { + msec: 3024 + hash: "1b7ebcf0e3d68e429cb04966120985e5" + } + Key { + type: 6 + key: 16777237 + modifiers: 536870912 + text: "1f" + autorep: false + count: 1 + } + Frame { + msec: 3040 + hash: "1b7ebcf0e3d68e429cb04966120985e5" + } + Frame { + msec: 3056 + hash: "1a8a32127c1b699bc282b0c209117a00" + } + Frame { + msec: 3072 + hash: "2f5f2ab12410c070a7c05a1674e273fe" + } + Frame { + msec: 3088 + hash: "afe7c2cd74cc90d67e8c068eaf5988eb" + } + Frame { + msec: 3104 + hash: "e063d9eb45dc42b3f8b66937b7b4c19a" + } + Frame { + msec: 3120 + hash: "75a620b42caabf5b1576041dbd4c2808" + } + Frame { + msec: 3136 + hash: "2e2b9db4d2f19035c7c29489332b2550" + } + Frame { + msec: 3152 + hash: "32370cba80db8eaf1f5cd9b73d3472ed" + } + Frame { + msec: 3168 + hash: "3a79c47a8eb8bb79316e61a7eed58e57" + } + Key { + type: 7 + key: 16777237 + modifiers: 536870912 + text: "1f" + autorep: false + count: 1 + } + Frame { + msec: 3184 + hash: "c84e47182ef6ebec61163f9b42d03c64" + } + Frame { + msec: 3200 + hash: "6a0a83a39e6ab82b5437d46468e4776d" + } + Frame { + msec: 3216 + hash: "945929656c1d27bcba51ce908e72a770" + } + Frame { + msec: 3232 + hash: "506283ccfe9670633ce0bf60b437b37b" + } + Frame { + msec: 3248 + hash: "506283ccfe9670633ce0bf60b437b37b" + } + Frame { + msec: 3264 + hash: "506283ccfe9670633ce0bf60b437b37b" + } + Frame { + msec: 3280 + hash: "506283ccfe9670633ce0bf60b437b37b" + } + Frame { + msec: 3296 + hash: "506283ccfe9670633ce0bf60b437b37b" + } + Frame { + msec: 3312 + hash: "506283ccfe9670633ce0bf60b437b37b" + } + Frame { + msec: 3328 + hash: "506283ccfe9670633ce0bf60b437b37b" + } + Frame { + msec: 3344 + hash: "506283ccfe9670633ce0bf60b437b37b" + } + Frame { + msec: 3360 + hash: "506283ccfe9670633ce0bf60b437b37b" + } + Frame { + msec: 3376 + hash: "506283ccfe9670633ce0bf60b437b37b" + } + Key { + type: 6 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 3392 + hash: "506283ccfe9670633ce0bf60b437b37b" + } + Frame { + msec: 3408 + hash: "7d12bcac0fcaaff7467c444ab89f1e06" + } + Frame { + msec: 3424 + hash: "2f4538eec0c704af25b0a73d5a8dded4" + } + Frame { + msec: 3440 + hash: "4722cbfba5de7e4f7b3cee10bd0f75b5" + } + Frame { + msec: 3456 + hash: "3a6df7e6d771c6edc5218ad9a4bf6ab0" + } + Frame { + msec: 3472 + hash: "09219f55fae47a0afed887ebf68a36bc" + } + Frame { + msec: 3488 + hash: "c04c0010761f572c5b16963699c70135" + } + Frame { + msec: 3504 + hash: "52d59ffff0f2109f9a584f3582158798" + } + Key { + type: 7 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 3520 + hash: "9b1d58189c56205ba8963671bfb86742" + } + Frame { + msec: 3536 + hash: "7de84895e12919ffe935b23372db95db" + } + Frame { + msec: 3552 + hash: "d9c5b4c2a7831c216fe2266fe26306b0" + } + Frame { + msec: 3568 + hash: "1c2bc039c48e7e9da07165f405a6f207" + } + Frame { + msec: 3584 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 3600 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 3616 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 3632 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 3648 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 3664 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 3680 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 3696 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 3712 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 3728 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 3744 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 3760 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 3776 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Key { + type: 6 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 3792 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 3808 + hash: "abf9f5ef21fb62e5ad89ae2640a5a7e1" + } + Frame { + msec: 3824 + hash: "58103d91498617585163e0508bdb724d" + } + Frame { + msec: 3840 + hash: "c46ea52b070681155466b30096379c4f" + } + Frame { + msec: 3856 + image: "gridview2.4.png" + } + Key { + type: 7 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 3872 + hash: "523667a6f3213fb67de1744636780831" + } + Frame { + msec: 3888 + hash: "f0b7d38f695a29f6787dc3683a05a7c8" + } + Frame { + msec: 3904 + hash: "1e5cf55e27217e67a5deb89e2d46349a" + } + Frame { + msec: 3920 + hash: "c49869491f484d07da838a21564e5e19" + } + Frame { + msec: 3936 + hash: "1acce2b796476d2d7d130749b06f334f" + } + Frame { + msec: 3952 + hash: "19ee6550b52517345859f9feb0b0d5a4" + } + Frame { + msec: 3968 + hash: "d2f360af319c740ad095ee0a463fa6fa" + } + Frame { + msec: 3984 + hash: "032326c6cf2a9da09c2388626ce942ef" + } + Frame { + msec: 4000 + hash: "ba2a7178b7c68001ecfdfea053507d0e" + } + Frame { + msec: 4016 + hash: "9afddf683c810e288ed0da2fa44c5182" + } + Frame { + msec: 4032 + hash: "93a7145e4bafa1e40a1db013b1c4337c" + } + Frame { + msec: 4048 + hash: "3d48687ecb20a8670dd656c5705a0797" + } + Frame { + msec: 4064 + hash: "7578264d5ea215f7fde90478ba5e6d32" + } + Frame { + msec: 4080 + hash: "fb84bbce52e9c4dc4efc1eed7e863007" + } + Frame { + msec: 4096 + hash: "df5d88d8421af767057fc4b3d0de23b1" + } + Frame { + msec: 4112 + hash: "dae3e3e10fe7e0ddcf10a7bb4ecc3f1a" + } + Frame { + msec: 4128 + hash: "eb15ba34411afd416dea5bc2b18cfb27" + } + Frame { + msec: 4144 + hash: "5f51ade6a1400093e9dd2b80d6f7a6ca" + } + Frame { + msec: 4160 + hash: "5e240752b752ca2ed4e6087f4deb0fbf" + } + Frame { + msec: 4176 + hash: "ae1931b9f168211c44c7269a245635fd" + } + Frame { + msec: 4192 + hash: "83588693715deadea8b875d6c6547371" + } + Frame { + msec: 4208 + hash: "83588693715deadea8b875d6c6547371" + } + Frame { + msec: 4224 + hash: "83588693715deadea8b875d6c6547371" + } + Frame { + msec: 4240 + hash: "83588693715deadea8b875d6c6547371" + } + Frame { + msec: 4256 + hash: "83588693715deadea8b875d6c6547371" + } + Frame { + msec: 4272 + hash: "83588693715deadea8b875d6c6547371" + } + Frame { + msec: 4288 + hash: "83588693715deadea8b875d6c6547371" + } + Frame { + msec: 4304 + hash: "83588693715deadea8b875d6c6547371" + } + Frame { + msec: 4320 + hash: "83588693715deadea8b875d6c6547371" + } + Frame { + msec: 4336 + hash: "83588693715deadea8b875d6c6547371" + } + Frame { + msec: 4352 + hash: "83588693715deadea8b875d6c6547371" + } + Frame { + msec: 4368 + hash: "83588693715deadea8b875d6c6547371" + } + Frame { + msec: 4384 + hash: "83588693715deadea8b875d6c6547371" + } + Frame { + msec: 4400 + hash: "83588693715deadea8b875d6c6547371" + } + Frame { + msec: 4416 + hash: "83588693715deadea8b875d6c6547371" + } + Key { + type: 6 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 4432 + hash: "83588693715deadea8b875d6c6547371" + } + Frame { + msec: 4448 + hash: "ae1931b9f168211c44c7269a245635fd" + } + Frame { + msec: 4464 + hash: "a8e4b69162a6298929c12a91e60f20c1" + } + Frame { + msec: 4480 + hash: "ca4694bbbdc206c46600c894ed853390" + } + Frame { + msec: 4496 + hash: "21b2f2ee716d6b28066d44bfdc57babf" + } + Frame { + msec: 4512 + hash: "d37df25a59f3ba88b78f548521a6e5b2" + } + Frame { + msec: 4528 + hash: "b554cb62b97bbbb671d9b34389d4187a" + } + Key { + type: 7 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 4544 + hash: "d28889303f98c47665247009bcfd68e7" + } + Frame { + msec: 4560 + hash: "80e7808641fc79c893a02842f641249b" + } + Frame { + msec: 4576 + hash: "4f3a39e8c61ad9197e7f24058671e510" + } + Frame { + msec: 4592 + hash: "ba2a7178b7c68001ecfdfea053507d0e" + } + Frame { + msec: 4608 + hash: "ca1c72729c41845151820d362721a1e7" + } + Frame { + msec: 4624 + hash: "ac37c4abbbc11b8e2bf8e0e8dae6180f" + } + Frame { + msec: 4640 + hash: "ac37c4abbbc11b8e2bf8e0e8dae6180f" + } + Frame { + msec: 4656 + hash: "ac37c4abbbc11b8e2bf8e0e8dae6180f" + } + Frame { + msec: 4672 + hash: "ac37c4abbbc11b8e2bf8e0e8dae6180f" + } + Frame { + msec: 4688 + hash: "ac37c4abbbc11b8e2bf8e0e8dae6180f" + } + Frame { + msec: 4704 + hash: "ac37c4abbbc11b8e2bf8e0e8dae6180f" + } + Frame { + msec: 4720 + hash: "ac37c4abbbc11b8e2bf8e0e8dae6180f" + } + Frame { + msec: 4736 + hash: "ac37c4abbbc11b8e2bf8e0e8dae6180f" + } + Frame { + msec: 4752 + hash: "ac37c4abbbc11b8e2bf8e0e8dae6180f" + } + Frame { + msec: 4768 + hash: "ac37c4abbbc11b8e2bf8e0e8dae6180f" + } + Frame { + msec: 4784 + hash: "ac37c4abbbc11b8e2bf8e0e8dae6180f" + } + Frame { + msec: 4800 + hash: "ac37c4abbbc11b8e2bf8e0e8dae6180f" + } + Frame { + msec: 4816 + image: "gridview2.5.png" + } + Key { + type: 6 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 4832 + hash: "ac37c4abbbc11b8e2bf8e0e8dae6180f" + } + Frame { + msec: 4848 + hash: "1176eed6f023a843a646517e60f848b5" + } + Frame { + msec: 4864 + hash: "26eca367a7fe38ac123fa63cfbb20421" + } + Frame { + msec: 4880 + hash: "d471f06d345e5a09bf4ea540b80fe1e3" + } + Frame { + msec: 4896 + hash: "e3694d271e363df1b212d975a464df62" + } + Frame { + msec: 4912 + hash: "3dc24a10bbf6a6a0ba85f50de8646305" + } + Key { + type: 7 + key: 16777236 + modifiers: 536870912 + text: "1d" + autorep: false + count: 1 + } + Frame { + msec: 4928 + hash: "08e7979e36a9a8a500193020ab68c616" + } + Frame { + msec: 4944 + hash: "bd91601e455c2c37c786f907bd20b447" + } + Frame { + msec: 4960 + hash: "e4b676fc9752f3bff5353a2bf528b3ac" + } + Frame { + msec: 4976 + hash: "c772188a68cc0958c247145005d580ef" + } + Frame { + msec: 4992 + hash: "eded946d9e7c6418e3933624fe2f1dbf" + } + Frame { + msec: 5008 + hash: "46a2dd2bfa66a3781a00fe466e05eeb0" + } + Frame { + msec: 5024 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5040 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5056 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5072 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5088 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5104 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5120 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5136 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5152 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5168 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5184 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5200 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5216 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5232 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5248 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5264 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5280 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5296 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5312 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5328 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5344 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5360 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5376 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5392 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5408 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5424 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5440 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5456 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5472 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5488 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5504 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5520 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5536 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5552 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5568 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5584 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5600 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Key { + type: 6 + key: 16777237 + modifiers: 536870912 + text: "1f" + autorep: false + count: 1 + } + Frame { + msec: 5616 + hash: "4e11a072f1136c2c6298e6cfb25700dd" + } + Frame { + msec: 5632 + hash: "e44ee0f83cbd176620d5c91851402b5b" + } + Frame { + msec: 5648 + hash: "c18bc8109b350673faf64b4722e86f3d" + } + Frame { + msec: 5664 + hash: "1b552ed8555c61e1fa664e6c88aee64d" + } + Frame { + msec: 5680 + hash: "11284c77b23ba4b4b0c664b387dc9d48" + } + Frame { + msec: 5696 + hash: "fbd015d60a8ada6a671301d01846b4c8" + } + Frame { + msec: 5712 + hash: "1456fca256ab6fdf930dd079ee8b77a7" + } + Key { + type: 7 + key: 16777237 + modifiers: 536870912 + text: "1f" + autorep: false + count: 1 + } + Frame { + msec: 5728 + hash: "bf7f688319a89ade564734d7fc658167" + } + Frame { + msec: 5744 + hash: "68819e722d6032881824448ed63248b2" + } + Frame { + msec: 5760 + hash: "510589f35813c6c1d6484f614da92ae3" + } + Frame { + msec: 5776 + image: "gridview2.6.png" + } + Frame { + msec: 5792 + hash: "37f9e630ac66e999046d686078cf5a68" + } + Frame { + msec: 5808 + hash: "b534ccea1f69ececc54d943e73b7e9f4" + } + Frame { + msec: 5824 + hash: "b534ccea1f69ececc54d943e73b7e9f4" + } + Frame { + msec: 5840 + hash: "b534ccea1f69ececc54d943e73b7e9f4" + } + Frame { + msec: 5856 + hash: "b534ccea1f69ececc54d943e73b7e9f4" + } + Frame { + msec: 5872 + hash: "b534ccea1f69ececc54d943e73b7e9f4" + } + Frame { + msec: 5888 + hash: "b534ccea1f69ececc54d943e73b7e9f4" + } + Frame { + msec: 5904 + hash: "b534ccea1f69ececc54d943e73b7e9f4" + } + Frame { + msec: 5920 + hash: "b534ccea1f69ececc54d943e73b7e9f4" + } + Frame { + msec: 5936 + hash: "b534ccea1f69ececc54d943e73b7e9f4" + } + Frame { + msec: 5952 + hash: "b534ccea1f69ececc54d943e73b7e9f4" + } + Frame { + msec: 5968 + hash: "b534ccea1f69ececc54d943e73b7e9f4" + } + Frame { + msec: 5984 + hash: "b534ccea1f69ececc54d943e73b7e9f4" + } + Frame { + msec: 6000 + hash: "b534ccea1f69ececc54d943e73b7e9f4" + } + Frame { + msec: 6016 + hash: "b534ccea1f69ececc54d943e73b7e9f4" + } + Frame { + msec: 6032 + hash: "b534ccea1f69ececc54d943e73b7e9f4" + } + Frame { + msec: 6048 + hash: "b534ccea1f69ececc54d943e73b7e9f4" + } + Frame { + msec: 6064 + hash: "b534ccea1f69ececc54d943e73b7e9f4" + } + Frame { + msec: 6080 + hash: "b534ccea1f69ececc54d943e73b7e9f4" + } + Frame { + msec: 6096 + hash: "b534ccea1f69ececc54d943e73b7e9f4" + } + Key { + type: 6 + key: 16777237 + modifiers: 536870912 + text: "1f" + autorep: false + count: 1 + } + Frame { + msec: 6112 + hash: "b534ccea1f69ececc54d943e73b7e9f4" + } + Frame { + msec: 6128 + hash: "f45eb6005981864d7e4d1379a4390b02" + } + Frame { + msec: 6144 + hash: "a644905acb7cf6e4d9351f1140985a98" + } + Frame { + msec: 6160 + hash: "011be55b909843b2506c5a97e7571e51" + } + Frame { + msec: 6176 + hash: "35b224d84ae3a4bdba0ace487471f0a6" + } + Frame { + msec: 6192 + hash: "dcfd5536e6065a19650fe67914211223" + } + Frame { + msec: 6208 + hash: "8ad99c352901c54ecc601ca2ac8c1f08" + } + Frame { + msec: 6224 + hash: "e4774d15b45865b9f445f679cd0414ea" + } + Frame { + msec: 6240 + hash: "a5b78dfb09b9031f0aabfa7439cbc433" + } + Key { + type: 7 + key: 16777237 + modifiers: 536870912 + text: "1f" + autorep: false + count: 1 + } + Frame { + msec: 6256 + hash: "20b87dc26080f8e8e070b2fa299f496a" + } + Frame { + msec: 6272 + hash: "0e6d05d1df8328ca17d953476d19ae14" + } + Frame { + msec: 6288 + hash: "e2b1ec6b985bbc57f0384a49f3af545c" + } + Frame { + msec: 6304 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 6320 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 6336 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 6352 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 6368 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 6384 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 6400 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 6416 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 6432 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 6448 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 6464 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 6480 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 6496 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 6512 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 6528 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 6544 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 6560 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 6576 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 6592 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 6608 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 6624 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 6640 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 6656 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 6672 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 6688 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 6704 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 6720 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 6736 + image: "gridview2.7.png" + } + Key { + type: 6 + key: 16777237 + modifiers: 536870912 + text: "1f" + autorep: false + count: 1 + } + Frame { + msec: 6752 + hash: "8d36bc2f3ab614d19f3ec8821f3e81ed" + } + Frame { + msec: 6768 + hash: "6cbeb42ae5aa75638fedcaf38d25370a" + } + Frame { + msec: 6784 + hash: "fe3b287b14cbfbca4e19a2de979e9e16" + } + Frame { + msec: 6800 + hash: "69650da29b84b8009c30de516fb9b623" + } + Frame { + msec: 6816 + hash: "5cbcaf1e6916aa635e31ac4219e387f7" + } + Frame { + msec: 6832 + hash: "acb7f98da26b70bebe20336c51449318" + } + Key { + type: 7 + key: 16777237 + modifiers: 536870912 + text: "1f" + autorep: false + count: 1 + } + Frame { + msec: 6848 + hash: "8588b82fadca8ea18d4cc268508119e0" + } + Frame { + msec: 6864 + hash: "e2cf9055220b1c8126423df30e3607ed" + } + Frame { + msec: 6880 + hash: "d06e77ff2044ba3f6fc1664af5720a0a" + } + Frame { + msec: 6896 + hash: "b931ef84ecc38676d602638081b1f126" + } + Frame { + msec: 6912 + hash: "b6a0ee0b24737bc0045ff3fb68cfe3ad" + } + Frame { + msec: 6928 + hash: "b6a0ee0b24737bc0045ff3fb68cfe3ad" + } + Frame { + msec: 6944 + hash: "b6a0ee0b24737bc0045ff3fb68cfe3ad" + } + Frame { + msec: 6960 + hash: "b6a0ee0b24737bc0045ff3fb68cfe3ad" + } + Frame { + msec: 6976 + hash: "b6a0ee0b24737bc0045ff3fb68cfe3ad" + } + Frame { + msec: 6992 + hash: "b6a0ee0b24737bc0045ff3fb68cfe3ad" + } + Frame { + msec: 7008 + hash: "b6a0ee0b24737bc0045ff3fb68cfe3ad" + } + Frame { + msec: 7024 + hash: "b6a0ee0b24737bc0045ff3fb68cfe3ad" + } + Frame { + msec: 7040 + hash: "b6a0ee0b24737bc0045ff3fb68cfe3ad" + } + Frame { + msec: 7056 + hash: "b6a0ee0b24737bc0045ff3fb68cfe3ad" + } + Frame { + msec: 7072 + hash: "b6a0ee0b24737bc0045ff3fb68cfe3ad" + } + Frame { + msec: 7088 + hash: "b6a0ee0b24737bc0045ff3fb68cfe3ad" + } + Frame { + msec: 7104 + hash: "b6a0ee0b24737bc0045ff3fb68cfe3ad" + } + Frame { + msec: 7120 + hash: "b6a0ee0b24737bc0045ff3fb68cfe3ad" + } + Frame { + msec: 7136 + hash: "b6a0ee0b24737bc0045ff3fb68cfe3ad" + } + Frame { + msec: 7152 + hash: "b6a0ee0b24737bc0045ff3fb68cfe3ad" + } + Frame { + msec: 7168 + hash: "b6a0ee0b24737bc0045ff3fb68cfe3ad" + } + Frame { + msec: 7184 + hash: "b6a0ee0b24737bc0045ff3fb68cfe3ad" + } + Frame { + msec: 7200 + hash: "b6a0ee0b24737bc0045ff3fb68cfe3ad" + } + Frame { + msec: 7216 + hash: "b6a0ee0b24737bc0045ff3fb68cfe3ad" + } + Frame { + msec: 7232 + hash: "b6a0ee0b24737bc0045ff3fb68cfe3ad" + } + Frame { + msec: 7248 + hash: "d30ed063d99d02f6d8302847e83d60a1" + } + Frame { + msec: 7264 + hash: "30b128c6248cb35ee4c55e1c2129a19c" + } + Frame { + msec: 7280 + hash: "1ae71ef5b1006f637bd8df0769af65a6" + } + Frame { + msec: 7296 + hash: "6bd6f0c35aeede01d1a8e42c81cd6fb8" + } + Frame { + msec: 7312 + hash: "ca90dcb70d416616dcae2df84956cff1" + } + Frame { + msec: 7328 + hash: "a33bc4f7c40fa3eb36803c20222d75f6" + } + Frame { + msec: 7344 + hash: "12430a710362b47fef8dfc022b789e07" + } + Frame { + msec: 7360 + hash: "a18abef207f5f6bbd260ca98cce91380" + } + Frame { + msec: 7376 + hash: "e853ea2eba5e3baeba0f43e57d2415ba" + } + Frame { + msec: 7392 + hash: "294cff3e6d3a1101f76d2ecce14e11a1" + } + Frame { + msec: 7408 + hash: "c38ee992a1b435c12a66e4d49d78c2ed" + } + Frame { + msec: 7424 + hash: "54775aed3a6283c1fa330d65de5bc70c" + } + Frame { + msec: 7440 + hash: "eba9a696d9ab1e8da7c6c59787d3f311" + } + Frame { + msec: 7456 + hash: "2048cd8abb56be34f9e475d7f92b6153" + } + Frame { + msec: 7472 + hash: "d56b4a04f1d2835a0852ea20e8e2f451" + } + Frame { + msec: 7488 + hash: "f5afb489b7aee20b45c9f5eb5a9eb8d7" + } + Frame { + msec: 7504 + hash: "26f25129f9d2c73a7a5168c73e299919" + } + Frame { + msec: 7520 + hash: "6f23e3c4ec738903b5011cbee1141b00" + } + Frame { + msec: 7536 + hash: "e10d4bf08980ea7d079a2f359ee62b95" + } + Frame { + msec: 7552 + hash: "eb0a656e8feabcb131e59c66b64f7d09" + } + Frame { + msec: 7568 + hash: "94cfa3f71326f6e188fee32c0970de30" + } + Frame { + msec: 7584 + hash: "8bc4274a3f0498d600405409f69c1d16" + } + Frame { + msec: 7600 + hash: "995cb12e1d07488ae4139d2c67552dc6" + } + Frame { + msec: 7616 + hash: "2d9d9f3fb43e2280b0dea054dc8d7dd4" + } + Frame { + msec: 7632 + hash: "dd68eb502e1fe114a24d902b50a5dff9" + } + Frame { + msec: 7648 + hash: "b2738b11e34c5d7840e9aacc443cc1f0" + } + Frame { + msec: 7664 + hash: "de148713c156476ca7c4021633596782" + } + Frame { + msec: 7680 + hash: "0e273dbaaab76058b6e04a830bbd80d3" + } + Frame { + msec: 7696 + image: "gridview2.8.png" + } + Frame { + msec: 7712 + hash: "5dcad019a1c0eaaab381a7602e1914ff" + } + Frame { + msec: 7728 + hash: "e046dc0869cc629de5037214af1d58f8" + } + Frame { + msec: 7744 + hash: "affc71688994d6b6763e78305ba1d6b3" + } + Frame { + msec: 7760 + hash: "d5ec397fdf17bf864e4575543c535dad" + } + Frame { + msec: 7776 + hash: "b37cb5816c2077b8018f78985b91fdeb" + } + Frame { + msec: 7792 + hash: "a3060fa79b1f7f0d9e61ad8c69be19ed" + } + Frame { + msec: 7808 + hash: "236dcbaf20e11335efc64b2ce87b551d" + } + Frame { + msec: 7824 + hash: "09af1c488b56dc3c7c3893b024f6d53f" + } + Frame { + msec: 7840 + hash: "ef2bf66ac68002102476d3cfe4501cb7" + } + Frame { + msec: 7856 + hash: "165c02de63604aa118d9f8995e6b45af" + } + Frame { + msec: 7872 + hash: "fb790a0e4bc20afe24639dadf50a03c0" + } + Frame { + msec: 7888 + hash: "881298b629aeaeb23fa9e9eb446912d2" + } + Frame { + msec: 7904 + hash: "2175ff436c42616147b2e71b91e34060" + } + Frame { + msec: 7920 + hash: "85bc0cd40ddc08814a2c3677e7e43bcf" + } + Frame { + msec: 7936 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 7952 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 7968 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 7984 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8000 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8016 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8032 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8048 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8064 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8080 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8096 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8112 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8128 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8144 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8160 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8176 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8192 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8208 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8224 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8240 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8256 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8272 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8288 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8304 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8320 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8336 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8352 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8368 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8384 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8400 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8416 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8432 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8448 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8464 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8480 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8496 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8512 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8528 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8544 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8560 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8576 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8592 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8608 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8624 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8640 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8656 + image: "gridview2.9.png" + } + Frame { + msec: 8672 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8688 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8704 + hash: "33d81c39d16c6a326012499796e50e03" + } + Key { + type: 6 + key: 16777249 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 8720 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8736 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8752 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8768 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8784 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8800 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8816 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8832 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8848 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8864 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8880 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8896 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8912 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8928 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8944 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8960 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8976 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 8992 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 9008 + hash: "33d81c39d16c6a326012499796e50e03" + } + Frame { + msec: 9024 + hash: "33d81c39d16c6a326012499796e50e03" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativegridview/gridview.qml b/tests/auto/declarative/qmlvisual/qdeclarativegridview/gridview.qml new file mode 100644 index 00000000..95556f14 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativegridview/gridview.qml @@ -0,0 +1,51 @@ +import QtQuick 1.0 + +Rectangle { + width: 300; height: 400; color: "black" + + ListModel { + id: appModel + ListElement { lColor: "red" } + ListElement { lColor: "yellow" } + ListElement { lColor: "green" } + ListElement { lColor: "blue" } + ListElement { lColor: "purple" } + ListElement { lColor: "orange" } + ListElement { lColor: "pink" } + ListElement { lColor: "brown" } + ListElement { lColor: "gray" } + ListElement { lColor: "red" } + ListElement { lColor: "yellow" } + ListElement { lColor: "green" } + ListElement { lColor: "blue" } + ListElement { lColor: "purple" } + ListElement { lColor: "orange" } + ListElement { lColor: "pink" } + ListElement { lColor: "brown" } + ListElement { lColor: "gray" } + } + + Component { + id: appDelegate + Item { + width: 100; height: 100 + Rectangle { + color: lColor; x: 4; y: 4 + width: 92; height: 92 + } + } + } + + Component { + id: appHighlight + Rectangle { width: 100; height: 100; color: "white"; z: 0 } + } + + GridView { + anchors.fill: parent + cellWidth: 100; cellHeight: 100; cacheBuffer: 200 + model: appModel; delegate: appDelegate + highlight: appHighlight + focus: true + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativegridview/gridview2.qml b/tests/auto/declarative/qmlvisual/qdeclarativegridview/gridview2.qml new file mode 100644 index 00000000..0dd9d0e6 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativegridview/gridview2.qml @@ -0,0 +1,62 @@ +import QtQuick 1.0 + +Rectangle { + property string skip: "Last bit is wrong (rest is probably right, just bitrot). QTBUG-14838" + width: 300; height: 400; color: "black" + + ListModel { + id: appModel + ListElement { lColor: "red" } + ListElement { lColor: "yellow" } + ListElement { lColor: "green" } + ListElement { lColor: "blue" } + ListElement { lColor: "purple" } + ListElement { lColor: "orange" } + ListElement { lColor: "pink" } + ListElement { lColor: "brown" } + ListElement { lColor: "gray" } + ListElement { lColor: "red" } + ListElement { lColor: "yellow" } + ListElement { lColor: "green" } + ListElement { lColor: "blue" } + ListElement { lColor: "purple" } + ListElement { lColor: "orange" } + ListElement { lColor: "pink" } + ListElement { lColor: "brown" } + ListElement { lColor: "gray" } + ListElement { lColor: "red" } + ListElement { lColor: "yellow" } + ListElement { lColor: "green" } + } + + Component { + id: appDelegate + Item { + width: 100; height: 100 + Rectangle { + color: lColor; x: 4; y: 4 + width: 92; height: 92 + } + } + } + + GridView { + id: gridView; anchors.fill: parent + cellWidth: 100; cellHeight: 100; cacheBuffer: 200 + model: appModel; delegate: appDelegate; focus: true + keyNavigationWraps: true + + flickableData: [//Presumably the different way of doing highlight tests more things + Rectangle { + color: "transparent"; border.color: "white"; border.width: 8; z: 3000 + height: 100; width: 100 + x: gridView.currentItem.x + y: gridView.currentItem.y + + Behavior on x { SmoothedAnimation { velocity: 500 } } + Behavior on y { SmoothedAnimation { velocity: 500 } } + } + ] + } + +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.0.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.0.png new file mode 100644 index 00000000..dd992cc6 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.1.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.1.png new file mode 100644 index 00000000..dd992cc6 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.2.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.2.png new file mode 100644 index 00000000..887d395d Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.3.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.3.png new file mode 100644 index 00000000..055258de Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.4.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.4.png new file mode 100644 index 00000000..dd992cc6 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.5.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.5.png new file mode 100644 index 00000000..d3d35afa Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.5.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.6.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.6.png new file mode 100644 index 00000000..2028c960 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.6.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.7.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.7.png new file mode 100644 index 00000000..a667cf94 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.7.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.8.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.8.png new file mode 100644 index 00000000..2f0967dc Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.8.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.qml b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.qml new file mode 100644 index 00000000..001861d5 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/drag.qml @@ -0,0 +1,5207 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "drag.0.png" + } + Frame { + msec: 32 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 48 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 64 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 80 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 96 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 112 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 128 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 144 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 160 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 176 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 192 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 208 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 224 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 240 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 256 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 272 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 288 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 304 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 320 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 336 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 352 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 368 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 384 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 400 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 416 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 432 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 448 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 464 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 480 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 496 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 512 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 528 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 544 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 560 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 576 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 592 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 608 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 624 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 640 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 656 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 672 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 688 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 704 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 720 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 736 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 752 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 768 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 784 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 800 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 816 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 832 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 848 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 864 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 880 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 896 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 912 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 928 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 944 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 960 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 976 + image: "drag.1.png" + } + Frame { + msec: 992 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1008 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1024 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1040 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1056 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1072 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1088 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1104 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1120 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1136 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1152 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1168 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1184 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1200 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1216 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1232 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1248 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1264 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1280 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1296 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1312 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1328 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1344 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1360 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1376 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1392 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1408 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1424 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1440 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1456 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1472 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1488 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1504 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1520 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1536 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1552 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1568 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1584 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1600 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1616 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1632 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1648 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1664 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1680 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1696 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1712 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1728 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1744 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1760 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1776 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1792 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 16; y: 54 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1808 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 1824 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 16; y: 55 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 55 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1840 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 55 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1856 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 18; y: 55 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1872 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 19; y: 54 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1888 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 22; y: 49 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 29; y: 42 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1904 + hash: "a6c6df34bb552249393ba208ad327691" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 37; y: 35 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1920 + hash: "a611a57ed2bdf4eaa5e13612346ecce7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 47; y: 27 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1936 + image: "drag.2.png" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 59; y: 21 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 73; y: 15 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1952 + hash: "6170ab3a7e51278ac4462b89fe7781b4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 87; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1968 + hash: "32866f0aa5b13b3ab68661f49336439e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 100; y: 5 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1984 + hash: "26dc17c16eed46d37932cfe48d182b62" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 111; y: 1 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 121; y: -3 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2000 + hash: "ba70936fb44396fac184cc7ba0e94a90" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 130; y: -6 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2016 + hash: "bae13291d4f031c34d80428d83367ede" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 140; y: -8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2032 + hash: "0a2fbfdc27bb6662553f637f1c325475" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 151; y: -9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 160; y: -9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2048 + hash: "cdab85736dfcc4424d42e0e96094eded" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 170; y: -9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2064 + hash: "76d51ce9ad69560d983d8d86d50f7bd0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 174; y: -9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2080 + hash: "b5ada9e80f7f894aa141d5e3cfa5d69e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 176; y: -9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2096 + hash: "446d35fc7b9c0fe4bf0bfe0182f994f6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 183; y: -5 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2112 + hash: "cced849d314835d43ebd93bcfe396c12" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 188; y: -3 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2128 + hash: "09696d700944c373f82d7c6f75d51c51" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 193; y: 0 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2144 + hash: "af56586db93c49637c9bfbb17cac9001" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 199; y: 2 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 203; y: 5 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2160 + hash: "66fc1b30b4037aad3975036faccbb7a7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 209; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2176 + hash: "3f443d9c89d6ba1b36ca9635bc32de1a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 217; y: 11 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2192 + hash: "df47db8cc7bb466b298749a6449d3d70" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 227; y: 15 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 234; y: 18 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 241; y: 20 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2208 + hash: "c1146fdc0e628d050442606096e52b10" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 252; y: 23 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2224 + hash: "22f44c43f300fd7ff2b4d87d93756178" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 272; y: 30 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2240 + hash: "bf11dc9a9679692abde5d116a169eecf" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 299; y: 38 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 329; y: 48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2256 + hash: "e63f1960f342639ac412010ffcefb049" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 360; y: 57 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2272 + hash: "ae0228419ec9358025c3026a39abd671" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 392; y: 65 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2288 + hash: "6d2272e2bea21c280100ed8de5b95d4e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 422; y: 72 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 451; y: 76 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2304 + hash: "1628c6fa5feabd90924452bc9f55054d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 476; y: 78 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2320 + hash: "f696791eb0a317b0efb69407616bec9f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 497; y: 78 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2336 + hash: "f696791eb0a317b0efb69407616bec9f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 513; y: 77 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 527; y: 76 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2352 + hash: "1628c6fa5feabd90924452bc9f55054d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 538; y: 75 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2368 + hash: "a5d3d247e22a2852a60fe07ab40345a5" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 548; y: 74 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2384 + hash: "a453fb6bcdd87f819782d8d8c46b56ee" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 556; y: 74 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 563; y: 75 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2400 + hash: "a5d3d247e22a2852a60fe07ab40345a5" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 570; y: 76 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2416 + hash: "1628c6fa5feabd90924452bc9f55054d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 576; y: 78 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2432 + hash: "f696791eb0a317b0efb69407616bec9f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 582; y: 78 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 585; y: 80 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2448 + hash: "8f061986df633c21dcad767ee857988c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 589; y: 81 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2464 + hash: "2cc110a6fb800171d7d752693ede1e4e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 592; y: 82 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2480 + hash: "319fc3053e02a8b161f33a79d9839bb1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 595; y: 85 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 597; y: 89 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2496 + hash: "42915c8866746316cf1083a2d55410fb" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 601; y: 95 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2512 + hash: "5df34b3ae292de9a9cd8ff09347e7bd4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 606; y: 103 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2528 + hash: "1f9bc3c955983ea85f568797cb4f7365" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 609; y: 113 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 613; y: 124 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2544 + hash: "3f156dc64a12c672874acf5456ef4a31" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 618; y: 136 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2560 + hash: "d4d9fe5b5f138e06a87039ebf8695d03" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 619; y: 142 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2576 + hash: "383fe813021ee2791930200b2f88a802" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 620; y: 148 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 622; y: 155 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2592 + hash: "a235544bd5e791dfa329bd0b87358bfa" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 625; y: 163 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2608 + hash: "a87497cf47db3209610b532efe7eb380" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 629; y: 174 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2624 + hash: "abe69b4e4b7508028226f9b73c38058a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 634; y: 194 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 642; y: 225 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2640 + hash: "51c72fa2fa4c8765d882fe65dc0d697d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 649; y: 260 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2656 + hash: "79da7ed21bd6fc16b7264d4403e763cc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 655; y: 291 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2672 + hash: "b2828b6340a57fa45416469b23b7cef0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 658; y: 316 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 659; y: 340 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2688 + hash: "64a5351f2d746b338c34c7ea9ba6e1fe" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 660; y: 370 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2704 + hash: "9eedb7a6875210084fd2ec95d3505512" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 661; y: 408 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2720 + hash: "b88eb8fa8a0cfc263dc7b655ddc29db0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 661; y: 448 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2736 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 660; y: 487 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 659; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2752 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 658; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2768 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 658; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2784 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 658; y: 506 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 658; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2800 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 657; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2816 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 656; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2832 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 654; y: 506 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 652; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2848 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 651; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2864 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 650; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2880 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 650; y: 506 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 648; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2896 + image: "drag.3.png" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 647; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2912 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 646; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2928 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 645; y: 506 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 644; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2944 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 643; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2960 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 642; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2976 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 641; y: 506 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 640; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2992 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 640; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3008 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 639; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3024 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 639; y: 506 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 638; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3040 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 636; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3056 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 625; y: 505 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3072 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 611; y: 505 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3088 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 582; y: 506 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 546; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3104 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 505; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3120 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 460; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3136 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 408; y: 506 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 354; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3152 + hash: "c2997fdde10812f02791bfed5f158ac3" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 300; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3168 + hash: "23a6dfbd09e5b44d04f252cedaeb68af" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 250; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3184 + hash: "f74422989711f86a0840ffc98e8a29e9" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 206; y: 506 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 163; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3200 + hash: "fa922246d254a7c46d2d1d6ec91a2b02" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 140; y: 506 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 122; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3216 + hash: "ef216cb8c2bf58db7d58bd8a2e4eb38d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 101; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3232 + hash: "a383228d22e64b8a7758c959288eaca8" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 64; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3248 + hash: "636ca2a8e91c49ef6c8b1c93b830f345" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 36; y: 506 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 16; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3264 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -1; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3280 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3296 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 506 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3312 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3328 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3344 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 506 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3360 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3376 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 505 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3392 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 504 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 504 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3408 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 505 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3424 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3440 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3456 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3472 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3488 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 506 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3504 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3520 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3536 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 506 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3552 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Frame { + msec: 3568 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3584 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 506 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3600 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3616 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Frame { + msec: 3632 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 506 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 491 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3648 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 428 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3664 + hash: "9fa1e3686467f28cb013fe093dab388c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 342 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3680 + hash: "7ef97d10862f80d53e0b3b4446661deb" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 264 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 203 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3696 + hash: "c679866b3965b7b5f48b843d6efccf42" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 160 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3712 + hash: "de4bd9ad3cbb9bb19bf75f871b044072" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 144 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3728 + hash: "c5349bbddc03edd5ee3537e2a738f1ad" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 136 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 132 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3744 + hash: "bcbe9ec2687a6030385f08d3dc17becf" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 130 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3760 + hash: "3ad767f63eaccb9e64a9f704900f2530" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 129 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3776 + hash: "421a1ffde15fda0e7846bc095ed2ea37" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 128 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 128 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3792 + hash: "55c260da304a6b1119af83f6a4efcff0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 123 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3808 + hash: "f231cc521db801b4ec71248812e12db8" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 104 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3824 + hash: "b489b6b604e7f7699cac9e42d0725323" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 68 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 35 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3840 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 13 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3856 + image: "drag.4.png" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 2 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3872 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: -6 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: -12 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3888 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: -25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3904 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: -46 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3920 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: -65 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: -70 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3936 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: -74 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3952 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: -76 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3968 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: -76 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3984 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: -76 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4000 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: -77 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4016 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: -78 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4032 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 4048 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: -78 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4064 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 4080 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 4096 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: -77 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4112 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 4128 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 4144 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: -78 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4160 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -3; y: -84 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4176 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -2; y: -105 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 1; y: -151 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4192 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 4208 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 4224 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 4240 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 4256 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 4272 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 4288 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 4304 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 4320 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 4336 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 4352 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 4368 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Frame { + msec: 4384 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 3; y: -151 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4400 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 4; y: -149 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4416 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 5; y: -147 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4432 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 5; y: -143 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 6; y: -138 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4448 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 7; y: -130 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4464 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 9; y: -117 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4480 + hash: "668cc6d9d699b947a7c0f3ff4b26853f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 13; y: -94 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 20; y: -63 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4496 + hash: "b1b54f7bf8ab9cf98d96f9b34192434b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 29; y: -24 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4512 + hash: "a6c6df34bb552249393ba208ad327691" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 39; y: 15 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4528 + hash: "a05eb803b1f1f3574a2f2e08fe37bd35" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 49; y: 50 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 58; y: 74 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4544 + hash: "3c2f3db46673c2640a26832900b609cb" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 65; y: 91 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4560 + hash: "d0539a9791874f48634bb3cb9f78d9db" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 71; y: 103 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4576 + hash: "f2d862a0b81e2578799d64aef2e6bddc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 77; y: 112 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 81; y: 121 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4592 + hash: "295ef097845e30064c4d810a7718896c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 86; y: 128 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4608 + hash: "22a4a17d82ac402c0e8372861609ff1c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 92; y: 136 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4624 + hash: "a70e81b1435afd77b9079c58685ef9d0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 98; y: 143 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 104; y: 151 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4640 + hash: "d66fefd68fcd96834548c18797eee4bd" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 111; y: 159 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4656 + hash: "fcc435dc6f2643cd21a7cfac078880af" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 118; y: 166 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4672 + hash: "736edfcf33245d46aaea199634896c17" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 123; y: 173 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 129; y: 183 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4688 + hash: "7b7ab312d0c6f4bfc87a2ae467324f4e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 137; y: 197 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4704 + hash: "d78ce756fc27055eeee15001419b7fb5" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 146; y: 215 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4720 + hash: "4f15a726939d7f489d1fe58ebb5bcd0a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 157; y: 235 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 168; y: 255 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4736 + hash: "72184d71fd2fdc6786a43045db0be68f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 180; y: 274 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4752 + hash: "3b3f3f34218bf238f310412cb8c4968d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 192; y: 293 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4768 + hash: "24c00a7154471431d43b1db957ad6424" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 205; y: 316 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 221; y: 343 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4784 + hash: "30081a33ab007ff2c7ba6cc293a5aec3" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 237; y: 371 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4800 + hash: "c6d398d42d968763c7597728e86304f2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 253; y: 396 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4816 + image: "drag.5.png" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 268; y: 419 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 276; y: 429 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 284; y: 438 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4832 + hash: "101c007d0e2cf82331ba1cab4880e8a2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 291; y: 448 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4848 + hash: "72e46df7427420c5e942a97831723d3f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 307; y: 468 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4864 + hash: "4b7a009b46982a1e9e31250d7ebf0a20" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 323; y: 492 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 341; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4880 + hash: "a3ba70933b6452fad0cdc4192e04be23" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 359; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4896 + hash: "c2ee16182222b403f914eb5550ac6f91" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 378; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4912 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 397; y: 506 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 416; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4928 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 432; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4944 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 445; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4960 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 456; y: 506 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 466; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4976 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 475; y: 506 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4992 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 482; y: 505 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5008 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 488; y: 504 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 492; y: 503 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5024 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 496; y: 503 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5040 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 500; y: 502 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5056 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 507; y: 501 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5072 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 512; y: 500 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 516; y: 498 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5088 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 521; y: 494 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5104 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 525; y: 486 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5120 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 532; y: 472 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 542; y: 445 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5136 + hash: "9356ce797d12ae076af947cd0e658551" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 553; y: 414 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5152 + hash: "76a8d3b8465f08fdc4586c7766667eff" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 563; y: 389 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5168 + hash: "569e56ba99776d03dd3140e53bc77f56" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 569; y: 373 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 573; y: 363 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5184 + hash: "7139c72a2458685006da79d9cf11bc44" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 577; y: 354 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5200 + hash: "a83d5ef213edec4c8f938ab04afb5c4f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 580; y: 344 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5216 + hash: "5533602bc8a473c162966142d4bddebd" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 584; y: 321 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 586; y: 301 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5232 + hash: "7a79d6e31874428233e9c141d70522fd" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 588; y: 264 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5248 + hash: "b14f4daeb25cd71baae36f4cec111813" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 591; y: 238 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5264 + hash: "e2b2513d2918ffb85bab5fff5a8be644" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 592; y: 225 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 593; y: 216 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5280 + hash: "af0cbb3423491917db1fdaa8350d48b0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 594; y: 209 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5296 + hash: "b9c107f0a13ad37ae05b4d5f9e5f5442" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 594; y: 200 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5312 + hash: "0bbc0c7a4a40ee6b19565c04c23b565d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 594; y: 182 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 593; y: 146 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5328 + hash: "49494e8526a1417c151c7cac7099b9e6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 590; y: 107 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5344 + hash: "5e0839c4414cc8ddc5241c658fd3bf88" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 585; y: 80 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5360 + hash: "8f061986df633c21dcad767ee857988c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 582; y: 67 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5376 + hash: "d78c0a4fa0ccad407a565fab3a5c95b9" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 579; y: 61 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 576; y: 57 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5392 + hash: "cee6816f84911bc2262afe28d8996719" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 573; y: 55 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5408 + hash: "2cc6cd514ef7299dd60bf1a735b81d36" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 569; y: 51 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5424 + hash: "68c40f3551d7d10e61c5ffbb6948c7e6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 564; y: 44 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 557; y: 35 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5440 + hash: "68c40f3551d7d10e61c5ffbb6948c7e6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 548; y: 25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5456 + hash: "68c40f3551d7d10e61c5ffbb6948c7e6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 540; y: 14 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 532; y: 5 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5472 + hash: "68c40f3551d7d10e61c5ffbb6948c7e6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 524; y: -1 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5488 + hash: "68c40f3551d7d10e61c5ffbb6948c7e6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 517; y: -5 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5504 + hash: "68c40f3551d7d10e61c5ffbb6948c7e6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 510; y: -9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5520 + hash: "68c40f3551d7d10e61c5ffbb6948c7e6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 501; y: -14 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 492; y: -18 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5536 + hash: "68c40f3551d7d10e61c5ffbb6948c7e6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 483; y: -21 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5552 + hash: "68c40f3551d7d10e61c5ffbb6948c7e6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 476; y: -21 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5568 + hash: "68c40f3551d7d10e61c5ffbb6948c7e6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 470; y: -19 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 464; y: -15 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5584 + hash: "68c40f3551d7d10e61c5ffbb6948c7e6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 458; y: -9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5600 + hash: "68c40f3551d7d10e61c5ffbb6948c7e6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 452; y: -3 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5616 + hash: "68c40f3551d7d10e61c5ffbb6948c7e6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 446; y: 4 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 439; y: 11 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5632 + hash: "68c40f3551d7d10e61c5ffbb6948c7e6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 432; y: 20 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5648 + hash: "68c40f3551d7d10e61c5ffbb6948c7e6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 424; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5664 + hash: "68c40f3551d7d10e61c5ffbb6948c7e6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 413; y: 42 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 400; y: 59 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5680 + hash: "9bc8a652f43c0e3cae9492f5dff624e7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 392; y: 70 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 385; y: 79 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5696 + hash: "5465128afe72d9618cd9abc47f4ce72f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 378; y: 88 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5712 + hash: "ad739c2028caf8f89d8ae04d509c7854" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 366; y: 102 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 353; y: 114 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5728 + hash: "97cd37f639a7bea76a2f68774c0753db" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 339; y: 126 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5744 + hash: "d24fc8a57dd34e6ddb726426247ec219" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 324; y: 140 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5760 + hash: "f0454d80a51c5f2226bd45aba58dc1e9" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 308; y: 158 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 288; y: 181 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5776 + image: "drag.6.png" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 266; y: 208 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5792 + hash: "73623f4a857fd4d5150c2eeef1341540" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 243; y: 237 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5808 + hash: "076c4b60d9ec197950ade51e3f1be791" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 217; y: 265 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 191; y: 291 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5824 + hash: "22b7d7765c634763fa86912ea262efca" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 167; y: 314 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5840 + hash: "1267c017931bda0b88b4672f46d499e0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 147; y: 331 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5856 + hash: "b6a545e4c14b809f4ebcffbcb59a8e4f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 132; y: 344 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 121; y: 354 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5872 + hash: "b1085cb508d4613c76e99bc879c62cbf" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 111; y: 363 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5888 + hash: "365fd1260c2109e6d5bd0a97ce3a7e4e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 100; y: 370 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5904 + hash: "3a7d001313b23cbbb7f3d842ab40f41b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 86; y: 377 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 66; y: 385 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5920 + hash: "c5bda48bb2eaee54d6d8416592830327" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 45; y: 394 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5936 + hash: "5d0fd6d8a6ced4f197fe3b09e7e9155b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 29; y: 402 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5952 + hash: "79e2825f98644c061ae5216ae1823e4b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 16; y: 410 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 6; y: 417 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5968 + hash: "22a3978f2f3a0cde67f459527af3b3f2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 0; y: 422 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 427 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5984 + hash: "1511bec94911dd272f78a726e15bf76e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 432 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6000 + hash: "0f892f7e570cdc703e492248c9f54b6c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 439 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6016 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 447 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 452 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6032 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 457 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6048 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 459 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6064 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 464 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 465 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6080 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 467 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6096 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 468 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6112 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 468 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 468 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6128 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 468 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6144 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 468 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6160 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 469 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 470 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6176 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 470 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6192 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Frame { + msec: 6208 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 470 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6224 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -3; y: 470 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -3; y: 470 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6240 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -2; y: 470 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6256 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -1; y: 470 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6272 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -1; y: 468 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 0; y: 467 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6288 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 0; y: 464 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6304 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 0; y: 458 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6320 + hash: "ec34aa6937d2c081bdf11660a5eb461a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -3; y: 441 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 408 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6336 + hash: "58413f9b01f1e0b49519d8b6a3011607" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 366 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6352 + hash: "b3992d2f9c1383c710ee325a94117a8b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 327 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6368 + hash: "bd415044fcf6218d8184cb0206105e65" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 300 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 288 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6384 + hash: "e7296140fe8b28bed77e95e588c0e463" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 280 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6400 + hash: "9ff532223ccccd663809187465e478c2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 276 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6416 + hash: "4de9ca75503db05df5d8274d75c202e5" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 271 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 259 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6432 + hash: "a83b5bc409207e986055081b4ed3faa6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 227 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6448 + hash: "7fdbd00dd3553241f30fd6568a8ab646" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 190 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6464 + hash: "5ebaa67eaadc1ede8c46964fa1dffff1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -4; y: 169 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -2; y: 160 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6480 + hash: "de4bd9ad3cbb9bb19bf75f871b044072" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 1; y: 156 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6496 + hash: "9d762cd4dd6508cf8b54c47b76f4ef37" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 5; y: 155 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6512 + hash: "bdf17c384f4f824a89a06b88ba17c15f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 10; y: 154 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 25; y: 152 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6528 + hash: "f279f28995785afd143726aef7673b50" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 52; y: 149 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6544 + hash: "53b6b82a61d017e12afb01a728d8d856" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 80; y: 148 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6560 + hash: "9a48039175cab1360a0cf5cc195e2082" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 98; y: 148 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 112; y: 150 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6576 + hash: "cfc3991e30eef6c2edb66cb6060b2bde" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 123; y: 153 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6592 + hash: "737d8907f62768e623ba76866a509d1e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 134; y: 155 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6608 + hash: "dea2a596f7d85f29728b33d126d997e5" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 145; y: 158 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 157; y: 161 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6624 + hash: "3969a0bbb284ab1d5efd20cf93b0422d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 168; y: 164 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6640 + hash: "071ff25e49f7f16a727ff58c42ff766e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 176; y: 169 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6656 + hash: "454abec991a4675763f379c256919fa7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 184; y: 173 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 189; y: 177 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6672 + hash: "6de741c4e6057dc8580106155c4ac627" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 194; y: 184 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6688 + hash: "e35853e99cd205b7ccabdf632b238584" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 199; y: 192 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6704 + hash: "15a70a0196227c6bce50ed70cd6383c8" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 204; y: 201 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 211; y: 210 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6720 + hash: "bf4b18a73b53c0a554f9bb0ac32a465d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 217; y: 217 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6736 + image: "drag.7.png" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 224; y: 223 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6752 + hash: "ddd0f27027e23a45aef131296c781865" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 235; y: 228 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 246; y: 232 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6768 + hash: "715102a252756e5a8c4f459d808aec6a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 257; y: 235 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6784 + hash: "42b9c1b894247ddbd85f4a4aca5695f1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 267; y: 239 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6800 + hash: "b67b4bdd412ed5160901803c60c6f19e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 275; y: 239 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 280; y: 239 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6816 + hash: "3490cc41c2b1f9301c209bdb8f052add" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 281; y: 239 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6832 + hash: "df32868d564ebbc41c359409b5a69e7d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 282; y: 239 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6848 + hash: "b9cb430a6f677e67c87322e0aff53fb1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 282; y: 239 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6864 + hash: "b9cb430a6f677e67c87322e0aff53fb1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 281; y: 239 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6880 + hash: "df32868d564ebbc41c359409b5a69e7d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 280; y: 239 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6896 + hash: "3490cc41c2b1f9301c209bdb8f052add" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 279; y: 240 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6912 + hash: "e23a88f49a73cd2a9326095dd380ab55" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 277; y: 240 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6928 + hash: "ffffc1aed27fe77c2fe5c035eab706a9" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 277; y: 240 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6944 + hash: "ffffc1aed27fe77c2fe5c035eab706a9" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 276; y: 240 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6960 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 276; y: 240 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6976 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 6992 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 276; y: 240 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7008 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7024 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7040 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7056 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7072 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7088 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7104 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7120 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7136 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7152 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7168 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7184 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7200 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7216 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7232 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7248 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7264 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7280 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7296 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7312 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7328 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7344 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7360 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7376 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7392 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7408 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7424 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7440 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7456 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7472 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7488 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7504 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7520 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7536 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7552 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7568 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7584 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7600 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7616 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7632 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7648 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7664 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7680 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7696 + image: "drag.8.png" + } + Frame { + msec: 7712 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7728 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7744 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7760 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7776 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7792 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7808 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7824 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7840 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7856 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7872 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7888 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7904 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7920 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7936 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7952 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7968 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 7984 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } + Frame { + msec: 8000 + hash: "2c1ce07ab6ce0072f6cb205f1e5297e0" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.0.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.0.png new file mode 100644 index 00000000..87305b34 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.1.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.1.png new file mode 100644 index 00000000..87305b34 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.10.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.10.png new file mode 100644 index 00000000..87305b34 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.10.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.11.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.11.png new file mode 100644 index 00000000..b268c5cc Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.11.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.12.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.12.png new file mode 100644 index 00000000..3926b9be Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.12.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.13.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.13.png new file mode 100644 index 00000000..69561957 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.13.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.14.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.14.png new file mode 100644 index 00000000..87305b34 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.14.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.2.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.2.png new file mode 100644 index 00000000..87305b34 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.3.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.3.png new file mode 100644 index 00000000..1d126919 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.4.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.4.png new file mode 100644 index 00000000..1d126919 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.5.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.5.png new file mode 100644 index 00000000..7f76076f Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.5.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.6.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.6.png new file mode 100644 index 00000000..02c6af06 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.6.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.7.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.7.png new file mode 100644 index 00000000..15f0ec5c Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.7.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.8.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.8.png new file mode 100644 index 00000000..15f0ec5c Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.8.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.9.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.9.png new file mode 100644 index 00000000..71bf9cd8 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.9.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.qml b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.qml new file mode 100644 index 00000000..c8626782 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-flickable.qml @@ -0,0 +1,5127 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "mousearea-flickable.0.png" + } + Frame { + msec: 32 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 48 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 64 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 80 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 96 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 112 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 128 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 144 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 160 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 176 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 192 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 208 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 224 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 240 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 256 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 272 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 288 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 304 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 320 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 336 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 352 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 368 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 384 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 400 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 416 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 432 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 448 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 464 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 480 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 496 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 512 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 528 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 544 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 560 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 576 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 592 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 608 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 624 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 640 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 656 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 672 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 688 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 704 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 720 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 736 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 752 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 768 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 784 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 800 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 816 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 832 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 848 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 864 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 880 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 896 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 912 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 928 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 944 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 960 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 976 + image: "mousearea-flickable.1.png" + } + Frame { + msec: 992 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1008 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1024 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1040 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1056 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1072 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1088 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1104 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1120 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1136 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1152 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1168 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1184 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1200 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1216 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1232 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1248 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1264 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1280 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1296 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1312 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1328 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1344 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1360 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1376 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1392 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1408 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1424 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1440 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1456 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1472 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1488 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1504 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1520 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1536 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1552 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1568 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1584 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1600 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1616 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1632 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1648 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1664 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1680 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1696 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1712 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1728 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1744 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1760 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1776 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1792 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1808 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1824 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1840 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1856 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1872 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1888 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1904 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1920 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1936 + image: "mousearea-flickable.2.png" + } + Frame { + msec: 1952 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1968 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 1984 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2000 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2016 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2032 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2048 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2064 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2080 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2096 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2112 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2128 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2144 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2160 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2176 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2192 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2208 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2224 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2240 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2256 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2272 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2288 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2304 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2320 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2336 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2352 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2368 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2384 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2400 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2416 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2432 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2448 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2464 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2480 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2496 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2512 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2528 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2544 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2560 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2576 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2592 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 2608 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 188; y: 41 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2624 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 2640 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 2656 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 2672 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 2688 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 2704 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 2720 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 2736 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 2752 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 2768 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 2784 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 2800 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 2816 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 2832 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 2848 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 2864 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 2880 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 2896 + image: "mousearea-flickable.3.png" + } + Frame { + msec: 2912 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 2928 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 2944 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 2960 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 2976 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 2992 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3008 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3024 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3040 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3056 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3072 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3088 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3104 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3120 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3136 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3152 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3168 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3184 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3200 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3216 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3232 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3248 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3264 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3280 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3296 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3312 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3328 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3344 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3360 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3376 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3392 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3408 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3424 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3440 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3456 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3472 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3488 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3504 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3520 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3536 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3552 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3568 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3584 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3600 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3616 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3632 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3648 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3664 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3680 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3696 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3712 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3728 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3744 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3760 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3776 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3792 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3808 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3824 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3840 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3856 + image: "mousearea-flickable.4.png" + } + Frame { + msec: 3872 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3888 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3904 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3920 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3936 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3952 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3968 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 3984 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 4000 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 4016 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 4032 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 4048 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 4064 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 4080 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 4096 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 4112 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 4128 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 4144 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 4160 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 4176 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 4192 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 4208 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 4224 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 4240 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 4256 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 4272 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 4288 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 4304 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 4320 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 4336 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 4352 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 4368 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 4384 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 4400 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 4416 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 4432 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 4448 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 4464 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 4480 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 4496 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Frame { + msec: 4512 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 189; y: 42 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4528 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 189; y: 44 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4544 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 190; y: 45 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 190; y: 47 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4560 + hash: "4a60ab820ca66548384b2257b21de8ec" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 190; y: 48 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 190; y: 50 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4576 + hash: "d75a43305e2884759ca41d7b1cbadf52" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 191; y: 51 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 191; y: 53 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4592 + hash: "9f9f85d5f879b0e52ebc751d6668cfb8" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 191; y: 54 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 192; y: 56 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4608 + hash: "a569789b082296415321ba11c859abe5" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 192; y: 57 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 192; y: 59 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4624 + hash: "7a5f69a1eecb5de0fc2295cd287eb449" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 193; y: 61 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 193; y: 62 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4640 + hash: "70e522f64236dfa4e1613ffc29b4b23e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 193; y: 64 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 194; y: 66 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4656 + hash: "11120d6de575ffa639b6abb3af4afef7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 194; y: 68 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 194; y: 70 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4672 + hash: "ab4c936a81299adf080f3b14f7e6be49" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 195; y: 72 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 195; y: 75 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4688 + hash: "c29ab366ba3f11de6452949c11310b4a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 196; y: 77 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 196; y: 79 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4704 + hash: "34ef0279e3731447f1df97784b47648a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 196; y: 82 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 197; y: 84 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4720 + hash: "84df34cd981e0465aaaae47881de6c3b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 197; y: 86 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 197; y: 88 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4736 + hash: "837deeb2a92648d830acf29e829ebb53" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 198; y: 90 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 198; y: 92 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4752 + hash: "572cb62d69ccb973ea18d3b0eaff571b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 198; y: 94 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 198; y: 97 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4768 + hash: "3d75735eefbf95f37e2a8605b9167ba1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 199; y: 99 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 199; y: 101 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4784 + hash: "c37507a29e3a6d80446ad68f2d92f266" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 199; y: 106 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4800 + hash: "b66571ae47bf129be88dc66785a81a7d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 200; y: 111 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4816 + image: "mousearea-flickable.5.png" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 200; y: 113 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 200; y: 116 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4832 + hash: "363eca81f97f20f14e8d480f83d2bc7d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 201; y: 121 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4848 + hash: "72e75cfa62993593303b25cbff4af0e6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 201; y: 124 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 203; y: 130 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4864 + hash: "cc6619c7cd6e4e274df4729aad6cca46" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 203; y: 133 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 203; y: 135 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4880 + hash: "0b16e524cd5253d07aa9b5855967fa71" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 203; y: 138 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 205; y: 146 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4896 + hash: "091d1ad7aba4b662cba98214c98a4707" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 205; y: 149 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 205; y: 152 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4912 + hash: "f334bfcc3af89bf1405762a215c54ea6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 207; y: 161 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4928 + hash: "7b41d651ad46341859d0188db341ae10" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 207; y: 164 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 208; y: 166 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4944 + hash: "95b57cd3dac3bce56674f2c4143f42d4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 208; y: 172 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4960 + hash: "1709dda08ce7494ff6d082cc5d93f0d2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 208; y: 175 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 209; y: 177 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4976 + hash: "390105f21526e1f8fda15666631578a1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 209; y: 180 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 209; y: 182 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4992 + hash: "ee40862a59f14667c89fa62f380c10fb" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 209; y: 187 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5008 + hash: "6d6cec95a6a2445d88b015ff76af032e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 209; y: 189 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 209; y: 192 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5024 + hash: "e87bf82b6a7a928a27bffd9cb2dd7604" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 210; y: 194 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 210; y: 196 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5040 + hash: "9a9d1e0b1d7b9291480b3ec641f354ce" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 210; y: 198 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 210; y: 200 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5056 + hash: "d1372239a681d1fccc25257b4a02fb39" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 210; y: 202 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 211; y: 204 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5072 + hash: "1f37473ab2fb0643e11e4a41a2ee4561" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 211; y: 205 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 211; y: 207 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5088 + hash: "1533c6ff17e79a47a5d3510aa85bcf8a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 211; y: 209 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 211; y: 210 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5104 + hash: "c5980322acf00a04efbd5e1b92aa0e98" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 211; y: 211 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 211; y: 213 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5120 + hash: "b81183233961b34c2a3f21a249b0fbfb" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 211; y: 215 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5136 + hash: "2dc2def0c748ac94d33d90d4a3610136" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 211; y: 217 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5152 + hash: "9f876eb93a16c24843dd6a5acd303ab3" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 211; y: 218 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5168 + hash: "9f876eb93a16c24843dd6a5acd303ab3" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 210; y: 219 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 210; y: 220 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5184 + hash: "237dd62011f4253970b946b335e3fb71" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 210; y: 222 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5200 + hash: "6206ad3e633b6b1b068304caa4efe48a" + } + Frame { + msec: 5216 + hash: "6206ad3e633b6b1b068304caa4efe48a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 210; y: 223 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5232 + hash: "1eb5f0e1aa014a38e6ca66ddfc2a076b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 209; y: 224 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5248 + hash: "1eb5f0e1aa014a38e6ca66ddfc2a076b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 209; y: 225 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5264 + hash: "d9e953d132330f8a58a190d61aec6ec3" + } + Frame { + msec: 5280 + hash: "d9e953d132330f8a58a190d61aec6ec3" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 209; y: 226 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5296 + hash: "d9e953d132330f8a58a190d61aec6ec3" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 209; y: 227 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5312 + hash: "c1570ad4cb688ea51818e0a09e349daa" + } + Frame { + msec: 5328 + hash: "c1570ad4cb688ea51818e0a09e349daa" + } + Frame { + msec: 5344 + hash: "c1570ad4cb688ea51818e0a09e349daa" + } + Frame { + msec: 5360 + hash: "c1570ad4cb688ea51818e0a09e349daa" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 209; y: 227 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5376 + hash: "c1570ad4cb688ea51818e0a09e349daa" + } + Frame { + msec: 5392 + hash: "d9e953d132330f8a58a190d61aec6ec3" + } + Frame { + msec: 5408 + hash: "1eb5f0e1aa014a38e6ca66ddfc2a076b" + } + Frame { + msec: 5424 + hash: "9f876eb93a16c24843dd6a5acd303ab3" + } + Frame { + msec: 5440 + hash: "4cad3c6caf8d3009f63923df897c4723" + } + Frame { + msec: 5456 + hash: "79538d2f507fd6eea7ea1f990e90388a" + } + Frame { + msec: 5472 + hash: "e87bf82b6a7a928a27bffd9cb2dd7604" + } + Frame { + msec: 5488 + hash: "390105f21526e1f8fda15666631578a1" + } + Frame { + msec: 5504 + hash: "7b41d651ad46341859d0188db341ae10" + } + Frame { + msec: 5520 + hash: "091d1ad7aba4b662cba98214c98a4707" + } + Frame { + msec: 5536 + hash: "1978cda418856b542d7c5a155b74f09c" + } + Frame { + msec: 5552 + hash: "01bf03313a0229e810a24e2adbbe9775" + } + Frame { + msec: 5568 + hash: "79650397b868019909b931a32a115823" + } + Frame { + msec: 5584 + hash: "84df34cd981e0465aaaae47881de6c3b" + } + Frame { + msec: 5600 + hash: "c29ab366ba3f11de6452949c11310b4a" + } + Frame { + msec: 5616 + hash: "ab4c936a81299adf080f3b14f7e6be49" + } + Frame { + msec: 5632 + hash: "11120d6de575ffa639b6abb3af4afef7" + } + Frame { + msec: 5648 + hash: "70e522f64236dfa4e1613ffc29b4b23e" + } + Frame { + msec: 5664 + hash: "86b32befe0dada5bdce82a7dd14777ce" + } + Frame { + msec: 5680 + hash: "a569789b082296415321ba11c859abe5" + } + Frame { + msec: 5696 + hash: "9f9f85d5f879b0e52ebc751d6668cfb8" + } + Frame { + msec: 5712 + hash: "9f9f85d5f879b0e52ebc751d6668cfb8" + } + Frame { + msec: 5728 + hash: "43fc85bb3b1501f5e12f1fedaaa14c64" + } + Frame { + msec: 5744 + hash: "43fc85bb3b1501f5e12f1fedaaa14c64" + } + Frame { + msec: 5760 + hash: "d75a43305e2884759ca41d7b1cbadf52" + } + Frame { + msec: 5776 + image: "mousearea-flickable.6.png" + } + Frame { + msec: 5792 + hash: "d75a43305e2884759ca41d7b1cbadf52" + } + Frame { + msec: 5808 + hash: "d75a43305e2884759ca41d7b1cbadf52" + } + Frame { + msec: 5824 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 5840 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 5856 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 5872 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 5888 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 5904 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 5920 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 5936 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 5952 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 5968 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 5984 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 6000 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 6016 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 6032 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 6048 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 6064 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 6080 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 6096 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 6112 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 6128 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 6144 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 6160 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 6176 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 6192 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 6208 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 6224 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 6240 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 6256 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 6272 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 6288 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 6304 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 6320 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 6336 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 6352 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 6368 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 188; y: 180 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6384 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6400 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6416 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6432 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6448 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6464 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6480 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6496 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6512 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6528 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6544 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6560 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6576 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6592 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6608 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6624 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6640 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6656 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6672 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6688 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6704 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6720 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6736 + image: "mousearea-flickable.7.png" + } + Frame { + msec: 6752 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6768 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6784 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6800 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6816 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6832 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6848 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6864 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6880 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6896 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6912 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6928 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6944 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6960 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6976 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 6992 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7008 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7024 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7040 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7056 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7072 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7088 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7104 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7120 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7136 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7152 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7168 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7184 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7200 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7216 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7232 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7248 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7264 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7280 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7296 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7312 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7328 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7344 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7360 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7376 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7392 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7408 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7424 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7440 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7456 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7472 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7488 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7504 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7520 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7536 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7552 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7568 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7584 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7600 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7616 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7632 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7648 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7664 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7680 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7696 + image: "mousearea-flickable.8.png" + } + Frame { + msec: 7712 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7728 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7744 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7760 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7776 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7792 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7808 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7824 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7840 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7856 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7872 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7888 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7904 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7920 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7936 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7952 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7968 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 7984 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 8000 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 8016 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 8032 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 8048 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 8064 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 8080 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 8096 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 8112 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 8128 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 8144 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 8160 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 8176 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Frame { + msec: 8192 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 188; y: 182 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8208 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 188; y: 183 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8224 + hash: "037386eb30a5e8d53a20a11258ee0f60" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 189; y: 185 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 189; y: 186 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8240 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 191; y: 194 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8256 + hash: "a569789b082296415321ba11c859abe5" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 191; y: 196 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 192; y: 198 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8272 + hash: "7a5f69a1eecb5de0fc2295cd287eb449" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 192; y: 201 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 192; y: 203 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8288 + hash: "11120d6de575ffa639b6abb3af4afef7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 194; y: 211 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 194; y: 214 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8304 + hash: "c29ab366ba3f11de6452949c11310b4a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 194; y: 219 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8320 + hash: "4e129ebba85d1f3717d09f71eb5a1a7d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 194; y: 225 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8336 + hash: "837deeb2a92648d830acf29e829ebb53" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 192; y: 231 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 192; y: 234 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8352 + hash: "79650397b868019909b931a32a115823" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 192; y: 240 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8368 + hash: "c37507a29e3a6d80446ad68f2d92f266" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 192; y: 245 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8384 + hash: "01bf03313a0229e810a24e2adbbe9775" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 192; y: 248 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 192; y: 251 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8400 + hash: "8ffbbed46737837e55383833b96d2624" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 192; y: 257 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8416 + hash: "6d49fc41fb6d74643c7613df7e417833" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 192; y: 259 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 192; y: 262 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8432 + hash: "806d22bc3533c729cd10dc889c36902d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 192; y: 265 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 192; y: 267 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8448 + hash: "cc6619c7cd6e4e274df4729aad6cca46" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 192; y: 270 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 192; y: 272 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8464 + hash: "929bf28dcb97e8c93dae5dbe23beecc8" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 192; y: 275 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 192; y: 278 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8480 + hash: "0121c18897c37481fddbac57db636a60" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 193; y: 283 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8496 + hash: "091d1ad7aba4b662cba98214c98a4707" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 193; y: 285 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 193; y: 288 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8512 + hash: "ce673b66f695f5b002515a5416bbf913" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 194; y: 290 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 194; y: 293 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8528 + hash: "66f71641c7a607152f140428ab9621d6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 194; y: 298 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8544 + hash: "29ca97cc573d3a1fde65320b61678c60" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 194; y: 299 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 196; y: 305 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8560 + hash: "021bda841eaefa76ce5e1c97150af6f6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 196; y: 306 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 196; y: 308 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8576 + hash: "b1ea82b880a2fc35bf1ed117d8ab21b0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 196; y: 310 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 196; y: 312 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8592 + hash: "80edf52cc9e64a29f677bc2203220ba9" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 196; y: 316 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8608 + hash: "390105f21526e1f8fda15666631578a1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 196; y: 318 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 196; y: 320 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8624 + hash: "ee40862a59f14667c89fa62f380c10fb" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 196; y: 322 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 196; y: 324 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8640 + hash: "524db6ce45674c777d72f9206415be2f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 196; y: 328 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8656 + image: "mousearea-flickable.9.png" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 196; y: 330 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 196; y: 332 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8672 + hash: "3ca9742356b6ff833fd287a95520174a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 196; y: 335 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 196; y: 338 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8688 + hash: "d1372239a681d1fccc25257b4a02fb39" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 196; y: 341 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 198; y: 347 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8704 + hash: "c5980322acf00a04efbd5e1b92aa0e98" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 198; y: 350 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 200; y: 356 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8720 + hash: "9f876eb93a16c24843dd6a5acd303ab3" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 200; y: 358 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 200; y: 360 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8736 + hash: "6206ad3e633b6b1b068304caa4efe48a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 201; y: 364 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8752 + hash: "d9e953d132330f8a58a190d61aec6ec3" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 201; y: 366 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8768 + hash: "c1570ad4cb688ea51818e0a09e349daa" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 202; y: 368 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8784 + hash: "11853dcbad9d1d9a8b7d8a4e6fcca140" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 202; y: 369 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8800 + hash: "c6a81be579382f25ac583734897c2570" + } + Frame { + msec: 8816 + hash: "c6a81be579382f25ac583734897c2570" + } + Frame { + msec: 8832 + hash: "c6a81be579382f25ac583734897c2570" + } + Frame { + msec: 8848 + hash: "c6a81be579382f25ac583734897c2570" + } + Frame { + msec: 8864 + hash: "c6a81be579382f25ac583734897c2570" + } + Frame { + msec: 8880 + hash: "c6a81be579382f25ac583734897c2570" + } + Frame { + msec: 8896 + hash: "c6a81be579382f25ac583734897c2570" + } + Frame { + msec: 8912 + hash: "c6a81be579382f25ac583734897c2570" + } + Frame { + msec: 8928 + hash: "c6a81be579382f25ac583734897c2570" + } + Frame { + msec: 8944 + hash: "c6a81be579382f25ac583734897c2570" + } + Frame { + msec: 8960 + hash: "c6a81be579382f25ac583734897c2570" + } + Frame { + msec: 8976 + hash: "c6a81be579382f25ac583734897c2570" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 202; y: 369 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8992 + hash: "c6a81be579382f25ac583734897c2570" + } + Frame { + msec: 9008 + hash: "11853dcbad9d1d9a8b7d8a4e6fcca140" + } + Frame { + msec: 9024 + hash: "c1570ad4cb688ea51818e0a09e349daa" + } + Frame { + msec: 9040 + hash: "6206ad3e633b6b1b068304caa4efe48a" + } + Frame { + msec: 9056 + hash: "2dc2def0c748ac94d33d90d4a3610136" + } + Frame { + msec: 9072 + hash: "2010f6f0c34e59f505bbe1aab262b646" + } + Frame { + msec: 9088 + hash: "3ca9742356b6ff833fd287a95520174a" + } + Frame { + msec: 9104 + hash: "c09f4002ed9d41f62bb1aaff95723cce" + } + Frame { + msec: 9120 + hash: "95b57cd3dac3bce56674f2c4143f42d4" + } + Frame { + msec: 9136 + hash: "52d45e8dde81fef5ee93bbd5a40d4851" + } + Frame { + msec: 9152 + hash: "1978cda418856b542d7c5a155b74f09c" + } + Frame { + msec: 9168 + hash: "7d03030f5a672d87aeabefdf4f3a39a4" + } + Frame { + msec: 9184 + hash: "79650397b868019909b931a32a115823" + } + Frame { + msec: 9200 + hash: "82f54d7e254edcf499ea12a63118e8a7" + } + Frame { + msec: 9216 + hash: "8517007d5102af238935e93a3b38087f" + } + Frame { + msec: 9232 + hash: "ab4c936a81299adf080f3b14f7e6be49" + } + Frame { + msec: 9248 + hash: "11120d6de575ffa639b6abb3af4afef7" + } + Frame { + msec: 9264 + hash: "70e522f64236dfa4e1613ffc29b4b23e" + } + Frame { + msec: 9280 + hash: "86b32befe0dada5bdce82a7dd14777ce" + } + Frame { + msec: 9296 + hash: "a569789b082296415321ba11c859abe5" + } + Frame { + msec: 9312 + hash: "9f9f85d5f879b0e52ebc751d6668cfb8" + } + Frame { + msec: 9328 + hash: "9f9f85d5f879b0e52ebc751d6668cfb8" + } + Frame { + msec: 9344 + hash: "43fc85bb3b1501f5e12f1fedaaa14c64" + } + Frame { + msec: 9360 + hash: "43fc85bb3b1501f5e12f1fedaaa14c64" + } + Frame { + msec: 9376 + hash: "d75a43305e2884759ca41d7b1cbadf52" + } + Frame { + msec: 9392 + hash: "d75a43305e2884759ca41d7b1cbadf52" + } + Frame { + msec: 9408 + hash: "d75a43305e2884759ca41d7b1cbadf52" + } + Frame { + msec: 9424 + hash: "d75a43305e2884759ca41d7b1cbadf52" + } + Frame { + msec: 9440 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 9456 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 9472 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 9488 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 9504 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 9520 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 9536 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 9552 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 9568 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 9584 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 9600 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 9616 + image: "mousearea-flickable.10.png" + } + Frame { + msec: 9632 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 9648 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 9664 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 9680 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 9696 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 9712 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 9728 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 9744 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 205; y: 307 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9760 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 9776 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 9792 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 9808 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 9824 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 9840 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 9856 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 9872 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 9888 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 9904 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 9920 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 9936 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 9952 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 9968 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 9984 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10000 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10016 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10032 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10048 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10064 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10080 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10096 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10112 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10128 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10144 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10160 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10176 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10192 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10208 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10224 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10240 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10256 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10272 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10288 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10304 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10320 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10336 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10352 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10368 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10384 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10400 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10416 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10432 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10448 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10464 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10480 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10496 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10512 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10528 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10544 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10560 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10576 + image: "mousearea-flickable.11.png" + } + Frame { + msec: 10592 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10608 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10624 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10640 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10656 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10672 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10688 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10704 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10720 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10736 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10752 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10768 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10784 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10800 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10816 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10832 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10848 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10864 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10880 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10896 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10912 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10928 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10944 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10960 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10976 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 10992 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 11008 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 11024 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 11040 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 11056 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 11072 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 11088 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 205; y: 308 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11104 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 11120 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 11136 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 205; y: 309 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11152 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 11168 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Frame { + msec: 11184 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 205; y: 310 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11200 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 205; y: 311 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11216 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 205; y: 312 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11232 + hash: "90cdfe8920f115fd55cde6fdbd95e867" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 206; y: 313 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 206; y: 314 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11248 + hash: "d75a43305e2884759ca41d7b1cbadf52" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 206; y: 316 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 206; y: 317 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11264 + hash: "43fc85bb3b1501f5e12f1fedaaa14c64" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 206; y: 319 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 206; y: 321 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11280 + hash: "a569789b082296415321ba11c859abe5" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 206; y: 324 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11296 + hash: "7a5f69a1eecb5de0fc2295cd287eb449" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 206; y: 326 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 206; y: 327 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11312 + hash: "70e522f64236dfa4e1613ffc29b4b23e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 206; y: 330 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 206; y: 332 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11328 + hash: "8e05207e0d0d9d15a61a0d21d985a83a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 206; y: 335 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 206; y: 337 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11344 + hash: "dc272fc8fc98d822a154da1d495d4f7e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 204; y: 343 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 204; y: 345 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11360 + hash: "34ef0279e3731447f1df97784b47648a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 204; y: 348 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 204; y: 350 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11376 + hash: "82f54d7e254edcf499ea12a63118e8a7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 204; y: 352 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 204; y: 355 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11392 + hash: "6ef4abc294d928381346e8ff9b012475" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 204; y: 357 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 204; y: 359 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11408 + hash: "7d2606d432858288dac019e0002ff85a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 204; y: 361 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 204; y: 363 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11424 + hash: "3d75735eefbf95f37e2a8605b9167ba1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 204; y: 365 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 204; y: 367 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11440 + hash: "c37507a29e3a6d80446ad68f2d92f266" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 203; y: 369 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 203; y: 371 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11456 + hash: "b66571ae47bf129be88dc66785a81a7d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 203; y: 373 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 203; y: 375 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11472 + hash: "7d03030f5a672d87aeabefdf4f3a39a4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 203; y: 379 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11488 + hash: "8ffbbed46737837e55383833b96d2624" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 203; y: 381 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 203; y: 383 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11504 + hash: "aafb12a520eb443ee1348282f2c54e4a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 203; y: 385 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 203; y: 387 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11520 + hash: "72e75cfa62993593303b25cbff4af0e6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 203; y: 389 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 203; y: 392 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11536 + image: "mousearea-flickable.12.png" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 203; y: 394 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 204; y: 396 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11552 + hash: "1451addb43319318c794333cd1cec3fd" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 204; y: 398 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 204; y: 399 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11568 + hash: "929bf28dcb97e8c93dae5dbe23beecc8" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 205; y: 402 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11584 + hash: "cb49adcd2c8afe27fd5926bd622added" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 205; y: 404 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 205; y: 406 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11600 + hash: "d0b4215b43403c97d83250add6d2b6db" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 205; y: 407 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 206; y: 409 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11616 + hash: "c0a569ee064d844835dddab11eadcd33" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 206; y: 410 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11632 + hash: "091d1ad7aba4b662cba98214c98a4707" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 206; y: 411 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 206; y: 412 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11648 + hash: "52d45e8dde81fef5ee93bbd5a40d4851" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 207; y: 414 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11664 + hash: "ce673b66f695f5b002515a5416bbf913" + } + Frame { + msec: 11680 + hash: "ce673b66f695f5b002515a5416bbf913" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 207; y: 415 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11696 + hash: "ce673b66f695f5b002515a5416bbf913" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 207; y: 416 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11712 + hash: "f334bfcc3af89bf1405762a215c54ea6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 207; y: 417 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11728 + hash: "f334bfcc3af89bf1405762a215c54ea6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 208; y: 418 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11744 + hash: "ee0523fe6a33b59871ad3b311ca0cbeb" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 208; y: 419 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11760 + hash: "ee0523fe6a33b59871ad3b311ca0cbeb" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 208; y: 421 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11776 + hash: "66f71641c7a607152f140428ab9621d6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 208; y: 423 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11792 + hash: "ddd3d8cb82e238358cdb16c1df7d27b7" + } + Frame { + msec: 11808 + hash: "ddd3d8cb82e238358cdb16c1df7d27b7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 208; y: 424 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11824 + hash: "29ca97cc573d3a1fde65320b61678c60" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 208; y: 425 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11840 + hash: "29ca97cc573d3a1fde65320b61678c60" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 209; y: 426 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11856 + hash: "7b41d651ad46341859d0188db341ae10" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 209; y: 428 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11872 + hash: "6b236864b7d95bf9f76b8afd6ba78613" + } + Frame { + msec: 11888 + hash: "6b236864b7d95bf9f76b8afd6ba78613" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 209; y: 429 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11904 + hash: "6b236864b7d95bf9f76b8afd6ba78613" + } + Frame { + msec: 11920 + hash: "6b236864b7d95bf9f76b8afd6ba78613" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 209; y: 430 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11936 + hash: "95b57cd3dac3bce56674f2c4143f42d4" + } + Frame { + msec: 11952 + hash: "95b57cd3dac3bce56674f2c4143f42d4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 209; y: 431 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11968 + hash: "95b57cd3dac3bce56674f2c4143f42d4" + } + Frame { + msec: 11984 + hash: "95b57cd3dac3bce56674f2c4143f42d4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 209; y: 432 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 12000 + hash: "021bda841eaefa76ce5e1c97150af6f6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 209; y: 433 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 12016 + hash: "021bda841eaefa76ce5e1c97150af6f6" + } + Frame { + msec: 12032 + hash: "021bda841eaefa76ce5e1c97150af6f6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 210; y: 434 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 12048 + hash: "b1ea82b880a2fc35bf1ed117d8ab21b0" + } + Frame { + msec: 12064 + hash: "b1ea82b880a2fc35bf1ed117d8ab21b0" + } + Frame { + msec: 12080 + hash: "b1ea82b880a2fc35bf1ed117d8ab21b0" + } + Frame { + msec: 12096 + hash: "b1ea82b880a2fc35bf1ed117d8ab21b0" + } + Frame { + msec: 12112 + hash: "b1ea82b880a2fc35bf1ed117d8ab21b0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 210; y: 435 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 12128 + hash: "b1ea82b880a2fc35bf1ed117d8ab21b0" + } + Frame { + msec: 12144 + hash: "b1ea82b880a2fc35bf1ed117d8ab21b0" + } + Frame { + msec: 12160 + hash: "b1ea82b880a2fc35bf1ed117d8ab21b0" + } + Frame { + msec: 12176 + hash: "b1ea82b880a2fc35bf1ed117d8ab21b0" + } + Frame { + msec: 12192 + hash: "b1ea82b880a2fc35bf1ed117d8ab21b0" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 210; y: 435 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 12208 + hash: "b1ea82b880a2fc35bf1ed117d8ab21b0" + } + Frame { + msec: 12224 + hash: "b1ea82b880a2fc35bf1ed117d8ab21b0" + } + Frame { + msec: 12240 + hash: "021bda841eaefa76ce5e1c97150af6f6" + } + Frame { + msec: 12256 + hash: "6b236864b7d95bf9f76b8afd6ba78613" + } + Frame { + msec: 12272 + hash: "ddd3d8cb82e238358cdb16c1df7d27b7" + } + Frame { + msec: 12288 + hash: "f334bfcc3af89bf1405762a215c54ea6" + } + Frame { + msec: 12304 + hash: "091d1ad7aba4b662cba98214c98a4707" + } + Frame { + msec: 12320 + hash: "0b16e524cd5253d07aa9b5855967fa71" + } + Frame { + msec: 12336 + hash: "1978cda418856b542d7c5a155b74f09c" + } + Frame { + msec: 12352 + hash: "8ffbbed46737837e55383833b96d2624" + } + Frame { + msec: 12368 + hash: "43e50f4d4d37373e26af0a5d3cb64c4c" + } + Frame { + msec: 12384 + hash: "837deeb2a92648d830acf29e829ebb53" + } + Frame { + msec: 12400 + hash: "34ef0279e3731447f1df97784b47648a" + } + Frame { + msec: 12416 + hash: "dc272fc8fc98d822a154da1d495d4f7e" + } + Frame { + msec: 12432 + hash: "8e05207e0d0d9d15a61a0d21d985a83a" + } + Frame { + msec: 12448 + hash: "144eeb7c2a32cedb6ebba063501c9176" + } + Frame { + msec: 12464 + hash: "7a5f69a1eecb5de0fc2295cd287eb449" + } + Frame { + msec: 12480 + hash: "86b32befe0dada5bdce82a7dd14777ce" + } + Frame { + msec: 12496 + image: "mousearea-flickable.13.png" + } + Frame { + msec: 12512 + hash: "9f9f85d5f879b0e52ebc751d6668cfb8" + } + Frame { + msec: 12528 + hash: "43fc85bb3b1501f5e12f1fedaaa14c64" + } + Frame { + msec: 12544 + hash: "43fc85bb3b1501f5e12f1fedaaa14c64" + } + Frame { + msec: 12560 + hash: "d75a43305e2884759ca41d7b1cbadf52" + } + Frame { + msec: 12576 + hash: "d75a43305e2884759ca41d7b1cbadf52" + } + Frame { + msec: 12592 + hash: "d75a43305e2884759ca41d7b1cbadf52" + } + Frame { + msec: 12608 + hash: "d75a43305e2884759ca41d7b1cbadf52" + } + Frame { + msec: 12624 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 12640 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 12656 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 12672 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 12688 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 12704 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 12720 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 12736 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 12752 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 12768 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 12784 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 12800 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 12816 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 12832 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 12848 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 12864 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 12880 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 12896 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 12912 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 12928 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 12944 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 12960 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 12976 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 12992 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 13008 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 13024 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 13040 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 13056 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 13072 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 13088 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 13104 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 13120 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 13136 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 13152 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 13168 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 13184 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 13200 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 13216 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 13232 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 13248 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 13264 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 13280 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 13296 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 13312 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 13328 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 13344 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 13360 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Key { + type: 6 + key: 16777251 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 13376 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 13392 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 13408 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 13424 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 13440 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 13456 + image: "mousearea-flickable.14.png" + } + Frame { + msec: 13472 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 13488 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } + Frame { + msec: 13504 + hash: "cc1fd2f4c3be318052254a9b6be7a57b" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.0.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.0.png new file mode 100644 index 00000000..e2e90d2b Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.1.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.1.png new file mode 100644 index 00000000..e2e90d2b Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.10.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.10.png new file mode 100644 index 00000000..93cf54c7 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.10.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.11.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.11.png new file mode 100644 index 00000000..93cf54c7 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.11.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.12.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.12.png new file mode 100644 index 00000000..93cf54c7 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.12.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.13.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.13.png new file mode 100644 index 00000000..93cf54c7 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.13.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.14.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.14.png new file mode 100644 index 00000000..93cf54c7 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.14.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.15.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.15.png new file mode 100644 index 00000000..93cf54c7 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.15.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.2.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.2.png new file mode 100644 index 00000000..25facec9 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.3.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.3.png new file mode 100644 index 00000000..25facec9 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.4.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.4.png new file mode 100644 index 00000000..25facec9 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.5.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.5.png new file mode 100644 index 00000000..630b14aa Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.5.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.6.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.6.png new file mode 100644 index 00000000..630b14aa Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.6.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.7.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.7.png new file mode 100644 index 00000000..630b14aa Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.7.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.8.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.8.png new file mode 100644 index 00000000..630b14aa Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.8.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.9.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.9.png new file mode 100644 index 00000000..93cf54c7 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.9.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.qml b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.qml new file mode 100644 index 00000000..2daeebcc --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mousearea-visual.qml @@ -0,0 +1,5867 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "mousearea-visual.0.png" + } + Frame { + msec: 32 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 48 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 64 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 80 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 96 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 112 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 128 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 144 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 160 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 176 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 192 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 208 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 224 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 240 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 256 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 272 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 288 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 304 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 320 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 336 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 352 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 368 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 384 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 400 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 416 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 432 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 448 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 464 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 480 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 496 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 512 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 528 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 544 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 560 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 576 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 592 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 608 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 624 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 640 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 656 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 672 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 688 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 704 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 720 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 736 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 752 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 768 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 784 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 800 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 816 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 832 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 848 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 864 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 880 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 896 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 912 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 928 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 944 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 960 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 976 + image: "mousearea-visual.1.png" + } + Frame { + msec: 992 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1008 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1024 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1040 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1056 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1072 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1088 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1104 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1120 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1136 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1152 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1168 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1184 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1200 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1216 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1232 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1248 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1264 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1280 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1296 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1312 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1328 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1344 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1360 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1376 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1392 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1408 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1424 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1440 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1456 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1472 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1488 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1504 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1520 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1536 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1552 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1568 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1584 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1600 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1616 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1632 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1648 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Frame { + msec: 1664 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 2; y: 29 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 7; y: 32 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1680 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 19; y: 40 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 33; y: 48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1696 + hash: "1121bb51fc2d4c5c7ef3ae2c44794b49" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 49; y: 54 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1712 + hash: "337f0f4af627bbdf8807135ce39d5070" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 67; y: 56 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 74; y: 56 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1728 + hash: "337f0f4af627bbdf8807135ce39d5070" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 78; y: 57 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 81; y: 57 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1744 + hash: "337f0f4af627bbdf8807135ce39d5070" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 82; y: 56 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 83; y: 55 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1760 + hash: "337f0f4af627bbdf8807135ce39d5070" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 83; y: 54 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1776 + hash: "337f0f4af627bbdf8807135ce39d5070" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 83; y: 53 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1792 + hash: "337f0f4af627bbdf8807135ce39d5070" + } + Frame { + msec: 1808 + hash: "337f0f4af627bbdf8807135ce39d5070" + } + Frame { + msec: 1824 + hash: "337f0f4af627bbdf8807135ce39d5070" + } + Frame { + msec: 1840 + hash: "337f0f4af627bbdf8807135ce39d5070" + } + Frame { + msec: 1856 + hash: "337f0f4af627bbdf8807135ce39d5070" + } + Frame { + msec: 1872 + hash: "337f0f4af627bbdf8807135ce39d5070" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 83; y: 52 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 82; y: 51 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1888 + hash: "337f0f4af627bbdf8807135ce39d5070" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 80; y: 50 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 78; y: 48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1904 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 75; y: 46 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 73; y: 45 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1920 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 71; y: 43 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 68; y: 41 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1936 + image: "mousearea-visual.2.png" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 66; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1952 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 64; y: 39 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 63; y: 37 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1968 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 61; y: 36 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 60; y: 36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1984 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 58; y: 34 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 57; y: 33 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2000 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 56; y: 32 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2016 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 55; y: 30 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 54; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2032 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2048 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2064 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2080 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2096 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2112 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2128 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 54; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2144 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2160 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2176 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2192 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2208 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2224 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2240 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 54; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2256 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2272 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2288 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2304 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2320 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2336 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2352 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2368 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2384 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2400 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2416 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2432 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2448 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2464 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2480 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2496 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2512 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2528 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2544 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2560 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2576 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2592 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2608 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2624 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2640 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Mouse { + type: 2 + button: 2 + buttons: 2 + x: 54; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2656 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2672 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2688 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2704 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2720 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2736 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2752 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Mouse { + type: 3 + button: 2 + buttons: 0 + x: 54; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2768 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2784 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2800 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2816 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2832 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2848 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2864 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2880 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 2896 + image: "mousearea-visual.3.png" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 55; y: 29 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 58; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2912 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 62; y: 29 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 67; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2928 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 75; y: 30 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2944 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 91; y: 34 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 99; y: 34 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2960 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 107; y: 34 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 113; y: 34 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2976 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 119; y: 34 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 124; y: 33 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2992 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 128; y: 33 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 131; y: 32 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3008 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 132; y: 32 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 132; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3024 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3040 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3056 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3072 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3088 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3104 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3120 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3136 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3152 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3168 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3184 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3200 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3216 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3232 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3248 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3264 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3280 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3296 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3312 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3328 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3344 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3360 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3376 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3392 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3408 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3424 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3440 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3456 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3472 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3488 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3504 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3520 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3536 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3552 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 133; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3568 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3584 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 133; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3600 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3616 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3632 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3648 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3664 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3680 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3696 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 133; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3712 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3728 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3744 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3760 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3776 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3792 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3808 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3824 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3840 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3856 + image: "mousearea-visual.4.png" + } + Frame { + msec: 3872 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3888 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3904 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3920 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3936 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3952 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3968 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 3984 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 4000 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 4016 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 4032 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 4048 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 4064 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 4080 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 4096 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 4112 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 4128 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 4144 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 4160 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 4176 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 4192 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 4208 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 4224 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 4240 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 4256 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 4272 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 4288 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 4304 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 4320 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Mouse { + type: 2 + button: 2 + buttons: 2 + x: 133; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4336 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 4352 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 4368 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 4384 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 4400 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 4416 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Frame { + msec: 4432 + hash: "73f1639b9e2164c7b974042934c0d151" + } + Mouse { + type: 3 + button: 2 + buttons: 0 + x: 133; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4448 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 4464 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 4480 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 4496 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 4512 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 4528 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 4544 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 4560 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 4576 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 4592 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 4608 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 4624 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 4640 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 4656 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 4672 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 4688 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 4704 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 4720 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 4736 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 133; y: 32 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 136; y: 32 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4752 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 142; y: 32 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 148; y: 32 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4768 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 155; y: 32 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 161; y: 32 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4784 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 166; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4800 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 168; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 170; y: 30 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4816 + image: "mousearea-visual.5.png" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 171; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4832 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 4848 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 4864 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 4880 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 172; y: 28 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 175; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4896 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 178; y: 25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4912 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 182; y: 24 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 187; y: 22 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4928 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 191; y: 22 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 195; y: 21 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4944 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 200; y: 21 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 206; y: 21 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4960 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 211; y: 21 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 215; y: 21 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4976 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 218; y: 21 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 221; y: 20 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4992 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 224; y: 20 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5008 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 225; y: 20 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 226; y: 20 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5024 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 227; y: 20 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5040 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5056 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5072 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 228; y: 20 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 229; y: 20 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5088 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 231; y: 20 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 232; y: 20 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5104 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 233; y: 20 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5120 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5136 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5152 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5168 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 233; y: 21 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 234; y: 22 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5184 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 237; y: 23 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5200 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 239; y: 24 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 242; y: 25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5216 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 244; y: 25 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 245; y: 25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5232 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 247; y: 25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5248 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5264 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5280 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5296 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5312 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5328 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5344 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5360 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5376 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5392 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5408 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5424 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5440 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5456 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5472 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5488 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5504 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5520 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5536 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5552 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5568 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5584 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5600 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5616 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5632 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5648 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5664 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5680 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5696 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5712 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5728 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5744 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5760 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5776 + image: "mousearea-visual.6.png" + } + Frame { + msec: 5792 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5808 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5824 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5840 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 247; y: 25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5856 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5872 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5888 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5904 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5920 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5936 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 247; y: 25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5952 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5968 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 5984 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6000 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6016 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6032 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6048 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6064 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6080 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6096 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6112 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6128 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6144 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6160 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6176 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6192 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6208 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6224 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6240 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6256 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6272 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6288 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6304 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6320 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6336 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6352 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6368 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6384 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6400 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6416 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6432 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6448 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6464 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6480 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6496 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6512 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6528 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6544 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6560 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6576 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 247; y: 25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6592 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6608 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6624 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6640 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 247; y: 25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6656 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6672 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6688 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6704 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6720 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6736 + image: "mousearea-visual.7.png" + } + Mouse { + type: 4 + button: 1 + buttons: 1 + x: 247; y: 25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6752 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6768 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6784 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6800 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6816 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6832 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 247; y: 25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6848 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6864 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6880 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6896 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6912 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6928 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6944 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6960 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6976 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 6992 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7008 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7024 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7040 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7056 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7072 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7088 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7104 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7120 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7136 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7152 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7168 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7184 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7200 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 247; y: 25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7216 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7232 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7248 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7264 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7280 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7296 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7312 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7328 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7344 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7360 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7376 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7392 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7408 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7424 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7440 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7456 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7472 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7488 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7504 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7520 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7536 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7552 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7568 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7584 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7600 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7616 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7632 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7648 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7664 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7680 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7696 + image: "mousearea-visual.8.png" + } + Frame { + msec: 7712 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7728 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7744 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7760 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7776 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7792 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7808 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7824 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7840 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7856 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7872 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7888 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7904 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7920 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7936 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7952 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7968 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 7984 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 8000 + hash: "12edb0902e4d480c9052b00edc1a0a42" + } + Frame { + msec: 8016 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 8032 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 8048 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 8064 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 8080 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 8096 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 8112 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 8128 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 8144 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 8160 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 8176 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 8192 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 8208 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 8224 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 8240 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 8256 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 8272 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 8288 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 8304 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 8320 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 8336 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 247; y: 25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8352 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 8368 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 8384 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 8400 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 8416 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 8432 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 8448 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 8464 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 8480 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 8496 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 8512 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 8528 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 248; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8544 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 254; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 259; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8560 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 264; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 268; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8576 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 273; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 277; y: 25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8592 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 281; y: 24 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 284; y: 24 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8608 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 287; y: 24 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 289; y: 24 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8624 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 292; y: 24 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8640 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 294; y: 24 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 295; y: 24 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8656 + image: "mousearea-visual.9.png" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 297; y: 24 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 299; y: 25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8672 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 301; y: 25 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 304; y: 25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8688 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 307; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8704 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 310; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 312; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8720 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 314; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 315; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8736 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 317; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 318; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8752 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 319; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8768 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 320; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8784 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 322; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 323; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8800 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 325; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 327; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8816 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 330; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 333; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8832 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 336; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 338; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8848 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 339; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8864 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 340; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8880 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 8896 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 340; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8912 + hash: "d1f2fc2133f3d6554e41982196662c2a" + } + Frame { + msec: 8928 + hash: "d1f2fc2133f3d6554e41982196662c2a" + } + Frame { + msec: 8944 + hash: "d1f2fc2133f3d6554e41982196662c2a" + } + Frame { + msec: 8960 + hash: "d1f2fc2133f3d6554e41982196662c2a" + } + Frame { + msec: 8976 + hash: "d1f2fc2133f3d6554e41982196662c2a" + } + Frame { + msec: 8992 + hash: "d1f2fc2133f3d6554e41982196662c2a" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 340; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9008 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9024 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9040 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9056 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9072 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9088 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9104 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9120 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9136 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9152 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9168 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9184 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9200 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9216 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9232 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9248 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9264 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9280 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9296 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9312 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9328 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9344 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9360 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9376 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9392 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9408 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9424 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9440 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9456 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9472 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9488 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9504 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9520 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9536 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9552 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9568 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9584 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 9600 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 339; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9616 + image: "mousearea-visual.10.png" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 336; y: 25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9632 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 332; y: 25 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 326; y: 25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9648 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 320; y: 25 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 312; y: 25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9664 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 292; y: 25 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 283; y: 25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9680 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 261; y: 25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9696 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 252; y: 25 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 243; y: 25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9712 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 225; y: 29 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 207; y: 33 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9728 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 189; y: 35 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 169; y: 39 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9744 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 161; y: 40 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 145; y: 44 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9760 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 138; y: 45 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9776 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 133; y: 48 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 127; y: 50 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9792 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 122; y: 52 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 118; y: 56 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9808 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 114; y: 57 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 110; y: 60 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9824 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 109; y: 61 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9840 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 107; y: 62 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 106; y: 63 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9856 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 103; y: 63 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 100; y: 64 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9872 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 96; y: 64 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 92; y: 65 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9888 + hash: "6627c7a1a4da7e642f4b4b24ca5e8e7a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 88; y: 65 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9904 + hash: "6627c7a1a4da7e642f4b4b24ca5e8e7a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 85; y: 66 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 82; y: 67 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9920 + hash: "6627c7a1a4da7e642f4b4b24ca5e8e7a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 79; y: 69 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 77; y: 70 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9936 + hash: "6627c7a1a4da7e642f4b4b24ca5e8e7a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 74; y: 71 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 70; y: 72 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9952 + hash: "6627c7a1a4da7e642f4b4b24ca5e8e7a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 67; y: 74 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 64; y: 75 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9968 + hash: "6627c7a1a4da7e642f4b4b24ca5e8e7a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 62; y: 76 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9984 + hash: "6627c7a1a4da7e642f4b4b24ca5e8e7a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 61; y: 76 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 60; y: 77 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 10000 + hash: "6627c7a1a4da7e642f4b4b24ca5e8e7a" + } + Frame { + msec: 10016 + hash: "6627c7a1a4da7e642f4b4b24ca5e8e7a" + } + Frame { + msec: 10032 + hash: "6627c7a1a4da7e642f4b4b24ca5e8e7a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 59; y: 77 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 10048 + hash: "6627c7a1a4da7e642f4b4b24ca5e8e7a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 58; y: 77 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 57; y: 77 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 10064 + hash: "6627c7a1a4da7e642f4b4b24ca5e8e7a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 56; y: 76 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 10080 + hash: "6627c7a1a4da7e642f4b4b24ca5e8e7a" + } + Frame { + msec: 10096 + hash: "6627c7a1a4da7e642f4b4b24ca5e8e7a" + } + Frame { + msec: 10112 + hash: "6627c7a1a4da7e642f4b4b24ca5e8e7a" + } + Frame { + msec: 10128 + hash: "6627c7a1a4da7e642f4b4b24ca5e8e7a" + } + Frame { + msec: 10144 + hash: "6627c7a1a4da7e642f4b4b24ca5e8e7a" + } + Frame { + msec: 10160 + hash: "6627c7a1a4da7e642f4b4b24ca5e8e7a" + } + Frame { + msec: 10176 + hash: "6627c7a1a4da7e642f4b4b24ca5e8e7a" + } + Frame { + msec: 10192 + hash: "6627c7a1a4da7e642f4b4b24ca5e8e7a" + } + Frame { + msec: 10208 + hash: "6627c7a1a4da7e642f4b4b24ca5e8e7a" + } + Frame { + msec: 10224 + hash: "6627c7a1a4da7e642f4b4b24ca5e8e7a" + } + Frame { + msec: 10240 + hash: "6627c7a1a4da7e642f4b4b24ca5e8e7a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 57; y: 76 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 59; y: 75 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 10256 + hash: "6627c7a1a4da7e642f4b4b24ca5e8e7a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 62; y: 75 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 10272 + hash: "6627c7a1a4da7e642f4b4b24ca5e8e7a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 65; y: 74 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 69; y: 74 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 10288 + hash: "6627c7a1a4da7e642f4b4b24ca5e8e7a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 72; y: 73 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 76; y: 73 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 10304 + hash: "6627c7a1a4da7e642f4b4b24ca5e8e7a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 80; y: 72 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 84; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 10320 + hash: "6627c7a1a4da7e642f4b4b24ca5e8e7a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 87; y: 71 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 90; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 10336 + hash: "6627c7a1a4da7e642f4b4b24ca5e8e7a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 93; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 10352 + hash: "6627c7a1a4da7e642f4b4b24ca5e8e7a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 96; y: 71 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 99; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 10368 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 102; y: 71 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 106; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 10384 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 108; y: 71 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 110; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 10400 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 113; y: 71 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 115; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 10416 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 118; y: 71 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 121; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 10432 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 123; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 10448 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 126; y: 71 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 128; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 10464 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 130; y: 71 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 132; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 10480 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 133; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 10496 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 134; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 10512 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 10528 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 135; y: 71 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 136; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 10544 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 137; y: 71 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 138; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 10560 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 140; y: 71 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 141; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 10576 + image: "mousearea-visual.11.png" + } + Frame { + msec: 10592 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 10608 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 10624 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 10640 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 10656 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 10672 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 10688 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 10704 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 10720 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 10736 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 10752 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 10768 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 10784 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 10800 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 10816 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 10832 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 10848 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 10864 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 10880 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 10896 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 10912 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 10928 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 10944 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 10960 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 10976 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 10992 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11008 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11024 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11040 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11056 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11072 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11088 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11104 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11120 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11136 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11152 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11168 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11184 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11200 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11216 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11232 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11248 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11264 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 141; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11280 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11296 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11312 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11328 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11344 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11360 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 141; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11376 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11392 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11408 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11424 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11440 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11456 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11472 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11488 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11504 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11520 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11536 + image: "mousearea-visual.12.png" + } + Frame { + msec: 11552 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11568 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11584 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11600 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11616 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11632 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11648 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11664 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11680 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11696 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11712 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 2 + button: 2 + buttons: 2 + x: 141; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11728 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11744 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11760 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11776 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11792 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11808 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11824 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 3 + button: 2 + buttons: 0 + x: 141; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 11840 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11856 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11872 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11888 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11904 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11920 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11936 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11952 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11968 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 11984 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12000 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12016 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12032 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12048 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 4 + button: 2 + buttons: 2 + x: 141; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 12064 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12080 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12096 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12112 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12128 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12144 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12160 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12176 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12192 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12208 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 3 + button: 2 + buttons: 0 + x: 141; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 12224 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12240 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12256 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12272 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12288 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 141; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 12304 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12320 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12336 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12352 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12368 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12384 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12400 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12416 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12432 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12448 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 2 + button: 2 + buttons: 3 + x: 141; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 12464 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12480 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12496 + image: "mousearea-visual.13.png" + } + Frame { + msec: 12512 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12528 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 3 + button: 2 + buttons: 1 + x: 141; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 12544 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 141; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 12560 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12576 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12592 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12608 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12624 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12640 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12656 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12672 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 141; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 12688 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12704 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12720 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12736 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12752 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 141; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 12768 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12784 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12800 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12816 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12832 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 4 + button: 1 + buttons: 1 + x: 141; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 12848 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12864 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12880 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12896 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 141; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 12912 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12928 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12944 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12960 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 12976 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 141; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 12992 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13008 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13024 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13040 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13056 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 141; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 13072 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13088 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 4 + button: 1 + buttons: 1 + x: 141; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 13104 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13120 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13136 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13152 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13168 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13184 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 141; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 13200 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13216 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13232 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13248 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13264 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13280 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13296 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 141; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 13312 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13328 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13344 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13360 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13376 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 141; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 13392 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13408 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13424 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13440 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13456 + image: "mousearea-visual.14.png" + } + Frame { + msec: 13472 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13488 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13504 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13520 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13536 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13552 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13568 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13584 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13600 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13616 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13632 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 2 + button: 2 + buttons: 2 + x: 141; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 13648 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13664 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13680 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13696 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13712 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 3 + button: 2 + buttons: 0 + x: 141; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 13728 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13744 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13760 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13776 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13792 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13808 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 4 + button: 2 + buttons: 2 + x: 141; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 13824 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13840 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13856 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13872 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13888 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13904 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 3 + button: 2 + buttons: 0 + x: 141; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 13920 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13936 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13952 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13968 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 13984 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14000 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14016 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14032 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14048 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14064 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14080 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14096 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14112 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14128 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14144 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14160 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14176 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 141; y: 70 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 148; y: 68 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 14192 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 152; y: 68 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 158; y: 68 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 14208 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 164; y: 68 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 14224 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 171; y: 66 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 187; y: 62 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 205; y: 60 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 14240 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 223; y: 56 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 14256 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 239; y: 52 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 255; y: 46 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 14272 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 269; y: 40 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 285; y: 34 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 14288 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 299; y: 28 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 313; y: 20 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 14304 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 320; y: 18 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 326; y: 15 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 14320 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 340; y: 7 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 14336 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14352 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14368 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14384 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14400 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14416 + image: "mousearea-visual.15.png" + } + Frame { + msec: 14432 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14448 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14464 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14480 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14496 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14512 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14528 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14544 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14560 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14576 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14592 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14608 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14624 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14640 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14656 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14672 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14688 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14704 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14720 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14736 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14752 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14768 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14784 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14800 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14816 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14832 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14848 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14864 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14880 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14896 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14912 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } + Frame { + msec: 14928 + hash: "194ebac4ae7d95bf427f8161885a13e1" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.0.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.0.png new file mode 100644 index 00000000..c249c211 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.1.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.1.png new file mode 100644 index 00000000..a96bf1ba Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.10.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.10.png new file mode 100644 index 00000000..7420ca7f Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.10.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.11.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.11.png new file mode 100644 index 00000000..7420ca7f Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.11.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.12.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.12.png new file mode 100644 index 00000000..7420ca7f Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.12.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.13.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.13.png new file mode 100644 index 00000000..7420ca7f Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.13.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.14.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.14.png new file mode 100644 index 00000000..7420ca7f Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.14.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.15.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.15.png new file mode 100644 index 00000000..e797cc93 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.15.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.16.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.16.png new file mode 100644 index 00000000..7951309c Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.16.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.17.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.17.png new file mode 100644 index 00000000..7951309c Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.17.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.18.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.18.png new file mode 100644 index 00000000..7951309c Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.18.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.19.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.19.png new file mode 100644 index 00000000..7951309c Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.19.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.2.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.2.png new file mode 100644 index 00000000..a96bf1ba Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.20.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.20.png new file mode 100644 index 00000000..7951309c Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.20.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.21.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.21.png new file mode 100644 index 00000000..7951309c Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.21.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.22.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.22.png new file mode 100644 index 00000000..7951309c Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.22.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.3.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.3.png new file mode 100644 index 00000000..a96bf1ba Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.4.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.4.png new file mode 100644 index 00000000..1fe365a4 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.5.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.5.png new file mode 100644 index 00000000..1fe365a4 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.5.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.6.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.6.png new file mode 100644 index 00000000..1fe365a4 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.6.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.7.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.7.png new file mode 100644 index 00000000..1fe365a4 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.7.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.8.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.8.png new file mode 100644 index 00000000..7420ca7f Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.8.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.9.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.9.png new file mode 100644 index 00000000..7420ca7f Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/mouseregion.9.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.0.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.0.png new file mode 100644 index 00000000..793fb0f9 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.1.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.1.png new file mode 100644 index 00000000..5935b453 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.2.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.2.png new file mode 100644 index 00000000..a2052664 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.3.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.3.png new file mode 100644 index 00000000..3d81ff25 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.4.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.4.png new file mode 100644 index 00000000..ee2076e1 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.5.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.5.png new file mode 100644 index 00000000..9017124d Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.5.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.6.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.6.png new file mode 100644 index 00000000..216dd7e9 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.6.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.7.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.7.png new file mode 100644 index 00000000..27e8480b Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.7.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.8.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.8.png new file mode 100644 index 00000000..6b911c59 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.8.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.9.png b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.9.png new file mode 100644 index 00000000..01858a55 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.9.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.qml b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.qml new file mode 100644 index 00000000..cec1558a --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/data/nested.qml @@ -0,0 +1,5039 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "nested.0.png" + } + Frame { + msec: 32 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 48 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 64 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 80 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 96 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 112 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 128 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 144 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 160 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 176 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 192 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 208 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 224 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 240 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 256 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 272 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 288 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 304 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 320 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 336 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 352 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 368 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 384 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 400 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 416 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 432 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 448 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 464 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 480 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 496 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 512 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 528 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 544 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 560 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 576 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 592 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 608 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 624 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 640 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 656 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 672 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 688 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 704 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 720 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 736 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 752 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 768 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 784 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 800 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 816 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 832 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 848 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Frame { + msec: 864 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 25; y: 62 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 880 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 26; y: 62 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 896 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 27; y: 62 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 912 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 28; y: 62 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 29; y: 62 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 928 + hash: "2400cadaaa467cbfb0c7d2ace8137179" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 30; y: 62 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 33; y: 63 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 944 + hash: "f5aa6257fd80c1e383bc2db84e41c354" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 35; y: 63 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 40; y: 63 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 960 + hash: "e96076794d3efc62a8fe2d2e543e97c7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 42; y: 63 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 48; y: 63 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 976 + image: "nested.1.png" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 51; y: 63 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 58; y: 63 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 992 + hash: "ab955f6c6b210b66b27e244dc2150860" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 66; y: 64 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 64 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1008 + hash: "b655247e73b0b8357dc9d355ba6f49a0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 79; y: 64 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 83; y: 64 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1024 + hash: "08b67b7e28990cac8c9bd354b7d87698" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 91; y: 64 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 95; y: 64 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1040 + hash: "69cecfb41899e13c0bc5acb6f9bc666d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 104; y: 64 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 107; y: 64 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1056 + hash: "8d1f0cd85fd3f2654f7c30a6d9ec2b99" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 115; y: 64 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 122; y: 64 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1072 + hash: "f8ddda87cfcf5dc9d8c6e940fbd295f3" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 126; y: 64 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 133; y: 64 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1088 + hash: "ab9d942c47a2cca5531f7b67df034161" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 136; y: 64 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 143; y: 64 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1104 + hash: "7ca5a03fdfac44c389315c3928631a2a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 146; y: 64 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 151; y: 64 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1120 + hash: "ade955ed9d85fbbe72cf18bbc541c8bf" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 153; y: 64 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 158; y: 64 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1136 + hash: "6ad4afa3e3fcb578946fccbf4896761c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 162; y: 64 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 163; y: 64 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1152 + hash: "3ebe78e37c1c66d0b8fc86c8191e39de" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 165; y: 64 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 166; y: 64 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1168 + hash: "6450917cc89a553cf509265eaf318efb" + } + Frame { + msec: 1184 + hash: "6450917cc89a553cf509265eaf318efb" + } + Frame { + msec: 1200 + hash: "6450917cc89a553cf509265eaf318efb" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 166; y: 63 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1216 + hash: "6450917cc89a553cf509265eaf318efb" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 164; y: 63 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 161; y: 63 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1232 + hash: "adfe54d5d28f7caf9ace117fd3573444" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 159; y: 63 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 156; y: 63 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1248 + hash: "f4963636cc4fbd8bfe6baf10540ed7e7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 154; y: 63 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 149; y: 63 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1264 + hash: "1c2d2edb9214cc3857aa221330ee28ba" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 143; y: 63 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 139; y: 63 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1280 + hash: "750226c90e6c6cd0b3bdd3c3dc8da18f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 131; y: 63 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 126; y: 63 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1296 + hash: "b6b5d177ab531460dc125afa82489a1d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 115; y: 63 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 111; y: 63 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1312 + hash: "62d411a7b6c404393e4bfafab9c638a3" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 100; y: 63 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 91; y: 63 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1328 + hash: "e355997b3decd4deb686fece59c33c7c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 86; y: 63 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 76; y: 63 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1344 + hash: "2ab73c8aac6a0e321686e97c9bb28f28" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 71; y: 63 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 61; y: 63 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1360 + hash: "55a887f9f45f71beb6b723191eb60a2f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 56; y: 63 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 50; y: 63 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1376 + hash: "b2d49e34362994739d14fb8231ff82d6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 47; y: 63 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: 64 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1392 + hash: "3964796876870035794b41501991b527" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 41; y: 64 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 40; y: 64 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1408 + hash: "e96076794d3efc62a8fe2d2e543e97c7" + } + Frame { + msec: 1424 + hash: "e96076794d3efc62a8fe2d2e543e97c7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 41; y: 64 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1440 + hash: "7e524b3c43a987503ef102bdb9f11701" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 42; y: 64 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1456 + hash: "2a7c13e97c21e298541bb5ab8169ff13" + } + Frame { + msec: 1472 + hash: "2a7c13e97c21e298541bb5ab8169ff13" + } + Frame { + msec: 1488 + hash: "2a7c13e97c21e298541bb5ab8169ff13" + } + Frame { + msec: 1504 + hash: "2a7c13e97c21e298541bb5ab8169ff13" + } + Frame { + msec: 1520 + hash: "2a7c13e97c21e298541bb5ab8169ff13" + } + Frame { + msec: 1536 + hash: "2a7c13e97c21e298541bb5ab8169ff13" + } + Frame { + msec: 1552 + hash: "2a7c13e97c21e298541bb5ab8169ff13" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 42; y: 64 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1568 + hash: "2a7c13e97c21e298541bb5ab8169ff13" + } + Frame { + msec: 1584 + hash: "2a7c13e97c21e298541bb5ab8169ff13" + } + Frame { + msec: 1600 + hash: "2a7c13e97c21e298541bb5ab8169ff13" + } + Frame { + msec: 1616 + hash: "2a7c13e97c21e298541bb5ab8169ff13" + } + Frame { + msec: 1632 + hash: "2a7c13e97c21e298541bb5ab8169ff13" + } + Frame { + msec: 1648 + hash: "2a7c13e97c21e298541bb5ab8169ff13" + } + Frame { + msec: 1664 + hash: "2a7c13e97c21e298541bb5ab8169ff13" + } + Frame { + msec: 1680 + hash: "2a7c13e97c21e298541bb5ab8169ff13" + } + Frame { + msec: 1696 + hash: "2a7c13e97c21e298541bb5ab8169ff13" + } + Frame { + msec: 1712 + hash: "2a7c13e97c21e298541bb5ab8169ff13" + } + Frame { + msec: 1728 + hash: "2a7c13e97c21e298541bb5ab8169ff13" + } + Frame { + msec: 1744 + hash: "2a7c13e97c21e298541bb5ab8169ff13" + } + Frame { + msec: 1760 + hash: "2a7c13e97c21e298541bb5ab8169ff13" + } + Frame { + msec: 1776 + hash: "2a7c13e97c21e298541bb5ab8169ff13" + } + Frame { + msec: 1792 + hash: "2a7c13e97c21e298541bb5ab8169ff13" + } + Frame { + msec: 1808 + hash: "2a7c13e97c21e298541bb5ab8169ff13" + } + Frame { + msec: 1824 + hash: "2a7c13e97c21e298541bb5ab8169ff13" + } + Frame { + msec: 1840 + hash: "2a7c13e97c21e298541bb5ab8169ff13" + } + Frame { + msec: 1856 + hash: "2a7c13e97c21e298541bb5ab8169ff13" + } + Frame { + msec: 1872 + hash: "2a7c13e97c21e298541bb5ab8169ff13" + } + Frame { + msec: 1888 + hash: "2a7c13e97c21e298541bb5ab8169ff13" + } + Frame { + msec: 1904 + hash: "2a7c13e97c21e298541bb5ab8169ff13" + } + Frame { + msec: 1920 + hash: "2a7c13e97c21e298541bb5ab8169ff13" + } + Frame { + msec: 1936 + image: "nested.2.png" + } + Frame { + msec: 1952 + hash: "2a7c13e97c21e298541bb5ab8169ff13" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 38; y: 56 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1968 + hash: "2a7c13e97c21e298541bb5ab8169ff13" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 39; y: 57 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1984 + hash: "2a7c13e97c21e298541bb5ab8169ff13" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 39; y: 59 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 39; y: 60 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2000 + hash: "2a7c13e97c21e298541bb5ab8169ff13" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 40; y: 63 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 40; y: 65 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2016 + hash: "9178754b825d60b2174ed9431ea80586" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 41; y: 68 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 41; y: 70 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 45; y: 79 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2032 + hash: "89eff8fa9f8710d7cbc50b8d4b751148" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 47; y: 84 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 48; y: 86 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2048 + hash: "cdae8b46ecfc2b0c90264c120156cc46" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 50; y: 91 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 51; y: 93 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2064 + hash: "cf35919630eab647a28eb91d8a441704" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 53; y: 99 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 53; y: 102 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2080 + hash: "283256d50da8c855c50d5f8813d37afd" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 54; y: 107 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 54; y: 109 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2096 + hash: "2560cd67d507bc24c1000187f645531c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 54; y: 113 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 54; y: 117 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2112 + hash: "6f6f7c299c4516c5231f5bfcd39b6db3" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 54; y: 119 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 54; y: 122 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2128 + hash: "e7989524238996cf59f420f4edf8f982" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 54; y: 124 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 54; y: 126 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2144 + hash: "34d8d456848807e854bcb25ffbde37d4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 54; y: 127 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 54; y: 130 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2160 + hash: "433bd3983804b07484d38af2723f519e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 53; y: 132 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 53; y: 134 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2176 + hash: "510e534a8a7b88041f7544e7e4992b8f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 53; y: 137 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 52; y: 139 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2192 + hash: "25f43c457a5bf2b70a66ce91685ad4dc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 51; y: 141 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 51; y: 142 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2208 + hash: "4119ab90627359420e25220618b76a69" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 51; y: 145 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 50; y: 146 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2224 + hash: "8a3cc888e96cf3e26e369723b442baf1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 49; y: 147 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 49; y: 150 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2240 + hash: "980552e8ff9d87ccb40127b06b0f846f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 48; y: 151 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 48; y: 153 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2256 + hash: "9ee23fc7cbca4467f984073d2af7cdf6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 48; y: 154 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 48; y: 155 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2272 + hash: "032d65792ac867c9b9acef05bd993c54" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 48; y: 156 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2288 + hash: "be2f8d5a64034e75e23527c486e33029" + } + Frame { + msec: 2304 + hash: "be2f8d5a64034e75e23527c486e33029" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 49; y: 155 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2320 + hash: "3f65505e4d1f8534c9123b3dea15d43e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 49; y: 154 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 49; y: 152 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2336 + hash: "e8b1799cf1926cb3b6cbf3adee80cffe" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 49; y: 149 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 49; y: 147 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2352 + hash: "31155b14cc0d3d47bbef4e199fdfcb46" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 51; y: 140 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 52; y: 132 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2368 + hash: "b89745a9a60a7ebeb1de0a7f96ad2ac3" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 53; y: 128 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 57; y: 118 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2384 + hash: "7e99fa1eba369d45f10778fe02356f09" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 59; y: 114 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 64; y: 103 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2400 + hash: "cd123f6b332f38f43abbf01469a41301" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 67; y: 98 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 71; y: 90 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2416 + hash: "353c0602dd2b670e19988117172855fc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 76; y: 81 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 78; y: 78 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2432 + hash: "20df9d19fd2113fa8f8023d5b4328dc5" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 81; y: 70 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 82; y: 67 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2448 + hash: "10b34a758d5b3790dd36c9d95c47b157" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 84; y: 62 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 85; y: 60 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2464 + hash: "98a483e1eaa9145fd277fd85a9b0cf03" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 87; y: 57 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 88; y: 55 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2480 + hash: "e92edd52ff1ee78456fa1947a46e6570" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 89; y: 53 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 91; y: 52 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2496 + hash: "877384496d967f5f0ab1c817a2b316d6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 92; y: 51 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 93; y: 51 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2512 + hash: "15673570ffe9a391f9214601ac9dc86c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 94; y: 50 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 95; y: 50 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2528 + hash: "4b7f0094b19a4495bf913d2994889497" + } + Frame { + msec: 2544 + hash: "4b7f0094b19a4495bf913d2994889497" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 95; y: 49 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2560 + hash: "4b7f0094b19a4495bf913d2994889497" + } + Frame { + msec: 2576 + hash: "4b7f0094b19a4495bf913d2994889497" + } + Frame { + msec: 2592 + hash: "4b7f0094b19a4495bf913d2994889497" + } + Frame { + msec: 2608 + hash: "4b7f0094b19a4495bf913d2994889497" + } + Frame { + msec: 2624 + hash: "4b7f0094b19a4495bf913d2994889497" + } + Frame { + msec: 2640 + hash: "4b7f0094b19a4495bf913d2994889497" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 95; y: 49 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2656 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 2672 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 2688 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 2704 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 2720 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 2736 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 2752 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 2768 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 2784 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 2800 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 2816 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 2832 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 2848 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 2864 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 2880 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 2896 + image: "nested.3.png" + } + Frame { + msec: 2912 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 2928 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 2944 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 2960 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 2976 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 2992 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 3008 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 3024 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 3040 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 3056 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 3072 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 3088 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 3104 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 3120 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 3136 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 3152 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 3168 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 3184 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 3200 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 3216 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 3232 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 156; y: 74 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3248 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Frame { + msec: 3264 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 156; y: 73 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 157; y: 73 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3280 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 158; y: 73 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 160; y: 73 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3296 + hash: "2994e98b8ea9a6883a7324e7e848345c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 161; y: 73 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 163; y: 73 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3312 + hash: "df6cf21e99177a436e356f818996070c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 166; y: 73 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 171; y: 74 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3328 + hash: "86f5e3fee147f47edd4a6d042aff0301" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 178; y: 75 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 181; y: 75 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3344 + hash: "589c1418a9179c868d904b1a5169a11b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 189; y: 75 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 193; y: 75 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3360 + hash: "3141ad77d193e145b749759070e1e6ef" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 200; y: 75 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 204; y: 75 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3376 + hash: "5e34d4deeb6d80b336cacea39797e0ca" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 211; y: 75 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 217; y: 75 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3392 + hash: "b8795d844982bcf60a6713f91717648f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 220; y: 75 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 224; y: 75 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3408 + hash: "857c63b24057ee0186c5136eddb71cb1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 226; y: 75 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 227; y: 76 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3424 + hash: "49222ed0d1ebc8759d0a1dc65c3beec6" + } + Frame { + msec: 3440 + hash: "49222ed0d1ebc8759d0a1dc65c3beec6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 227; y: 77 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 226; y: 77 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3456 + hash: "751847708a468f4f3e64e7cb5ebd1351" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 225; y: 78 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 224; y: 78 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3472 + hash: "4016f80a5219fcba6480645f71998d71" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 221; y: 80 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 220; y: 80 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3488 + hash: "beef05cd2a3d20bc66978fa4f0ac1d12" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 216; y: 82 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 214; y: 84 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3504 + hash: "e50a2661e93d34b55c8d2d39abc77e5a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 209; y: 86 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 206; y: 86 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3520 + hash: "7beccbc2f091350bb5d9de1e2443021d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 200; y: 88 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 192; y: 89 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3536 + hash: "1d39570bf07392f56b6dd24b0bf9e7bc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 188; y: 90 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 180; y: 91 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3552 + hash: "62565b3e5aad3979b408207bbf36e615" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 176; y: 92 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 167; y: 92 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3568 + hash: "d9c6004921847fef16bb8c2f5d6b3b7d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 162; y: 92 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 152; y: 92 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3584 + hash: "53da27301ad97ae52c65928615ec0cd7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 142; y: 92 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 137; y: 90 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3600 + hash: "9772a776e84515984b4eec70dbd1c5a7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 125; y: 88 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 119; y: 88 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3616 + hash: "9caa6583a716443c13e8fef3f2923d6e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 109; y: 86 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 104; y: 85 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3632 + hash: "f162a18b2d3f0d5f6f01fc373c016f68" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 98; y: 84 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 96; y: 84 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3648 + hash: "58976e8e31beddf881c7cfa3ede54c09" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 94; y: 84 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 92; y: 83 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3664 + hash: "6625f7adb097bc170024083c42d74b4b" + } + Frame { + msec: 3680 + hash: "6625f7adb097bc170024083c42d74b4b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 92; y: 82 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3696 + hash: "1d63f09ca27e9d70c3c0ea923a6cfba4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 93; y: 82 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3712 + hash: "1d63f09ca27e9d70c3c0ea923a6cfba4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 94; y: 81 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 96; y: 81 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3728 + hash: "a23c75fcaa0a28adb944bf192af65bff" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 98; y: 81 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 100; y: 81 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3744 + hash: "2b90fe8937dcc39d1d6add305cf36043" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 107; y: 81 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 111; y: 81 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3760 + hash: "7da82cfaf0f826ca9a41128278b6b09c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 118; y: 81 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 122; y: 81 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3776 + hash: "a3f69d13d38b336fda33a86899564996" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 129; y: 80 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 135; y: 79 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3792 + hash: "dc562319e1d332ba34ac94bfc0c39c5e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 138; y: 79 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 140; y: 78 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3808 + hash: "756482bee292668f56d813847b0ccd53" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 141; y: 77 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 142; y: 76 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3824 + hash: "06d250c4d18a70f8f7b1c10e22a1bc4c" + } + Frame { + msec: 3840 + hash: "06d250c4d18a70f8f7b1c10e22a1bc4c" + } + Frame { + msec: 3856 + image: "nested.4.png" + } + Frame { + msec: 3872 + hash: "06d250c4d18a70f8f7b1c10e22a1bc4c" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 142; y: 76 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3888 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 3904 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 3920 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 3936 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 3952 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 3968 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 3984 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4000 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4016 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4032 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4048 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4064 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4080 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4096 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4112 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4128 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4144 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4160 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4176 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4192 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4208 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4224 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4240 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4256 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4272 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4288 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4304 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4320 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4336 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4352 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4368 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4384 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4400 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4416 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4432 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4448 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4464 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4480 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4496 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4512 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4528 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4544 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 16; y: 46 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4560 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 4576 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 16; y: 47 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 16; y: 48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4592 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 16; y: 49 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 50 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4608 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 55 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 18; y: 56 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4624 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 20; y: 61 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 20; y: 64 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4640 + hash: "ff1f86b47e0d1db5db7d939df8349931" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 22; y: 70 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 23; y: 73 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4656 + hash: "f13393a4556e9e73c33f2bb74d8f7794" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 26; y: 80 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 28; y: 84 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4672 + hash: "8c9aa01516437184eb17d89348cca004" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 33; y: 91 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 40; y: 99 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4688 + hash: "8b6848cb722ff5ec02d957da1ee687e5" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 44; y: 102 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 53; y: 109 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4704 + hash: "552fde584d128f511788670031d79dd2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 58; y: 112 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 64; y: 117 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4720 + hash: "55dc3a4242b46e602f823c0305e67ad2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 68; y: 118 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 71; y: 120 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4736 + hash: "603b9b2ed6ff4273c3ab1cbe32afb19e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 73; y: 120 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 73; y: 120 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4752 + hash: "157eda24ea8452a208aa7a6a22639c73" + } + Frame { + msec: 4768 + hash: "157eda24ea8452a208aa7a6a22639c73" + } + Frame { + msec: 4784 + hash: "c5005b83816c18b67448dfbccd0ab0b2" + } + Frame { + msec: 4800 + hash: "878512df863e5d60437b85fbd2a32eb1" + } + Frame { + msec: 4816 + image: "nested.5.png" + } + Frame { + msec: 4832 + hash: "02ab69b67b746ec0021295992a03ada1" + } + Frame { + msec: 4848 + hash: "c621382766d7bacab87055a73623a8ce" + } + Frame { + msec: 4864 + hash: "a8d1be78741d9afd88363bd19f1cbc6b" + } + Frame { + msec: 4880 + hash: "5a70275ff656766d73638d4dd4db4492" + } + Frame { + msec: 4896 + hash: "892ea0a00553524b79889d437eac9b6f" + } + Frame { + msec: 4912 + hash: "d818258bffc065430902ffa8f5668f86" + } + Frame { + msec: 4928 + hash: "6b844523522ace7545705ffb8ffe1da3" + } + Frame { + msec: 4944 + hash: "3906097bc49bad199b52c99dbf87f98f" + } + Frame { + msec: 4960 + hash: "a2bd859b5ca7f4fac8d62b1c9ab76aad" + } + Frame { + msec: 4976 + hash: "f374673e3511b1df8b50ff7ef6002b3a" + } + Frame { + msec: 4992 + hash: "c2eecfadd19418f469b1ab53a3ecae70" + } + Frame { + msec: 5008 + hash: "2b481965ece0f2e1795ef56aa5d6a752" + } + Frame { + msec: 5024 + hash: "c294f28000348365a2c37265132efdb5" + } + Frame { + msec: 5040 + hash: "c294f28000348365a2c37265132efdb5" + } + Frame { + msec: 5056 + hash: "4e9c18eab469b2da0cb92526d3d54501" + } + Frame { + msec: 5072 + hash: "4e9c18eab469b2da0cb92526d3d54501" + } + Frame { + msec: 5088 + hash: "4e9c18eab469b2da0cb92526d3d54501" + } + Frame { + msec: 5104 + hash: "4e9c18eab469b2da0cb92526d3d54501" + } + Frame { + msec: 5120 + hash: "3836449b99d88e2dea9a0eb9417faca5" + } + Frame { + msec: 5136 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 5152 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 5168 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 5184 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 5200 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 5216 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 5232 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 5248 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 5264 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 5280 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 5296 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 5312 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 5328 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 5344 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 5360 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 5376 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 5392 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 5408 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 5424 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 5440 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 5456 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 5472 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 5488 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 5504 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 5520 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 5536 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 5552 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 5568 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 5584 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 5600 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 5616 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Frame { + msec: 5632 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 20; y: 238 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 21; y: 238 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5648 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 22; y: 239 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 23; y: 239 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5664 + hash: "42dc501eb5a34843ef0a8977ff029054" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 27; y: 240 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 29; y: 240 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5680 + hash: "b56d132ac881e27d308009fb9a9d2d50" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 33; y: 241 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 36; y: 241 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5696 + hash: "6c65fca03ea127d554f15c80da76f21f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 42; y: 242 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 45; y: 243 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5712 + hash: "e5d8939135d0e964609a09a437af58bc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 53; y: 243 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 61; y: 243 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5728 + hash: "ab60a45ac475ef8d1177d831a6572d1f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 66; y: 243 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 75; y: 243 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5744 + hash: "78b2e0c7dd8b8bcbd573dac79ff815e4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 79; y: 243 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 89; y: 243 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5760 + hash: "ef9e89650d8e3d572285e2a2e2b09166" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 95; y: 243 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 106; y: 243 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5776 + image: "nested.6.png" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 118; y: 243 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 126; y: 243 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5792 + hash: "b83136fa3769e30ea47097b489e8f1dc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 137; y: 241 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 143; y: 240 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5808 + hash: "fb892905b790a061ce5985c927db3cf5" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 154; y: 238 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 159; y: 237 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5824 + hash: "bc4358e21d2d31942e776adfd32ef1c6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 170; y: 235 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 184; y: 234 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5840 + hash: "b42380a7fcf5e2fbfe4dddbe86ad7287" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 191; y: 232 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 201; y: 231 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5856 + hash: "4b3c12beb43a77ebaf458804b03c7b52" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 205; y: 231 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 208; y: 230 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5872 + hash: "a18be4d4ab28c0fd0c16696c4ecc03ef" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 209; y: 230 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 209; y: 229 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5888 + hash: "c5f100bc4b14e958c7d9bbff84e0a934" + } + Frame { + msec: 5904 + hash: "c5f100bc4b14e958c7d9bbff84e0a934" + } + Frame { + msec: 5920 + hash: "c5f100bc4b14e958c7d9bbff84e0a934" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 208; y: 229 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5936 + hash: "a18be4d4ab28c0fd0c16696c4ecc03ef" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 207; y: 229 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 207; y: 230 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5952 + hash: "a8b23e7dad1bdbaa3452335be0f07658" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 206; y: 230 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 204; y: 231 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5968 + hash: "4c1feb559a11912b06ed521bebba43d0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 200; y: 232 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 194; y: 232 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5984 + hash: "ffb97bcedf72e02616272c1cad5c38d7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 190; y: 232 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 181; y: 231 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6000 + hash: "99498ed9b4d519a2f842d407abdef90a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 175; y: 230 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 163; y: 229 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6016 + hash: "1ca3f012adab899eba1dcb63d048345f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 158; y: 228 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 145; y: 227 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6032 + hash: "8a81d49de887f314f67976a65f469169" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 132; y: 227 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 126; y: 227 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6048 + hash: "b83136fa3769e30ea47097b489e8f1dc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 116; y: 227 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 112; y: 227 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6064 + hash: "12cdd297407257ae4bb13c87e24537fb" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 103; y: 227 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 99; y: 227 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6080 + hash: "a51ac0a1e9432671c88f7649c38d265d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 90; y: 227 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 86; y: 227 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6096 + hash: "4ba4f854659161c765395cdee35594f2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 77; y: 226 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 225 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6112 + hash: "9907add9e28b4a8976f3727f99a4b6d4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 66; y: 224 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 60; y: 223 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6128 + hash: "c2cb865c4a766b9c08328b374e940f29" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 59; y: 223 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 56; y: 223 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6144 + hash: "c97981263572ded23b328da45cf88012" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 55; y: 223 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 53; y: 223 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6160 + hash: "f4bae51c866ba1158f44529208514d6f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 52; y: 222 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 50; y: 222 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6176 + hash: "35b4f1f9bb343f2b22bd7cdad6f28249" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 49; y: 223 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 48; y: 223 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6192 + hash: "84eba4cb400e5622463f5a1fa79be72b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 47; y: 223 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 46; y: 223 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6208 + hash: "d38e882728c7efc906befe69b416082a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 45; y: 223 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6224 + hash: "e5d8939135d0e964609a09a437af58bc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 44; y: 223 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: 223 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6240 + hash: "6b6e06e8473d5703e217accd824b08d5" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 42; y: 223 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 40; y: 223 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6256 + hash: "8e38bc5b00e33e24f931b181dc77d3c1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 39; y: 223 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 38; y: 223 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6272 + hash: "a173708b5380f42a2bdbf6ae69cdca20" + } + Frame { + msec: 6288 + hash: "a173708b5380f42a2bdbf6ae69cdca20" + } + Frame { + msec: 6304 + hash: "a173708b5380f42a2bdbf6ae69cdca20" + } + Frame { + msec: 6320 + hash: "a173708b5380f42a2bdbf6ae69cdca20" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 38; y: 223 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6336 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6352 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6368 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6384 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6400 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6416 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6432 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6448 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6464 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6480 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6496 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6512 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6528 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6544 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6560 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6576 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6592 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6608 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6624 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6640 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6656 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6672 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6688 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6704 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6720 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6736 + image: "nested.7.png" + } + Frame { + msec: 6752 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6768 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6784 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6800 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6816 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6832 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6848 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6864 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6880 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6896 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6912 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6928 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6944 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6960 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6976 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 6992 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 7008 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 7024 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 7040 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 7056 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 7072 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 46; y: 225 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7088 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 7104 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 46; y: 226 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 46; y: 227 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7120 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 46; y: 228 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 46; y: 231 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7136 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 46; y: 233 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 46; y: 238 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7152 + hash: "35dd0f784c356be0050936ff75b0cdf7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 47; y: 240 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 48; y: 245 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7168 + hash: "9ac066a700eae45edf9b2f1ba12f0324" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 48; y: 248 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 49; y: 255 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7184 + hash: "22a2a8bf257918820b0ab55ecb14b479" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 50; y: 259 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 51; y: 266 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7200 + hash: "eb98237e06cde8ed2f18040ce9197d16" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 52; y: 272 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 52; y: 276 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7216 + hash: "f0c7afe1bd25b9b573cbc69154c25862" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 53; y: 282 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 54; y: 285 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7232 + hash: "d6a681b6de867db47f889e6f1ec03dcf" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 54; y: 291 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 54; y: 293 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7248 + hash: "0ee281281c7654567a1debae7a13abe0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 54; y: 299 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 54; y: 304 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7264 + hash: "9d5f1c8cb0953c14bdd49aa88d2b225f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 54; y: 306 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 54; y: 310 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7280 + hash: "ae1c2a3ed67c5c10fc9d19de4de7b7eb" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 54; y: 312 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 53; y: 315 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7296 + hash: "8505f9d060fc17fef2e91eb2add206bb" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 53; y: 316 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 53; y: 318 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7312 + hash: "c32a6d546a3e4f2ee5349a7dad4b30af" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 53; y: 319 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 52; y: 320 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7328 + hash: "222f6e8e8deab567f1e7d0aaf7035b60" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 51; y: 321 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 51; y: 322 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7344 + hash: "f7011629f44015187849daad6a53cebf" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 51; y: 323 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 51; y: 324 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7360 + hash: "56b00d9116a51c041483dd00db0aca90" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 50; y: 325 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 50; y: 326 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7376 + hash: "93232fbcafe8e279b37781f51dfb923a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 49; y: 328 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 48; y: 329 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7392 + hash: "9fcf62eaacfc3477a4550c31f03c4782" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 48; y: 330 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 48; y: 331 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7408 + hash: "dd669865fd36e42eec1d69860b29e7ce" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 47; y: 331 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7424 + hash: "9247af334483b219ca9bbe98d8fc362e" + } + Frame { + msec: 7440 + hash: "9247af334483b219ca9bbe98d8fc362e" + } + Frame { + msec: 7456 + hash: "9247af334483b219ca9bbe98d8fc362e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 47; y: 330 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7472 + hash: "9247af334483b219ca9bbe98d8fc362e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 47; y: 329 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 47; y: 328 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7488 + hash: "69ef9255a29d65f26e5441594ea1bad9" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 48; y: 325 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 48; y: 323 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7504 + hash: "055f73dd085d2f65a055ba4d9a8a7539" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 49; y: 318 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 49; y: 316 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7520 + hash: "384da5b6a948a52d0519935a8e33f014" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 51; y: 309 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 54; y: 303 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7536 + hash: "1caa0049be4033db45f0d2debb25268f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 55; y: 299 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 55; y: 299 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7552 + hash: "76b8d00b3a2a68fec277050a442c18ca" + } + Frame { + msec: 7568 + hash: "0ee281281c7654567a1debae7a13abe0" + } + Frame { + msec: 7584 + hash: "df1dbb027a8542aa6120cce7b69724a7" + } + Frame { + msec: 7600 + hash: "06a4d9b1d73362b3e29c6cf52fdb515c" + } + Frame { + msec: 7616 + hash: "876c0dc8a68a4c1253b7aed6316cb892" + } + Frame { + msec: 7632 + hash: "b46c74b1a2535099f0cdb8093bd49a4e" + } + Frame { + msec: 7648 + hash: "0ad09a7638aa6f2affe47db2a810196f" + } + Frame { + msec: 7664 + hash: "3710dde54d7e4a10a2c3ca2f891da7f5" + } + Frame { + msec: 7680 + hash: "8426a607c92fbfa508e81c620d90e919" + } + Frame { + msec: 7696 + image: "nested.8.png" + } + Frame { + msec: 7712 + hash: "1f38e34787c909d93d567f983a425257" + } + Frame { + msec: 7728 + hash: "7b09913793d4c79d948fdff1b72c7124" + } + Frame { + msec: 7744 + hash: "8a0d1484c073d8107b4bf9949edcdb18" + } + Frame { + msec: 7760 + hash: "4bad25465dfdcc41995216b0f6a5191b" + } + Frame { + msec: 7776 + hash: "6d39bbeb5f74273c1ed0231ac34fe094" + } + Frame { + msec: 7792 + hash: "8ccc2e33b8d6c67162326d229e9c17ab" + } + Frame { + msec: 7808 + hash: "3561eaa9124b96b2a0afa022bc0fe581" + } + Frame { + msec: 7824 + hash: "b87d739e49f0427d9da577ac5147fd21" + } + Frame { + msec: 7840 + hash: "7d0efbfceec35e591f9fae650288809b" + } + Frame { + msec: 7856 + hash: "7d0efbfceec35e591f9fae650288809b" + } + Frame { + msec: 7872 + hash: "ff5d2037d3cc7bb6930cabc3d53f0196" + } + Frame { + msec: 7888 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 7904 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 7920 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 7936 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 7952 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 7968 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 7984 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8000 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8016 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8032 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8048 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8064 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8080 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8096 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8112 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8128 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8144 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8160 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8176 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8192 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8208 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8224 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8240 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8256 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8272 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8288 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8304 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8320 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8336 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8352 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8368 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8384 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8400 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8416 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8432 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8448 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8464 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8480 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8496 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8512 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8528 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8544 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8560 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8576 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8592 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8608 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8624 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8640 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8656 + image: "nested.9.png" + } + Frame { + msec: 8672 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8688 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8704 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8720 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8736 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8752 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8768 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8784 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8800 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8816 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8832 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8848 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8864 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8880 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8896 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8912 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8928 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8944 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8960 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8976 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 8992 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 9008 + hash: "76624c57195c25b8abd4297e11c55980" + } + Frame { + msec: 9024 + hash: "76624c57195c25b8abd4297e11c55980" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/drag.qml b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/drag.qml new file mode 100644 index 00000000..99c898e9 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/drag.qml @@ -0,0 +1,26 @@ +import QtQuick 1.0 + +/* +this test shows a blue box being dragged around -- first roughly tracing the +borders of the window, then doing a rough 'x'-shape, then moving to around the middle. +*/ + +Rectangle{ + width:400 + height:440 + color: "white" + Rectangle{ + id: draggable + width:40; height:40; color: "lightsteelblue" + y:20 + MouseArea{ + anchors.fill: parent + drag.target: draggable + drag.axis: "XandYAxis" + drag.minimumX: 0 + drag.maximumX: 360 + drag.minimumY: 20 + drag.maximumY: 400 + } + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/mousearea-flickable.qml b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/mousearea-flickable.qml new file mode 100644 index 00000000..70ea78c7 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/mousearea-flickable.qml @@ -0,0 +1,52 @@ +import QtQuick 1.0 + +Rectangle { + width: 400; height: 480 + color: "white" + + Flickable { + anchors.fill: parent + contentHeight: 100 + + Rectangle { + id: yellow + width: 400; height: 120 + color: "yellow" + MouseArea { + anchors.fill: parent + onPressedChanged: pressed ? yellow.color = "lightyellow": yellow.color = "yellow" + } + } + Rectangle { + id: blue + width: 400; height: 120 + y: 120 + color: "steelblue" + MouseArea { + anchors.fill: parent + onPressed: blue.color = "lightsteelblue" + onCanceled: blue.color = "steelblue" + } + } + Rectangle { + id: red + y: 240 + width: 400; height: 120 + color: "red" + MouseArea { + anchors.fill: parent + onEntered: { red.color = "darkred"; tooltip.opacity = 1 } + onCanceled: { red.color = "red"; tooltip.opacity = 0 } + } + Rectangle { + id: tooltip + x: 10; y: 20 + width: 100; height: 50 + color: "green" + opacity: 0 + } + } + + } + +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/mousearea-visual.qml b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/mousearea-visual.qml new file mode 100644 index 00000000..540866fb --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/mousearea-visual.qml @@ -0,0 +1,135 @@ +import QtQuick 1.0 + +/* +This test displays 6 red rects -- 4 in the top row, 2 in the bottom. + +Sequence: +1. the bottom-left rect turns blue, then green +2. the second rect in the top row turns blue +3. the third rect in the top row turns blue +4. the last rect in the top row quickly turns blue then back to red +5. the bottom-left rect turns blue, then green +*/ + +Rectangle { + id: root + width: 400 + height: 100 + + // Left click on me + Rectangle { + width: 98; height: 48 + color: "red" + MouseArea { + id: mr1 + anchors.fill: parent + enabled: false + onClicked: { parent.color = "blue"; root.error = "mr1 should ignore presses"; } + } + } + + // Left click, then right click + Rectangle { + x: 100 + width: 98; height: 48 + color: "red" + MouseArea { + id: mr2 + anchors.fill: parent + acceptedButtons: Qt.RightButton + onClicked: { + if (mouse.button == Qt.RightButton) { + parent.color = "blue"; + } else { + parent.color = "green"; + root.error = "mr1 should ignore presses"; + } + } + } + } + + // press and hold me + Rectangle { + x: 200 + width: 98; height: 48 + color: "red" + MouseArea { + id: mr3 + anchors.fill: parent + onPressAndHold: { + parent.color = "blue"; + } + } + } + + // click me + Rectangle { + x: 300 + width: 98; height: 48 + color: "red" + MouseArea { + id: mr4 + anchors.fill: parent + onPressed: { + parent.color = "blue"; + } + onReleased: { + parent.color = "red"; + } + } + } + + // move into and out of me + Rectangle { + x: 0 + y: 50 + width: 98; height: 48 + color: "red" + MouseArea { + id: mr5 + anchors.fill: parent + hoverEnabled: true + onEntered: { + parent.color = "blue"; + } + onExited: { + parent.color = "green"; + } + } + } + + // click, then double click me + Rectangle { + x: 100 + y: 50 + width: 98; height: 48 + color: "red" + MouseArea { + id: mr6 + anchors.fill: parent + onClicked: { + parent.color = "blue"; + } + onDoubleClicked: { + parent.color = "green"; + } + } + } + + // click, then double click me - nothing should happen + Rectangle { + x: 100 + y: 50 + width: 98; height: 48 + color: "red" + MouseArea { + id: mr7 + anchors.fill: parent + enabled: false + onClicked: { parent.color = "blue" } + onPressed: { parent.color = "yellow" } + onReleased: { parent.color = "cyan" } + onDoubleClicked: { parent.color = "green" } + } + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativemousearea/nested.qml b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/nested.qml new file mode 100644 index 00000000..b2d88d2c --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativemousearea/nested.qml @@ -0,0 +1,62 @@ +import QtQuick 1.0 + +/* + Test nested MouseArea with different drag axes. +*/ + +Rectangle{ + width:400 + height:360 + color: "white" + Flickable { + anchors.fill: parent + contentWidth: 600 + contentHeight: 600 + Rectangle{ + id: draggable + width:200; height:200; color: "lightsteelblue" + opacity: ma1.drag.active ? 0.5 : 1.0 + y:20 + MouseArea{ + id: ma1 + objectName: "one" + anchors.fill: parent + drag.target: draggable + drag.axis: "XandYAxis" + drag.filterChildren: true + drag.minimumX: 0 + drag.maximumX: 200 + drag.minimumY: 20 + drag.maximumY: 220 + Rectangle{ + id: draggable_inner + width:40; height:40; color: "red" + y:20 + MouseArea{ + objectName: "two" + anchors.fill: parent + drag.target: draggable_inner + drag.axis: "XAxis" + drag.minimumX: 0 + drag.maximumX: 360 + } + } + } + } + Rectangle{ + id: draggable3 + width:40; height:40; color: "green" + opacity: ma3.drag.active ? 0.5 : 1.0 + y:210 + MouseArea{ + id: ma3 + objectName: "three" + anchors.fill: parent + drag.target: draggable3 + drag.axis: "XAxis" + drag.minimumX: 0 + drag.maximumX: 360 + } + } + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeparticles/data/particles.0.png b/tests/auto/declarative/qmlvisual/qdeclarativeparticles/data/particles.0.png new file mode 100644 index 00000000..88924b1f Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeparticles/data/particles.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeparticles/data/particles.1.png b/tests/auto/declarative/qmlvisual/qdeclarativeparticles/data/particles.1.png new file mode 100644 index 00000000..024a17cd Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeparticles/data/particles.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeparticles/data/particles.2.png b/tests/auto/declarative/qmlvisual/qdeclarativeparticles/data/particles.2.png new file mode 100644 index 00000000..8860fc21 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeparticles/data/particles.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeparticles/data/particles.3.png b/tests/auto/declarative/qmlvisual/qdeclarativeparticles/data/particles.3.png new file mode 100644 index 00000000..2ab8ee32 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeparticles/data/particles.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeparticles/data/particles.qml b/tests/auto/declarative/qmlvisual/qdeclarativeparticles/data/particles.qml new file mode 100644 index 00000000..2930e286 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativeparticles/data/particles.qml @@ -0,0 +1,775 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "particles.0.png" + } + Frame { + msec: 32 + hash: "c7eb3936886726f584d1bd99133a199f" + } + Frame { + msec: 48 + hash: "f7f6eeab119435f0cccd55074b4941bf" + } + Frame { + msec: 64 + hash: "06f52743e61bf0212971652c500fe5d1" + } + Frame { + msec: 80 + hash: "1f9dd3a3a0524c60791362f560936f9b" + } + Frame { + msec: 96 + hash: "42538495fc9d63384a1709476c06d750" + } + Frame { + msec: 112 + hash: "4d1b53541ffe5cdfcf0e3aa2916b1bac" + } + Frame { + msec: 128 + hash: "6a3a683dbd2ad7c89f0788441303485e" + } + Frame { + msec: 144 + hash: "125a936660dae42969fab4144d166ac6" + } + Frame { + msec: 160 + hash: "87d008547326ff1bf2c4c2a9d9b99abc" + } + Frame { + msec: 176 + hash: "0df69d85b37d3ebf0e314a7e89701703" + } + Frame { + msec: 192 + hash: "7af12cac3bd33c903d6aa6fa8f89b498" + } + Frame { + msec: 208 + hash: "424c950111c492ded19df874b938067c" + } + Frame { + msec: 224 + hash: "bee69a0df1ca8ccc7d83a52f9de34f8c" + } + Frame { + msec: 240 + hash: "47da1538d818e22d836de57d5c6601ce" + } + Frame { + msec: 256 + hash: "fbfb0e177b19d6ef9433619f60dd9580" + } + Frame { + msec: 272 + hash: "23b4f8bb116e8db48db25ccccedba43a" + } + Frame { + msec: 288 + hash: "13f0847f1b86f880690692066cde21c7" + } + Frame { + msec: 304 + hash: "639ca4c978bea080139b219c75bf01d1" + } + Frame { + msec: 320 + hash: "19debcaa7bbde930eda2fd08ac1e9d8a" + } + Frame { + msec: 336 + hash: "1d733c5010604bff67138f1eb9881dcd" + } + Frame { + msec: 352 + hash: "b14435e41a3730baff06bb0800157081" + } + Frame { + msec: 368 + hash: "504b3548c38d50f15235594f3f3d7be5" + } + Frame { + msec: 384 + hash: "4e73ef73c949da579217c1d94139a75a" + } + Frame { + msec: 400 + hash: "5fced44782484b1962368b9c04bf5246" + } + Frame { + msec: 416 + hash: "6ab0cd5c14e1871a35d003574255c1db" + } + Frame { + msec: 432 + hash: "23f5c485fbd0acd607119e93277284db" + } + Frame { + msec: 448 + hash: "02ebd53ee0e6ca3605916b05d827989e" + } + Frame { + msec: 464 + hash: "99b1d1e72d7da88a7d5d5a7907e1b1f4" + } + Frame { + msec: 480 + hash: "b7de7d40263f2811ec51f28f8ff4929c" + } + Frame { + msec: 496 + hash: "e64059f850dd4c8642a9883a1c5356bf" + } + Frame { + msec: 512 + hash: "b0aefb8f8d4d970ba4b51d7f77b55cf1" + } + Frame { + msec: 528 + hash: "5ab4b1373c233b2342eb66cf9eccac8d" + } + Frame { + msec: 544 + hash: "b3726c296d5919a59c32201d857e92b4" + } + Frame { + msec: 560 + hash: "70e246371f9cf83b5913f2fc53f6b736" + } + Frame { + msec: 576 + hash: "871cd4b99b6d544d487424219e0caf92" + } + Frame { + msec: 592 + hash: "8c002ec15e88220bf12ebaa5a3390570" + } + Frame { + msec: 608 + hash: "21c994a5ad23938a9e873d04bbd4165e" + } + Frame { + msec: 624 + hash: "1f04a0ed31823cd0817f3e97a11e3a46" + } + Frame { + msec: 640 + hash: "f163eda68878ae0ed4cac7f941e24414" + } + Frame { + msec: 656 + hash: "560527d6c7fa64a4739f9c79f3eaab8f" + } + Frame { + msec: 672 + hash: "df7e7469ff685c4cd822232b1aa66029" + } + Frame { + msec: 688 + hash: "fa92bf73b0737d4ac8bbc16518cd9c2a" + } + Frame { + msec: 704 + hash: "bb2f2765ba20b727701352f11ed30417" + } + Frame { + msec: 720 + hash: "4c45617ce77a5869cdbfcfe851796422" + } + Frame { + msec: 736 + hash: "24aa2eabe8d2a4adc5a096dd201a3bc1" + } + Frame { + msec: 752 + hash: "2eb5de2524ad38e1dcd44d89b115e75a" + } + Frame { + msec: 768 + hash: "8b39e542908051b0ab8fbf3cd36f3be9" + } + Frame { + msec: 784 + hash: "a447e9d7c87c90633dcfc550fcf04ff6" + } + Frame { + msec: 800 + hash: "c3d1e7753b592bc0d0c3169e3cf08bb7" + } + Frame { + msec: 816 + hash: "fb20ccb3b36798835fbc1d529a7424ea" + } + Frame { + msec: 832 + hash: "ff253670ae78826250b9612cf2a2e1a4" + } + Frame { + msec: 848 + hash: "45fb7f71debd3b61062a4165c04c0637" + } + Frame { + msec: 864 + hash: "a1542b5bc5e65cdb3f8775cf21b54429" + } + Frame { + msec: 880 + hash: "a146b5b88875e4148658dd55e162d6f4" + } + Frame { + msec: 896 + hash: "94222050206925d4c9b38da03125cc0c" + } + Frame { + msec: 912 + hash: "71a63ace8450029b968723cfa684330c" + } + Frame { + msec: 928 + hash: "14e4d2af07146133c6a0e87391747c6a" + } + Frame { + msec: 944 + hash: "e380593e219531620dbca0a8131b4f13" + } + Frame { + msec: 960 + hash: "d52c30bc201afd3d1caf34efcddafdee" + } + Frame { + msec: 976 + image: "particles.1.png" + } + Frame { + msec: 992 + hash: "0d2871475891f96e1cc4150cbe725d46" + } + Frame { + msec: 1008 + hash: "b6d064a26c282ce4fd8cba48de0a0f7b" + } + Frame { + msec: 1024 + hash: "9ad67d9833d749b2b8158abb3076357b" + } + Frame { + msec: 1040 + hash: "ce86624a1e055fdb4711dd73be31dc42" + } + Frame { + msec: 1056 + hash: "a2c6fc81e1f02477f6ad084acaf12b0d" + } + Frame { + msec: 1072 + hash: "bab24924a5ac4cd45c1fa7b5e4ff3efe" + } + Frame { + msec: 1088 + hash: "8c8fd3b9cc257dab84df8e88a3e7a001" + } + Frame { + msec: 1104 + hash: "a3f9936dc4e3161d9db1fa39267cda4d" + } + Frame { + msec: 1120 + hash: "d6669c8a47077f665a93587ea3cafe6e" + } + Frame { + msec: 1136 + hash: "601dbd220a7f312d4343323ae99e21ee" + } + Frame { + msec: 1152 + hash: "722411ffc1d6740caed9bf1231bc54ba" + } + Frame { + msec: 1168 + hash: "cb3bd6f5ee770399e21a07e56dcf28ef" + } + Frame { + msec: 1184 + hash: "1819d6719e6b56b3e673dacf1865272e" + } + Frame { + msec: 1200 + hash: "6b6532937a3e37df28b3939cbadc4741" + } + Frame { + msec: 1216 + hash: "8a065d54600e9ae3c7958f7b71d8432d" + } + Frame { + msec: 1232 + hash: "2259806ac264b292f5701f34ffac5c35" + } + Frame { + msec: 1248 + hash: "e4b2a6440df9141616f89cbb6a6ba0aa" + } + Frame { + msec: 1264 + hash: "034b74fe5327909214bb5a6e3084edf2" + } + Frame { + msec: 1280 + hash: "976fd9bc54baefe8d71002a22706052a" + } + Frame { + msec: 1296 + hash: "45138388ebc6ec44a205934475907b25" + } + Frame { + msec: 1312 + hash: "01edec5ae6e33b49baee2abe2a59ad7d" + } + Frame { + msec: 1328 + hash: "9a89ff95df027e53827c5554a28e05a8" + } + Frame { + msec: 1344 + hash: "8d1cd8a1181b7320990b7348b424ce4b" + } + Frame { + msec: 1360 + hash: "2366d1ee0c0740f0d19fe2ce1acfe4c3" + } + Frame { + msec: 1376 + hash: "071988963ab2d1a53243e0f6837fecb0" + } + Frame { + msec: 1392 + hash: "20f1e8adef04cea6bcd1511ac47a7922" + } + Frame { + msec: 1408 + hash: "2241def30a3ef54ea82e5fa2b1ef5997" + } + Frame { + msec: 1424 + hash: "15365370ac6859f1bfc76e96e603c417" + } + Frame { + msec: 1440 + hash: "45edcbeb23c88f62982f9af9a4647f4c" + } + Frame { + msec: 1456 + hash: "b7a9c7c44e6f9ff5132d1ad3f6137dc8" + } + Frame { + msec: 1472 + hash: "8a55b85fdd63ac63c1a566a5c4d92a04" + } + Frame { + msec: 1488 + hash: "e1973b7d557dec08e6375feefb56db47" + } + Frame { + msec: 1504 + hash: "a321445212e561de4262228482b0edbe" + } + Frame { + msec: 1520 + hash: "a2c787a576e1f85561c08330b6801e98" + } + Frame { + msec: 1536 + hash: "ba84070f0081d4c7a08ebc3204d9aebf" + } + Frame { + msec: 1552 + hash: "4b82a6908ed0caf3cbfd9dc9211ec69a" + } + Frame { + msec: 1568 + hash: "a1dc7c4ad596fc005cf3077ee78406e1" + } + Frame { + msec: 1584 + hash: "53d76884202d4b9ce3874db796705b80" + } + Frame { + msec: 1600 + hash: "9f24c090531259f9d83ea97e842c4f14" + } + Frame { + msec: 1616 + hash: "541c81585a781bab82d4ee95b9f844ff" + } + Frame { + msec: 1632 + hash: "73e15141e6c6bfba4a2c820ba96e3f6e" + } + Frame { + msec: 1648 + hash: "0500129b602ab14925aa09a1d9bee3d0" + } + Frame { + msec: 1664 + hash: "2d45ba5e0e21430f468332c13ce3ee15" + } + Frame { + msec: 1680 + hash: "bafd11c210e683d79ac438c5612503bc" + } + Frame { + msec: 1696 + hash: "f968f49e6a0674877c55282e5543edab" + } + Frame { + msec: 1712 + hash: "705307529862a3825a0870b294058825" + } + Frame { + msec: 1728 + hash: "a008a501d1dc16a5ffaee325fdd90816" + } + Frame { + msec: 1744 + hash: "5091621481873738658f4d8543582c62" + } + Frame { + msec: 1760 + hash: "141216eeb31b5af4ec247bb930169a7f" + } + Frame { + msec: 1776 + hash: "bfb203e39ab0a9837fc5b9c9b49d9580" + } + Frame { + msec: 1792 + hash: "1f2704480af7dd2bb382d13450f34755" + } + Frame { + msec: 1808 + hash: "f3182da7f6202250a6cc2de3e43fcf87" + } + Frame { + msec: 1824 + hash: "6fa500f5ff387c5801186fb7eced96f4" + } + Frame { + msec: 1840 + hash: "1874d59911d70daf098cd053da69127b" + } + Frame { + msec: 1856 + hash: "52a7bcb9a18e8d4a24c2617124b7961b" + } + Frame { + msec: 1872 + hash: "f3a7dd26aa4177dbee02d52df664c751" + } + Frame { + msec: 1888 + hash: "5180db29e325f00c3940b6a7b8eb8a8e" + } + Frame { + msec: 1904 + hash: "eab16b6ef76e627eff492cdf5d5da9e2" + } + Frame { + msec: 1920 + hash: "57976a66963718e90c62535a936d9251" + } + Frame { + msec: 1936 + image: "particles.2.png" + } + Frame { + msec: 1952 + hash: "85ecf35d439bd4129f8780d8ee561dfb" + } + Frame { + msec: 1968 + hash: "785d712b57b3ec4cee6b9e2fcfa1b775" + } + Frame { + msec: 1984 + hash: "77906acfafec6ab595e8dad00373f953" + } + Frame { + msec: 2000 + hash: "33722e5c66ee6dfc87ca62a53590969e" + } + Frame { + msec: 2016 + hash: "7bd3d9e36789b3456c5e098d02341ce3" + } + Frame { + msec: 2032 + hash: "be4af661ca19ca607acf0d8949b58c26" + } + Frame { + msec: 2048 + hash: "e249df985887229664d3c61c7b01d2ef" + } + Frame { + msec: 2064 + hash: "541a01af440e81c7b20fa9df0e85f5f9" + } + Frame { + msec: 2080 + hash: "3579e5a3ab93b8c9998ef812f43ba158" + } + Frame { + msec: 2096 + hash: "c2902c8068a48788e5511d2987191181" + } + Frame { + msec: 2112 + hash: "3fc7d417d13cbccbff81c0630cf968f3" + } + Frame { + msec: 2128 + hash: "5507fabe77585c38b2929e2565cd8e9d" + } + Frame { + msec: 2144 + hash: "73f6a9a1602929b80ba28ac2c8095a95" + } + Frame { + msec: 2160 + hash: "3377ee6818f1fbf15cfe2916ef7328ed" + } + Frame { + msec: 2176 + hash: "4bea4237a5044b9ffbe9815b877a5b96" + } + Frame { + msec: 2192 + hash: "f25dadf7b916625f120d3b5fc1602d0d" + } + Frame { + msec: 2208 + hash: "ba095d86b7ecc9e2ca6c5d6567d6debf" + } + Frame { + msec: 2224 + hash: "296129caee6a9526aa2c6071fb07198c" + } + Frame { + msec: 2240 + hash: "42abe26548e9eb7a2c63aea7f349808c" + } + Frame { + msec: 2256 + hash: "2d187394342584568aa24353233f67f7" + } + Frame { + msec: 2272 + hash: "5c4047c8ca78103d443f9058f3ec3237" + } + Frame { + msec: 2288 + hash: "05af8a131ec98b5bc60669bfcdee9a16" + } + Frame { + msec: 2304 + hash: "b486a796a74962d6b5a4e928ff9e6a2d" + } + Frame { + msec: 2320 + hash: "8bfa5cc3edf294a728bae51014733230" + } + Frame { + msec: 2336 + hash: "fb5928a74d75f7eb23ed914e12ea2dba" + } + Frame { + msec: 2352 + hash: "16c83f70c3559e97c4a28df7e8b94d95" + } + Frame { + msec: 2368 + hash: "a7f926210d56dc368c99da12a27db42e" + } + Frame { + msec: 2384 + hash: "9f235f259af00126a3fc2417d399dee6" + } + Frame { + msec: 2400 + hash: "2397c99cc1697303bad9fbd029ee63a3" + } + Frame { + msec: 2416 + hash: "b83a021c82c203d6cf690edd5fd98c89" + } + Frame { + msec: 2432 + hash: "4e9e74f8b115b69b593f0233f9431258" + } + Frame { + msec: 2448 + hash: "2d8f24eea1e87691eb2292bd01756498" + } + Frame { + msec: 2464 + hash: "bad7ffbfe4feac5e7a13a70c8096ddab" + } + Frame { + msec: 2480 + hash: "6869d23bf601c67593f23402023f931d" + } + Frame { + msec: 2496 + hash: "6e4846623fe8b4a1c850729620cd7502" + } + Frame { + msec: 2512 + hash: "f679d87f206ca71de191f3991c13f4b0" + } + Frame { + msec: 2528 + hash: "7f503ceda23f0e4718f6216c3b4ddef7" + } + Frame { + msec: 2544 + hash: "69f01285109c21cbd32a0f17942734be" + } + Frame { + msec: 2560 + hash: "f2060324802c080703ff62c051c7cff2" + } + Frame { + msec: 2576 + hash: "45d01b58f0812596aff06a09c1167d83" + } + Frame { + msec: 2592 + hash: "688c9931abdaa7225da91cdf7f2beb48" + } + Frame { + msec: 2608 + hash: "d522505f28615cc17206ca6099dbd83e" + } + Frame { + msec: 2624 + hash: "ad86d8cee90c1458b64318f3edd94aee" + } + Frame { + msec: 2640 + hash: "6dda1a6359b421ef7c9ffa4ecd863341" + } + Frame { + msec: 2656 + hash: "dcc388cdf2b87e10b07e2f05ab6dce3c" + } + Frame { + msec: 2672 + hash: "a5d64264be7778929116c9407548c7f8" + } + Frame { + msec: 2688 + hash: "cc7ac18a25936825d42694a9022b73fa" + } + Frame { + msec: 2704 + hash: "4423af95764aadbaffe3c608fb3a376b" + } + Frame { + msec: 2720 + hash: "ad186cd5735531e2e6bfb2fc387dee2d" + } + Frame { + msec: 2736 + hash: "d0e7c8071350bac03cf06996b6f74a63" + } + Frame { + msec: 2752 + hash: "d012311c64fb35717155ebc88f9940d6" + } + Frame { + msec: 2768 + hash: "13111334420c479b6a3ddbde65e2d143" + } + Frame { + msec: 2784 + hash: "3a77939f35498ef91590cd57c534fb6a" + } + Frame { + msec: 2800 + hash: "89cbc568600c18c3d7163c3079a3f584" + } + Frame { + msec: 2816 + hash: "2a8db5a4cae5258578749a88fbf915ce" + } + Frame { + msec: 2832 + hash: "ddd9cef18ce748096869dae9c2e23de3" + } + Frame { + msec: 2848 + hash: "d9e213af096ce69f75863ed7c39b59f4" + } + Frame { + msec: 2864 + hash: "69e9bfa09b8f5a1e2d83b77a5c9bc374" + } + Frame { + msec: 2880 + hash: "ac6878edac61916bf424dcee2d7790e8" + } + Frame { + msec: 2896 + image: "particles.3.png" + } + Frame { + msec: 2912 + hash: "e60ed277794737b9f5d8c4a575f5b300" + } + Frame { + msec: 2928 + hash: "5c1a39fa9789064ff0d5ea1fd4c6d187" + } + Frame { + msec: 2944 + hash: "64c1593bf33b85593153ac9eeeb7793e" + } + Frame { + msec: 2960 + hash: "dab7df26ba23ed3e750fa6080916f177" + } + Frame { + msec: 2976 + hash: "5958428d5ab5a379f9bbcc0f86c20d1b" + } + Frame { + msec: 2992 + hash: "65929536b7b8b48958fab7bd1e3ccca5" + } + Frame { + msec: 3008 + hash: "cb157ba8c58bb7a8ec357e83e82ab441" + } + Frame { + msec: 3024 + hash: "bf36b7c52a3b3b2fb08524131bb4b9e2" + } + Frame { + msec: 3040 + hash: "0d2dbb3ba42cad9e8b5833c97dd0cdba" + } + Frame { + msec: 3056 + hash: "f918a9f5fa6808b545c715dffa2f4838" + } + Frame { + msec: 3072 + hash: "ec11344fb21ee06df6cface390d611d9" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeparticles/particles.qml b/tests/auto/declarative/qmlvisual/qdeclarativeparticles/particles.qml new file mode 100644 index 00000000..38506a0c --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativeparticles/particles.qml @@ -0,0 +1,56 @@ +import QtQuick 1.0 +import Qt.labs.particles 1.0 + +Rectangle { + property string skip: "May contain random numbers" + width: 640; height: 480; color: "black" + + Particles { id:particlesAneverEmitting + y:60; width: 260; height:30; source: "star.png"; + lifeSpan:1000; count: 50; angle:70; angleDeviation:36; + velocity:30; velocityDeviation:10; emissionRate: 0 + ParticleMotionWander { yvariance:5; xvariance:30; pace:100 } + } + Particles { id:particlesA //snowy particles from the top + y:0; width: 260; height:30; source: "star.png"; + lifeSpan:1000; count: 50; angle:70; angleDeviation:36; + velocity:30; velocityDeviation:10; emissionRate: 10 + ParticleMotionWander { yvariance:5; xvariance:30; pace:100 } + } + + Particles { id:particlesB //particle fountain bursting every second + y:280; x:180; width:1; height:1; lifeSpan:1000; source: "star.png" + count: 100; angle:270; angleDeviation:45; velocity:50; velocityDeviation:30; + emissionRate: 0 + ParticleMotionGravity { yattractor: 1000; xattractor:0; acceleration:25 } + } + + Timer { running: true; interval: 1000; repeat: true; onTriggered: particlesB.burst(200, 2000); } + + Column{ + x: 340; + Repeater{//emission variance test + model: 5 + delegate: Component{ + Item{ + width: 100; height: 100 + Rectangle{ + color: "blue" + width: 2; height: 2; + x: 49; y:49; + } + Particles{ + x: 50; y:50; width: 0; height: 0; + fadeInDuration: 0; fadeOutDuration: 0 + lifeSpan: 1000; lifeSpanDeviation:0; + source: "star.png" + count: -1; emissionRate: 120; + emissionVariance: index/2; + velocity: 250; velocityDeviation: 0; + angle: 0; angleDeviation: 0; + } + } + } + } + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativeparticles/star.png b/tests/auto/declarative/qmlvisual/qdeclarativeparticles/star.png new file mode 100644 index 00000000..defbde53 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativeparticles/star.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.0.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.0.png new file mode 100644 index 00000000..1b87edbe Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.1.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.1.png new file mode 100644 index 00000000..4fc12d62 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.2.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.2.png new file mode 100644 index 00000000..d761a0ce Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.3.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.3.png new file mode 100644 index 00000000..e22464fd Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.4.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.4.png new file mode 100644 index 00000000..14f07bed Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.5.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.5.png new file mode 100644 index 00000000..ba1ad343 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.5.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.qml b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.qml new file mode 100644 index 00000000..9eaff18f --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview-2.qml @@ -0,0 +1,1855 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "test-pathview-2.0.png" + } + Frame { + msec: 32 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 48 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 64 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 80 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 96 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 112 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 128 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 144 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 160 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 176 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 192 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 208 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 224 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 240 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 256 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 272 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 288 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 304 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 320 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 336 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 352 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 368 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 384 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 400 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 416 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 432 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 448 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 464 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 480 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 496 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 512 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 528 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 544 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 560 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 576 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 592 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 608 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 624 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 640 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 656 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 672 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 688 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 260; y: 189 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 704 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Frame { + msec: 720 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 261; y: 188 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 736 + hash: "cc72b488dcdfa7c251782cbcae7ab1d5" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 262; y: 188 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 266; y: 186 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 752 + hash: "ae9028c15de8ba4b02c733212d521c29" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 283; y: 183 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 768 + hash: "d61d21ab4d83b8578494720d9bfe6fa8" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 302; y: 181 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 331; y: 181 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 784 + hash: "6a6c5551e3a5a08f5505eb0f61d9df36" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 384; y: 179 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 800 + hash: "c800609ffea814ba7cc2441790157245" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 432; y: 175 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 432; y: 175 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 816 + hash: "afcb452d41c6e895309bb921a1ad1d31" + } + Frame { + msec: 832 + hash: "02d8f91c33f62aaf366bcfd03d232269" + } + Frame { + msec: 848 + hash: "a1e475643d0871bb7d63f8cf2e0b780d" + } + Frame { + msec: 864 + hash: "ba429e0c1a7f1624973813ae8be6b090" + } + Frame { + msec: 880 + hash: "36c04a2bd58124877a332bb6a262a7e5" + } + Frame { + msec: 896 + hash: "e6ea836d68c54a8308e10f33d4eb8b98" + } + Frame { + msec: 912 + hash: "1910f67eb9180a866924fa8567afbdf5" + } + Frame { + msec: 928 + hash: "68c60f1bc67a1d1117be7ed305b61ae1" + } + Frame { + msec: 944 + hash: "b859b690c633a9fec87941e7c89f5d19" + } + Frame { + msec: 960 + hash: "ef0b66e789a8e88389e16bfa36b9f6e2" + } + Frame { + msec: 976 + image: "test-pathview-2.1.png" + } + Frame { + msec: 992 + hash: "2bcde5c7b2e1aac1439b379ed729f6e1" + } + Frame { + msec: 1008 + hash: "b7056d635c69b8e5bf98872f4c07ed43" + } + Frame { + msec: 1024 + hash: "68aa8bd6709e1b49cfefc4594c236c46" + } + Frame { + msec: 1040 + hash: "e615b8648d5449535b1f47ab770db423" + } + Frame { + msec: 1056 + hash: "877e6357cc9a183a0288aa1551e26179" + } + Frame { + msec: 1072 + hash: "d540453541aba394b0958cdc48f91d48" + } + Frame { + msec: 1088 + hash: "d15e299030bc08097c3b9b4bbaace558" + } + Frame { + msec: 1104 + hash: "b12b31d4959a697fcc8e54f1c846eef9" + } + Frame { + msec: 1120 + hash: "937c7e346463c58c909795fa382761d9" + } + Frame { + msec: 1136 + hash: "41975592e60f08a0296a8babe1da2df3" + } + Frame { + msec: 1152 + hash: "0a5eea8a11b15ee8583f187f336f56c7" + } + Frame { + msec: 1168 + hash: "5872891af6953f07a635698581695c58" + } + Frame { + msec: 1184 + hash: "157c92d133a39a2b1d20a551303d2f6f" + } + Frame { + msec: 1200 + hash: "213716cad9fa2179a17a512e8c03c8f5" + } + Frame { + msec: 1216 + hash: "0ec517c50e9e36fef4fb14318e298723" + } + Frame { + msec: 1232 + hash: "bab010fe0f5d3b57fd556a9b709c285e" + } + Frame { + msec: 1248 + hash: "d8de3485eb7fb1f3675a25d7f807d08e" + } + Frame { + msec: 1264 + hash: "c091e46064c8096568224ed7e4c8dc4f" + } + Frame { + msec: 1280 + hash: "c0a6ede96566533ab35384afa535530f" + } + Frame { + msec: 1296 + hash: "f61f5c7617700b9aad71206cfc9e402e" + } + Frame { + msec: 1312 + hash: "c70c106d128051c06da3acdf817f5ffb" + } + Frame { + msec: 1328 + hash: "624d7c7fb2f39225d51d1a548aa186ed" + } + Frame { + msec: 1344 + hash: "f052610f17a7484bf6cb2bd07aa91af6" + } + Frame { + msec: 1360 + hash: "ee9ac101215923305fa75ab4c99c8f36" + } + Frame { + msec: 1376 + hash: "7597f86b537fbd70260908c973f9db21" + } + Frame { + msec: 1392 + hash: "30cd60db9aa2df2adc7d01091c905cb4" + } + Frame { + msec: 1408 + hash: "a9012dc82230c791bda1a7e6b7741896" + } + Frame { + msec: 1424 + hash: "78774bdff6cef175dcb7a190e5f1bcab" + } + Frame { + msec: 1440 + hash: "b87f002bf6fb0684f0b3cf565507e066" + } + Frame { + msec: 1456 + hash: "b60916a57aec6ebbd8b69be7c8d66e19" + } + Frame { + msec: 1472 + hash: "a28e1538d18ccb7485d0306b9f7b18a6" + } + Frame { + msec: 1488 + hash: "d74aa07d0b66a5f2be42b9868d3cd8f2" + } + Frame { + msec: 1504 + hash: "ea4c8f35367ee6f7631aa6e6d8aead03" + } + Frame { + msec: 1520 + hash: "3ecf7faa733653ef20e4a26eb47d63d1" + } + Frame { + msec: 1536 + hash: "f17a6be2e183f4c87e31004458e5052c" + } + Frame { + msec: 1552 + hash: "5361d1f1100c4815dca1b49046b44593" + } + Frame { + msec: 1568 + hash: "5cd97dc8a237fa92373eb50de8a3bd7b" + } + Frame { + msec: 1584 + hash: "c957f5c58e0a9b315b51ac1012709493" + } + Frame { + msec: 1600 + hash: "7b3cd8f583e6045d2e923a34abfc3aeb" + } + Frame { + msec: 1616 + hash: "2146e67d469f1eb2071a1f04d8e9fc4e" + } + Frame { + msec: 1632 + hash: "26839de649101c7b3bc6d9b1131325e6" + } + Frame { + msec: 1648 + hash: "47472faf5e9bf4b4e514abe55f1e0b72" + } + Frame { + msec: 1664 + hash: "30bc1d78a0cbd29813ad9504b1f0864b" + } + Frame { + msec: 1680 + hash: "e255c047ce78f5677ccec8bd9737201a" + } + Frame { + msec: 1696 + hash: "bd4f08095a9c546a42c85e6df6eaf655" + } + Frame { + msec: 1712 + hash: "ca65869f48b169260c3756d846a12f36" + } + Frame { + msec: 1728 + hash: "1921889beb8e61c8b959d4affa814465" + } + Frame { + msec: 1744 + hash: "864a4d26e719dd9fc0e3ce5c28d7726a" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 275; y: 170 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 278; y: 171 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1760 + hash: "cab96d2118b31d43e85dc902df2ed8ed" + } + Frame { + msec: 1776 + hash: "cab96d2118b31d43e85dc902df2ed8ed" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 279; y: 171 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 282; y: 171 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1792 + hash: "d21c8af68b314800b86922493db6553e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 290; y: 172 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1808 + hash: "a80c0f6f679ba5f1354f8e16677c1125" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 292; y: 172 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1824 + hash: "d8729deb404f5b821264743943adb288" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 294; y: 171 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 297; y: 171 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1840 + hash: "87d41239eb7e170fa7a1ed523a9af942" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 302; y: 170 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1856 + hash: "1c185649e08a54a6949409ed7ee5dc60" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 305; y: 170 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 308; y: 169 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1872 + hash: "57d5b71d5ff16f986c7df8d8405822b6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 313; y: 169 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1888 + hash: "6fd4123cfc8998cfc7716f3d928fb03f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 331; y: 165 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1904 + hash: "e1d6c01f6cd66a5bcdb08ca810a07282" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 340; y: 164 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1920 + hash: "fd0e9cf835131ee6cc5ecf67c6724d73" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 354; y: 163 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1936 + image: "test-pathview-2.2.png" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 361; y: 161 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 367; y: 160 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1952 + hash: "69c17a9c18795b1d8ae63d36d76af626" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 371; y: 160 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 376; y: 158 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1968 + hash: "c7ca4762498af158a2f2da6f5ae560ce" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 383; y: 157 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1984 + hash: "d823492036431e23d8b6876baccec263" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 387; y: 157 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 391; y: 157 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2000 + hash: "11d77567aeff20d8f62f2e4100603de3" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 394; y: 156 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2016 + hash: "f87df2e12dfe2ebb5b093e21970885b4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 395; y: 156 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2032 + hash: "1e743264f0a312bc0d0a023fbc6db832" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 396; y: 156 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2048 + hash: "ba9d1850c5c43c9aec5660601ba21d2f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 398; y: 156 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2064 + hash: "8eb1f2c8c02c2acf4262e05000045649" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 401; y: 155 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2080 + hash: "419c09739f855c53be3427a71aa3faf9" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 403; y: 155 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 406; y: 155 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2096 + hash: "c55a189b05d87e8937d272f32bdc2481" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 408; y: 154 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 409; y: 154 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2112 + hash: "bb1515904f9b299402d1141445154430" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 411; y: 153 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2128 + hash: "93363142c5a05c52c21e771b2bce71f6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 413; y: 153 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2144 + hash: "96f763c555b523d9b7ed7a0a159db368" + } + Frame { + msec: 2160 + hash: "96f763c555b523d9b7ed7a0a159db368" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 414; y: 153 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2176 + hash: "20f9cf7787c8cfd4843289f5ab2012e7" + } + Frame { + msec: 2192 + hash: "20f9cf7787c8cfd4843289f5ab2012e7" + } + Frame { + msec: 2208 + hash: "20f9cf7787c8cfd4843289f5ab2012e7" + } + Frame { + msec: 2224 + hash: "20f9cf7787c8cfd4843289f5ab2012e7" + } + Frame { + msec: 2240 + hash: "20f9cf7787c8cfd4843289f5ab2012e7" + } + Frame { + msec: 2256 + hash: "20f9cf7787c8cfd4843289f5ab2012e7" + } + Frame { + msec: 2272 + hash: "20f9cf7787c8cfd4843289f5ab2012e7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 412; y: 153 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2288 + hash: "1241895174f4d8e4386c3957e3d2e292" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 409; y: 154 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2304 + hash: "bb1515904f9b299402d1141445154430" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 401; y: 155 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2320 + hash: "419c09739f855c53be3427a71aa3faf9" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 399; y: 155 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 396; y: 156 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2336 + hash: "ba9d1850c5c43c9aec5660601ba21d2f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 393; y: 158 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2352 + hash: "a130b471b3903f3f1d77f2306da2b92e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 392; y: 158 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2368 + hash: "11d77567aeff20d8f62f2e4100603de3" + } + Frame { + msec: 2384 + hash: "11d77567aeff20d8f62f2e4100603de3" + } + Frame { + msec: 2400 + hash: "11d77567aeff20d8f62f2e4100603de3" + } + Frame { + msec: 2416 + hash: "11d77567aeff20d8f62f2e4100603de3" + } + Frame { + msec: 2432 + hash: "11d77567aeff20d8f62f2e4100603de3" + } + Frame { + msec: 2448 + hash: "11d77567aeff20d8f62f2e4100603de3" + } + Frame { + msec: 2464 + hash: "11d77567aeff20d8f62f2e4100603de3" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 391; y: 159 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 390; y: 159 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2480 + hash: "47e86b008567366f37ac043ed8802d53" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 377; y: 159 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2496 + hash: "92e1d5dbc85e777785cc68171a0a3fbf" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 331; y: 156 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2512 + hash: "2234e44042daf277bd5307635155117f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 294; y: 154 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 249; y: 151 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2528 + hash: "acefb43050e140d689f1d377f50f5c83" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 129; y: 141 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2544 + hash: "4bc43ae81aac757c872157ac9b41a2d9" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 9; y: 133 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2560 + hash: "41421089f087c54ebcd9fa44e95bd96e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -48; y: 128 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -99; y: 126 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2576 + hash: "db0f09393b5c9284142f9eb3cb5952ce" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -173; y: 129 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: -173; y: 129 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2592 + hash: "9491689e51ec46bec07fb8b280daef80" + } + Frame { + msec: 2608 + hash: "398e4a0ebc812b779b38c4541d33424c" + } + Frame { + msec: 2624 + hash: "6bf415b82e7cfa68b8321571ab619c3f" + } + Frame { + msec: 2640 + hash: "0d09a6a0cce6d22c14bc41b8465e8ba0" + } + Frame { + msec: 2656 + hash: "495d14df729eede7e560f2e841bae142" + } + Frame { + msec: 2672 + hash: "5329441c12424e5aa69ee0c5cff5926d" + } + Frame { + msec: 2688 + hash: "482ce41c4b918a71b803c5f521ea494e" + } + Frame { + msec: 2704 + hash: "aa8b21cdea3d0ae6a2e59a1b318da842" + } + Frame { + msec: 2720 + hash: "dd142875acafdc8591a29bcd9f871dab" + } + Frame { + msec: 2736 + hash: "222d638b8fb896563028f029e6fb3c49" + } + Frame { + msec: 2752 + hash: "20b8fc718d9329c9c8901fdfe14557a2" + } + Frame { + msec: 2768 + hash: "36217f04f3b1b70a9cf3fa4881b2def7" + } + Frame { + msec: 2784 + hash: "e3a4b357c00d3d49e4a7d90f6f57054c" + } + Frame { + msec: 2800 + hash: "44ad81d2ad0d502b003e148412871a41" + } + Frame { + msec: 2816 + hash: "7313fc37802c462ddd324a13c8fcdc9c" + } + Frame { + msec: 2832 + hash: "961e84cbb3591cebdb5b83c2aa83887c" + } + Frame { + msec: 2848 + hash: "70e3cd650472d0e95f4d6ca9e34a2ce1" + } + Frame { + msec: 2864 + hash: "19a7825cd8c0eaa6f313ec77fff9ec1b" + } + Frame { + msec: 2880 + hash: "943dfcee3f04c77fba2cec289a288c4b" + } + Frame { + msec: 2896 + image: "test-pathview-2.3.png" + } + Frame { + msec: 2912 + hash: "36be9a0d4376ece0b279a118a3fab364" + } + Frame { + msec: 2928 + hash: "92e9be6d36844bb475b861ba9c4bc3ff" + } + Frame { + msec: 2944 + hash: "08b9cce3b2071b328054af6bcb6755c7" + } + Frame { + msec: 2960 + hash: "b505d2f41a6db06d4ca03f5340800aa6" + } + Frame { + msec: 2976 + hash: "b17faafb59a9d182faf00495736a7fac" + } + Frame { + msec: 2992 + hash: "549eb98193f0e81aee716239f872a21c" + } + Frame { + msec: 3008 + hash: "8dd67df95fae14079ed5b83c421a5b6e" + } + Frame { + msec: 3024 + hash: "7b217f7c51087a07e8922b0286b2c1dc" + } + Frame { + msec: 3040 + hash: "e464b5121f3204c64cafe2f5e31cf497" + } + Frame { + msec: 3056 + hash: "7fc2018f8db17b65fd01b2ddfa44f66d" + } + Frame { + msec: 3072 + hash: "a5d1871511eac7224292b3552da466a8" + } + Frame { + msec: 3088 + hash: "2f0a55cf3cd30da77fbb73e749b729a3" + } + Frame { + msec: 3104 + hash: "9aab649b6664c179878d0ead438dd751" + } + Frame { + msec: 3120 + hash: "9506c95e1febf3d781e6b1dbbaf640d3" + } + Frame { + msec: 3136 + hash: "e73b4fd7cb6285df9a77d666f25ab245" + } + Frame { + msec: 3152 + hash: "adef134dc735305b673c6fa47a3d1a34" + } + Frame { + msec: 3168 + hash: "04fc6aac5f090960cd87eefb4273fb0f" + } + Frame { + msec: 3184 + hash: "294c842a71b5e4927146952ce865c8a2" + } + Frame { + msec: 3200 + hash: "ac6f7afb4a5e67e2edd8300e7dfdff13" + } + Frame { + msec: 3216 + hash: "036d247dd83e0fbfe4f65cbd79e9ab57" + } + Frame { + msec: 3232 + hash: "959270d536187e6b669263a57b260e78" + } + Frame { + msec: 3248 + hash: "ca457a1c503a980687926e31ac16995b" + } + Frame { + msec: 3264 + hash: "42a9b43e2c66a5ef32c8b6564235c623" + } + Frame { + msec: 3280 + hash: "b2a071734226b905f6c6f5652f645517" + } + Frame { + msec: 3296 + hash: "cf5c7868e399fadac1642f47a0b4dbd2" + } + Frame { + msec: 3312 + hash: "9c689254f44a6ced1c4962400613d4da" + } + Frame { + msec: 3328 + hash: "9cfe0627852cefe67fc0b44b31085b4a" + } + Frame { + msec: 3344 + hash: "de7ab5230efb63264f76fa1f1b61dcfa" + } + Frame { + msec: 3360 + hash: "5ad22cf9e1c9a02cfc570beaac55bee0" + } + Frame { + msec: 3376 + hash: "9e6210d9e6bfda4fe0695b75d03435e2" + } + Frame { + msec: 3392 + hash: "d3989a9fb7e99d16032fa1842364f2ed" + } + Frame { + msec: 3408 + hash: "f65c57211997139ae1473951333d7b35" + } + Frame { + msec: 3424 + hash: "16bb17f511519337be2e60d8b9f95149" + } + Frame { + msec: 3440 + hash: "819250fd9899a9457a9300f942f4d8bf" + } + Frame { + msec: 3456 + hash: "191115950915abcb338c3f4c17595840" + } + Frame { + msec: 3472 + hash: "14b553132a86e57577c416e6f6c53433" + } + Frame { + msec: 3488 + hash: "f7a95239db44b66698d29f0daae826f1" + } + Frame { + msec: 3504 + hash: "b5a6abb5294fb9b069ab8a075003cb61" + } + Frame { + msec: 3520 + hash: "391c1c43ce893aeefc42d164e6e8aaac" + } + Frame { + msec: 3536 + hash: "271addef36d51d904bc1d68f65b66de3" + } + Frame { + msec: 3552 + hash: "73a23e56edcd64ac6147aff27b785ebb" + } + Frame { + msec: 3568 + hash: "bd43145ae22086348cb5e68765a42ac1" + } + Frame { + msec: 3584 + hash: "e9de53c430f9de55146ac6606d55d427" + } + Frame { + msec: 3600 + hash: "6420fd46fd8068010d3caaa68eea457e" + } + Frame { + msec: 3616 + hash: "188499a79313d984ed1d710329b0237f" + } + Frame { + msec: 3632 + hash: "12da197320858ea4f8a1437b7ceac95a" + } + Frame { + msec: 3648 + hash: "a44936319089e2379de34edf58b453c1" + } + Frame { + msec: 3664 + hash: "c894ceaf318dd1afe29dcfe171aadf0f" + } + Frame { + msec: 3680 + hash: "deea3a520f3fe43bf92f05a25f791458" + } + Frame { + msec: 3696 + hash: "176381c4acfacecd0d203b7ad8fbd7d4" + } + Frame { + msec: 3712 + hash: "0c6eec50abcf4afc20311ffa1326d4e8" + } + Frame { + msec: 3728 + hash: "21f2e0c3ba2142d1baae9406858f1cea" + } + Frame { + msec: 3744 + hash: "21f2e0c3ba2142d1baae9406858f1cea" + } + Frame { + msec: 3760 + hash: "21f2e0c3ba2142d1baae9406858f1cea" + } + Frame { + msec: 3776 + hash: "21f2e0c3ba2142d1baae9406858f1cea" + } + Frame { + msec: 3792 + hash: "21f2e0c3ba2142d1baae9406858f1cea" + } + Frame { + msec: 3808 + hash: "21f2e0c3ba2142d1baae9406858f1cea" + } + Frame { + msec: 3824 + hash: "21f2e0c3ba2142d1baae9406858f1cea" + } + Frame { + msec: 3840 + hash: "21f2e0c3ba2142d1baae9406858f1cea" + } + Frame { + msec: 3856 + image: "test-pathview-2.4.png" + } + Frame { + msec: 3872 + hash: "21f2e0c3ba2142d1baae9406858f1cea" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 363; y: 156 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3888 + hash: "e66b75e5644018aecd321e498de08ca1" + } + Frame { + msec: 3904 + hash: "e66b75e5644018aecd321e498de08ca1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 363; y: 157 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3920 + hash: "eb346d68bd5b51a31ee2f5d807970d96" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 361; y: 158 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 358; y: 158 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3936 + hash: "ffd30479d99b19926072fa94cdec6195" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 352; y: 159 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3952 + hash: "207efe4cbcebaedca1d2fc6726d46543" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 349; y: 160 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 342; y: 162 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3968 + hash: "f011a043293362d5affcbcdfe3c93131" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 327; y: 166 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3984 + hash: "934ed8956abae51fd19352f23ef9a16a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 320; y: 168 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 320; y: 168 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4000 + hash: "0daf00b242485319f5c9050b9cdb6775" + } + Frame { + msec: 4016 + hash: "8111f56ae5cfcf1d6c934e134602a8dc" + } + Frame { + msec: 4032 + hash: "6f3f6c2ae3c36401d1d96a37bbd62c52" + } + Frame { + msec: 4048 + hash: "11cde9b9369addaa5ff140e3a0bbf9ac" + } + Frame { + msec: 4064 + hash: "fefd7d44805c330c606fcc23b691832e" + } + Frame { + msec: 4080 + hash: "b9eb8f8a78485deafc04a9bac39e5c31" + } + Frame { + msec: 4096 + hash: "f0be22ea55a6a9621718cb5e1b55e6f7" + } + Frame { + msec: 4112 + hash: "cb0d62b8c16406a0ff35feea3ff074b9" + } + Frame { + msec: 4128 + hash: "15bf986b1e4072ce48ef40651e11a93a" + } + Frame { + msec: 4144 + hash: "d29f81f0c8468ea045f1c21adca8c0e6" + } + Frame { + msec: 4160 + hash: "577f27fd6212bbb7394b64b0872d7e6e" + } + Frame { + msec: 4176 + hash: "f26c83a4ede9e04ceabf276fd2eeaa4d" + } + Frame { + msec: 4192 + hash: "34f449f3c29c4b0bb0972e8d3510452c" + } + Frame { + msec: 4208 + hash: "5cf950b9f0bb8c851a2865718bd3e6ec" + } + Frame { + msec: 4224 + hash: "202b5c9cd1717dfef0d1f667ca115571" + } + Frame { + msec: 4240 + hash: "5d703db8af0eeba0327177f79b0fd85b" + } + Frame { + msec: 4256 + hash: "69e4fdbaba2ad4983edcbaad0ccfa905" + } + Frame { + msec: 4272 + hash: "c91389bd9e9c7fce2a8e5ffca851cf89" + } + Frame { + msec: 4288 + hash: "5e2b94dda5af845a368032cc85e3167f" + } + Frame { + msec: 4304 + hash: "5946e2bd9a32130fed9612d6152b7ddd" + } + Frame { + msec: 4320 + hash: "74f13b9111005e610028ea252132c1fc" + } + Frame { + msec: 4336 + hash: "ba2a587b26fd3d92a368e3b63513e145" + } + Frame { + msec: 4352 + hash: "2047ecb0be3173846b7c09b7054bad07" + } + Frame { + msec: 4368 + hash: "db6993dfaad694f812130c112e9c78b6" + } + Frame { + msec: 4384 + hash: "aea54cad7368b8511412f4d9fd1e8b07" + } + Frame { + msec: 4400 + hash: "431d140c8e9a61f6c1fe7a044900b4b7" + } + Frame { + msec: 4416 + hash: "ed80bccd69ebd4326b01fdf46b56dd52" + } + Frame { + msec: 4432 + hash: "edd82b44bd2813f2bf20bbf8be4ad10d" + } + Frame { + msec: 4448 + hash: "527b3fb45d585f70ef2ef2e78d2fff05" + } + Frame { + msec: 4464 + hash: "00b68c12c6cef0b523eeef8c7556a26c" + } + Frame { + msec: 4480 + hash: "37c62b1c2c3d70220b1d7b28a57de0a5" + } + Frame { + msec: 4496 + hash: "e73843907eb7ee18c59b5fe98022f542" + } + Frame { + msec: 4512 + hash: "139d84bfdefd825a89ddd4150a72fa9f" + } + Frame { + msec: 4528 + hash: "779690a2e5291b7d64ceed193bf8e572" + } + Frame { + msec: 4544 + hash: "4ffd9beb48bd769d9e3b8ad3aedff08b" + } + Frame { + msec: 4560 + hash: "b1edf784de34b42bd74390836db976b9" + } + Frame { + msec: 4576 + hash: "78327706741822e6ba8b0b88be469422" + } + Frame { + msec: 4592 + hash: "32979d6f14c1aeca1f7ac0c5a330bbdc" + } + Frame { + msec: 4608 + hash: "8274a35f384478ca2f018c5d914d428d" + } + Frame { + msec: 4624 + hash: "70f4b77c65450eddfa61ebdf2dc75985" + } + Frame { + msec: 4640 + hash: "2f95623085afc48094f122c290566440" + } + Frame { + msec: 4656 + hash: "8f671bd7878b897593eb8ae0358c8a01" + } + Frame { + msec: 4672 + hash: "64cf5c749c85d0e42b6c99f31da955b8" + } + Frame { + msec: 4688 + hash: "22e3394e779e25cc0d6c05bd2c6159d5" + } + Frame { + msec: 4704 + hash: "42bc5633692228e48aa3ce3e3d8a7bbe" + } + Frame { + msec: 4720 + hash: "4dd05fce6984dbc6b6764b5e4189fd94" + } + Frame { + msec: 4736 + hash: "ca7b9bc30c728268b338848230a5a859" + } + Frame { + msec: 4752 + hash: "ca7b9bc30c728268b338848230a5a859" + } + Frame { + msec: 4768 + hash: "ca7b9bc30c728268b338848230a5a859" + } + Frame { + msec: 4784 + hash: "ca7b9bc30c728268b338848230a5a859" + } + Frame { + msec: 4800 + hash: "ca7b9bc30c728268b338848230a5a859" + } + Frame { + msec: 4816 + image: "test-pathview-2.5.png" + } + Frame { + msec: 4832 + hash: "ca7b9bc30c728268b338848230a5a859" + } + Frame { + msec: 4848 + hash: "ca7b9bc30c728268b338848230a5a859" + } + Frame { + msec: 4864 + hash: "ca7b9bc30c728268b338848230a5a859" + } + Frame { + msec: 4880 + hash: "ca7b9bc30c728268b338848230a5a859" + } + Frame { + msec: 4896 + hash: "ca7b9bc30c728268b338848230a5a859" + } + Frame { + msec: 4912 + hash: "ca7b9bc30c728268b338848230a5a859" + } + Frame { + msec: 4928 + hash: "ca7b9bc30c728268b338848230a5a859" + } + Frame { + msec: 4944 + hash: "ca7b9bc30c728268b338848230a5a859" + } + Frame { + msec: 4960 + hash: "ca7b9bc30c728268b338848230a5a859" + } + Frame { + msec: 4976 + hash: "ca7b9bc30c728268b338848230a5a859" + } + Frame { + msec: 4992 + hash: "ca7b9bc30c728268b338848230a5a859" + } + Frame { + msec: 5008 + hash: "ca7b9bc30c728268b338848230a5a859" + } + Frame { + msec: 5024 + hash: "ca7b9bc30c728268b338848230a5a859" + } + Frame { + msec: 5040 + hash: "ca7b9bc30c728268b338848230a5a859" + } + Frame { + msec: 5056 + hash: "d30be31c0f9d92aeba83ce345551005a" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.0.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.0.png new file mode 100644 index 00000000..af0e7817 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.1.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.1.png new file mode 100644 index 00000000..d3e98dcb Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.2.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.2.png new file mode 100644 index 00000000..9c6c1c3f Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.3.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.3.png new file mode 100644 index 00000000..fc1574a2 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.4.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.4.png new file mode 100644 index 00000000..f76ae14a Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.5.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.5.png new file mode 100644 index 00000000..f6b8e83c Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.5.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.6.png b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.6.png new file mode 100644 index 00000000..d7b5943f Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.6.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.qml b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.qml new file mode 100644 index 00000000..32c2a15f --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/data/test-pathview.qml @@ -0,0 +1,2567 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "test-pathview.0.png" + } + Frame { + msec: 32 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Frame { + msec: 48 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Frame { + msec: 64 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Frame { + msec: 80 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Frame { + msec: 96 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Frame { + msec: 112 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Frame { + msec: 128 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Frame { + msec: 144 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Frame { + msec: 160 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Frame { + msec: 176 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Frame { + msec: 192 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Frame { + msec: 208 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Frame { + msec: 224 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Frame { + msec: 240 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Frame { + msec: 256 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Frame { + msec: 272 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Frame { + msec: 288 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Frame { + msec: 304 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Frame { + msec: 320 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Frame { + msec: 336 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Frame { + msec: 352 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Frame { + msec: 368 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Frame { + msec: 384 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Frame { + msec: 400 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Frame { + msec: 416 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Frame { + msec: 432 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Frame { + msec: 448 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Frame { + msec: 464 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Frame { + msec: 480 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Frame { + msec: 496 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Frame { + msec: 512 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Frame { + msec: 528 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Frame { + msec: 544 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 363; y: 161 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 560 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 362; y: 160 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 576 + hash: "b9fed927475786f6f7aefc554cfc1afe" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 361; y: 159 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 357; y: 159 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 592 + hash: "683d9f54c75f5b1ed082edb0b4559bc8" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 348; y: 157 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 330; y: 157 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 608 + hash: "02e5238c0764f370d0f463cc3f477df7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 286; y: 161 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 624 + hash: "02239cd84ce630a89b94dbcf469d9a70" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 254; y: 163 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 640 + hash: "51c14d87d2cf89aaece5bd682008f67f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 240; y: 165 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 225; y: 167 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 656 + hash: "db00a0d69efd43f69c83dafbf38a06a6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 191; y: 171 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 672 + hash: "1bfd848a89a0477596b77903a173f728" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 174; y: 171 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 153; y: 171 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 153; y: 171 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 688 + hash: "f66f04b42b0db33b852a82030d647886" + } + Frame { + msec: 704 + hash: "e1573c6fd92f0fc4e267a37f417d0bc0" + } + Frame { + msec: 720 + hash: "017044987c781ad8bb4cd8242f9091ed" + } + Frame { + msec: 736 + hash: "cd952ffa63dbcb772b666ce755c9a2f1" + } + Frame { + msec: 752 + hash: "2a31778e3ab7c676ae82278948cef12a" + } + Frame { + msec: 768 + hash: "cb9e1ef51c8367e0b8c71cfdb70906fa" + } + Frame { + msec: 784 + hash: "05ccb24a2025df31188b413c8d837232" + } + Frame { + msec: 800 + hash: "df31f9dba1a762397c0364d7e83052ef" + } + Frame { + msec: 816 + hash: "6eec07606ef320072ea23ceedb3f6b29" + } + Frame { + msec: 832 + hash: "e3502cb53c6e17373de3b718a8212f4d" + } + Frame { + msec: 848 + hash: "c684dc3153314fe3a73fa0dd09f27695" + } + Frame { + msec: 864 + hash: "f1d5e911a68f9922f29bb6ae14234da9" + } + Frame { + msec: 880 + hash: "aa9c3122e3c2a7ed450a0afffbcf4e6a" + } + Frame { + msec: 896 + hash: "1535dea92038cf87395a616841fd9bf6" + } + Frame { + msec: 912 + hash: "1535dea92038cf87395a616841fd9bf6" + } + Frame { + msec: 928 + hash: "1535dea92038cf87395a616841fd9bf6" + } + Frame { + msec: 944 + hash: "1535dea92038cf87395a616841fd9bf6" + } + Frame { + msec: 960 + hash: "1535dea92038cf87395a616841fd9bf6" + } + Frame { + msec: 976 + image: "test-pathview.1.png" + } + Frame { + msec: 992 + hash: "1535dea92038cf87395a616841fd9bf6" + } + Frame { + msec: 1008 + hash: "1535dea92038cf87395a616841fd9bf6" + } + Frame { + msec: 1024 + hash: "1535dea92038cf87395a616841fd9bf6" + } + Frame { + msec: 1040 + hash: "1535dea92038cf87395a616841fd9bf6" + } + Frame { + msec: 1056 + hash: "1535dea92038cf87395a616841fd9bf6" + } + Frame { + msec: 1072 + hash: "1535dea92038cf87395a616841fd9bf6" + } + Frame { + msec: 1088 + hash: "1535dea92038cf87395a616841fd9bf6" + } + Frame { + msec: 1104 + hash: "1535dea92038cf87395a616841fd9bf6" + } + Frame { + msec: 1120 + hash: "1535dea92038cf87395a616841fd9bf6" + } + Frame { + msec: 1136 + hash: "1535dea92038cf87395a616841fd9bf6" + } + Frame { + msec: 1152 + hash: "1535dea92038cf87395a616841fd9bf6" + } + Frame { + msec: 1168 + hash: "1535dea92038cf87395a616841fd9bf6" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 378; y: 161 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1184 + hash: "1535dea92038cf87395a616841fd9bf6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 376; y: 161 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1200 + hash: "1535dea92038cf87395a616841fd9bf6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 374; y: 161 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 373; y: 161 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1216 + hash: "aa9c3122e3c2a7ed450a0afffbcf4e6a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 367; y: 160 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 353; y: 160 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1232 + hash: "b889647c08af7db2e6582d9927cb1cf7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 328; y: 157 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 303; y: 155 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1248 + hash: "1cea77e58dbf1c9f321eab2f01f37be0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 280; y: 153 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 253; y: 151 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1264 + hash: "b38c46d537e6e622c8a0ecae76dbe506" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 230; y: 151 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 211; y: 151 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1280 + hash: "6261f2f16bdd89142cfbf1de4ce64a32" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 193; y: 153 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 193; y: 153 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1296 + hash: "d4f8d57bae3d5bc888a4bbe2812b3fdf" + } + Frame { + msec: 1312 + hash: "11717eaf13ac83760984afa47bbd52f7" + } + Frame { + msec: 1328 + hash: "b20e244f27dae505568fcba25cccb5d8" + } + Frame { + msec: 1344 + hash: "f31d264a002718787ea55a6312c7f9f2" + } + Frame { + msec: 1360 + hash: "514d400cdc9c356a0de3c04649d885dc" + } + Frame { + msec: 1376 + hash: "64fc0f18174f5e8002cf79a908cc08df" + } + Frame { + msec: 1392 + hash: "ab04af0d0f0f0d4538ec58841306cea7" + } + Frame { + msec: 1408 + hash: "5cbc813c467b453c3e8de177aaede5b6" + } + Frame { + msec: 1424 + hash: "47e431bf01575c44f7c1fa3e20409866" + } + Frame { + msec: 1440 + hash: "d17b62a0b52b4a5220b29b55f764abc6" + } + Frame { + msec: 1456 + hash: "9bd0d8dfbee424bd0ccf72703a7c51c2" + } + Frame { + msec: 1472 + hash: "8ef880c18ecd8adb66e7e0a2dceb61fc" + } + Frame { + msec: 1488 + hash: "fcc1bc7f35342f595448ca2870478b50" + } + Frame { + msec: 1504 + hash: "24421668a7814c3db8b7d1e50d2e9137" + } + Frame { + msec: 1520 + hash: "b2a6acf1fed92069fd2779b1fa236c95" + } + Frame { + msec: 1536 + hash: "7128a442b6bb06038477d46ac3da5021" + } + Frame { + msec: 1552 + hash: "6a0ab3ccc3749b9a2b9a5b5851b0cf70" + } + Frame { + msec: 1568 + hash: "18f6cdad215c55ea8335d06110715aa8" + } + Frame { + msec: 1584 + hash: "137420f4b1f51440c3aefd18dbdad71d" + } + Frame { + msec: 1600 + hash: "a4a436b32e96fe5f9c3309bd1cabe65a" + } + Frame { + msec: 1616 + hash: "cb801c9d2b7f04a0413898ea74c61f80" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 339; y: 152 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 334; y: 152 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1632 + hash: "2e74cc22a4e5b20cc231bc08e15e662a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 245; y: 152 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 161; y: 148 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1648 + hash: "27be226c985bb0143d1dca3e4be4b10a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 139; y: 150 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 139; y: 150 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1664 + hash: "9384d46806b2a8091b6d16f7636d6ae4" + } + Frame { + msec: 1680 + hash: "38e396c6fa5754d0070e4fd17ab2dc8b" + } + Frame { + msec: 1696 + hash: "dc1facc91b6935983bbcd2eada452d4d" + } + Frame { + msec: 1712 + hash: "6bb08cc431a3ecca1a553ea10669bb0c" + } + Frame { + msec: 1728 + hash: "1330640d4ca9ac69dd089cea34b7f61d" + } + Frame { + msec: 1744 + hash: "95370207a55b56c41923937b40d5fe6b" + } + Frame { + msec: 1760 + hash: "ba1a6b8e55d7c5d73b371c8821f8caa2" + } + Frame { + msec: 1776 + hash: "ec19910e0f7b3e218d5a1992a7d00c4a" + } + Frame { + msec: 1792 + hash: "7ca87adb6f69c5530be9da6df6b1d9a9" + } + Frame { + msec: 1808 + hash: "05109c3dfac7f65fe00e81d1a145f048" + } + Frame { + msec: 1824 + hash: "3da4fe69c1d6904a36d95bcd43f52195" + } + Frame { + msec: 1840 + hash: "3cdb89ceb3ee66349b8a19301cc58e3d" + } + Frame { + msec: 1856 + hash: "98088442867a0f1ec90144c531c9c5fb" + } + Frame { + msec: 1872 + hash: "22d87a7d6409e2ce659a869dce57eef8" + } + Frame { + msec: 1888 + hash: "c1466f188c724c889017db70e2d60153" + } + Frame { + msec: 1904 + hash: "e5392d308078449277be8d2f57561551" + } + Frame { + msec: 1920 + hash: "f0dcfd9b22f385fedfde964774480f85" + } + Frame { + msec: 1936 + image: "test-pathview.2.png" + } + Frame { + msec: 1952 + hash: "8d6a232f303e48c9366dbf265cedf958" + } + Frame { + msec: 1968 + hash: "c6bc2031a4c59eb7a5b34e663252e91c" + } + Frame { + msec: 1984 + hash: "bf8be42cdcdcfd205c8cb7e937ff5d0d" + } + Frame { + msec: 2000 + hash: "ac57c578e7e2cbb57e982d6da5fb7268" + } + Frame { + msec: 2016 + hash: "db40e242fabf119f0e7187eeb96a34a5" + } + Frame { + msec: 2032 + hash: "9a2c8dd1883824415f5825a2a5cf3d09" + } + Frame { + msec: 2048 + hash: "78e31d9b30619ee5774d3cf10b5af762" + } + Frame { + msec: 2064 + hash: "67a28c2188aecfc5dcccedd257789dbc" + } + Frame { + msec: 2080 + hash: "4355f220c8a87ad981088fb23bb15f11" + } + Frame { + msec: 2096 + hash: "6a2f7dde022d4044e8772b8fcc28b02e" + } + Frame { + msec: 2112 + hash: "ba13b0b4790aec7084b5553fe0b0d72b" + } + Frame { + msec: 2128 + hash: "662402cd180eb325c174b6935a9d3f0a" + } + Frame { + msec: 2144 + hash: "8eb192c9d01fe205ddcba2d5cadab65f" + } + Frame { + msec: 2160 + hash: "bcc69f859b3bff759e0c732c7adc23f0" + } + Frame { + msec: 2176 + hash: "bc0ee50215b6b31422ee423f7955770c" + } + Frame { + msec: 2192 + hash: "955212dc28a6f8fe59c658401284d3a3" + } + Frame { + msec: 2208 + hash: "0ce5216f041f657a96ae4693319bfad3" + } + Frame { + msec: 2224 + hash: "0370a09ab78439e9df487ea55853ef98" + } + Frame { + msec: 2240 + hash: "23190380ddcc4e3afce2164a4743d179" + } + Frame { + msec: 2256 + hash: "40ca7c3d24883a8d3457de934b247280" + } + Frame { + msec: 2272 + hash: "299ed19fa4d213e0e9dd127e8799d5fc" + } + Frame { + msec: 2288 + hash: "e39a067860fa7dcb4efba87aee58cc77" + } + Frame { + msec: 2304 + hash: "a709045723c4a9a2e85295fcc360eea9" + } + Frame { + msec: 2320 + hash: "44ecad3423a36882755fad6fb79bc2c8" + } + Frame { + msec: 2336 + hash: "b3eaadeb9d3b008fcf21c58158e8b028" + } + Frame { + msec: 2352 + hash: "110b000fa3e122560480d466fe231b21" + } + Frame { + msec: 2368 + hash: "51f7c896d79c900a2b54a8c756228200" + } + Frame { + msec: 2384 + hash: "28c18081813c801c6793873ec23e6c0c" + } + Frame { + msec: 2400 + hash: "65c1f85d2086f5e6d95d9b99a84281a5" + } + Frame { + msec: 2416 + hash: "752cb6969fa8b76abf4bb229edb2c21f" + } + Frame { + msec: 2432 + hash: "f00ea591d697546b5afe4420b702db49" + } + Frame { + msec: 2448 + hash: "d510db233f025b026f896b760848cc07" + } + Frame { + msec: 2464 + hash: "e5c8d361abcbc15df0b0b82728cb5b84" + } + Frame { + msec: 2480 + hash: "e5c8d361abcbc15df0b0b82728cb5b84" + } + Frame { + msec: 2496 + hash: "e5c8d361abcbc15df0b0b82728cb5b84" + } + Frame { + msec: 2512 + hash: "e5c8d361abcbc15df0b0b82728cb5b84" + } + Frame { + msec: 2528 + hash: "e5c8d361abcbc15df0b0b82728cb5b84" + } + Frame { + msec: 2544 + hash: "e5c8d361abcbc15df0b0b82728cb5b84" + } + Frame { + msec: 2560 + hash: "e5c8d361abcbc15df0b0b82728cb5b84" + } + Frame { + msec: 2576 + hash: "e5c8d361abcbc15df0b0b82728cb5b84" + } + Frame { + msec: 2592 + hash: "e5c8d361abcbc15df0b0b82728cb5b84" + } + Frame { + msec: 2608 + hash: "e5c8d361abcbc15df0b0b82728cb5b84" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 72; y: 121 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2624 + hash: "e5c8d361abcbc15df0b0b82728cb5b84" + } + Frame { + msec: 2640 + hash: "e5c8d361abcbc15df0b0b82728cb5b84" + } + Frame { + msec: 2656 + hash: "e5c8d361abcbc15df0b0b82728cb5b84" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 73; y: 121 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 74; y: 122 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2672 + hash: "f728208b0fc2f230313c86378cf7f419" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 79; y: 123 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 95; y: 129 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2688 + hash: "f728208b0fc2f230313c86378cf7f419" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 126; y: 138 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 161; y: 148 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2704 + hash: "f728208b0fc2f230313c86378cf7f419" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 194; y: 158 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 239; y: 169 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2720 + hash: "f728208b0fc2f230313c86378cf7f419" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 280; y: 178 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 313; y: 185 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2736 + hash: "f728208b0fc2f230313c86378cf7f419" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 344; y: 191 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 344; y: 191 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2752 + hash: "f728208b0fc2f230313c86378cf7f419" + } + Frame { + msec: 2768 + hash: "f728208b0fc2f230313c86378cf7f419" + } + Frame { + msec: 2784 + hash: "f728208b0fc2f230313c86378cf7f419" + } + Frame { + msec: 2800 + hash: "f728208b0fc2f230313c86378cf7f419" + } + Frame { + msec: 2816 + hash: "f728208b0fc2f230313c86378cf7f419" + } + Frame { + msec: 2832 + hash: "f728208b0fc2f230313c86378cf7f419" + } + Frame { + msec: 2848 + hash: "f728208b0fc2f230313c86378cf7f419" + } + Frame { + msec: 2864 + hash: "f728208b0fc2f230313c86378cf7f419" + } + Frame { + msec: 2880 + hash: "f728208b0fc2f230313c86378cf7f419" + } + Frame { + msec: 2896 + image: "test-pathview.3.png" + } + Frame { + msec: 2912 + hash: "f728208b0fc2f230313c86378cf7f419" + } + Frame { + msec: 2928 + hash: "f728208b0fc2f230313c86378cf7f419" + } + Frame { + msec: 2944 + hash: "f728208b0fc2f230313c86378cf7f419" + } + Frame { + msec: 2960 + hash: "f728208b0fc2f230313c86378cf7f419" + } + Frame { + msec: 2976 + hash: "f728208b0fc2f230313c86378cf7f419" + } + Frame { + msec: 2992 + hash: "f728208b0fc2f230313c86378cf7f419" + } + Frame { + msec: 3008 + hash: "f728208b0fc2f230313c86378cf7f419" + } + Frame { + msec: 3024 + hash: "f728208b0fc2f230313c86378cf7f419" + } + Frame { + msec: 3040 + hash: "f728208b0fc2f230313c86378cf7f419" + } + Frame { + msec: 3056 + hash: "f728208b0fc2f230313c86378cf7f419" + } + Frame { + msec: 3072 + hash: "f728208b0fc2f230313c86378cf7f419" + } + Frame { + msec: 3088 + hash: "f728208b0fc2f230313c86378cf7f419" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 152; y: 143 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3104 + hash: "f728208b0fc2f230313c86378cf7f419" + } + Frame { + msec: 3120 + hash: "f728208b0fc2f230313c86378cf7f419" + } + Frame { + msec: 3136 + hash: "f728208b0fc2f230313c86378cf7f419" + } + Frame { + msec: 3152 + hash: "f728208b0fc2f230313c86378cf7f419" + } + Frame { + msec: 3168 + hash: "f728208b0fc2f230313c86378cf7f419" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 151; y: 144 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3184 + hash: "f728208b0fc2f230313c86378cf7f419" + } + Frame { + msec: 3200 + hash: "f728208b0fc2f230313c86378cf7f419" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 152; y: 145 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 153; y: 145 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3216 + hash: "f728208b0fc2f230313c86378cf7f419" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 155; y: 146 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 157; y: 146 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3232 + hash: "7d43010a9951054df82571936a04cc50" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 161; y: 147 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 164; y: 148 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3248 + hash: "ab1980970c82238d2c37d61db4fc5153" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 166; y: 148 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 168; y: 149 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3264 + hash: "dc7f5231d844b36e1429f1072080a60c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 170; y: 150 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 171; y: 150 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3280 + hash: "161410fe9eb458c717cfbb9ef0626535" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 175; y: 150 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 177; y: 151 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3296 + hash: "91a884de3e19dc6ca7fcde32492b3ff1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 180; y: 152 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 183; y: 152 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3312 + hash: "ab2d88a4cd58d0064c32660272ff1dbd" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 187; y: 153 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 191; y: 154 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3328 + hash: "ed299cd4ef2364ab1d7b702e2b0a7233" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 193; y: 154 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 195; y: 154 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3344 + hash: "4346ad16720e853154bfc1a22d9e7f55" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 197; y: 154 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 199; y: 155 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3360 + hash: "1347a26241ed98d4913e1cb6cda58286" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 202; y: 155 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 202; y: 155 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3376 + hash: "2efe07858c0c4de7fd3e339d7a24d5f5" + } + Frame { + msec: 3392 + hash: "3edbe6755710ce148341faeb6980707a" + } + Frame { + msec: 3408 + hash: "fb7b31720b9de8d820ce29d9861482dd" + } + Frame { + msec: 3424 + hash: "4bb82c8b498b41e0785bea6b2c52b5e6" + } + Frame { + msec: 3440 + hash: "207003ce6908f9707e9193a6c82a40c0" + } + Frame { + msec: 3456 + hash: "04f3c7a5cb270405446cbb85da8c1c16" + } + Frame { + msec: 3472 + hash: "1fdaaa68c4ed484536c207a0eacf6e72" + } + Frame { + msec: 3488 + hash: "d1223c8254f9e7e37c4e09628f38bce2" + } + Frame { + msec: 3504 + hash: "3b0dce0a781799bd24073a6dc9717f68" + } + Frame { + msec: 3520 + hash: "1f6fc9f37a02e54418d90307f06c5b6f" + } + Frame { + msec: 3536 + hash: "a1116c06874af67ff54d69009f78d4da" + } + Frame { + msec: 3552 + hash: "4717c402fc7ad0d3f44b9944672d2746" + } + Frame { + msec: 3568 + hash: "7a180273295e9a30f5e26cdb080b87f2" + } + Frame { + msec: 3584 + hash: "8d8c117ca102cb93e752904fe3aee7bc" + } + Frame { + msec: 3600 + hash: "3cee427f42e8ccd33e9fccd903ae6f1d" + } + Frame { + msec: 3616 + hash: "bbd5f2b95325fde3b8759f2ef713c6bd" + } + Frame { + msec: 3632 + hash: "25779cf68847c0a132ea4aed6a5ef4d3" + } + Frame { + msec: 3648 + hash: "5a424e7e66d87d278483c43070920d56" + } + Frame { + msec: 3664 + hash: "ae28bc20e20e022e1ac9bc2ddac0e134" + } + Frame { + msec: 3680 + hash: "9f3c20980b481806ce7c1b33c177a049" + } + Frame { + msec: 3696 + hash: "5fb403dc08f95fb0651dcd33d32ef6c0" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 117; y: 142 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 118; y: 142 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3712 + hash: "c6422e39ed268dd67846e55908bc6f21" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 118; y: 143 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3728 + hash: "913269856c18d4f478eed1aa1d5ae293" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 119; y: 143 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 120; y: 143 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3744 + hash: "2c6a32e167bef4c3de0ca97e5764f31b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 121; y: 144 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 122; y: 144 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3760 + hash: "88386cf4d982c5ca4e3fbd3519d9bd9c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 123; y: 144 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 124; y: 144 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3776 + hash: "8c30751e1d1e443b5ad217151e8e8fc8" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 126; y: 144 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 129; y: 145 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3792 + hash: "b09c45ea79cd818bac6fe35e4167d4bd" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 132; y: 145 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 135; y: 146 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3808 + hash: "e621e9486e10332d937417a0b6be6be7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 139; y: 147 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 143; y: 149 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3824 + hash: "f4a805fc5c12cc3b2a22ef01050bf3aa" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 147; y: 150 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 152; y: 151 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3840 + hash: "aa7805e4d806c4c56ded804145c44464" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 156; y: 152 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 161; y: 153 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3856 + image: "test-pathview.4.png" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 168; y: 155 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 175; y: 155 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3872 + hash: "f6495f86ae29c7a996b3302300e98f75" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 184; y: 157 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 194; y: 158 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3888 + hash: "0dda191a66162db6365c663979b0990d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 203; y: 160 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 211; y: 160 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3904 + hash: "72a57fe4fc34a19040890a9e2a11dae5" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 221; y: 162 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 231; y: 162 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3920 + hash: "3a303646ea0fd126ee00c847efa48d0c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 241; y: 162 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 251; y: 164 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3936 + hash: "8d33b6fa9d6525902e5611cf8ed2fa1f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 276; y: 167 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3952 + hash: "d73a8eba0c43f214946052481f3db98f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 288; y: 167 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 301; y: 169 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3968 + hash: "c2f101636963ff5c61be2ad83c6b7ceb" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 312; y: 169 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 324; y: 171 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 324; y: 171 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3984 + hash: "54630f489303c7ec2e94b4c941bd310f" + } + Frame { + msec: 4000 + hash: "357106c752b13bcca047d55a3c7cd486" + } + Frame { + msec: 4016 + hash: "3cc1355449b8ec7209537fedb0af43b1" + } + Frame { + msec: 4032 + hash: "7da9e4197cb9be292e561790af1caa27" + } + Frame { + msec: 4048 + hash: "2f4e6b57c6a4fa1689e585214f35702a" + } + Frame { + msec: 4064 + hash: "76edfedd2b9edcc5770dcce87b022427" + } + Frame { + msec: 4080 + hash: "68165bd37b4cb1609d686a361ae54e06" + } + Frame { + msec: 4096 + hash: "436e81734e23502ef8604145d5892c41" + } + Frame { + msec: 4112 + hash: "93f005a5a6a989db3e1702fa4f11f6ee" + } + Frame { + msec: 4128 + hash: "7d00d2a606d92cb8c0726c14cba0f989" + } + Frame { + msec: 4144 + hash: "32ebb24cee3ba65f9242708538203553" + } + Frame { + msec: 4160 + hash: "948429b8ded1f688cd7e27e0f056f40c" + } + Frame { + msec: 4176 + hash: "c6fc2e8519a31bc18eb924ca98cd24be" + } + Frame { + msec: 4192 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 4208 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 4224 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 4240 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 4256 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 4272 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 4288 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 4304 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 4320 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 4336 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 4352 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 4368 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 4384 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 4400 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 112; y: 126 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4416 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 112; y: 128 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4432 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 114; y: 128 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 115; y: 130 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4448 + hash: "96815da788d9968a173e7005d3ca8bff" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 116; y: 130 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 119; y: 132 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4464 + hash: "6949c70729c3e43bc59cc12d4bb82d8f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 122; y: 134 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 131; y: 138 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4480 + hash: "26ce66ebfa6eec9eab4d987ef4ec5d5f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 147; y: 144 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 168; y: 151 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4496 + hash: "46e206837a34ba4d418c4e1098b49fd8" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 190; y: 157 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 219; y: 164 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4512 + hash: "ac7451dcd3f1359ca2850bd986c22994" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 269; y: 171 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4528 + hash: "f9179ba9c011bc1492daf0d22f7e85e0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 319; y: 176 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4544 + hash: "8db5ba9548ecad76b889d9024f59b5cf" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 361; y: 180 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4560 + hash: "30375b9f69ca4ac1b67ff208fd18817f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 406; y: 185 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4576 + hash: "3ba2bd45231cdea3bd9f868c9d35f91e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 428; y: 187 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 428; y: 187 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4592 + hash: "50646478058ada031f29b5df661e734e" + } + Frame { + msec: 4608 + hash: "ab6f2fb209650dbf83710f3299db8907" + } + Frame { + msec: 4624 + hash: "dbec24d44d19b834e9a4936c960c4295" + } + Frame { + msec: 4640 + hash: "09c41872193e4a6eab37b35ef4e90465" + } + Frame { + msec: 4656 + hash: "1778dc99de59e28a730a1439a7576abb" + } + Frame { + msec: 4672 + hash: "6dbbdb5b4e6c6870b5dd62b1b94f9dd3" + } + Frame { + msec: 4688 + hash: "3b5cf826c12339c0c635ae1ffcd431e7" + } + Frame { + msec: 4704 + hash: "6d6068c26eea67214fd3529ab84ab5b5" + } + Frame { + msec: 4720 + hash: "54cbc4842acb46254746984936656c5b" + } + Frame { + msec: 4736 + hash: "10707bae5274ad29ac3e4aea320a30bf" + } + Frame { + msec: 4752 + hash: "ad288c8afc21a87077bae47cbaed1a46" + } + Frame { + msec: 4768 + hash: "bc1c391b0d7a56276b7c082aa2882e47" + } + Frame { + msec: 4784 + hash: "c62341687ca048da1551eb708c7e8a19" + } + Frame { + msec: 4800 + hash: "1a4e3bb688d6fcfe937f53f8179b21e0" + } + Frame { + msec: 4816 + image: "test-pathview.5.png" + } + Frame { + msec: 4832 + hash: "0646877fe2f6935ca4b34495abed5919" + } + Frame { + msec: 4848 + hash: "46899d9c0a188671d9b7ec01c827ad03" + } + Frame { + msec: 4864 + hash: "85cd8aa6dfa28c5d2e10f1ff83644d8f" + } + Frame { + msec: 4880 + hash: "323711ddd10147f51d903f524195b9fe" + } + Frame { + msec: 4896 + hash: "ba6b46ac25a4f111c926522fc47d7367" + } + Frame { + msec: 4912 + hash: "5dab5804d66b6aa8e4f73246c3b19557" + } + Frame { + msec: 4928 + hash: "2cac21d8e33bc01431a6aedabba3ce18" + } + Frame { + msec: 4944 + hash: "e1edf4268e206a40543d1a6caa4d0b43" + } + Frame { + msec: 4960 + hash: "4989e920c0d173e68c3de730a5f4f877" + } + Frame { + msec: 4976 + hash: "9840b722350840b56b096fda3a70f8e8" + } + Frame { + msec: 4992 + hash: "261b7a66300ff2a9b761dd70d02ed490" + } + Frame { + msec: 5008 + hash: "7b6ffb01c050c31bfb433077c8336ed9" + } + Frame { + msec: 5024 + hash: "f8a20f8fe943b498dae9ba8fed113496" + } + Frame { + msec: 5040 + hash: "e66b0f50bae2d0bba73f415af2c8dba1" + } + Frame { + msec: 5056 + hash: "c82bb5035ff84c955f34f1189dcdbda4" + } + Frame { + msec: 5072 + hash: "8fce2628032b2a1f16373e721671ab8c" + } + Frame { + msec: 5088 + hash: "e260e978d88301448eb56145e0fdfd07" + } + Frame { + msec: 5104 + hash: "7c5d5bfdabf8b7f1d01fb1761ec976b3" + } + Frame { + msec: 5120 + hash: "eeb8f15a4cbecf4013f48015ebb1840d" + } + Frame { + msec: 5136 + hash: "fb7bbed845f6fd5648c73431b0e4f65a" + } + Frame { + msec: 5152 + hash: "6e944ef5057031fc6a56ea27036c953a" + } + Frame { + msec: 5168 + hash: "0f96b7d876cb893081606ff93f7cf5c7" + } + Frame { + msec: 5184 + hash: "5904e4105e1108427a2826f24f82b293" + } + Frame { + msec: 5200 + hash: "79a79fd11348a5a250d132a151446711" + } + Frame { + msec: 5216 + hash: "edfed341f047b923aea434a3c31c8c27" + } + Frame { + msec: 5232 + hash: "06e8e9e202b395dc3b230b1b7a982bf8" + } + Frame { + msec: 5248 + hash: "d2ba2520683cdb64d366ab44a54b4668" + } + Frame { + msec: 5264 + hash: "94b1e8a018f17f761de164a8acf4d68a" + } + Frame { + msec: 5280 + hash: "8abb0aa8951612338c3bb87c7a0d2509" + } + Frame { + msec: 5296 + hash: "8abb0aa8951612338c3bb87c7a0d2509" + } + Frame { + msec: 5312 + hash: "8abb0aa8951612338c3bb87c7a0d2509" + } + Frame { + msec: 5328 + hash: "8abb0aa8951612338c3bb87c7a0d2509" + } + Frame { + msec: 5344 + hash: "8abb0aa8951612338c3bb87c7a0d2509" + } + Frame { + msec: 5360 + hash: "8abb0aa8951612338c3bb87c7a0d2509" + } + Frame { + msec: 5376 + hash: "8abb0aa8951612338c3bb87c7a0d2509" + } + Frame { + msec: 5392 + hash: "8abb0aa8951612338c3bb87c7a0d2509" + } + Frame { + msec: 5408 + hash: "8abb0aa8951612338c3bb87c7a0d2509" + } + Frame { + msec: 5424 + hash: "8abb0aa8951612338c3bb87c7a0d2509" + } + Frame { + msec: 5440 + hash: "8abb0aa8951612338c3bb87c7a0d2509" + } + Frame { + msec: 5456 + hash: "8abb0aa8951612338c3bb87c7a0d2509" + } + Frame { + msec: 5472 + hash: "8abb0aa8951612338c3bb87c7a0d2509" + } + Frame { + msec: 5488 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 5504 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 5520 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 5536 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 5552 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 5568 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 5584 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 5600 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 5616 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 5632 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 5648 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 5664 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 5680 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 5696 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 5712 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 5728 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 5744 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 5760 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 5776 + image: "test-pathview.6.png" + } + Frame { + msec: 5792 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 5808 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 5824 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 5840 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 5856 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 5872 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 5888 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 5904 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 5920 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 5936 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 5952 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 5968 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 5984 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 6000 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 6016 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 6032 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 6048 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 6064 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 6080 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 6096 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 6112 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 6128 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 6144 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 6160 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 6176 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 6192 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 6208 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 6224 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 6240 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 6256 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } + Frame { + msec: 6272 + hash: "a29d4b3fa16829823e63bf83e7b62aff" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/test-pathview-2.qml b/tests/auto/declarative/qmlvisual/qdeclarativepathview/test-pathview-2.qml new file mode 100644 index 00000000..31712034 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/test-pathview-2.qml @@ -0,0 +1,70 @@ +import QtQuick 1.0 + +Rectangle { + width: 580; height: 220 + //Same as test-pathview, but with pathItemCount < model.count + + 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: 65; height: 65; color: lColor + scale: wrapper.PathView.scale + + MouseArea { anchors.fill: parent } + + 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 + anchors.fill: parent; z: 1 + anchors.topMargin:40 + pathItemCount: 6 + path: Path { + startX: -50; startY: 40; + + PathAttribute { name: "scale"; value: 0.5 } + PathAttribute { name: "angle"; value: -45 } + + PathCubic { + x: 300; y: 140 + control1X: 90; control1Y: 30 + control2X: 140; control2Y: 150 + } + + PathAttribute { name: "scale"; value: 1.2 } + PathAttribute { name: "angle"; value: 0 } + + PathCubic { + x: 600; y: 30 + control2X: 440; control2Y: 30 + control1X: 420; control1Y: 150 + } + + PathAttribute { name: "scale"; value: 0.5 } + PathAttribute { name: "angle"; value: 45 } + } + } + + Column { + Rectangle { width: 20; height: 20; color: "red"; opacity: photoPathView.moving ? 1 : 0 } + Rectangle { width: 20; height: 20; color: "blue"; opacity: photoPathView.flicking ? 1 : 0 } + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepathview/test-pathview.qml b/tests/auto/declarative/qmlvisual/qdeclarativepathview/test-pathview.qml new file mode 100644 index 00000000..08499e76 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativepathview/test-pathview.qml @@ -0,0 +1,70 @@ +import QtQuick 1.0 + +Rectangle { + width: 580; height: 220 + + 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: 65; height: 65; color: lColor + scale: wrapper.PathView.scale + + MouseArea { anchors.fill: parent } + + 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 + anchors.fill: parent; z: 1 + anchors.topMargin:40 + highlightMoveDuration: 200 + flickDeceleration: 200 + path: Path { + startX: -50; startY: 40; + + PathAttribute { name: "scale"; value: 0.5 } + PathAttribute { name: "angle"; value: -45 } + + PathCubic { + x: 300; y: 140 + control1X: 90; control1Y: 30 + control2X: 140; control2Y: 150 + } + + PathAttribute { name: "scale"; value: 1.2 } + PathAttribute { name: "angle"; value: 0 } + + PathCubic { + x: 600; y: 30 + control2X: 440; control2Y: 30 + control1X: 420; control1Y: 150 + } + + PathAttribute { name: "scale"; value: 0.5 } + PathAttribute { name: "angle"; value: 45 } + } + } + + Column { + Rectangle { width: 20; height: 20; color: "red"; opacity: photoPathView.moving ? 1 : 0 } + Rectangle { width: 20; height: 20; color: "blue"; opacity: photoPathView.flicking ? 1 : 0 } + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.0.png b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.0.png new file mode 100644 index 00000000..a02a00dd Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.1.png b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.1.png new file mode 100644 index 00000000..be18b8dc Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.2.png b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.2.png new file mode 100644 index 00000000..e4db4bca Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.3.png b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.3.png new file mode 100644 index 00000000..d464e79d Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.4.png b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.4.png new file mode 100644 index 00000000..b0b93863 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.5.png b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.5.png new file mode 100644 index 00000000..4ea4b24e Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.5.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.6.png b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.6.png new file mode 100644 index 00000000..a115867d Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.6.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.qml b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.qml new file mode 100644 index 00000000..5f1e8be1 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/dynamic.qml @@ -0,0 +1,1603 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "dynamic.0.png" + } + Frame { + msec: 32 + hash: "d203c2cb69cb0841827e14bddc206d1f" + } + Frame { + msec: 48 + hash: "d203c2cb69cb0841827e14bddc206d1f" + } + Frame { + msec: 64 + hash: "d203c2cb69cb0841827e14bddc206d1f" + } + Frame { + msec: 80 + hash: "d203c2cb69cb0841827e14bddc206d1f" + } + Frame { + msec: 96 + hash: "d203c2cb69cb0841827e14bddc206d1f" + } + Frame { + msec: 112 + hash: "d203c2cb69cb0841827e14bddc206d1f" + } + Frame { + msec: 128 + hash: "d203c2cb69cb0841827e14bddc206d1f" + } + Frame { + msec: 144 + hash: "d203c2cb69cb0841827e14bddc206d1f" + } + Frame { + msec: 160 + hash: "d203c2cb69cb0841827e14bddc206d1f" + } + Frame { + msec: 176 + hash: "d203c2cb69cb0841827e14bddc206d1f" + } + Frame { + msec: 192 + hash: "d203c2cb69cb0841827e14bddc206d1f" + } + Frame { + msec: 208 + hash: "d203c2cb69cb0841827e14bddc206d1f" + } + Frame { + msec: 224 + hash: "d203c2cb69cb0841827e14bddc206d1f" + } + Frame { + msec: 240 + hash: "d203c2cb69cb0841827e14bddc206d1f" + } + Frame { + msec: 256 + hash: "d203c2cb69cb0841827e14bddc206d1f" + } + Frame { + msec: 272 + hash: "d203c2cb69cb0841827e14bddc206d1f" + } + Frame { + msec: 288 + hash: "d203c2cb69cb0841827e14bddc206d1f" + } + Frame { + msec: 304 + hash: "d203c2cb69cb0841827e14bddc206d1f" + } + Frame { + msec: 320 + hash: "d203c2cb69cb0841827e14bddc206d1f" + } + Frame { + msec: 336 + hash: "d203c2cb69cb0841827e14bddc206d1f" + } + Frame { + msec: 352 + hash: "d203c2cb69cb0841827e14bddc206d1f" + } + Frame { + msec: 368 + hash: "d203c2cb69cb0841827e14bddc206d1f" + } + Frame { + msec: 384 + hash: "d203c2cb69cb0841827e14bddc206d1f" + } + Frame { + msec: 400 + hash: "d203c2cb69cb0841827e14bddc206d1f" + } + Frame { + msec: 416 + hash: "d203c2cb69cb0841827e14bddc206d1f" + } + Frame { + msec: 432 + hash: "d203c2cb69cb0841827e14bddc206d1f" + } + Frame { + msec: 448 + hash: "d203c2cb69cb0841827e14bddc206d1f" + } + Frame { + msec: 464 + hash: "d203c2cb69cb0841827e14bddc206d1f" + } + Frame { + msec: 480 + hash: "d203c2cb69cb0841827e14bddc206d1f" + } + Frame { + msec: 496 + hash: "d203c2cb69cb0841827e14bddc206d1f" + } + Frame { + msec: 512 + hash: "d203c2cb69cb0841827e14bddc206d1f" + } + Frame { + msec: 528 + hash: "453d5fb9d38f37bb8c23e376de76db06" + } + Frame { + msec: 544 + hash: "c4a103de3b7207b3c6277e8ecf79f7dc" + } + Frame { + msec: 560 + hash: "f58b0eb42d9b6ace87379f205da57550" + } + Frame { + msec: 576 + hash: "3384c5b5939d8297e0834c7cd347d579" + } + Frame { + msec: 592 + hash: "420b55371c69c6e1a17ef85a600c75d1" + } + Frame { + msec: 608 + hash: "55cc6fb3424ef69d316ef29f6563a025" + } + Frame { + msec: 624 + hash: "045b5ac545e69777b814423f77575990" + } + Frame { + msec: 640 + hash: "45b05241e8e83180a8d92a37dc859ce0" + } + Frame { + msec: 656 + hash: "97915dfbe4943e1f583ee134bc7a0117" + } + Frame { + msec: 672 + hash: "9b4ce5ed20dd81698b4dd8e48f799c5c" + } + Frame { + msec: 688 + hash: "24bdcea108cdbb3898a4d9216e9f9510" + } + Frame { + msec: 704 + hash: "d1427093b1a375e86a69c6f65cb1f8e5" + } + Frame { + msec: 720 + hash: "43dd666b15697ae18eb2410017256e4c" + } + Frame { + msec: 736 + hash: "8043755f5a8a528353f1e7c310a46a97" + } + Frame { + msec: 752 + hash: "d6b2ef0cb81395cd7454392aed4571f0" + } + Frame { + msec: 768 + hash: "c249fd272e02cbdde972e85fc6dac695" + } + Frame { + msec: 784 + hash: "1df5f8fce7b0c102e9902912600054e7" + } + Frame { + msec: 800 + hash: "a9d16b180634620e3fe6caacb730885b" + } + Frame { + msec: 816 + hash: "7228ce597720520bc12911fdef70ca86" + } + Frame { + msec: 832 + hash: "1faa5c3e72740941234ff4a93388edc9" + } + Frame { + msec: 848 + hash: "997ee1c6d5838153182473a3724df4ad" + } + Frame { + msec: 864 + hash: "6ebbc0a0427825ea701f5bb4758f11a2" + } + Frame { + msec: 880 + hash: "a2ac19360d631fd6d58f8a5ee85e40b4" + } + Frame { + msec: 896 + hash: "17a5842b47a220bb8bd74a368cea6c1f" + } + Frame { + msec: 912 + hash: "b37bae9c3384c068a7dd4f1135d3bfaa" + } + Frame { + msec: 928 + hash: "65ffb0b6629364ebc687da7785601abd" + } + Frame { + msec: 944 + hash: "27c7a43515fb2d8cddde42263f6ac9df" + } + Frame { + msec: 960 + hash: "cc292df8a090c08d135dedf5e2a0af7c" + } + Frame { + msec: 976 + image: "dynamic.1.png" + } + Frame { + msec: 992 + hash: "59735c8372774b50052d15232d2f6d01" + } + Frame { + msec: 1008 + hash: "9c239c4439009465dd91606ac84a3bf0" + } + Frame { + msec: 1024 + hash: "8b9715d6468c8501895545bd84bf7f57" + } + Frame { + msec: 1040 + hash: "0f7a123bfff1dbe059b6ceb3a3f44180" + } + Frame { + msec: 1056 + hash: "c1bc31a379d15ca67d0ffc7139800b3f" + } + Frame { + msec: 1072 + hash: "ebf470cd7cff4a836da9e721acfd327d" + } + Frame { + msec: 1088 + hash: "e2b89846459f8ae48117ab4393d493bf" + } + Frame { + msec: 1104 + hash: "5b980dcc070faf4ab4099cd5f711259c" + } + Frame { + msec: 1120 + hash: "4640ed55c1608d76109407279a1f02db" + } + Frame { + msec: 1136 + hash: "d839b597a3afef61de7b14ffb7ae518e" + } + Frame { + msec: 1152 + hash: "2810e01355c32d3f7a9352676e6b5eef" + } + Frame { + msec: 1168 + hash: "f1ac8b222e0068320827564e759e87ba" + } + Frame { + msec: 1184 + hash: "7da89563319dd4045e7f9c40a712d722" + } + Frame { + msec: 1200 + hash: "09c55dba364e484eec1a1badb4319003" + } + Frame { + msec: 1216 + hash: "defd5c9a8003c58a7bef1930efdd6f29" + } + Frame { + msec: 1232 + hash: "0f84e515b41b5c064ece9002e5edff0d" + } + Frame { + msec: 1248 + hash: "d1a0405a18fe5b54e79ca0cadf46743b" + } + Frame { + msec: 1264 + hash: "6046feb2fad386ae25ddd0d0e8ecb673" + } + Frame { + msec: 1280 + hash: "b4374b0d9d709b0d7a9f8949616a16bf" + } + Frame { + msec: 1296 + hash: "4d9d7d28f32ce2acd14c8dca0bc11fa0" + } + Frame { + msec: 1312 + hash: "384afb63bdf34729132ac57080fa2988" + } + Frame { + msec: 1328 + hash: "44ac2a9783c450a8c39b09387f0439e2" + } + Frame { + msec: 1344 + hash: "26e1dfc2b54370f94881c2341b6e0618" + } + Frame { + msec: 1360 + hash: "be47d72ae7c57e255706a8a5afe1fd3f" + } + Frame { + msec: 1376 + hash: "92cb490b081bccedf0bbdee86dbc50ed" + } + Frame { + msec: 1392 + hash: "1f0a09601474246e94c5ec3763cfa83e" + } + Frame { + msec: 1408 + hash: "73f1a5c57a2c96e18ba894a7adb9a014" + } + Frame { + msec: 1424 + hash: "8aa130cf4b2706afc8d582ee4c5f510d" + } + Frame { + msec: 1440 + hash: "1c0de0f1f4aa5f44bdf774169296487d" + } + Frame { + msec: 1456 + hash: "1e9b701ee63effb760e733ac623d75d7" + } + Frame { + msec: 1472 + hash: "c30620b6d5d41937217fa9d3e0bf367d" + } + Frame { + msec: 1488 + hash: "1f96e1da113d4a6cdb7179771ef7967d" + } + Frame { + msec: 1504 + hash: "aa31458e44ba42a633421e8688a3af7e" + } + Frame { + msec: 1520 + hash: "a7a560c05566d0bbea3f2bf397a0063a" + } + Frame { + msec: 1536 + hash: "fdd290bc46b86a11afdffb95570d9a67" + } + Frame { + msec: 1552 + hash: "46574d7bfc15bc5b9124eb0e12741724" + } + Frame { + msec: 1568 + hash: "aed2015031da6c7e5064fe5fcd1e86e3" + } + Frame { + msec: 1584 + hash: "dea39f30e686771ca516ac32e3dc4cb0" + } + Frame { + msec: 1600 + hash: "4a9839f52a7ee6732c5e18c0d67534be" + } + Frame { + msec: 1616 + hash: "df21723df1031542483684ff92aaf40a" + } + Frame { + msec: 1632 + hash: "53683b7b52d0940aac744f0ef03a4527" + } + Frame { + msec: 1648 + hash: "e6177b60c5586e79ca82e1bc7af41737" + } + Frame { + msec: 1664 + hash: "592a60e226aa6967a8a41bc0e4288583" + } + Frame { + msec: 1680 + hash: "534512915d800d00350803c3fdcccaf3" + } + Frame { + msec: 1696 + hash: "a01ffd7ab177f850f3d8320da19a03ce" + } + Frame { + msec: 1712 + hash: "15bd47f2c5c8cefe7565790b429aa6a4" + } + Frame { + msec: 1728 + hash: "b90692eafe68c2b04057af887617667c" + } + Frame { + msec: 1744 + hash: "edb22bd93a83de0cd3a046ed5a513ece" + } + Frame { + msec: 1760 + hash: "f08fa88d05f48c42dd1eba538dc464d4" + } + Frame { + msec: 1776 + hash: "ec46803523ee0516ed2c89923ff2ded7" + } + Frame { + msec: 1792 + hash: "ec46803523ee0516ed2c89923ff2ded7" + } + Frame { + msec: 1808 + hash: "ec46803523ee0516ed2c89923ff2ded7" + } + Frame { + msec: 1824 + hash: "ec46803523ee0516ed2c89923ff2ded7" + } + Frame { + msec: 1840 + hash: "ec46803523ee0516ed2c89923ff2ded7" + } + Frame { + msec: 1856 + hash: "ec46803523ee0516ed2c89923ff2ded7" + } + Frame { + msec: 1872 + hash: "ec46803523ee0516ed2c89923ff2ded7" + } + Frame { + msec: 1888 + hash: "ec46803523ee0516ed2c89923ff2ded7" + } + Frame { + msec: 1904 + hash: "ec46803523ee0516ed2c89923ff2ded7" + } + Frame { + msec: 1920 + hash: "ec46803523ee0516ed2c89923ff2ded7" + } + Frame { + msec: 1936 + image: "dynamic.2.png" + } + Frame { + msec: 1952 + hash: "ec46803523ee0516ed2c89923ff2ded7" + } + Frame { + msec: 1968 + hash: "ec46803523ee0516ed2c89923ff2ded7" + } + Frame { + msec: 1984 + hash: "ec46803523ee0516ed2c89923ff2ded7" + } + Frame { + msec: 2000 + hash: "ec46803523ee0516ed2c89923ff2ded7" + } + Frame { + msec: 2016 + hash: "ec46803523ee0516ed2c89923ff2ded7" + } + Frame { + msec: 2032 + hash: "ec46803523ee0516ed2c89923ff2ded7" + } + Frame { + msec: 2048 + hash: "ec46803523ee0516ed2c89923ff2ded7" + } + Frame { + msec: 2064 + hash: "ec46803523ee0516ed2c89923ff2ded7" + } + Frame { + msec: 2080 + hash: "ec46803523ee0516ed2c89923ff2ded7" + } + Frame { + msec: 2096 + hash: "ec46803523ee0516ed2c89923ff2ded7" + } + Frame { + msec: 2112 + hash: "ec46803523ee0516ed2c89923ff2ded7" + } + Frame { + msec: 2128 + hash: "ec46803523ee0516ed2c89923ff2ded7" + } + Frame { + msec: 2144 + hash: "ec46803523ee0516ed2c89923ff2ded7" + } + Frame { + msec: 2160 + hash: "ec46803523ee0516ed2c89923ff2ded7" + } + Frame { + msec: 2176 + hash: "ec46803523ee0516ed2c89923ff2ded7" + } + Frame { + msec: 2192 + hash: "ec46803523ee0516ed2c89923ff2ded7" + } + Frame { + msec: 2208 + hash: "ec46803523ee0516ed2c89923ff2ded7" + } + Frame { + msec: 2224 + hash: "ec46803523ee0516ed2c89923ff2ded7" + } + Frame { + msec: 2240 + hash: "ec46803523ee0516ed2c89923ff2ded7" + } + Frame { + msec: 2256 + hash: "ec46803523ee0516ed2c89923ff2ded7" + } + Frame { + msec: 2272 + hash: "6b8b68e359f532729bf25a6851563ad7" + } + Frame { + msec: 2288 + hash: "1ee3cf0c3c738a909f1b40b4ef49ac50" + } + Frame { + msec: 2304 + hash: "71889e0f81eeb252dd91a46af5ce24e7" + } + Frame { + msec: 2320 + hash: "99390a696ac524d752672df6f2136fa3" + } + Frame { + msec: 2336 + hash: "00919914f1623bb260e0f99b471aa182" + } + Frame { + msec: 2352 + hash: "64bd7ff1518a3e84c4b40511c5c0ff2d" + } + Frame { + msec: 2368 + hash: "b68da721bf79592e49408b098f72e884" + } + Frame { + msec: 2384 + hash: "6a8ca937b7c961c403ab1662d170c1a5" + } + Frame { + msec: 2400 + hash: "3f4034da4cd71738d1130c3baa38cf9b" + } + Frame { + msec: 2416 + hash: "97a86d3c04d07508604b46732b121edd" + } + Frame { + msec: 2432 + hash: "42e9ab3ed744d1a9a7eb5b7a206f29b3" + } + Frame { + msec: 2448 + hash: "ff86192c1b9c0faabb5563260cb1bff2" + } + Frame { + msec: 2464 + hash: "e1de0e431b971deb546935b6b2fc78e7" + } + Frame { + msec: 2480 + hash: "b7817a7f15d8e727e25719de8cc7d50a" + } + Frame { + msec: 2496 + hash: "66772971897fc00d01d067e5fc38f848" + } + Frame { + msec: 2512 + hash: "175db8c0324af4c206f9673f0a8d0477" + } + Frame { + msec: 2528 + hash: "f3dea687e0ca335b987b6b3c7d736469" + } + Frame { + msec: 2544 + hash: "44d035dd8e302b75c5a7f98a2005fe75" + } + Frame { + msec: 2560 + hash: "140cf53cb6873b14e6263537f84b0aa0" + } + Frame { + msec: 2576 + hash: "6c9090d4488289e69562747271459d7d" + } + Frame { + msec: 2592 + hash: "49e92db256f5be8c4e35566eea8fca70" + } + Frame { + msec: 2608 + hash: "80f41d2eb743ee13fcc486651e310fe2" + } + Frame { + msec: 2624 + hash: "f581fdcaf30c0efd4518e538e88c2ebf" + } + Frame { + msec: 2640 + hash: "c028db6753cf60bf587e6c46080a31ea" + } + Frame { + msec: 2656 + hash: "231b69aa9bdadbaf47cbfbc44a322a51" + } + Frame { + msec: 2672 + hash: "f0bcc02aaab3fad2ff53fc2d7541d4aa" + } + Frame { + msec: 2688 + hash: "80e34154585ba3480e37eaac6bfa396c" + } + Frame { + msec: 2704 + hash: "e1ebf3ba98b2df53ac9f72744034ba6d" + } + Frame { + msec: 2720 + hash: "b8f749a58888f90ed5cabe7aa2eee1ee" + } + Frame { + msec: 2736 + hash: "3a78458aa124a331f5b1616be5eea914" + } + Frame { + msec: 2752 + hash: "c442c02859bc35a8e5493200e68b1730" + } + Frame { + msec: 2768 + hash: "0cc4d24a1e1fa75a339a5b3dd07f18f3" + } + Frame { + msec: 2784 + hash: "0d124bc578058db99e32d58f4b412758" + } + Frame { + msec: 2800 + hash: "fc174a039606c5457532c9ac27c6faec" + } + Frame { + msec: 2816 + hash: "db5d25d7c01605ec81cdab3e239a1f0f" + } + Frame { + msec: 2832 + hash: "7dcffdbf9ac992aac0751bed5c38a0eb" + } + Frame { + msec: 2848 + hash: "b59dc4f39b3e032d5cd34ffca098889f" + } + Frame { + msec: 2864 + hash: "925d232189a3eee4bae08a8fe86a488b" + } + Frame { + msec: 2880 + hash: "4ab3a889e27de8f45670c240f6d452a6" + } + Frame { + msec: 2896 + image: "dynamic.3.png" + } + Frame { + msec: 2912 + hash: "9b8629b588dcb840fcd32f73f66016ee" + } + Frame { + msec: 2928 + hash: "dca8e45e930314a860f36343f4577738" + } + Frame { + msec: 2944 + hash: "b68f3b38e154b65225211c6a1ca8ddb8" + } + Frame { + msec: 2960 + hash: "d8168aea7962cad60132da9baf66f95c" + } + Frame { + msec: 2976 + hash: "6f83cd7be71666e08172a2c59e715f2e" + } + Frame { + msec: 2992 + hash: "f98c68954ed98f340e86c159fcf4f013" + } + Frame { + msec: 3008 + hash: "e4692a0e6d82864e9027bcf893e0cf90" + } + Frame { + msec: 3024 + hash: "ed02ff4d37ad03c0d0d53cf8163ed1c5" + } + Frame { + msec: 3040 + hash: "fb116353a2ceabae2d93c9aac48727d8" + } + Frame { + msec: 3056 + hash: "7b8c99b86838c46db4e756cc039ba045" + } + Frame { + msec: 3072 + hash: "c8d8e194bc957402fe2236b1a472faa6" + } + Frame { + msec: 3088 + hash: "f0f3d8c8ac3604cd11b7492fe5ee023e" + } + Frame { + msec: 3104 + hash: "b41cf314e4684423b4708ccd55904d60" + } + Frame { + msec: 3120 + hash: "4f578969386627b6e620e83bad5a6a6c" + } + Frame { + msec: 3136 + hash: "bd9fcfaa4e79f969548af12d072c1ec2" + } + Frame { + msec: 3152 + hash: "a418dc92f8b04fddf95f38bd24825ee6" + } + Frame { + msec: 3168 + hash: "4684b3e318a08f0f2331a13143592d18" + } + Frame { + msec: 3184 + hash: "1e135a4fd2e7336d8a59ca3497374a3d" + } + Frame { + msec: 3200 + hash: "d1be76e2c56422b469a9d09e22f62df5" + } + Frame { + msec: 3216 + hash: "8827523a7f8fa89a56d932102dff7b52" + } + Frame { + msec: 3232 + hash: "e12e6b907af5e6feffed0b9e68c71895" + } + Frame { + msec: 3248 + hash: "7bc3605f5f241170732aba19ca649896" + } + Frame { + msec: 3264 + hash: "d7da9274f30cacd419f0b0b7c8c8a728" + } + Frame { + msec: 3280 + hash: "154775464235d2a2fb338c27f1490f27" + } + Frame { + msec: 3296 + hash: "1657f65e8759eec3c026262bb271dd1c" + } + Frame { + msec: 3312 + hash: "29b4c68846aab3c1dcf4e58861915c33" + } + Frame { + msec: 3328 + hash: "fe22b3b991a80b34d6fe12515bfa2fd0" + } + Frame { + msec: 3344 + hash: "961343bb9dcc1fbe81b4c20392c28cb9" + } + Frame { + msec: 3360 + hash: "a2adb3179465e34b517bf906491a1b60" + } + Frame { + msec: 3376 + hash: "067fb8a2f5043dd4616fb1539e3e9c4a" + } + Frame { + msec: 3392 + hash: "009329915e9027d77218fd83334960ed" + } + Frame { + msec: 3408 + hash: "81b05d8aef8152830c6f199d6dd94fd5" + } + Frame { + msec: 3424 + hash: "b23fa537f88a97490e48fb3a8cd4b507" + } + Frame { + msec: 3440 + hash: "182464f620768efe0253c97cda75d839" + } + Frame { + msec: 3456 + hash: "f1ddbec396cead5d4acf9b65822becb6" + } + Frame { + msec: 3472 + hash: "a73085722d33638517b3f60a16ce9fcd" + } + Frame { + msec: 3488 + hash: "ecce53b0c525834341ee4b3c546e670c" + } + Frame { + msec: 3504 + hash: "86f1da737164290a90c1aef9355e2375" + } + Frame { + msec: 3520 + hash: "722ec874122ad8dcc73820a3a2fb7dca" + } + Frame { + msec: 3536 + hash: "35eb086b11482b752e2c02f1dc4d9099" + } + Frame { + msec: 3552 + hash: "83cf9c0b5d0afd5d3cee4c446274f5c4" + } + Frame { + msec: 3568 + hash: "e1bbef11fe02adb0756113e1106fe7f1" + } + Frame { + msec: 3584 + hash: "774c8bb4585954274852d6bb07e64916" + } + Frame { + msec: 3600 + hash: "b0264bcddf313d4e819a608143a86ac9" + } + Frame { + msec: 3616 + hash: "5e3859fd56e5022cbc7831e22447f05d" + } + Frame { + msec: 3632 + hash: "8c2a8b7321d2598b08d483914d4f319c" + } + Frame { + msec: 3648 + hash: "f13913dbc015836e35d5a2ebc94bbeef" + } + Frame { + msec: 3664 + hash: "1309af996f2d7a686f1d9177bc5c9be6" + } + Frame { + msec: 3680 + hash: "460b3500b41624486fe8dcfde087d2b5" + } + Frame { + msec: 3696 + hash: "de0837d19497021528dc782db4da084a" + } + Frame { + msec: 3712 + hash: "18afb8f8e9aa6d4a5db376e26cd9a56d" + } + Frame { + msec: 3728 + hash: "4fc1a8173824c2725160798b7d70aec2" + } + Frame { + msec: 3744 + hash: "87a593f74c946d6af6e31c5a25898766" + } + Frame { + msec: 3760 + hash: "57e68ec2aa5a21b11d21f388399713e5" + } + Frame { + msec: 3776 + hash: "4cb9ee1d12b99fb98bedcbcc048867e4" + } + Frame { + msec: 3792 + hash: "3eebd1f4f58210f6b546715997a984c2" + } + Frame { + msec: 3808 + hash: "39eabc07bfcefb2ecd369abf94d706cd" + } + Frame { + msec: 3824 + hash: "a0c46402b4700cc2099bdf42c47faf9b" + } + Frame { + msec: 3840 + hash: "3c8b4831583922c7c1c85f227ef2b3dc" + } + Frame { + msec: 3856 + image: "dynamic.4.png" + } + Frame { + msec: 3872 + hash: "e1b0d4cae609f3074fb1ac46c172bf4a" + } + Frame { + msec: 3888 + hash: "09b76db3e4a95666ba9c37dd89996fa3" + } + Frame { + msec: 3904 + hash: "b692386f34972d80aded2347e64ad2b6" + } + Frame { + msec: 3920 + hash: "dc65b0a791002efffec05884aa948842" + } + Frame { + msec: 3936 + hash: "069bab78e29d322894647f81d315184a" + } + Frame { + msec: 3952 + hash: "39c8d804b3caf53845baba4ce98e007d" + } + Frame { + msec: 3968 + hash: "3b477dfd05f07bdf0ba562d6068cafdb" + } + Frame { + msec: 3984 + hash: "eb84ee75bdbf25dcc32587007f5dc9bd" + } + Frame { + msec: 4000 + hash: "441d34bff2755e3c30bed80e2bdde69c" + } + Frame { + msec: 4016 + hash: "4cb9ee1d12b99fb98bedcbcc048867e4" + } + Frame { + msec: 4032 + hash: "3eebd1f4f58210f6b546715997a984c2" + } + Frame { + msec: 4048 + hash: "39eabc07bfcefb2ecd369abf94d706cd" + } + Frame { + msec: 4064 + hash: "a0c46402b4700cc2099bdf42c47faf9b" + } + Frame { + msec: 4080 + hash: "3c8b4831583922c7c1c85f227ef2b3dc" + } + Frame { + msec: 4096 + hash: "c92cba3c2825db4293153588c4b7b229" + } + Frame { + msec: 4112 + hash: "e1b0d4cae609f3074fb1ac46c172bf4a" + } + Frame { + msec: 4128 + hash: "09b76db3e4a95666ba9c37dd89996fa3" + } + Frame { + msec: 4144 + hash: "b692386f34972d80aded2347e64ad2b6" + } + Frame { + msec: 4160 + hash: "dc65b0a791002efffec05884aa948842" + } + Frame { + msec: 4176 + hash: "069bab78e29d322894647f81d315184a" + } + Frame { + msec: 4192 + hash: "39c8d804b3caf53845baba4ce98e007d" + } + Frame { + msec: 4208 + hash: "3b477dfd05f07bdf0ba562d6068cafdb" + } + Frame { + msec: 4224 + hash: "eb84ee75bdbf25dcc32587007f5dc9bd" + } + Frame { + msec: 4240 + hash: "441d34bff2755e3c30bed80e2bdde69c" + } + Frame { + msec: 4256 + hash: "57e68ec2aa5a21b11d21f388399713e5" + } + Frame { + msec: 4272 + hash: "4cb9ee1d12b99fb98bedcbcc048867e4" + } + Frame { + msec: 4288 + hash: "3eebd1f4f58210f6b546715997a984c2" + } + Frame { + msec: 4304 + hash: "39eabc07bfcefb2ecd369abf94d706cd" + } + Frame { + msec: 4320 + hash: "a0c46402b4700cc2099bdf42c47faf9b" + } + Frame { + msec: 4336 + hash: "3c8b4831583922c7c1c85f227ef2b3dc" + } + Frame { + msec: 4352 + hash: "c92cba3c2825db4293153588c4b7b229" + } + Frame { + msec: 4368 + hash: "e1b0d4cae609f3074fb1ac46c172bf4a" + } + Frame { + msec: 4384 + hash: "09b76db3e4a95666ba9c37dd89996fa3" + } + Frame { + msec: 4400 + hash: "b692386f34972d80aded2347e64ad2b6" + } + Frame { + msec: 4416 + hash: "dc65b0a791002efffec05884aa948842" + } + Frame { + msec: 4432 + hash: "069bab78e29d322894647f81d315184a" + } + Frame { + msec: 4448 + hash: "39c8d804b3caf53845baba4ce98e007d" + } + Frame { + msec: 4464 + hash: "3b477dfd05f07bdf0ba562d6068cafdb" + } + Frame { + msec: 4480 + hash: "eb84ee75bdbf25dcc32587007f5dc9bd" + } + Frame { + msec: 4496 + hash: "441d34bff2755e3c30bed80e2bdde69c" + } + Frame { + msec: 4512 + hash: "57e68ec2aa5a21b11d21f388399713e5" + } + Frame { + msec: 4528 + hash: "4cb9ee1d12b99fb98bedcbcc048867e4" + } + Frame { + msec: 4544 + hash: "3eebd1f4f58210f6b546715997a984c2" + } + Frame { + msec: 4560 + hash: "39eabc07bfcefb2ecd369abf94d706cd" + } + Frame { + msec: 4576 + hash: "a0c46402b4700cc2099bdf42c47faf9b" + } + Frame { + msec: 4592 + hash: "3c8b4831583922c7c1c85f227ef2b3dc" + } + Frame { + msec: 4608 + hash: "c92cba3c2825db4293153588c4b7b229" + } + Frame { + msec: 4624 + hash: "e1b0d4cae609f3074fb1ac46c172bf4a" + } + Frame { + msec: 4640 + hash: "09b76db3e4a95666ba9c37dd89996fa3" + } + Frame { + msec: 4656 + hash: "b692386f34972d80aded2347e64ad2b6" + } + Frame { + msec: 4672 + hash: "dc65b0a791002efffec05884aa948842" + } + Frame { + msec: 4688 + hash: "069bab78e29d322894647f81d315184a" + } + Frame { + msec: 4704 + hash: "39c8d804b3caf53845baba4ce98e007d" + } + Frame { + msec: 4720 + hash: "3b477dfd05f07bdf0ba562d6068cafdb" + } + Frame { + msec: 4736 + hash: "eb84ee75bdbf25dcc32587007f5dc9bd" + } + Frame { + msec: 4752 + hash: "441d34bff2755e3c30bed80e2bdde69c" + } + Frame { + msec: 4768 + hash: "4cb9ee1d12b99fb98bedcbcc048867e4" + } + Frame { + msec: 4784 + hash: "3eebd1f4f58210f6b546715997a984c2" + } + Frame { + msec: 4800 + hash: "39eabc07bfcefb2ecd369abf94d706cd" + } + Frame { + msec: 4816 + image: "dynamic.5.png" + } + Frame { + msec: 4832 + hash: "3c8b4831583922c7c1c85f227ef2b3dc" + } + Frame { + msec: 4848 + hash: "c92cba3c2825db4293153588c4b7b229" + } + Frame { + msec: 4864 + hash: "e1b0d4cae609f3074fb1ac46c172bf4a" + } + Frame { + msec: 4880 + hash: "09b76db3e4a95666ba9c37dd89996fa3" + } + Frame { + msec: 4896 + hash: "b692386f34972d80aded2347e64ad2b6" + } + Frame { + msec: 4912 + hash: "dc65b0a791002efffec05884aa948842" + } + Frame { + msec: 4928 + hash: "069bab78e29d322894647f81d315184a" + } + Frame { + msec: 4944 + hash: "39c8d804b3caf53845baba4ce98e007d" + } + Frame { + msec: 4960 + hash: "3b477dfd05f07bdf0ba562d6068cafdb" + } + Frame { + msec: 4976 + hash: "eb84ee75bdbf25dcc32587007f5dc9bd" + } + Frame { + msec: 4992 + hash: "441d34bff2755e3c30bed80e2bdde69c" + } + Frame { + msec: 5008 + hash: "57e68ec2aa5a21b11d21f388399713e5" + } + Frame { + msec: 5024 + hash: "4cb9ee1d12b99fb98bedcbcc048867e4" + } + Frame { + msec: 5040 + hash: "3eebd1f4f58210f6b546715997a984c2" + } + Frame { + msec: 5056 + hash: "39eabc07bfcefb2ecd369abf94d706cd" + } + Frame { + msec: 5072 + hash: "a0c46402b4700cc2099bdf42c47faf9b" + } + Frame { + msec: 5088 + hash: "3c8b4831583922c7c1c85f227ef2b3dc" + } + Frame { + msec: 5104 + hash: "c92cba3c2825db4293153588c4b7b229" + } + Frame { + msec: 5120 + hash: "e1b0d4cae609f3074fb1ac46c172bf4a" + } + Frame { + msec: 5136 + hash: "09b76db3e4a95666ba9c37dd89996fa3" + } + Frame { + msec: 5152 + hash: "b692386f34972d80aded2347e64ad2b6" + } + Frame { + msec: 5168 + hash: "dc65b0a791002efffec05884aa948842" + } + Frame { + msec: 5184 + hash: "069bab78e29d322894647f81d315184a" + } + Frame { + msec: 5200 + hash: "39c8d804b3caf53845baba4ce98e007d" + } + Frame { + msec: 5216 + hash: "3b477dfd05f07bdf0ba562d6068cafdb" + } + Frame { + msec: 5232 + hash: "eb84ee75bdbf25dcc32587007f5dc9bd" + } + Frame { + msec: 5248 + hash: "441d34bff2755e3c30bed80e2bdde69c" + } + Frame { + msec: 5264 + hash: "57e68ec2aa5a21b11d21f388399713e5" + } + Frame { + msec: 5280 + hash: "4cb9ee1d12b99fb98bedcbcc048867e4" + } + Frame { + msec: 5296 + hash: "3eebd1f4f58210f6b546715997a984c2" + } + Frame { + msec: 5312 + hash: "39eabc07bfcefb2ecd369abf94d706cd" + } + Frame { + msec: 5328 + hash: "a0c46402b4700cc2099bdf42c47faf9b" + } + Frame { + msec: 5344 + hash: "3c8b4831583922c7c1c85f227ef2b3dc" + } + Frame { + msec: 5360 + hash: "c92cba3c2825db4293153588c4b7b229" + } + Frame { + msec: 5376 + hash: "e1b0d4cae609f3074fb1ac46c172bf4a" + } + Frame { + msec: 5392 + hash: "09b76db3e4a95666ba9c37dd89996fa3" + } + Frame { + msec: 5408 + hash: "b692386f34972d80aded2347e64ad2b6" + } + Frame { + msec: 5424 + hash: "dc65b0a791002efffec05884aa948842" + } + Frame { + msec: 5440 + hash: "069bab78e29d322894647f81d315184a" + } + Frame { + msec: 5456 + hash: "39c8d804b3caf53845baba4ce98e007d" + } + Frame { + msec: 5472 + hash: "3b477dfd05f07bdf0ba562d6068cafdb" + } + Frame { + msec: 5488 + hash: "eb84ee75bdbf25dcc32587007f5dc9bd" + } + Frame { + msec: 5504 + hash: "441d34bff2755e3c30bed80e2bdde69c" + } + Frame { + msec: 5520 + hash: "4cb9ee1d12b99fb98bedcbcc048867e4" + } + Frame { + msec: 5536 + hash: "3eebd1f4f58210f6b546715997a984c2" + } + Frame { + msec: 5552 + hash: "39eabc07bfcefb2ecd369abf94d706cd" + } + Frame { + msec: 5568 + hash: "a0c46402b4700cc2099bdf42c47faf9b" + } + Frame { + msec: 5584 + hash: "3c8b4831583922c7c1c85f227ef2b3dc" + } + Frame { + msec: 5600 + hash: "c92cba3c2825db4293153588c4b7b229" + } + Frame { + msec: 5616 + hash: "e1b0d4cae609f3074fb1ac46c172bf4a" + } + Frame { + msec: 5632 + hash: "09b76db3e4a95666ba9c37dd89996fa3" + } + Frame { + msec: 5648 + hash: "b692386f34972d80aded2347e64ad2b6" + } + Frame { + msec: 5664 + hash: "dc65b0a791002efffec05884aa948842" + } + Frame { + msec: 5680 + hash: "069bab78e29d322894647f81d315184a" + } + Frame { + msec: 5696 + hash: "39c8d804b3caf53845baba4ce98e007d" + } + Frame { + msec: 5712 + hash: "3b477dfd05f07bdf0ba562d6068cafdb" + } + Frame { + msec: 5728 + hash: "eb84ee75bdbf25dcc32587007f5dc9bd" + } + Frame { + msec: 5744 + hash: "441d34bff2755e3c30bed80e2bdde69c" + } + Frame { + msec: 5760 + hash: "57e68ec2aa5a21b11d21f388399713e5" + } + Frame { + msec: 5776 + image: "dynamic.6.png" + } + Frame { + msec: 5792 + hash: "3eebd1f4f58210f6b546715997a984c2" + } + Frame { + msec: 5808 + hash: "39eabc07bfcefb2ecd369abf94d706cd" + } + Frame { + msec: 5824 + hash: "a0c46402b4700cc2099bdf42c47faf9b" + } + Frame { + msec: 5840 + hash: "3c8b4831583922c7c1c85f227ef2b3dc" + } + Frame { + msec: 5856 + hash: "c92cba3c2825db4293153588c4b7b229" + } + Frame { + msec: 5872 + hash: "e1b0d4cae609f3074fb1ac46c172bf4a" + } + Frame { + msec: 5888 + hash: "09b76db3e4a95666ba9c37dd89996fa3" + } + Frame { + msec: 5904 + hash: "b692386f34972d80aded2347e64ad2b6" + } + Frame { + msec: 5920 + hash: "dc65b0a791002efffec05884aa948842" + } + Frame { + msec: 5936 + hash: "069bab78e29d322894647f81d315184a" + } + Frame { + msec: 5952 + hash: "39c8d804b3caf53845baba4ce98e007d" + } + Frame { + msec: 5968 + hash: "3b477dfd05f07bdf0ba562d6068cafdb" + } + Frame { + msec: 5984 + hash: "eb84ee75bdbf25dcc32587007f5dc9bd" + } + Frame { + msec: 6000 + hash: "441d34bff2755e3c30bed80e2bdde69c" + } + Frame { + msec: 6016 + hash: "4cb9ee1d12b99fb98bedcbcc048867e4" + } + Frame { + msec: 6032 + hash: "3eebd1f4f58210f6b546715997a984c2" + } + Frame { + msec: 6048 + hash: "39eabc07bfcefb2ecd369abf94d706cd" + } + Frame { + msec: 6064 + hash: "a0c46402b4700cc2099bdf42c47faf9b" + } + Frame { + msec: 6080 + hash: "3c8b4831583922c7c1c85f227ef2b3dc" + } + Frame { + msec: 6096 + hash: "c92cba3c2825db4293153588c4b7b229" + } + Frame { + msec: 6112 + hash: "e1b0d4cae609f3074fb1ac46c172bf4a" + } + Frame { + msec: 6128 + hash: "09b76db3e4a95666ba9c37dd89996fa3" + } + Frame { + msec: 6144 + hash: "b692386f34972d80aded2347e64ad2b6" + } + Frame { + msec: 6160 + hash: "dc65b0a791002efffec05884aa948842" + } + Frame { + msec: 6176 + hash: "069bab78e29d322894647f81d315184a" + } + Frame { + msec: 6192 + hash: "39c8d804b3caf53845baba4ce98e007d" + } + Frame { + msec: 6208 + hash: "3b477dfd05f07bdf0ba562d6068cafdb" + } + Frame { + msec: 6224 + hash: "eb84ee75bdbf25dcc32587007f5dc9bd" + } + Frame { + msec: 6240 + hash: "441d34bff2755e3c30bed80e2bdde69c" + } + Frame { + msec: 6256 + hash: "57e68ec2aa5a21b11d21f388399713e5" + } + Frame { + msec: 6272 + hash: "4cb9ee1d12b99fb98bedcbcc048867e4" + } + Frame { + msec: 6288 + hash: "3eebd1f4f58210f6b546715997a984c2" + } + Frame { + msec: 6304 + hash: "39eabc07bfcefb2ecd369abf94d706cd" + } + Frame { + msec: 6320 + hash: "a0c46402b4700cc2099bdf42c47faf9b" + } + Frame { + msec: 6336 + hash: "3c8b4831583922c7c1c85f227ef2b3dc" + } + Frame { + msec: 6352 + hash: "c92cba3c2825db4293153588c4b7b229" + } + Frame { + msec: 6368 + hash: "e1b0d4cae609f3074fb1ac46c172bf4a" + } + Frame { + msec: 6384 + hash: "09b76db3e4a95666ba9c37dd89996fa3" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/usingRepeater.0.png b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/usingRepeater.0.png new file mode 100644 index 00000000..75a6c49b Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/usingRepeater.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/usingRepeater.qml b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/usingRepeater.qml new file mode 100644 index 00000000..365c25f0 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/data/usingRepeater.qml @@ -0,0 +1,135 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "usingRepeater.0.png" + } + Frame { + msec: 32 + hash: "e76f50af76d6ee5925b183f9e2316b78" + } + Frame { + msec: 48 + hash: "e76f50af76d6ee5925b183f9e2316b78" + } + Frame { + msec: 64 + hash: "e76f50af76d6ee5925b183f9e2316b78" + } + Frame { + msec: 80 + hash: "e76f50af76d6ee5925b183f9e2316b78" + } + Frame { + msec: 96 + hash: "e76f50af76d6ee5925b183f9e2316b78" + } + Frame { + msec: 112 + hash: "e76f50af76d6ee5925b183f9e2316b78" + } + Frame { + msec: 128 + hash: "e76f50af76d6ee5925b183f9e2316b78" + } + Frame { + msec: 144 + hash: "e76f50af76d6ee5925b183f9e2316b78" + } + Frame { + msec: 160 + hash: "e76f50af76d6ee5925b183f9e2316b78" + } + Frame { + msec: 176 + hash: "e76f50af76d6ee5925b183f9e2316b78" + } + Frame { + msec: 192 + hash: "e76f50af76d6ee5925b183f9e2316b78" + } + Frame { + msec: 208 + hash: "e76f50af76d6ee5925b183f9e2316b78" + } + Frame { + msec: 224 + hash: "e76f50af76d6ee5925b183f9e2316b78" + } + Frame { + msec: 240 + hash: "e76f50af76d6ee5925b183f9e2316b78" + } + Frame { + msec: 256 + hash: "e76f50af76d6ee5925b183f9e2316b78" + } + Frame { + msec: 272 + hash: "c98a904eb5da750f4cabf787e253b2ec" + } + Frame { + msec: 288 + hash: "c98a904eb5da750f4cabf787e253b2ec" + } + Frame { + msec: 304 + hash: "c98a904eb5da750f4cabf787e253b2ec" + } + Frame { + msec: 320 + hash: "c98a904eb5da750f4cabf787e253b2ec" + } + Frame { + msec: 336 + hash: "c98a904eb5da750f4cabf787e253b2ec" + } + Frame { + msec: 352 + hash: "c98a904eb5da750f4cabf787e253b2ec" + } + Frame { + msec: 368 + hash: "c98a904eb5da750f4cabf787e253b2ec" + } + Frame { + msec: 384 + hash: "c98a904eb5da750f4cabf787e253b2ec" + } + Frame { + msec: 400 + hash: "c98a904eb5da750f4cabf787e253b2ec" + } + Frame { + msec: 416 + hash: "c98a904eb5da750f4cabf787e253b2ec" + } + Frame { + msec: 432 + hash: "c98a904eb5da750f4cabf787e253b2ec" + } + Frame { + msec: 448 + hash: "c98a904eb5da750f4cabf787e253b2ec" + } + Frame { + msec: 464 + hash: "c98a904eb5da750f4cabf787e253b2ec" + } + Frame { + msec: 480 + hash: "c98a904eb5da750f4cabf787e253b2ec" + } + Frame { + msec: 496 + hash: "c98a904eb5da750f4cabf787e253b2ec" + } + Frame { + msec: 512 + hash: "c98a904eb5da750f4cabf787e253b2ec" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepositioners/dynamic.qml b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/dynamic.qml new file mode 100644 index 00000000..b5685d1a --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/dynamic.qml @@ -0,0 +1,70 @@ +import QtQuick 1.0 + +Item { + property string skip: "Expected to fail until QTBUG-14839 is resolved" + width: 120; height: 60; + property int step: 0 + function tick() + { + step++; + if(step == 1){ + //row1.destroy(); //Not dynamically created, so is this valid? + }else if(step == 2){ + r2a.destroy(); + }else if(step == 3){ + r2b.destroy(); + }else if(step == 4){ + r2c.destroy(); + }else if(step == 5){ + r3a.parent = row2; + }else if(step == 6){ + r3b.parent = row2; + }else if(step == 7){ + r3c.parent = row2; + }else if(step == 8){ + //row3.destroy();//empty now, so should have no effect//May be invalid, but was deleting the reparent items at one point + }else{ + repeater.model++; + } + } + + //Tests base positioner functionality, so don't need them all. + Column{ + move: Transition{NumberAnimation{properties:"y"}} + Row{ + id: row1 + height: childrenRect.height + Rectangle{id: r1a; width:20; height:20; color: "red"} + Rectangle{id: r1b; width:20; height:20; color: "green"} + Rectangle{id: r1c; width:20; height:20; color: "blue"} + } + Row{ + id: row2 + height: childrenRect.height + move: Transition{NumberAnimation{properties:"x"}} + Repeater{ + id: repeater + model: 0; + delegate: Component{ Rectangle { color: "yellow"; width:20; height:20;}} + } + Rectangle{id: r2a; width:20; height:20; color: "red"} + Rectangle{id: r2b; width:20; height:20; color: "green"} + Rectangle{id: r2c; width:20; height:20; color: "blue"} + } + Row{ + move: Transition{NumberAnimation{properties:"x"}} + id: row3 + height: childrenRect.height + Rectangle{id: r3a; width:20; height:20; color: "red"} + Rectangle{id: r3b; width:20; height:20; color: "green"} + Rectangle{id: r3c; width:20; height:20; color: "blue"} + } + } + Timer{ + interval: 250; + running: true; + repeat: true; + onTriggered: tick(); + } +} + diff --git a/tests/auto/declarative/qmlvisual/qdeclarativepositioners/usingRepeater.qml b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/usingRepeater.qml new file mode 100644 index 00000000..c236b6a7 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativepositioners/usingRepeater.qml @@ -0,0 +1,16 @@ +import QtQuick 1.0 + +Item{ + width: 40; height: 320 + Column{ + Rectangle{color:"Red"; width:40; height:40;} + Repeater{ + id: rep + model: 3 + delegate: Component{Rectangle{color:"Green"; width:40; height:40; radius: 20;}} + } + Rectangle{color:"Blue"; width:40; height:40;} + } + Timer{ interval: 250; running: true; onTriggered: rep.model=6;} + Timer{ interval: 500; running: true; onTriggered: Qt.quit();} +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativesmoothedanimation/data/smoothedfollow.0.png b/tests/auto/declarative/qmlvisual/qdeclarativesmoothedanimation/data/smoothedfollow.0.png new file mode 100644 index 00000000..dd380195 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativesmoothedanimation/data/smoothedfollow.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativesmoothedanimation/data/smoothedfollow.1.png b/tests/auto/declarative/qmlvisual/qdeclarativesmoothedanimation/data/smoothedfollow.1.png new file mode 100644 index 00000000..d7490809 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativesmoothedanimation/data/smoothedfollow.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativesmoothedanimation/data/smoothedfollow.2.png b/tests/auto/declarative/qmlvisual/qdeclarativesmoothedanimation/data/smoothedfollow.2.png new file mode 100644 index 00000000..57a3ae0e Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativesmoothedanimation/data/smoothedfollow.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativesmoothedanimation/data/smoothedfollow.3.png b/tests/auto/declarative/qmlvisual/qdeclarativesmoothedanimation/data/smoothedfollow.3.png new file mode 100644 index 00000000..3a75ec4a Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativesmoothedanimation/data/smoothedfollow.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativesmoothedanimation/data/smoothedfollow.qml b/tests/auto/declarative/qmlvisual/qdeclarativesmoothedanimation/data/smoothedfollow.qml new file mode 100644 index 00000000..14280a08 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativesmoothedanimation/data/smoothedfollow.qml @@ -0,0 +1,795 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "smoothedfollow.0.png" + } + Frame { + msec: 32 + hash: "1d0005639ad631a4f88fb2372b955741" + } + Frame { + msec: 48 + hash: "b303c2fb08eb8158c322719d072deb06" + } + Frame { + msec: 64 + hash: "4b3d7a5b9b5f1a335e81e3aafce2a244" + } + Frame { + msec: 80 + hash: "33d144e82787ac28f9012105645f5eb8" + } + Frame { + msec: 96 + hash: "b6e16400c1364241da2fc12810780b9b" + } + Frame { + msec: 112 + hash: "e32e552a0ac9e517df2826d82ed3e483" + } + Frame { + msec: 128 + hash: "855e317677189a8aa97909ac5c7a831c" + } + Frame { + msec: 144 + hash: "cddb47ce0a793dc74c6cbc2b3fb138d0" + } + Frame { + msec: 160 + hash: "21932fa377c6c9652eb22bbae4bf7d23" + } + Frame { + msec: 176 + hash: "95adc0bfe18070001d531a36785af2a2" + } + Frame { + msec: 192 + hash: "b3c39dc57a658b1ff7c24194a4214696" + } + Frame { + msec: 208 + hash: "d145d38d45f824f3dd2f43eddf38d310" + } + Frame { + msec: 224 + hash: "dee8ad57b625965d3045089d5f6e80aa" + } + Frame { + msec: 240 + hash: "94263216e2b0ab77980b3cc0b42350a6" + } + Frame { + msec: 256 + hash: "a9ea122b9b67428f9d28368ffb862c37" + } + Frame { + msec: 272 + hash: "d1101c25521fd2308ccbe5ec318d9922" + } + Frame { + msec: 288 + hash: "e854bb4accb78052ec3df32a80d29a94" + } + Frame { + msec: 304 + hash: "10898f94cc74a888fc57f76897a56b2a" + } + Frame { + msec: 320 + hash: "65668c114d62e3e901953c9aca9fe276" + } + Frame { + msec: 336 + hash: "a67cd21b3c451134961d5890b05cff49" + } + Frame { + msec: 352 + hash: "40fbf54e37f46dce2aeda74ed6815e42" + } + Frame { + msec: 368 + hash: "dc86af89de1edce0986c6e1a56bd0e21" + } + Frame { + msec: 384 + hash: "b9700d510fe9b936d60a0ef22b1a4d23" + } + Frame { + msec: 400 + hash: "620edf9a854b1f32911b4af69be95076" + } + Frame { + msec: 416 + hash: "28d9670eb3dea66506affaf8b8672c52" + } + Frame { + msec: 432 + hash: "9deaf655b9e71dc835377526c5ae7d96" + } + Frame { + msec: 448 + hash: "a19709d7bf37fd126f15da386527d0f8" + } + Frame { + msec: 464 + hash: "32dbd7c98038abf3775a2c788a687b27" + } + Frame { + msec: 480 + hash: "d1a22b8e8cbd429dc0e8bc22bfce5d4b" + } + Frame { + msec: 496 + hash: "04a48f9f304a614535821f1278950789" + } + Frame { + msec: 512 + hash: "ba26b58e109d5b63e972e4acd7229162" + } + Frame { + msec: 528 + hash: "b92d3329f744c7de158a472b8b542437" + } + Frame { + msec: 544 + hash: "c44139265be3def1cc73ea7198a64537" + } + Frame { + msec: 560 + hash: "6f211c82a64c7e0ef2e7700359ac226e" + } + Frame { + msec: 576 + hash: "1690781b90e6e4ad264db76943d3b6d2" + } + Frame { + msec: 592 + hash: "2ab7e97b7426843f2488121fdda87b48" + } + Frame { + msec: 608 + hash: "91fe6ed4d44d69e9ce79aa3636faf0cb" + } + Frame { + msec: 624 + hash: "9b4638d2eb6ecc0b50c30e74dc4b098e" + } + Frame { + msec: 640 + hash: "0e18542d1b5b887eaf22f936adb38bd0" + } + Frame { + msec: 656 + hash: "f4a123a8811654d033c3613a80a8f3f7" + } + Frame { + msec: 672 + hash: "14edd1cf660429e95c55ae81ce57d05d" + } + Frame { + msec: 688 + hash: "1114235b75e814b80b70ce4109a0b6f3" + } + Frame { + msec: 704 + hash: "8ed2a94fab38d951325bbf79597134c6" + } + Frame { + msec: 720 + hash: "315a34cfe26778d86cadceea78fd15f6" + } + Frame { + msec: 736 + hash: "4a95ae04f498f93bf19ab2bc45c0be21" + } + Frame { + msec: 752 + hash: "d241f7cfdfd241facb0b7f7a3d328d01" + } + Frame { + msec: 768 + hash: "fae3040a9e0b2f9c76cc26bda47e04e9" + } + Frame { + msec: 784 + hash: "a444297639db23413810b2df5c47ed9c" + } + Frame { + msec: 800 + hash: "8084ee95169c3176af563fc4cc033332" + } + Frame { + msec: 816 + hash: "8f6ac972fb537f496a69f7bde0e8bc22" + } + Frame { + msec: 832 + hash: "b7e632bc5c8a0a0c5d2b752e581ff5db" + } + Frame { + msec: 848 + hash: "341c29c41dc1d938dcf5d94d20ff9160" + } + Frame { + msec: 864 + hash: "2c7eb6f2974c6520bc2fbbb65c118124" + } + Frame { + msec: 880 + hash: "8dd08316d3d4b17bd3d656dff2b69019" + } + Frame { + msec: 896 + hash: "5c2a7456afbb094671e693df0a5fa37d" + } + Frame { + msec: 912 + hash: "d169ce70699b020f62bc33160b74887b" + } + Frame { + msec: 928 + hash: "e67ef3cd8dbcef11cf156b32eb0aae67" + } + Frame { + msec: 944 + hash: "16d0d8676f754f0e85a3b425a4401c26" + } + Frame { + msec: 960 + hash: "7681c0a07803c3eadedf05b60acca9be" + } + Frame { + msec: 976 + image: "smoothedfollow.1.png" + } + Frame { + msec: 992 + hash: "5f87209dc76264d5c259092ccfd0663a" + } + Frame { + msec: 1008 + hash: "c647b4725e7f1ce05b5b7bd067d54bff" + } + Frame { + msec: 1024 + hash: "d43d241fa85cadc042ae510fa441d01d" + } + Frame { + msec: 1040 + hash: "87a4b4fb8981b1ddb765236cd74a9084" + } + Frame { + msec: 1056 + hash: "607fb5055cc0d5b6e8a1a37134a9686c" + } + Frame { + msec: 1072 + hash: "9ed861affdaf4de535ff65b26e1fa8ee" + } + Frame { + msec: 1088 + hash: "cdfbf1d934a46b85c9d7a07e25eb3fee" + } + Frame { + msec: 1104 + hash: "94cc78c6be827b3f3b3d74d72af5a4db" + } + Frame { + msec: 1120 + hash: "50cd154de9141528f0417c0e0f0090a9" + } + Frame { + msec: 1136 + hash: "86e4a163ad5d7d9bee8f513a814fcac2" + } + Frame { + msec: 1152 + hash: "61b927a9a58264b827ab00c30cddb4c1" + } + Frame { + msec: 1168 + hash: "e50d30e42cb035e52cf88664182b7ac1" + } + Frame { + msec: 1184 + hash: "33a45c3ab72e3e582ef0e4a759064050" + } + Frame { + msec: 1200 + hash: "323be0228c50a87f380c9b4e5af0c6c0" + } + Frame { + msec: 1216 + hash: "d82e3de64104096e0cce7bc23d1f3f96" + } + Frame { + msec: 1232 + hash: "e8872b9d98dff227cb3eb8765cbfa5f5" + } + Frame { + msec: 1248 + hash: "23ee9e4d9d5388c900072df7fb063164" + } + Frame { + msec: 1264 + hash: "e23cb4cdcc53a364004a55144ea1af8a" + } + Frame { + msec: 1280 + hash: "816ee1ba2a5fe2db4ee09cecb8d56c34" + } + Frame { + msec: 1296 + hash: "d0f01509412d1e4aa192db8aa6dbc50d" + } + Frame { + msec: 1312 + hash: "ba37ba506ce63c6cda06f23a73c928d9" + } + Frame { + msec: 1328 + hash: "194a5a791ee5008f585cf215e5cabc26" + } + Frame { + msec: 1344 + hash: "09c9466b27e57cf936653fdd91e885a8" + } + Frame { + msec: 1360 + hash: "ee8ef68a1d5cde45431ac233d1cbe191" + } + Frame { + msec: 1376 + hash: "45f3bede3b5ae8cde9d385746740760e" + } + Frame { + msec: 1392 + hash: "10ae672c18a84fec45513850797220b5" + } + Frame { + msec: 1408 + hash: "6d72fb8d4d1f7499b38e4969ae26409b" + } + Frame { + msec: 1424 + hash: "7c6bf427b0f7aac8c869a0dd83277ca0" + } + Frame { + msec: 1440 + hash: "1289b04711ef38d4e37161f1385bf4d2" + } + Frame { + msec: 1456 + hash: "2414780f52880801eea13dc9efba1cb2" + } + Frame { + msec: 1472 + hash: "37efbf23005659b4f2b29f224c929502" + } + Frame { + msec: 1488 + hash: "e70091696edf26a8dc8dc51d4932fd86" + } + Frame { + msec: 1504 + hash: "21e8d0b6eee7bc71ae7ccd05d9bb9280" + } + Frame { + msec: 1520 + hash: "321553e3e415cf7695d46a90050f8265" + } + Frame { + msec: 1536 + hash: "235f975c8b382caee2004a8bf9533385" + } + Frame { + msec: 1552 + hash: "abeeb9ff4c51f2b4ba5c9fee98e72926" + } + Frame { + msec: 1568 + hash: "d2de1c552fdf4675baccab402100aabb" + } + Frame { + msec: 1584 + hash: "26d2ac9f31c9181222edda09a4452b5f" + } + Frame { + msec: 1600 + hash: "8c1ac1872a6720185ec670150e344683" + } + Frame { + msec: 1616 + hash: "3b792cf960fc8dd6b424ce4c9f2aa0a1" + } + Frame { + msec: 1632 + hash: "4f0e2dad54e5be44c0345732deae067d" + } + Frame { + msec: 1648 + hash: "17f21faa9293cfd4ef63fcee9d07f264" + } + Frame { + msec: 1664 + hash: "0ea885db3c4c5facb96306f1fbf6bc43" + } + Frame { + msec: 1680 + hash: "a68e7bb730b29b4c3b5468fd7b3d1d4f" + } + Frame { + msec: 1696 + hash: "719de171d8413f691e4ece4bcb00896c" + } + Frame { + msec: 1712 + hash: "ee9f5c2bfda6718a23fdd6c8f3f2e765" + } + Frame { + msec: 1728 + hash: "0f01834bbcfe690e5ee2d5897e5ea225" + } + Frame { + msec: 1744 + hash: "68af59f35ff14d9ff12a2a05f22cca69" + } + Frame { + msec: 1760 + hash: "50c9141aae689a8f09acf4d914075299" + } + Frame { + msec: 1776 + hash: "beb9e30c9b4f0d351c1387c69ea99208" + } + Frame { + msec: 1792 + hash: "2079cd433d9d29ad330e0782853712c7" + } + Frame { + msec: 1808 + hash: "de18d8be8fc1414cc19d446c659d1bcd" + } + Frame { + msec: 1824 + hash: "031807325492a899da9a91a9512487dd" + } + Frame { + msec: 1840 + hash: "4fdd8f3b01b4b61d269001604144bb7c" + } + Frame { + msec: 1856 + hash: "1172ec8a63f431f457b9a398b3d03571" + } + Frame { + msec: 1872 + hash: "4741a14556e9d32c2b180cca9009c63a" + } + Frame { + msec: 1888 + hash: "ec2c6d187a97037b5c1edea65d4b17cc" + } + Frame { + msec: 1904 + hash: "ea7d445310c28aa3e07735f1c7db4a28" + } + Frame { + msec: 1920 + hash: "3424b2d983a8962d9abb232c3d7c7814" + } + Frame { + msec: 1936 + image: "smoothedfollow.2.png" + } + Frame { + msec: 1952 + hash: "c362edcbe4e4460aa18599c05e993312" + } + Frame { + msec: 1968 + hash: "1a1291338c205ef2d315a43cca1caae2" + } + Frame { + msec: 1984 + hash: "ff6f0f47955d069a65cf9d19b7a061ff" + } + Frame { + msec: 2000 + hash: "3a6b787bbfe0510fdc8693a4827043e5" + } + Frame { + msec: 2016 + hash: "8198a6eec71a6da13b77397f3ead05a3" + } + Frame { + msec: 2032 + hash: "4c0fcb8d2105f104f6e1db0d58077c01" + } + Frame { + msec: 2048 + hash: "d9146739fa248ddcb6b4308d125825e7" + } + Frame { + msec: 2064 + hash: "5bda4f61879d0e9c714f2c138a91f4fd" + } + Frame { + msec: 2080 + hash: "30c0f8016506edb6875fd4cfa16cfa0f" + } + Frame { + msec: 2096 + hash: "bc04c5ae627073fcc467b86bea097630" + } + Frame { + msec: 2112 + hash: "7fcc2f6a7c620202a55618e66ed3c5f9" + } + Frame { + msec: 2128 + hash: "36f0855b78bbbf08ddf28f7a5775aea8" + } + Frame { + msec: 2144 + hash: "4acd7d6bceab6c8ba4508f9edddab6e7" + } + Frame { + msec: 2160 + hash: "2074776f5bd921148a50fad1004c00ea" + } + Frame { + msec: 2176 + hash: "0d79e1f38609320586831d93d87532a9" + } + Frame { + msec: 2192 + hash: "0402d99770dd23cbfc051eb576a29b57" + } + Frame { + msec: 2208 + hash: "456ba4fbe1ff68e1c9e22c9182c98ac6" + } + Frame { + msec: 2224 + hash: "de41559e07d9e58a68e26cf4daab879f" + } + Frame { + msec: 2240 + hash: "ad5087eae86c1b2afe5dbbcf8d098b18" + } + Frame { + msec: 2256 + hash: "117dc7b2e560a6959ef82dc461580620" + } + Frame { + msec: 2272 + hash: "4ce30665d1e63f728018cddfda1e3249" + } + Frame { + msec: 2288 + hash: "c1e66d2c554b81631aff66e695e05ee0" + } + Frame { + msec: 2304 + hash: "293b4c3a8ba18d9000f1a0c35ba3dbed" + } + Frame { + msec: 2320 + hash: "eefcc0eb3e4847dbf7edc52979c19cfb" + } + Frame { + msec: 2336 + hash: "1e25f0a629cffa99c3c962c5ce72cba3" + } + Frame { + msec: 2352 + hash: "e86a378941f876143cf13ef8c161d155" + } + Frame { + msec: 2368 + hash: "7063d2895353e4e2659e0911f8959a92" + } + Frame { + msec: 2384 + hash: "d26161aad10ec6d446dbae65bcc73926" + } + Frame { + msec: 2400 + hash: "3322df938aa5d2ffa32e445ad1f8b1a2" + } + Frame { + msec: 2416 + hash: "4ce384ace0527cb637865426a42d382f" + } + Frame { + msec: 2432 + hash: "5f49f970488f457681a9a59e82a1650e" + } + Frame { + msec: 2448 + hash: "d5494958d0c8f4307506c0b27f4a350c" + } + Frame { + msec: 2464 + hash: "cebee9854c54f2badef1cfa6b12adc88" + } + Frame { + msec: 2480 + hash: "9824242313879d9494b561a0a3a7fdc2" + } + Frame { + msec: 2496 + hash: "a14019028da0d3bf08782bf8285a188c" + } + Frame { + msec: 2512 + hash: "f241eb27a0460182d08c6e4e1ebbc25b" + } + Frame { + msec: 2528 + hash: "3b243c79d097f89e5a3f8ece97321026" + } + Frame { + msec: 2544 + hash: "95755ce577ab0b8ede949851ce842d9d" + } + Frame { + msec: 2560 + hash: "0cd40a2a4b9d0b7dbba8dff247db178f" + } + Frame { + msec: 2576 + hash: "b964995f06ab287a98569baab365c475" + } + Frame { + msec: 2592 + hash: "a28aca3ba953c52ac00fea0c84a6aba9" + } + Frame { + msec: 2608 + hash: "d45d2eaeab472eaa1bd9460f4464c62b" + } + Frame { + msec: 2624 + hash: "0872615e2d8d2ec1192ec6e60aff01c7" + } + Frame { + msec: 2640 + hash: "8724c4128b869be51053deafd68e4e47" + } + Frame { + msec: 2656 + hash: "8c8e0a8fed148120b2b79d3c6b886651" + } + Frame { + msec: 2672 + hash: "35357a5689398f6f594ae45743555107" + } + Frame { + msec: 2688 + hash: "848a069b9e8334482e118ba0df14dc1c" + } + Frame { + msec: 2704 + hash: "26cb86bd54616c69966d949424d4d41f" + } + Frame { + msec: 2720 + hash: "437669b1efa8b33ee469547527ccb4d9" + } + Frame { + msec: 2736 + hash: "ff040bafe5c484d7b516008f17411ad2" + } + Frame { + msec: 2752 + hash: "fdab8b8cf64a2b15ab07691ca2ad115f" + } + Frame { + msec: 2768 + hash: "e3867ffaf98270f6efe77d816a8254cb" + } + Frame { + msec: 2784 + hash: "cbad5ba7c09567166f063955b45aa647" + } + Frame { + msec: 2800 + hash: "336049bb4ff2e945483648feabe997c2" + } + Frame { + msec: 2816 + hash: "45e65f29cc932090a3bfc2292c4e5e72" + } + Frame { + msec: 2832 + hash: "d617d33fe22196f88844a7adc5305413" + } + Frame { + msec: 2848 + hash: "fb32358f314d9cd6ac6646888f402b46" + } + Frame { + msec: 2864 + hash: "2897322c869a0bd7a851ff779c8591bf" + } + Frame { + msec: 2880 + hash: "c41d71d62727f0fc26dc790f09c67168" + } + Frame { + msec: 2896 + image: "smoothedfollow.3.png" + } + Frame { + msec: 2912 + hash: "b5c2182ce797d91175d9f7493a77aae8" + } + Frame { + msec: 2928 + hash: "4436d56d8dba299619be367cf57dc41d" + } + Frame { + msec: 2944 + hash: "fe2d68f672a78568da1a281be13eda36" + } + Frame { + msec: 2960 + hash: "90731590c28f254a213f83f83b988608" + } + Frame { + msec: 2976 + hash: "e276149e000e768a5b2704fde77bff2b" + } + Frame { + msec: 2992 + hash: "616b2d32f6b0f047a252f0b698408d87" + } + Frame { + msec: 3008 + hash: "ebd003e7712060ec45d7be9bebb9ab8f" + } + Frame { + msec: 3024 + hash: "d97b14eb1fe9556b283b5d7b35f30fcc" + } + Frame { + msec: 3040 + hash: "a926b60b28442c4318fb3c2c5474540c" + } + Frame { + msec: 3056 + hash: "7908c0356da3bc27d2513c843a0d4feb" + } + Frame { + msec: 3072 + hash: "48644d6fb0dbd280b806c991b3b72417" + } + Frame { + msec: 3088 + hash: "4efbb4954b2d2c26f3e32f9f1bba6b41" + } + Frame { + msec: 3104 + hash: "d9c5e5ca5d6c1189740706673abab943" + } + Frame { + msec: 3120 + hash: "d0acc9b7ee97220e551df16e0c3d1f53" + } + Frame { + msec: 3136 + hash: "2610d1de5d32e74ab8fd238cd721ef2e" + } + Frame { + msec: 3152 + hash: "b8d1e724d5cb172ab5d7475d2f7a6ee6" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativesmoothedanimation/smoothedfollow.qml b/tests/auto/declarative/qmlvisual/qdeclarativesmoothedanimation/smoothedfollow.qml new file mode 100644 index 00000000..c154aa06 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativesmoothedanimation/smoothedfollow.qml @@ -0,0 +1,128 @@ +import QtQuick 1.0 + +Rectangle { + width: 400; height: 360; color: "gray" + + Rectangle { + id: rect + width: 25; height: 10; y: 15; color: "black" + SequentialAnimation on x { + loops: Animation.Infinite + NumberAnimation { from: 25; to: 350; duration: 1000 } + NumberAnimation { from: 350; to: 25; duration: 1000 } + } + } + + Rectangle { + width: 25; height: 10; x: rect.x; y: 30; color: "red" + Behavior on x { SmoothedAnimation { velocity: 200 } } + } + + Rectangle { + width: 25; height: 10; x: rect.x; y: 45; color: "yellow" + Behavior on x { SmoothedAnimation { velocity: 150; reversingMode: SmoothedAnimation.Immediate } } + } + + Rectangle { + width: 25; height: 10; x: rect.x; y: 60; color: "green" + Behavior on x { SmoothedAnimation { velocity: 100; reversingMode: SmoothedAnimation.Sync } } + } + + Rectangle { + width: 25; height: 10; x: rect.x; y: 75; color: "purple" + Behavior on x { SmoothedAnimation { velocity: 100; maximumEasingTime: 100 } } + } + + Rectangle { + width: 25; height: 10; x: rect.x; y: 90; color: "blue" + Behavior on x { SmoothedAnimation { velocity: -1; duration: 300 } } + } + + //rect2 has jerky movement, but the rects following it should be smooth + Rectangle { + id: rect2 + property int dir: 1 + width: 25; height: 10; x:25; y: 120; color: "black" + function advance(){ + if(x >= 350) + dir = -1; + if(x <= 25) + dir = 1; + x += 65.0 * dir; + } + } + Timer{ + interval: 200 + running: true + repeat: true + onTriggered: rect2.advance(); + } + + Rectangle { + width: 25; height: 10; x: rect2.x; y: 135; color: "red" + Behavior on x { SmoothedAnimation { velocity: 200 } } + } + + Rectangle { + width: 25; height: 10; x: rect2.x; y: 150; color: "yellow" + Behavior on x { SmoothedAnimation { velocity: 150; reversingMode: SmoothedAnimation.Immediate } } + } + + Rectangle { + width: 25; height: 10; x: rect2.x; y: 165; color: "green" + Behavior on x { SmoothedAnimation { velocity: 100; reversingMode: SmoothedAnimation.Sync } } + } + + Rectangle { + width: 25; height: 10; x: rect2.x; y: 180; color: "purple" + Behavior on x { SmoothedAnimation { velocity: 100; maximumEasingTime: 100 } } + } + + Rectangle { + width: 25; height: 10; x: rect2.x; y: 195; color: "blue" + Behavior on x { SmoothedAnimation { velocity: -1; duration: 300 } } + } + + //rect3 just jumps , but the rects following it should be smooth + Rectangle { + id: rect3 + width: 25; height: 10; x:25; y: 240; color: "black" + function advance(){ + if(x == 25) + x = 350; + else + x = 25; + } + } + Timer{ + interval: 1000 + running: true + repeat: true + onTriggered: rect3.advance(); + } + + Rectangle { + width: 25; height: 10; x: rect3.x; y: 255; color: "red" + Behavior on x { SmoothedAnimation { velocity: 200 } } + } + + Rectangle { + width: 25; height: 10; x: rect3.x; y: 270; color: "yellow" + Behavior on x { SmoothedAnimation { velocity: 150; reversingMode: SmoothedAnimation.Immediate } } + } + + Rectangle { + width: 25; height: 10; x: rect3.x; y: 285; color: "green" + Behavior on x { SmoothedAnimation { velocity: 100; reversingMode: SmoothedAnimation.Sync } } + } + + Rectangle { + width: 25; height: 10; x: rect3.x; y: 300; color: "purple" + Behavior on x { SmoothedAnimation { velocity: 100; maximumEasingTime: 100 } } + } + + Rectangle { + width: 25; height: 10; x: rect3.x; y: 315; color: "blue" + Behavior on x { SmoothedAnimation { velocity: -1; duration: 300 } } + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/clock.qml b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/clock.qml new file mode 100644 index 00000000..0e4e6429 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/clock.qml @@ -0,0 +1,64 @@ +import QtQuick 1.0 + +Rectangle { + id: clock + color: "gray" + width: 200; height: 200 + + property variant hours: 10 + property variant minutes: 28 + property variant seconds: 0 + + Timer { + interval: 1000; running: true; repeat: true; triggeredOnStart: true + onTriggered: seconds++ + } + + Image { id: background; source: "content/clock.png" } + + Image { + x: 92.5; y: 27 + source: "content/hour.png" + transform: Rotation { + id: hourRotation + origin.x: 7.5; origin.y: 73 + angle: (clock.hours * 30) + (clock.minutes * 0.5) + + Behavior on angle { + SpringAnimation { spring: 2; damping: 0.2; modulus: 360 } + } + } + } + + Image { + x: 93.5; y: 17 + source: "content/minute.png" + transform: Rotation { + id: minuteRotation + origin.x: 6.5; origin.y: 83 + angle: clock.minutes * 6 + + Behavior on angle { + SpringAnimation { spring: 2; damping: 0.2; modulus: 360 } + } + } + } + + Image { + x: 97.5; y: 20 + source: "content/second.png" + transform: Rotation { + id: secondRotation + origin.x: 2.5; origin.y: 80 + angle: clock.seconds * 6 + + Behavior on angle { + SpringAnimation { spring: 5; damping: 0.25; modulus: 360 } + } + } + } + + Image { + anchors.centerIn: background; source: "content/center.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/content/background.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/content/background.png new file mode 100644 index 00000000..a8859508 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/content/background.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/content/center.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/content/center.png new file mode 100644 index 00000000..7fbd802a Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/content/center.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/content/clock.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/content/clock.png new file mode 100644 index 00000000..462edacc Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/content/clock.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/content/hour.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/content/hour.png new file mode 100644 index 00000000..f8061a12 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/content/hour.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/content/minute.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/content/minute.png new file mode 100644 index 00000000..1297ec7c Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/content/minute.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/content/second.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/content/second.png new file mode 100644 index 00000000..4aa9fb5e Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/content/second.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.0.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.0.png new file mode 100644 index 00000000..8714f580 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.1.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.1.png new file mode 100644 index 00000000..05e4a985 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.2.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.2.png new file mode 100644 index 00000000..29df073c Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.3.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.3.png new file mode 100644 index 00000000..b38486ee Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.4.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.4.png new file mode 100644 index 00000000..4de915b7 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.5.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.5.png new file mode 100644 index 00000000..61a4684f Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.5.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.6.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.6.png new file mode 100644 index 00000000..4ce5e304 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.6.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.7.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.7.png new file mode 100644 index 00000000..2376b139 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.7.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.qml b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.qml new file mode 100644 index 00000000..893355b6 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-MAC/follow.qml @@ -0,0 +1,1763 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "follow.0.png" + } + Frame { + msec: 32 + hash: "e94ba580322887dbbbf9cb6309e39c23" + } + Frame { + msec: 48 + hash: "787a59cda2c0b27d8959026e6d1b9427" + } + Frame { + msec: 64 + hash: "9ca724d4b31aa16015b5cbb50eea0c3a" + } + Frame { + msec: 80 + hash: "8a2c62a0190da1b7c1bade243baea6b8" + } + Frame { + msec: 96 + hash: "e129bebca7ad348c3134569d8eee4efc" + } + Frame { + msec: 112 + hash: "fd6387415e1c02fe6d17d9c3aa1d1ed8" + } + Frame { + msec: 128 + hash: "a82a4042fdca7c30facd2c4740c455f7" + } + Frame { + msec: 144 + hash: "62195722eb3acbfbad137ec71fd50bfe" + } + Frame { + msec: 160 + hash: "449819cdc880d59650732b5447ec6237" + } + Frame { + msec: 176 + hash: "552a838ebcacc0e08fa93b64a2433831" + } + Frame { + msec: 192 + hash: "3984992606d54f05eb31dd0974af2183" + } + Frame { + msec: 208 + hash: "3fd7225bbb0215ca8b6397580f2352a5" + } + Frame { + msec: 224 + hash: "0fd8f26f40a9049de1cf2a9493d579d1" + } + Frame { + msec: 240 + hash: "d08f0c57f071dc42e79fc5e0e3c32eeb" + } + Frame { + msec: 256 + hash: "084c2db330ee82cd032df248ecc9629d" + } + Frame { + msec: 272 + hash: "98da0d7f280d7fc4579c970c9a173b51" + } + Frame { + msec: 288 + hash: "4c819c54ced1b6ef0574417a7e11f2e7" + } + Frame { + msec: 304 + hash: "3dc5f7b412cb176c3b23d37cda3ef87c" + } + Frame { + msec: 320 + hash: "c368a01b43d94205c03f9c750c37f330" + } + Frame { + msec: 336 + hash: "8842bd0c8b17cac4fc9df84835999174" + } + Frame { + msec: 352 + hash: "26829e9c7ca44dfcb0c03852f4158a18" + } + Frame { + msec: 368 + hash: "ecffdb0888f1721e27b163e1f29a1950" + } + Frame { + msec: 384 + hash: "eaead96f2683c464a12df8aadba20691" + } + Frame { + msec: 400 + hash: "1e931963925bd208dce1ec9011372a3b" + } + Frame { + msec: 416 + hash: "1c3fd049001c1e883f21d0d1e0e32cba" + } + Frame { + msec: 432 + hash: "e8c3422ca637750ac52565594737d092" + } + Frame { + msec: 448 + hash: "b1c36322cf89e15a80af7c43f2aebca1" + } + Frame { + msec: 464 + hash: "f676c3171495f7bb2cb1812cfebaa17a" + } + Frame { + msec: 480 + hash: "255119e2efa99c8e31fee611aaaa5137" + } + Frame { + msec: 496 + hash: "e0bd32e3d44cfc2351db105f4595f18a" + } + Frame { + msec: 512 + hash: "b7f23b8f3769f929b42491efda7ebe19" + } + Frame { + msec: 528 + hash: "718cee11d869a8a8c5191cc0c09f2d30" + } + Frame { + msec: 544 + hash: "fbdbf92f8c5f507605ff50abc594682b" + } + Frame { + msec: 560 + hash: "c07fdc69c72b40d3c8dd1cc499008888" + } + Frame { + msec: 576 + hash: "38e17ecd537dc0f51211ad672a2ebb21" + } + Frame { + msec: 592 + hash: "2cbdc8728ef779c62f9938672986658a" + } + Frame { + msec: 608 + hash: "7fb66509d5d1df34861e9c70f9a579f0" + } + Frame { + msec: 624 + hash: "410b89392e859058718a08b79ec3d8fa" + } + Frame { + msec: 640 + hash: "9bd90f80700217d08dafed93b81ee9cf" + } + Frame { + msec: 656 + hash: "6d83671504a4274887b4e0d9bd2b24e7" + } + Frame { + msec: 672 + hash: "51ff7bd3fd4a776af33fce7b935b145c" + } + Frame { + msec: 688 + hash: "20f27392368b63b248bcd455cf3c9106" + } + Frame { + msec: 704 + hash: "1a5ab296bd55aa215c9b04a7ff6c73a1" + } + Frame { + msec: 720 + hash: "020fd7b14e8662fc006b0c39adca7c6a" + } + Frame { + msec: 736 + hash: "2619120bdb25a153963bdf05c4a16d44" + } + Frame { + msec: 752 + hash: "fd321314031efeb9ce71146764289d9f" + } + Frame { + msec: 768 + hash: "378a71f09445dfff284db919787cbf87" + } + Frame { + msec: 784 + hash: "d59eefe82ab8a00c903141dd9ea767ef" + } + Frame { + msec: 800 + hash: "0a65004d69a4567f2a5c7e84dab3a905" + } + Frame { + msec: 816 + hash: "92a4631716a51ff484ca14d9cfe05b2e" + } + Frame { + msec: 832 + hash: "87203f627cf410cad56d6ba38a140efa" + } + Frame { + msec: 848 + hash: "054cc085998cc059a6b7b4a7300dd36b" + } + Frame { + msec: 864 + hash: "af3fefeb908a0485c723d36f61eff0a4" + } + Frame { + msec: 880 + hash: "3f905d1e1ea79858b5a9bbfeab4eb255" + } + Frame { + msec: 896 + hash: "f935f1fc5f26a201098d894fca9a4d1f" + } + Frame { + msec: 912 + hash: "42b003dbb531da514716b9c32bdd3614" + } + Frame { + msec: 928 + hash: "a82fed83ee4efee7896b639c7691b13a" + } + Frame { + msec: 944 + hash: "31ad8cbf875233ea495330b0d3d4d2dd" + } + Frame { + msec: 960 + hash: "00586f2f1d49fa81f90f7b06614311b4" + } + Frame { + msec: 976 + image: "follow.1.png" + } + Frame { + msec: 992 + hash: "5d71ff48b865ad4266eb8292f981b04e" + } + Frame { + msec: 1008 + hash: "df599d934d131c92b209284277009efb" + } + Frame { + msec: 1024 + hash: "5aaf33d11eb70ffdfe89246c637caed7" + } + Frame { + msec: 1040 + hash: "9648cf623a66ded145c4fd23a42917b3" + } + Frame { + msec: 1056 + hash: "9d33c2cc44ceac5a527ddcf809a51df6" + } + Frame { + msec: 1072 + hash: "6d0ad2e0d012e53a03e246e6d5e49e13" + } + Frame { + msec: 1088 + hash: "d33fa68796e38b19f44571d11c1bcd33" + } + Frame { + msec: 1104 + hash: "636680f49bbf30b0fac31a6c581f18dd" + } + Frame { + msec: 1120 + hash: "66801dbc39301e6b46b244fe502e0340" + } + Frame { + msec: 1136 + hash: "f8fa6a033483279e78636f26493b10ac" + } + Frame { + msec: 1152 + hash: "11b46611550173df42986dee4339d907" + } + Frame { + msec: 1168 + hash: "5c9afdb519006079ee8d28b2b60d0b76" + } + Frame { + msec: 1184 + hash: "9a55c38b2cd8abf25fbe448c7ef80971" + } + Frame { + msec: 1200 + hash: "27ebdf1424e892b35c93ec009d942407" + } + Frame { + msec: 1216 + hash: "2d9e3f0ae56f7337012b51c4dd173108" + } + Frame { + msec: 1232 + hash: "e6f89ca892131d68ff1f4ca95c95d807" + } + Frame { + msec: 1248 + hash: "f75791f1b12a217d37acb09bdb114cc5" + } + Frame { + msec: 1264 + hash: "94c5ab1460fb1b0f957a9718b45bca36" + } + Frame { + msec: 1280 + hash: "e246c8a0ec3d01ea20258b24a5673fe1" + } + Frame { + msec: 1296 + hash: "529de7735e73409dff266d8c1275215c" + } + Frame { + msec: 1312 + hash: "330400763a670580570cb62241ebec62" + } + Frame { + msec: 1328 + hash: "ae444d1de9c509fc6f74136ca90f927a" + } + Frame { + msec: 1344 + hash: "c43631ca8ee90ea5dc7664be5bc45429" + } + Frame { + msec: 1360 + hash: "b366ac4a5b66c331a7667e9df0fc4eda" + } + Frame { + msec: 1376 + hash: "1c7f4c47a9c57a34787cc9703e99bff1" + } + Frame { + msec: 1392 + hash: "5555535609d512e8d34549b6624f74b8" + } + Frame { + msec: 1408 + hash: "be59df714541923494b59f31f57e310e" + } + Frame { + msec: 1424 + hash: "63e434f053032e54298f6e61c8d4da7d" + } + Frame { + msec: 1440 + hash: "b0bb838637eceb6f8993ebc5b887afed" + } + Frame { + msec: 1456 + hash: "fc39f33add4ebcaf578558ecd4aea281" + } + Frame { + msec: 1472 + hash: "3f36faa7cc1e5898d4d5890c47633ff3" + } + Frame { + msec: 1488 + hash: "4b328002b4461869b1f7de48e7291902" + } + Frame { + msec: 1504 + hash: "26252c63924d2abcaebea2c7caf1d7aa" + } + Frame { + msec: 1520 + hash: "a9a6023484ae439be86b2c2ff59dc40b" + } + Frame { + msec: 1536 + hash: "620dab11bd4aab84cc0d949c48dd9a5d" + } + Frame { + msec: 1552 + hash: "3b45ef80ee3e6fbbd3533bfa0d666e2f" + } + Frame { + msec: 1568 + hash: "b33306abcb6a8402e491b7216495c778" + } + Frame { + msec: 1584 + hash: "3cc52e8649a02e87785f1dc63f5c1efd" + } + Frame { + msec: 1600 + hash: "fe21141f48da685213ed9d7641b2e7a0" + } + Frame { + msec: 1616 + hash: "205aac4e822e20bd32f637256250f3c8" + } + Frame { + msec: 1632 + hash: "124df0948f36aaf6151556d301f4b930" + } + Frame { + msec: 1648 + hash: "c1701edd5eaf143fd1dbdc4a5324b48a" + } + Frame { + msec: 1664 + hash: "117402df55367c918a3835958f4ab1d6" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 195; y: 95 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1680 + hash: "73e3b86a1da28490cae4b03fdceefe19" + } + Frame { + msec: 1696 + hash: "172e329fb47d6db0180242990a84fe3b" + } + Frame { + msec: 1712 + hash: "82cf704cdfd406bab22689bc888ddc8d" + } + Frame { + msec: 1728 + hash: "4c288f198a06d1b2815d34c3c8f97051" + } + Frame { + msec: 1744 + hash: "6404d81456bb95a6b1c1ae55a181e40e" + } + Frame { + msec: 1760 + hash: "6c11b9f079936ea08d11aa1172bfd954" + } + Frame { + msec: 1776 + hash: "95388037c1f79a9dab951031f1d7c307" + } + Frame { + msec: 1792 + hash: "c4ee57d9bffbb5f0ff173db48eadf2e3" + } + Frame { + msec: 1808 + hash: "703ac9672a9c55cf08e6381ef76ac13c" + } + Frame { + msec: 1824 + hash: "ea7726d2a2923290398262c8f70d511e" + } + Frame { + msec: 1840 + hash: "9897c12603326a30c62381015c9adae3" + } + Frame { + msec: 1856 + hash: "a52aa37b10a05382f1b136896b7e00e8" + } + Frame { + msec: 1872 + hash: "a5acc1a45c95a67725e5e15084b7be18" + } + Frame { + msec: 1888 + hash: "c9fac8b5a4110493958d49b073ea96ed" + } + Frame { + msec: 1904 + hash: "6fca3a5c6d1cfbf1b905aca25b7785c5" + } + Frame { + msec: 1920 + hash: "a40e5e2744d1d84c8b9a45525801a745" + } + Frame { + msec: 1936 + image: "follow.2.png" + } + Frame { + msec: 1952 + hash: "b2f980ab19d44ee98ab3e82a19adfe2d" + } + Frame { + msec: 1968 + hash: "e01732623930aebefd76ab62c81dc722" + } + Frame { + msec: 1984 + hash: "3a59c6851bc89eb31100092b1ceddbd9" + } + Frame { + msec: 2000 + hash: "2949de19eacb9f35816aa7ba69614f2c" + } + Frame { + msec: 2016 + hash: "f2c4c1f4429cbb6bd10f2318b2cb6904" + } + Frame { + msec: 2032 + hash: "2c48af64162e7e028cd536dba03eab71" + } + Frame { + msec: 2048 + hash: "7fe13b8f9253f720b6591b396cfba2d1" + } + Frame { + msec: 2064 + hash: "559947a03e650575a764801366cc504b" + } + Frame { + msec: 2080 + hash: "a8d09f6c862fd5ec2dcf34f06d1ef744" + } + Frame { + msec: 2096 + hash: "e3bb4b62209631ff84134f2243bfdb42" + } + Frame { + msec: 2112 + hash: "a1956a9d1939bc154ea0c88d596948cc" + } + Frame { + msec: 2128 + hash: "c98a375727860da1e827d4dd74af8f63" + } + Frame { + msec: 2144 + hash: "df4edcbb2ef5348341ff55c808609b6c" + } + Frame { + msec: 2160 + hash: "6287564be85b7cbadc6bb6f0232bc837" + } + Frame { + msec: 2176 + hash: "9826fdb48f7ea770fa5f198ec49d7cb7" + } + Frame { + msec: 2192 + hash: "56f82641a5591df9bb929cc0d32eb95d" + } + Frame { + msec: 2208 + hash: "526c55e555fb2e58796561efa3568c50" + } + Frame { + msec: 2224 + hash: "6b4b74613421c1841a17c369cb316754" + } + Frame { + msec: 2240 + hash: "37f785c30947d5eec113dcf6af649abf" + } + Frame { + msec: 2256 + hash: "5ff2c975dd9e261c764537c836627c4d" + } + Frame { + msec: 2272 + hash: "efe554981583749c3d09988bce7fed02" + } + Frame { + msec: 2288 + hash: "0f7204b4afb0ea5d58e49650e8027c0c" + } + Frame { + msec: 2304 + hash: "817291f91f4b309710ad3aed53a7d47a" + } + Frame { + msec: 2320 + hash: "c15c9cd03089090cf8a777c1f0d88de7" + } + Frame { + msec: 2336 + hash: "05f45cb8d0856dcc81091351615e35d6" + } + Frame { + msec: 2352 + hash: "99785a16fed6d6409b4b47ec55afb56b" + } + Frame { + msec: 2368 + hash: "39032cb4432ee9536af500673fccf526" + } + Frame { + msec: 2384 + hash: "9057653e3cd6042831037d3590e7595b" + } + Frame { + msec: 2400 + hash: "76c772eb2ab8f117c260c9c96bc99e1d" + } + Frame { + msec: 2416 + hash: "b6474665b8f8bcdd76d1a38efecad889" + } + Frame { + msec: 2432 + hash: "106c2d2efafad0181e3ded3a6805f2c6" + } + Frame { + msec: 2448 + hash: "5275fa4ffef6c1909f9d03bb1e7b9cae" + } + Frame { + msec: 2464 + hash: "0c1043c0087d60000dc7259d4ac03618" + } + Frame { + msec: 2480 + hash: "645748569b4f5cb9b206b0808bb7d23d" + } + Frame { + msec: 2496 + hash: "dd95dfa80e1b3ff511e7c75efd0d87ce" + } + Frame { + msec: 2512 + hash: "86b3dd03b04d7610837cdc67cad07e0a" + } + Frame { + msec: 2528 + hash: "8264f67ac92e4ebcfe4cc8e954f8c5d2" + } + Frame { + msec: 2544 + hash: "6bf52377d822b09eb28a1ec36d3a36a9" + } + Frame { + msec: 2560 + hash: "7ae1d65cdaf7fa71eb4ec318b37bb0aa" + } + Frame { + msec: 2576 + hash: "860f5ce9844c90cf9e6a6d383ff0972f" + } + Frame { + msec: 2592 + hash: "5502229c038dfc59d966f69ae6ed8957" + } + Frame { + msec: 2608 + hash: "21843c027bc1434ae60b3bb0fced2c54" + } + Frame { + msec: 2624 + hash: "962df45680949c3eb6c968f98cd76b20" + } + Frame { + msec: 2640 + hash: "f313c26fa76a0edce61244bdf92528e4" + } + Frame { + msec: 2656 + hash: "b7bbde239e98cbd66b1e51b54b747f51" + } + Frame { + msec: 2672 + hash: "62340707fbc832fcb805c8f80ab353d1" + } + Frame { + msec: 2688 + hash: "d008a3f7af1810ff70b68b38a4cd0f0d" + } + Frame { + msec: 2704 + hash: "e651dd628af24faf34d716beb392b052" + } + Frame { + msec: 2720 + hash: "a97733963c7a7616b25741545b07ffba" + } + Frame { + msec: 2736 + hash: "3e017cc1db720cf16521bd17308e4f44" + } + Frame { + msec: 2752 + hash: "13652ebaa610cca71486517e2eed21a5" + } + Frame { + msec: 2768 + hash: "09f0f500c6f7d11be39c31f9e589b38a" + } + Frame { + msec: 2784 + hash: "b87968cbc60ddc6a5f5699e830410eab" + } + Frame { + msec: 2800 + hash: "50e65b043d1f07a321a08ee4c25204f6" + } + Frame { + msec: 2816 + hash: "122d1ffa1510468e8c4067e0f511588f" + } + Frame { + msec: 2832 + hash: "585f6c25caaafb99a22a23d8a998d202" + } + Frame { + msec: 2848 + hash: "9b245a00ad576666c10f509d8a80a61e" + } + Frame { + msec: 2864 + hash: "9b245a00ad576666c10f509d8a80a61e" + } + Frame { + msec: 2880 + hash: "3c5d3d10bacc093afc6a9c0b5aa4cddc" + } + Frame { + msec: 2896 + image: "follow.3.png" + } + Frame { + msec: 2912 + hash: "31926d69c2309fdf13fbd7f0e9868c3d" + } + Frame { + msec: 2928 + hash: "eb3acacce5dd31b0e94b59b9e546ccae" + } + Frame { + msec: 2944 + hash: "9a51cff3276d75803a0a6e480f7ecb70" + } + Frame { + msec: 2960 + hash: "fbbd8b9d519993a699815d935bcd2b9f" + } + Frame { + msec: 2976 + hash: "0314190c6de73f9f374a4eaed0709645" + } + Frame { + msec: 2992 + hash: "8ca1a203bdb5446094eb948aeb0a333e" + } + Frame { + msec: 3008 + hash: "301e1b86ce38e11ad9d0d7aba0909985" + } + Frame { + msec: 3024 + hash: "922095867d0a91b73ab7a63df2041279" + } + Frame { + msec: 3040 + hash: "ba8275f3ba4633bf64a1f81f630c90f1" + } + Frame { + msec: 3056 + hash: "efe39545279a7bd015d2de75d2b9d8b1" + } + Frame { + msec: 3072 + hash: "78926c3c0c6fcf89b9291f9902710964" + } + Frame { + msec: 3088 + hash: "ea63dcb7f00d3ddede0d8be59ad9d6bc" + } + Frame { + msec: 3104 + hash: "286ad493301b713a49e378f123482a53" + } + Frame { + msec: 3120 + hash: "a4bbbb8bb88188d3e99996502e3eebd1" + } + Frame { + msec: 3136 + hash: "a6100e79f3dc5af594e86ab6cd8dfb76" + } + Frame { + msec: 3152 + hash: "d9e3f777dc89bcf1b7f712206db768e2" + } + Frame { + msec: 3168 + hash: "768045c600c0aa0b1e9e6f012733c600" + } + Frame { + msec: 3184 + hash: "d8b4caa641ddee786f7898359efe9d07" + } + Frame { + msec: 3200 + hash: "f7c3b76d5bb7c263ac9447eaad685158" + } + Frame { + msec: 3216 + hash: "f7f97db815d653ec29fa31b87f72af2a" + } + Frame { + msec: 3232 + hash: "18524623762487b60943312cd8bd4388" + } + Frame { + msec: 3248 + hash: "5823dee5dd56e9f7515601f9629ccbae" + } + Frame { + msec: 3264 + hash: "5823dee5dd56e9f7515601f9629ccbae" + } + Frame { + msec: 3280 + hash: "5823dee5dd56e9f7515601f9629ccbae" + } + Frame { + msec: 3296 + hash: "5823dee5dd56e9f7515601f9629ccbae" + } + Frame { + msec: 3312 + hash: "18524623762487b60943312cd8bd4388" + } + Frame { + msec: 3328 + hash: "430995770b655054aaeda383df8e27f7" + } + Frame { + msec: 3344 + hash: "16a3a00f2b89aed676f80d63c4933ec3" + } + Frame { + msec: 3360 + hash: "6c55aa62079ec546522edbf69c37b270" + } + Frame { + msec: 3376 + hash: "0d68ca3ccecdd831013950cc7405e46e" + } + Frame { + msec: 3392 + hash: "9da2511bc8b434218695fa74ed543439" + } + Frame { + msec: 3408 + hash: "05afdd0b99dab81a500cdc2b2f0786fe" + } + Frame { + msec: 3424 + hash: "e6f8882d146ae60bcc6ea47ff41a637b" + } + Frame { + msec: 3440 + hash: "154542ed0e88321294f382501819aefc" + } + Frame { + msec: 3456 + hash: "8f47b6980c387c5020145bf04645fd2d" + } + Frame { + msec: 3472 + hash: "b34b055c7602f1f4e1cde875b258120c" + } + Frame { + msec: 3488 + hash: "5a697f675575f05e297d4877604b9a47" + } + Frame { + msec: 3504 + hash: "729dff1d1b357d19fc81804ec8940d0e" + } + Frame { + msec: 3520 + hash: "c6f3fee46baa94a6139d2ee40254b160" + } + Frame { + msec: 3536 + hash: "af0e700bb8ae34834510830f8b44afdb" + } + Frame { + msec: 3552 + hash: "9c87bb54c2dfe58c2da9194dae6f7502" + } + Frame { + msec: 3568 + hash: "2132356a92c75d725f9feafb8201b142" + } + Frame { + msec: 3584 + hash: "50d855d2595eeae2bfd6aaa8c2fa0454" + } + Frame { + msec: 3600 + hash: "5fde3c62d6e53a9056e3586f9dcda59e" + } + Frame { + msec: 3616 + hash: "8f04460254a1e9fb949d5165894cd92a" + } + Frame { + msec: 3632 + hash: "2b514c5e3b20d30f9c7e71092c69f081" + } + Frame { + msec: 3648 + hash: "2c1ba6224037790e15f5c0f2864ace4d" + } + Frame { + msec: 3664 + hash: "0d5b8e7bd5f560888aacaf2b3c6827a8" + } + Frame { + msec: 3680 + hash: "ae25004530e7df134414018e4a34780e" + } + Frame { + msec: 3696 + hash: "1a8fd9eaf9a91f1b42924f8986fbed9a" + } + Frame { + msec: 3712 + hash: "2ea6de2025d40ed5beeff12a5b70ccc9" + } + Frame { + msec: 3728 + hash: "624e417718d3cac1e4b7e4ce258ce6ea" + } + Frame { + msec: 3744 + hash: "8b56d29391257c7be8966af6be26ea9f" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 195; y: 95 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3760 + hash: "5c0d977d8b446d9191bde57335cf1062" + } + Frame { + msec: 3776 + hash: "100be2b21d069e3a5dbb694a90da4d4f" + } + Frame { + msec: 3792 + hash: "caab03f6c81080dd8fdbedb4e94ae4a5" + } + Frame { + msec: 3808 + hash: "3328a4d06f2f80a7e9ccf2ff21522fca" + } + Frame { + msec: 3824 + hash: "a534e6cc28daf3eff6a9cf8379bd6375" + } + Frame { + msec: 3840 + hash: "6686f9c1a814c6a6b785b70f94937b68" + } + Frame { + msec: 3856 + image: "follow.4.png" + } + Frame { + msec: 3872 + hash: "d3f1c3593375ca5c022a1361a7ec70bd" + } + Frame { + msec: 3888 + hash: "67843e6192e2ecaa3820c37dc2f93106" + } + Frame { + msec: 3904 + hash: "19a022f678e5b8f4ebdff936162323dc" + } + Frame { + msec: 3920 + hash: "34e55ae70c9e156db339ae15642359c3" + } + Frame { + msec: 3936 + hash: "3784778c817f9d9bb73d990cfe12685a" + } + Frame { + msec: 3952 + hash: "0403fdf79e3ba339c7e3786db0c9c0f0" + } + Frame { + msec: 3968 + hash: "93e4a0d5645d1cfc916f1e8422655555" + } + Frame { + msec: 3984 + hash: "29080bfabb87160b7c51385fb36b474b" + } + Frame { + msec: 4000 + hash: "9da2d83edc9d35f00fb8a159e79de4d9" + } + Frame { + msec: 4016 + hash: "5505a42d4788f00cfc7499fbfda851ce" + } + Frame { + msec: 4032 + hash: "bdd3040ab16fa9ffdd2fbc66b06699f8" + } + Frame { + msec: 4048 + hash: "2a347e30a20c693a9440caa60ade0a0f" + } + Frame { + msec: 4064 + hash: "0307f1857c091a639d47f112ce1a2f5a" + } + Frame { + msec: 4080 + hash: "778d18e539bbd562ebe39283a6315df1" + } + Frame { + msec: 4096 + hash: "0369cf6c3d1f5db2e92ee1f7c5d3b8ed" + } + Frame { + msec: 4112 + hash: "9f7413587ab50f1abf776bf180ec2d6f" + } + Frame { + msec: 4128 + hash: "7d04a27236485808e571e8a39f23ea17" + } + Frame { + msec: 4144 + hash: "a1dff63b723473d5a4c9c59975a2fb81" + } + Frame { + msec: 4160 + hash: "9795ea70a3b9d3b7805221a58c19e5da" + } + Frame { + msec: 4176 + hash: "f1392c489e21107136eb8e0d1e8b427e" + } + Frame { + msec: 4192 + hash: "95c225ef07171a96335e99078195b06a" + } + Frame { + msec: 4208 + hash: "d46ef3e7f9cec06e8c18afc0d07be4f3" + } + Frame { + msec: 4224 + hash: "b017f5b51d423bb0fca0d6df3aaded8b" + } + Frame { + msec: 4240 + hash: "60584d085b0cd6fbc436773be678597e" + } + Frame { + msec: 4256 + hash: "117951465dfd5c386826b295560d2dec" + } + Frame { + msec: 4272 + hash: "1b70137da5f4e024593999e93121fe8b" + } + Frame { + msec: 4288 + hash: "bd50dffd41941fef127f39b55c4748e0" + } + Frame { + msec: 4304 + hash: "8eec34d8e1d2e22d11b85a671cd4d3aa" + } + Frame { + msec: 4320 + hash: "9e3c97cfad5002ef5f3fcc365aeb7bd0" + } + Frame { + msec: 4336 + hash: "28e1cf1ee033915ea2ee39c9ab00a73d" + } + Frame { + msec: 4352 + hash: "99101a156a553f441f00221f6facbf1f" + } + Frame { + msec: 4368 + hash: "419023e5d59d16c26b35bee7d3cea559" + } + Frame { + msec: 4384 + hash: "485d23519293975b04031fe4baa5c276" + } + Frame { + msec: 4400 + hash: "c8bc60735e0ede26dbaf228294853f9a" + } + Frame { + msec: 4416 + hash: "ada3680b807d59843e3adf6640704066" + } + Frame { + msec: 4432 + hash: "3e28f3adf9241512cd0d6918d81ffffb" + } + Frame { + msec: 4448 + hash: "8f339acc33cbc89ae1c62391ce021bb3" + } + Frame { + msec: 4464 + hash: "d303960c0853a90557d64a04b8283c94" + } + Frame { + msec: 4480 + hash: "f907dbdacf2cfa9fdf8f9c8dead5b4c4" + } + Frame { + msec: 4496 + hash: "30c6e6f283f4a3f538cdda9c2e92de8c" + } + Frame { + msec: 4512 + hash: "04d2ac55774b43107a43a7d33764199b" + } + Frame { + msec: 4528 + hash: "cddf3e111cbc59e721725daa1d8a0c31" + } + Frame { + msec: 4544 + hash: "15b1b63cd1695207ebf9f04387be0739" + } + Frame { + msec: 4560 + hash: "690769b9bbe86a3c5b1fbdee39615fbd" + } + Frame { + msec: 4576 + hash: "2bd640d8ddbf878d808f22656fef1ed9" + } + Frame { + msec: 4592 + hash: "a654f1e4519bf883d554276ebbe96323" + } + Frame { + msec: 4608 + hash: "68f0313cfc3f51a0bb9b47c5407c19b6" + } + Frame { + msec: 4624 + hash: "77f29806b084de4cabf7ab9bf1a93d5e" + } + Frame { + msec: 4640 + hash: "f9991189e3282d107b98fb0ae5f5ef00" + } + Frame { + msec: 4656 + hash: "0cd1f2f6e347d48feea1b26a4968dec7" + } + Frame { + msec: 4672 + hash: "e75a6f6a088e2289042572a161ffb0e9" + } + Frame { + msec: 4688 + hash: "5a541081444c0a71128223a4c4c3144c" + } + Frame { + msec: 4704 + hash: "6813d442cc610f346a5441ed0cd723e5" + } + Frame { + msec: 4720 + hash: "24ec539bc57899819915f833f26deacd" + } + Frame { + msec: 4736 + hash: "3a7ed1b4b533b817674aa141c420cd61" + } + Frame { + msec: 4752 + hash: "d0a643fae97bb152e97ca60e96299003" + } + Frame { + msec: 4768 + hash: "c84093931520f4661eff6645091a294b" + } + Frame { + msec: 4784 + hash: "81e7ceaece82505a4a16ead195a66162" + } + Frame { + msec: 4800 + hash: "315764d20b647f6ab1ba30239a69bf72" + } + Frame { + msec: 4816 + image: "follow.5.png" + } + Frame { + msec: 4832 + hash: "d1824ced8af34ad9edb36a58ae9aa7f5" + } + Frame { + msec: 4848 + hash: "167b9a49fbb94908e09e7e9c9147cd8b" + } + Frame { + msec: 4864 + hash: "442d5f0906840de526d59a80ada322c0" + } + Frame { + msec: 4880 + hash: "78206c4d4d23c7c1ba888b9062b09432" + } + Frame { + msec: 4896 + hash: "e898202cfebbff1952efc6e01254d855" + } + Frame { + msec: 4912 + hash: "ab31dc7bbad2b0552359866bb8d92f0c" + } + Frame { + msec: 4928 + hash: "f093304e88964376baf9721d53d4fb49" + } + Frame { + msec: 4944 + hash: "3ef76f3e1c44d13c3a469bd192ff7b5d" + } + Frame { + msec: 4960 + hash: "5d3b6d0d91f8cc5b89e39407bc3b5a15" + } + Frame { + msec: 4976 + hash: "3c73573f12f49b34e1d990a55ad913fa" + } + Frame { + msec: 4992 + hash: "d1bac071b01a1c6fddab90cdc435fad4" + } + Frame { + msec: 5008 + hash: "36a219aadec910f1dbef616c641e1d2b" + } + Frame { + msec: 5024 + hash: "5871fc67d361cc988551592ee21dfb23" + } + Frame { + msec: 5040 + hash: "6e65ee6c814b9a9da205c36925e663bf" + } + Frame { + msec: 5056 + hash: "290b20fa8e91d34000d7c2d81745f6d2" + } + Frame { + msec: 5072 + hash: "19e7405a9083a8143f7bb040f8837b29" + } + Frame { + msec: 5088 + hash: "c0a0fa2b4c1ceb6c70594994a1ac8713" + } + Frame { + msec: 5104 + hash: "c236224c16743fb606deb78bcb8afc8d" + } + Frame { + msec: 5120 + hash: "7d44db15eb300b4338ffc26e9bcfce20" + } + Frame { + msec: 5136 + hash: "067a79148a194c45c6f32d85316a1e11" + } + Frame { + msec: 5152 + hash: "9075c379044476994a87f0fdcce8e332" + } + Frame { + msec: 5168 + hash: "b2316988fbd51096a4f512e71fe7d0a2" + } + Frame { + msec: 5184 + hash: "280f70877d93af5f84e178aad6a102d8" + } + Frame { + msec: 5200 + hash: "3eef4ae7e43a8cf1cd9dd562237296f8" + } + Frame { + msec: 5216 + hash: "e3184f77ce3a47ca4dca6386f42d7fec" + } + Frame { + msec: 5232 + hash: "a2a5df66fe4808ea8d466cac84ba910c" + } + Frame { + msec: 5248 + hash: "9f8a0e54788112d6c30482e840504f35" + } + Frame { + msec: 5264 + hash: "ae69cf84798844f9f360c86790feaecd" + } + Frame { + msec: 5280 + hash: "0244526572acb6266db5b7eb9d29c6fc" + } + Frame { + msec: 5296 + hash: "8fb53d60b95ddb5aef27442934ea9983" + } + Frame { + msec: 5312 + hash: "930fcfde491b4f5681e3861764003895" + } + Frame { + msec: 5328 + hash: "bcdcd0a637112d113ebe11dc18823237" + } + Frame { + msec: 5344 + hash: "65a564d5a5afbc14c0cdad4d52753507" + } + Frame { + msec: 5360 + hash: "0c5056d438d2d54938f31ef5f996673a" + } + Frame { + msec: 5376 + hash: "11c157ad2236fc390ffbdf339366cbc1" + } + Frame { + msec: 5392 + hash: "6cb341b1f281a97a35c2e41bfd4c4d9d" + } + Frame { + msec: 5408 + hash: "553a945f7f19f70ddae4ebe88e52a79b" + } + Frame { + msec: 5424 + hash: "d10b42b4095a2474e66a5a322f72e936" + } + Frame { + msec: 5440 + hash: "0f943d61e8072d70eddee8aa1ba0de5a" + } + Frame { + msec: 5456 + hash: "3df18e237b666e78d57857739b759e6d" + } + Frame { + msec: 5472 + hash: "1ddc0bfdb2ca7b6dee63f1024e62f26e" + } + Frame { + msec: 5488 + hash: "aaa397714528f41238059e3a88833abc" + } + Frame { + msec: 5504 + hash: "c94bd69f925c782656afc5f9618180a6" + } + Frame { + msec: 5520 + hash: "824ff8c0e1ab43e3c0eaa79b7cc19b9c" + } + Frame { + msec: 5536 + hash: "6c440a0b2293811335bdbf2c4f25f47d" + } + Frame { + msec: 5552 + hash: "bfc7936cdf833d5b720ec9baca740112" + } + Frame { + msec: 5568 + hash: "375fa305dbae2872dc9b20e59381cc0c" + } + Frame { + msec: 5584 + hash: "fffd6173aa49e74164dc17a238bcd830" + } + Frame { + msec: 5600 + hash: "44d9007e00fab161fd393b653255d7f4" + } + Frame { + msec: 5616 + hash: "f669ee25c58b4fa20a01705d334f0065" + } + Frame { + msec: 5632 + hash: "2dbb7d57711b67d5d9e1b81f70e22d34" + } + Frame { + msec: 5648 + hash: "19351b91448265cb95c1670ee283c611" + } + Frame { + msec: 5664 + hash: "19351b91448265cb95c1670ee283c611" + } + Frame { + msec: 5680 + hash: "3a24b99d048348a21f4e4bd69393de89" + } + Frame { + msec: 5696 + hash: "35a6fe955a52950bbfa954a453e4008e" + } + Frame { + msec: 5712 + hash: "896f4ec28c976237b34fb2725a44460e" + } + Frame { + msec: 5728 + hash: "ed3008ea950ec84c57518e573ea36d15" + } + Frame { + msec: 5744 + hash: "3447c7be992759f772c1db2033eead99" + } + Frame { + msec: 5760 + hash: "b7133225daa03563d3f5b1dac5f56a23" + } + Frame { + msec: 5776 + image: "follow.6.png" + } + Frame { + msec: 5792 + hash: "adc55f2fcf312a90b025a75fa80aa079" + } + Frame { + msec: 5808 + hash: "3ac85cad400d2b8e4f33798f4f6b7b42" + } + Frame { + msec: 5824 + hash: "1c115efd84ccbe489d24c3c521c4a61c" + } + Frame { + msec: 5840 + hash: "39518f1bbc0c4aba6ff517bc3dc7c279" + } + Frame { + msec: 5856 + hash: "7bd28d32996f4de61c415d3217da16d0" + } + Frame { + msec: 5872 + hash: "f5d06e25d775bf8db07e95625a712733" + } + Frame { + msec: 5888 + hash: "4820ea6ea3be88af2f86111c547a19d7" + } + Frame { + msec: 5904 + hash: "fa6e681c368118b7f135a47ae8fc12ff" + } + Frame { + msec: 5920 + hash: "f6b30e618aeeb837d2b3eca270b0a060" + } + Frame { + msec: 5936 + hash: "ac8504bde8d3063a8bf02b9d4b69d755" + } + Frame { + msec: 5952 + hash: "9670537bb77caa8e23fda7bbfa96ca60" + } + Frame { + msec: 5968 + hash: "8cd292865ce5c1d240e9ddc93881a0ed" + } + Frame { + msec: 5984 + hash: "de112013e526203d151c46e6cfba9f92" + } + Frame { + msec: 6000 + hash: "cd61066e697de8c055aaa168791c2d8c" + } + Frame { + msec: 6016 + hash: "cd61066e697de8c055aaa168791c2d8c" + } + Frame { + msec: 6032 + hash: "e68b27ff14aac03c827fd43ac488d23e" + } + Frame { + msec: 6048 + hash: "e68b27ff14aac03c827fd43ac488d23e" + } + Frame { + msec: 6064 + hash: "1f61d857a8c26587fbda5895c603441a" + } + Frame { + msec: 6080 + hash: "1e0dffdd02e05ade1ae444427d4aa345" + } + Frame { + msec: 6096 + hash: "9a416ee7a1de9ac45ab2d609233c9520" + } + Frame { + msec: 6112 + hash: "dfa35bf1cd908011c3214a506bcbdcb8" + } + Frame { + msec: 6128 + hash: "bd502dc72dce4af3036f7af9ed7cf9e9" + } + Frame { + msec: 6144 + hash: "c77280527612408daa3037aab45da59d" + } + Frame { + msec: 6160 + hash: "a38ed1532a40210ad7da4c0d4d1a7195" + } + Frame { + msec: 6176 + hash: "8ac8a8df937da526bbffb9a3590d89ac" + } + Frame { + msec: 6192 + hash: "07527cb9a4494e11f4c9f99eb72598b9" + } + Frame { + msec: 6208 + hash: "655b0327ef0f8711810714ba50f2f8cc" + } + Frame { + msec: 6224 + hash: "549fd25292012a2be1f78118998ca892" + } + Frame { + msec: 6240 + hash: "7a382ae4e6a48826eaa2c83ee7a73fb2" + } + Frame { + msec: 6256 + hash: "5acd5f250c5b32d9006ed68dfecbfa1c" + } + Frame { + msec: 6272 + hash: "3189e5a89d7b2ba1e6a06f6e3070e8c1" + } + Frame { + msec: 6288 + hash: "3189e5a89d7b2ba1e6a06f6e3070e8c1" + } + Frame { + msec: 6304 + hash: "07e5f1277558bfe7638b00cf9d967baf" + } + Frame { + msec: 6320 + hash: "07e5f1277558bfe7638b00cf9d967baf" + } + Frame { + msec: 6336 + hash: "07e5f1277558bfe7638b00cf9d967baf" + } + Frame { + msec: 6352 + hash: "07e5f1277558bfe7638b00cf9d967baf" + } + Frame { + msec: 6368 + hash: "07e5f1277558bfe7638b00cf9d967baf" + } + Frame { + msec: 6384 + hash: "877aca1c64e588845329ca8a38222604" + } + Frame { + msec: 6400 + hash: "877aca1c64e588845329ca8a38222604" + } + Frame { + msec: 6416 + hash: "877aca1c64e588845329ca8a38222604" + } + Frame { + msec: 6432 + hash: "877aca1c64e588845329ca8a38222604" + } + Frame { + msec: 6448 + hash: "877aca1c64e588845329ca8a38222604" + } + Frame { + msec: 6464 + hash: "b0f28e923f93dcdcea8460ca9d8cd674" + } + Frame { + msec: 6480 + hash: "b0f28e923f93dcdcea8460ca9d8cd674" + } + Frame { + msec: 6496 + hash: "b0f28e923f93dcdcea8460ca9d8cd674" + } + Frame { + msec: 6512 + hash: "b0f28e923f93dcdcea8460ca9d8cd674" + } + Frame { + msec: 6528 + hash: "b0f28e923f93dcdcea8460ca9d8cd674" + } + Frame { + msec: 6544 + hash: "b0f28e923f93dcdcea8460ca9d8cd674" + } + Frame { + msec: 6560 + hash: "b0f28e923f93dcdcea8460ca9d8cd674" + } + Frame { + msec: 6576 + hash: "b0f28e923f93dcdcea8460ca9d8cd674" + } + Frame { + msec: 6592 + hash: "b0f28e923f93dcdcea8460ca9d8cd674" + } + Frame { + msec: 6608 + hash: "b0f28e923f93dcdcea8460ca9d8cd674" + } + Frame { + msec: 6624 + hash: "b0f28e923f93dcdcea8460ca9d8cd674" + } + Frame { + msec: 6640 + hash: "b0f28e923f93dcdcea8460ca9d8cd674" + } + Frame { + msec: 6656 + hash: "b0f28e923f93dcdcea8460ca9d8cd674" + } + Frame { + msec: 6672 + hash: "b0f28e923f93dcdcea8460ca9d8cd674" + } + Frame { + msec: 6688 + hash: "b0f28e923f93dcdcea8460ca9d8cd674" + } + Frame { + msec: 6704 + hash: "228920e994ebf71d542c71ce8263614e" + } + Frame { + msec: 6720 + hash: "228920e994ebf71d542c71ce8263614e" + } + Frame { + msec: 6736 + image: "follow.7.png" + } + Frame { + msec: 6752 + hash: "228920e994ebf71d542c71ce8263614e" + } + Frame { + msec: 6768 + hash: "228920e994ebf71d542c71ce8263614e" + } + Frame { + msec: 6784 + hash: "228920e994ebf71d542c71ce8263614e" + } + Frame { + msec: 6800 + hash: "228920e994ebf71d542c71ce8263614e" + } + Frame { + msec: 6816 + hash: "228920e994ebf71d542c71ce8263614e" + } + Frame { + msec: 6832 + hash: "07e5f1277558bfe7638b00cf9d967baf" + } + Key { + type: 6 + key: 16777249 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 6848 + hash: "3189e5a89d7b2ba1e6a06f6e3070e8c1" + } + Frame { + msec: 6864 + hash: "3189e5a89d7b2ba1e6a06f6e3070e8c1" + } + Frame { + msec: 6880 + hash: "3189e5a89d7b2ba1e6a06f6e3070e8c1" + } + Frame { + msec: 6896 + hash: "3189e5a89d7b2ba1e6a06f6e3070e8c1" + } + Frame { + msec: 6912 + hash: "3189e5a89d7b2ba1e6a06f6e3070e8c1" + } + Frame { + msec: 6928 + hash: "3189e5a89d7b2ba1e6a06f6e3070e8c1" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.0.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.0.png new file mode 100644 index 00000000..6525dbb8 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.1.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.1.png new file mode 100644 index 00000000..5b8d209f Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.2.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.2.png new file mode 100644 index 00000000..cf012baf Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.3.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.3.png new file mode 100644 index 00000000..57e77a41 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.4.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.4.png new file mode 100644 index 00000000..24d26bde Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.5.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.5.png new file mode 100644 index 00000000..a5407348 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.5.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.6.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.6.png new file mode 100644 index 00000000..17da6436 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.6.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.7.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.7.png new file mode 100644 index 00000000..e03cfe4b Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.7.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.qml b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.qml new file mode 100644 index 00000000..98cd12c2 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data-X11/follow.qml @@ -0,0 +1,1763 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "follow.0.png" + } + Frame { + msec: 32 + hash: "2ddcb50f5d285eb80a8136f0cf4cf85a" + } + Frame { + msec: 48 + hash: "519d93a844e05f8215139d91c9aef58b" + } + Frame { + msec: 64 + hash: "9f075a5547e4dc67cbe2ace2766395bb" + } + Frame { + msec: 80 + hash: "8fc48f74a51d45b4ea1fb7bd1d48002f" + } + Frame { + msec: 96 + hash: "a28fc4be5a5bb9ff36f796d9b071f02c" + } + Frame { + msec: 112 + hash: "ebc14c2905f3596ec451dd96409e6001" + } + Frame { + msec: 128 + hash: "4f270bdcff44006a56055edb1cda522a" + } + Frame { + msec: 144 + hash: "571f347e764bf38985768c85c2a13ba1" + } + Frame { + msec: 160 + hash: "b1aa23268167b7e2a1190288926f52c0" + } + Frame { + msec: 176 + hash: "06d548aef9a678edbf3ab4d3ce62a647" + } + Frame { + msec: 192 + hash: "daf6af0ae78f39566913c656450a66e5" + } + Frame { + msec: 208 + hash: "f101cd0c026ee0ed6ccef7a4aed302a0" + } + Frame { + msec: 224 + hash: "b3caa673f072c53d31d71109c9b33357" + } + Frame { + msec: 240 + hash: "8596f1d305d6b8f97b9feda9e69bdefe" + } + Frame { + msec: 256 + hash: "23c23df2c130aafb2092fe47a958a4cd" + } + Frame { + msec: 272 + hash: "66a4f2d8213264437a5f4d6cf10cd442" + } + Frame { + msec: 288 + hash: "6392490111813bad0a9467cc0c1746ed" + } + Frame { + msec: 304 + hash: "c115a47e0ecab63b881e2ec492d24e68" + } + Frame { + msec: 320 + hash: "c2a2b57e6f9ea2975c0846124d2dbc66" + } + Frame { + msec: 336 + hash: "8286c315dfda4241607b2de1154f869d" + } + Frame { + msec: 352 + hash: "3f0f7cae80357176892ff7628ec3153a" + } + Frame { + msec: 368 + hash: "d13bde4a5b5ed8202f92ae33913166c9" + } + Frame { + msec: 384 + hash: "b70cc32134b1b0d31a5e7f145af09495" + } + Frame { + msec: 400 + hash: "03ebc2ff317ac840f4508e8701d66955" + } + Frame { + msec: 416 + hash: "8dff08e72365e8e2fee8088c386dedca" + } + Frame { + msec: 432 + hash: "720f3bbaf3fa3e3a064747d5689e47a0" + } + Frame { + msec: 448 + hash: "350e3ebfcfef96969ef5b8d5944f7e62" + } + Frame { + msec: 464 + hash: "1e4e6e68b3a8eac0c5cd039164eec166" + } + Frame { + msec: 480 + hash: "62a10c4250ad025139a3f9e72109e8e1" + } + Frame { + msec: 496 + hash: "23cfd643adfc98f6a06c7e7b15dac954" + } + Frame { + msec: 512 + hash: "3a78930d5b86b886723fad85e77dd075" + } + Frame { + msec: 528 + hash: "64dc878e2f527e80403c766e61fe14a6" + } + Frame { + msec: 544 + hash: "d79160989d2584044042271e79a88e69" + } + Frame { + msec: 560 + hash: "22cbaea4affc88433834c7d0dc1f1644" + } + Frame { + msec: 576 + hash: "77cb616902257e1f239a0e6bfaabb33c" + } + Frame { + msec: 592 + hash: "a2fe73dced03b23c4acb9aae9b774b41" + } + Frame { + msec: 608 + hash: "230e21d3a9ed0e185593677233af1275" + } + Frame { + msec: 624 + hash: "4e10ecffac4e06d624855d3f8917f76c" + } + Frame { + msec: 640 + hash: "84f49d56baace4a02e50d3eafaea04ec" + } + Frame { + msec: 656 + hash: "e3cd0b334551a9f91723eb2c876d335a" + } + Frame { + msec: 672 + hash: "259330f3ec390c9926d9c2ddc2d77319" + } + Frame { + msec: 688 + hash: "cc659623bfa385d282d608684d7cdc2b" + } + Frame { + msec: 704 + hash: "47ed75d077143a6bfa0e10158550c542" + } + Frame { + msec: 720 + hash: "0de93bbd9f9ee63e97968089321003e1" + } + Frame { + msec: 736 + hash: "b33d867d4399879256a01344ce0b81f2" + } + Frame { + msec: 752 + hash: "97c31fce937d11f62bebc6169b464a42" + } + Frame { + msec: 768 + hash: "ea4166b8a4001bca3f27af30f251267f" + } + Frame { + msec: 784 + hash: "b56d270b7893565f8d7ed2a0bfe10d60" + } + Frame { + msec: 800 + hash: "88a42559fe22b45cff379258dd40ced9" + } + Frame { + msec: 816 + hash: "4ee1a711cb8d26087e1b75a3166ca5f0" + } + Frame { + msec: 832 + hash: "9b88a00d041092e79b4a08bccbaca0e1" + } + Frame { + msec: 848 + hash: "afea397b3d740dc42f0313624fc10efd" + } + Frame { + msec: 864 + hash: "39fd8e4cefbd9fed283d62a7aecded22" + } + Frame { + msec: 880 + hash: "916b783d2379ac054c749e7b6eae7ddf" + } + Frame { + msec: 896 + hash: "fccd44740ff7ffb0f2adccf00a7588bd" + } + Frame { + msec: 912 + hash: "c064f20703a13543e8273d251fd645fe" + } + Frame { + msec: 928 + hash: "1b9b0755101841e3d1cbe208d81575d5" + } + Frame { + msec: 944 + hash: "1eb5e4a301b565012bc8f6af8e879eb9" + } + Frame { + msec: 960 + hash: "032db65eb5c405e433f88df3975c322b" + } + Frame { + msec: 976 + image: "follow.1.png" + } + Frame { + msec: 992 + hash: "fdb67e11d7cc767b2389a8bbef752c7e" + } + Frame { + msec: 1008 + hash: "ed89cb161336c61b13e3514fdf816023" + } + Frame { + msec: 1024 + hash: "331b873c5367e0aaa62af85cb54a6a96" + } + Frame { + msec: 1040 + hash: "cde4503f02f0c3732e310a7d0418cd1e" + } + Frame { + msec: 1056 + hash: "f8c028c591fc1495d5bec8763da6f011" + } + Frame { + msec: 1072 + hash: "9dc68483218335afe41aa3cd052a98b5" + } + Frame { + msec: 1088 + hash: "31105c455418a3284700cf9c88571507" + } + Frame { + msec: 1104 + hash: "72724947167a1ac600aaa1d7f331f7ec" + } + Frame { + msec: 1120 + hash: "a4a1243326de6b9e93948fcb22fecac4" + } + Frame { + msec: 1136 + hash: "c3e26e62f12dd658f21a0330fefb0533" + } + Frame { + msec: 1152 + hash: "15d85b4a9ad761a911bbaa3e0c4b2b61" + } + Frame { + msec: 1168 + hash: "bce1400b437cc43b8ff57b1a5fbc9551" + } + Frame { + msec: 1184 + hash: "5d05848afcd8f697c1b3762f00a759f6" + } + Frame { + msec: 1200 + hash: "6c83f68ea72cd54793149f4c9e759d44" + } + Frame { + msec: 1216 + hash: "5206b93666e51cee3e25a7a85e27b5b8" + } + Frame { + msec: 1232 + hash: "a3ef5c76efece4455e5ad12bcc8bd8f5" + } + Frame { + msec: 1248 + hash: "c36c6ee7b6c8074f5dc1af7446fad1ad" + } + Frame { + msec: 1264 + hash: "bb0887f1f10548bb53f0dc1ffeec25ee" + } + Frame { + msec: 1280 + hash: "ebffe547a7c3528e5deddc590510506d" + } + Frame { + msec: 1296 + hash: "18962faef1a1a1207a3c6783116154a2" + } + Frame { + msec: 1312 + hash: "8aaa876e4a6c4de04e557f35ddd4fb61" + } + Frame { + msec: 1328 + hash: "c66123bb4e01ce267629f5b50d147db1" + } + Frame { + msec: 1344 + hash: "334e5acf84d90e70ca3085b9d5e057a7" + } + Frame { + msec: 1360 + hash: "9bb49ddcc775307c3c1159908323e010" + } + Frame { + msec: 1376 + hash: "1b3cfb8b6b6c39a34ea86a66ea1cc6b1" + } + Frame { + msec: 1392 + hash: "d2a68c6eb2b05390ab1049137f96f227" + } + Frame { + msec: 1408 + hash: "91e254fd2376ba35a283b18b947ca1a8" + } + Frame { + msec: 1424 + hash: "fe94e2e8b4978390e9e8cbfe77dfc241" + } + Frame { + msec: 1440 + hash: "e3d32b73c5c50e7aa59f4e4725de170e" + } + Frame { + msec: 1456 + hash: "a73b90254d7da5557cc3941db0017a65" + } + Frame { + msec: 1472 + hash: "9aa49cce5d63f8dd6409995ac6d91d63" + } + Frame { + msec: 1488 + hash: "0ba674df46accec28a3c1b81e656adc7" + } + Frame { + msec: 1504 + hash: "025a45417b8c75d47b5dac6c5ef913e9" + } + Frame { + msec: 1520 + hash: "742527b97c7f580b0b7ff9d6aa105d31" + } + Frame { + msec: 1536 + hash: "965ec8315d45894e704fcc5a3efc8c55" + } + Frame { + msec: 1552 + hash: "6abdd59e6bd2c31124eab254418a5322" + } + Frame { + msec: 1568 + hash: "9f6d06b176c55fa292e7f0ef4b5cd1cb" + } + Frame { + msec: 1584 + hash: "05eba8c6e02c0d4af49e59b3346c9e68" + } + Frame { + msec: 1600 + hash: "3c4215f6253aba836516cd51368bc471" + } + Frame { + msec: 1616 + hash: "c6339a290007c0106cb18ecef5b7392b" + } + Frame { + msec: 1632 + hash: "39a4bcd2ce84035f9db70f196ca00971" + } + Frame { + msec: 1648 + hash: "b75a4be472583c3b893fc894ebe7d4d8" + } + Frame { + msec: 1664 + hash: "d1efebbe748c43b3c1241753612e100d" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 195; y: 95 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1680 + hash: "f6f3ad64fb71ffb68a5ea0375cc94bae" + } + Frame { + msec: 1696 + hash: "778ecbafb5d235edde1683cabe3c3cfe" + } + Frame { + msec: 1712 + hash: "5a41b9196fe4a97e6ba2400806299bd8" + } + Frame { + msec: 1728 + hash: "1c8ddbc5910e35be389a1cb34fab9dec" + } + Frame { + msec: 1744 + hash: "5e8b236c00087a067d366afde67184f3" + } + Frame { + msec: 1760 + hash: "b7308837c5d7950dc81abec1340b4582" + } + Frame { + msec: 1776 + hash: "bbe9f0b030efa716f34a05f0af929c66" + } + Frame { + msec: 1792 + hash: "cd393fc19a30d896bfe62aa0000308f8" + } + Frame { + msec: 1808 + hash: "c390f5b1bcff54de203490d8f2616fcd" + } + Frame { + msec: 1824 + hash: "b5da2ea467c334dd13c75b811b94efb1" + } + Frame { + msec: 1840 + hash: "49887c9312c3a4dfc2d9719f47c83a15" + } + Frame { + msec: 1856 + hash: "7f077703e49f154d01c12a44f53469c5" + } + Frame { + msec: 1872 + hash: "7be4130ed767f0e0bf41c3bebf050cac" + } + Frame { + msec: 1888 + hash: "cc1590486c172000557b76c6eadb51e0" + } + Frame { + msec: 1904 + hash: "7ccd05236d9c1f8af0e9645404326122" + } + Frame { + msec: 1920 + hash: "2da165bf7e868b53b85bb630649ddc3e" + } + Frame { + msec: 1936 + image: "follow.2.png" + } + Frame { + msec: 1952 + hash: "2b6a24b6ceeaa956527c872af70fb5f9" + } + Frame { + msec: 1968 + hash: "8c882de21f4ed0fb68433c19b114c3f8" + } + Frame { + msec: 1984 + hash: "f75226c58726a687079d0d24e865ee6f" + } + Frame { + msec: 2000 + hash: "2fa9b69fe85b4e1361ba260545c10e06" + } + Frame { + msec: 2016 + hash: "6d513bc03f2798fbce1a0790969da6b5" + } + Frame { + msec: 2032 + hash: "7e359e605483493e9a865f6eb912c394" + } + Frame { + msec: 2048 + hash: "497c7c82c24408dcaff5ec981d3d4f35" + } + Frame { + msec: 2064 + hash: "8738b024cf75ef970ffe20166e85141c" + } + Frame { + msec: 2080 + hash: "014b805eb1ecf2ea1cd61727bfd1ca08" + } + Frame { + msec: 2096 + hash: "a81cde60979300f397054ea017382114" + } + Frame { + msec: 2112 + hash: "c46183b5224e762335eea98d9da65465" + } + Frame { + msec: 2128 + hash: "11afbb88994f298a1fed6575fae3d7fd" + } + Frame { + msec: 2144 + hash: "0195fa503143561d9ae3ffe68739ca3f" + } + Frame { + msec: 2160 + hash: "6d298df37d2116eb9a62b58853cb3344" + } + Frame { + msec: 2176 + hash: "1660865f00ea9adf94c8e56c7a8a73b2" + } + Frame { + msec: 2192 + hash: "9835b5527b84e8e8a8fea2bdf9653a99" + } + Frame { + msec: 2208 + hash: "ec1158b83daa9e98437abc9ce90b70f0" + } + Frame { + msec: 2224 + hash: "11ce5e37747e05ff5f5071b13324ce9e" + } + Frame { + msec: 2240 + hash: "6d7d427d5a15a31fd395f26c94ea455e" + } + Frame { + msec: 2256 + hash: "828949e0fbdb7c79719fb533febb5b35" + } + Frame { + msec: 2272 + hash: "7ef7f73ef6a59c9210cfa37df3894cb1" + } + Frame { + msec: 2288 + hash: "e74bec397b32ba2934ffdde23a3d60c6" + } + Frame { + msec: 2304 + hash: "09c2ca9c22e9b77bc166b4567b29bca7" + } + Frame { + msec: 2320 + hash: "44d87983f33c4e03f4be70b406bb9bd9" + } + Frame { + msec: 2336 + hash: "92844b36c2f30e618f04bfbc5cfbcad6" + } + Frame { + msec: 2352 + hash: "0245f39a8966c4addb3f8dbcee93cd3f" + } + Frame { + msec: 2368 + hash: "eb1e81cfa29295d4b1522c69d4501f51" + } + Frame { + msec: 2384 + hash: "2af9c3bea11b25c0f6c2b780d533a968" + } + Frame { + msec: 2400 + hash: "5062e9ab29c4a7a9657a4d29249ca822" + } + Frame { + msec: 2416 + hash: "d7652ddc85d3be3bb3a2fc268ae9bc29" + } + Frame { + msec: 2432 + hash: "7c924bf2ad6167db439723679b373a3a" + } + Frame { + msec: 2448 + hash: "a93b61dd26a2ca72100b747ac3ed81b6" + } + Frame { + msec: 2464 + hash: "5fedc849d3d21e0acf0ab4a4815a1285" + } + Frame { + msec: 2480 + hash: "4313d2458f4bede8d3b02ac60135e728" + } + Frame { + msec: 2496 + hash: "0f09e81d89262b569c56a9c876f3898d" + } + Frame { + msec: 2512 + hash: "ea932789ded14fc5c8bae565b67d004c" + } + Frame { + msec: 2528 + hash: "fd1f7b9b51f1284fee4d777ef83bba3f" + } + Frame { + msec: 2544 + hash: "e98b884a1ec8ce4b4dc20749b85b571e" + } + Frame { + msec: 2560 + hash: "d144072bb87bb88750b9df9cd92f7a4b" + } + Frame { + msec: 2576 + hash: "9d8ad80d3367292d7e89d67cf49862b8" + } + Frame { + msec: 2592 + hash: "c09b89e71e862da15d2b9edb0e00aa7b" + } + Frame { + msec: 2608 + hash: "551277add3f8f09951d9c8f55ccd40f7" + } + Frame { + msec: 2624 + hash: "1d0be0e7108516869374a9b985fd7543" + } + Frame { + msec: 2640 + hash: "12e7cfb6c4a26af54c4b35182294a7b7" + } + Frame { + msec: 2656 + hash: "a666a5a59d5854973668798eb8d508ba" + } + Frame { + msec: 2672 + hash: "420d2e21461dc45f134b7dfa11d04d25" + } + Frame { + msec: 2688 + hash: "95f848874899fb58a81c62b5921cf857" + } + Frame { + msec: 2704 + hash: "fa3ea7a0f90ca549cc9a857f0647b061" + } + Frame { + msec: 2720 + hash: "cbc5338de6157cd5dad511b246f5093b" + } + Frame { + msec: 2736 + hash: "e26b43c83197abab3746830bbfacc0f4" + } + Frame { + msec: 2752 + hash: "5225e854ff2763e562dee2810331d560" + } + Frame { + msec: 2768 + hash: "a1d114ea67233ac4c6351e18e3afa64e" + } + Frame { + msec: 2784 + hash: "bc9f12af2d0816bb84fd5040ed29bdad" + } + Frame { + msec: 2800 + hash: "d9337da38caa4ad3385249602a830df3" + } + Frame { + msec: 2816 + hash: "6ce20e0c89181b0f11e609b248da71d7" + } + Frame { + msec: 2832 + hash: "bbc8337950a78c7bfa48aab2635120a8" + } + Frame { + msec: 2848 + hash: "0e28ade7f52f3c27e1dbdd6e98be8c7d" + } + Frame { + msec: 2864 + hash: "0e28ade7f52f3c27e1dbdd6e98be8c7d" + } + Frame { + msec: 2880 + hash: "b496af17513d60d4028bd7402fbfba93" + } + Frame { + msec: 2896 + image: "follow.3.png" + } + Frame { + msec: 2912 + hash: "29aa7ce0fb1aa350753d3ec6da05bdf9" + } + Frame { + msec: 2928 + hash: "fde474797d8105d9d004a7020e010fa4" + } + Frame { + msec: 2944 + hash: "5a553d9a4bd2ef5d86f5eb37a863d28f" + } + Frame { + msec: 2960 + hash: "2dcbf6c84abd49529f0b5d85bfb74808" + } + Frame { + msec: 2976 + hash: "e96ec3b7d37bbf4c9ca297ad5afde31c" + } + Frame { + msec: 2992 + hash: "9d824068affe32c143226b0b530206fc" + } + Frame { + msec: 3008 + hash: "3e85f0ace68cffed47f4c9b00145f0f0" + } + Frame { + msec: 3024 + hash: "540b8e1e2bee7d2ba5e29fd3b1086cd1" + } + Frame { + msec: 3040 + hash: "0786585d11934c5e4a7e965eaac9a152" + } + Frame { + msec: 3056 + hash: "8271705df2ca697f4343007a7810d4ac" + } + Frame { + msec: 3072 + hash: "b98e1cd20ab2e4239f35d04df5e5175a" + } + Frame { + msec: 3088 + hash: "ab1a7eaa5c5d919ee76cba405d0dd4cd" + } + Frame { + msec: 3104 + hash: "52682386448379a395dc6c541224b7d4" + } + Frame { + msec: 3120 + hash: "31dffcb9da94dfc085ab8c561404c248" + } + Frame { + msec: 3136 + hash: "f3703eed8ebf9ece776ebe51e4c60ae6" + } + Frame { + msec: 3152 + hash: "1126b90345bb42691cd17f37ecec6bdb" + } + Frame { + msec: 3168 + hash: "7a63ab96d1c8d4992c03a6f59bba4e7e" + } + Frame { + msec: 3184 + hash: "91f4a00c9a7ea6164b334aa4b90da862" + } + Frame { + msec: 3200 + hash: "485471140f6a5336837377612e7a85bf" + } + Frame { + msec: 3216 + hash: "96881b4021aff05020e0a9342fbae75d" + } + Frame { + msec: 3232 + hash: "9891326646c3da4ff250aab69c862f96" + } + Frame { + msec: 3248 + hash: "f00f36bbb5a828824c596ee6f85bec2f" + } + Frame { + msec: 3264 + hash: "f00f36bbb5a828824c596ee6f85bec2f" + } + Frame { + msec: 3280 + hash: "f00f36bbb5a828824c596ee6f85bec2f" + } + Frame { + msec: 3296 + hash: "f00f36bbb5a828824c596ee6f85bec2f" + } + Frame { + msec: 3312 + hash: "9891326646c3da4ff250aab69c862f96" + } + Frame { + msec: 3328 + hash: "c766238db55f4704c2f29a6be6ee6907" + } + Frame { + msec: 3344 + hash: "0254665427dcbd1c155bc954cc7aa7cd" + } + Frame { + msec: 3360 + hash: "33ae1012816b997ef5c61c03ccfcc590" + } + Frame { + msec: 3376 + hash: "4c7857bbbcb9aa812fc2503af2b395cf" + } + Frame { + msec: 3392 + hash: "3a570e4af992d35e55923cea23c3c11b" + } + Frame { + msec: 3408 + hash: "533ef554538005512ce37c73c6def722" + } + Frame { + msec: 3424 + hash: "f863fa215d0642708bfa82780c766dc4" + } + Frame { + msec: 3440 + hash: "fcca3ec34521c4b9087a102ba1e47293" + } + Frame { + msec: 3456 + hash: "47d67cd74cb96b12801842b288a8b9ff" + } + Frame { + msec: 3472 + hash: "34c5ea76f297ec68cba70521caa468e4" + } + Frame { + msec: 3488 + hash: "7be247cc7a4032ff0478fca1a2aace8a" + } + Frame { + msec: 3504 + hash: "3ade2a1a48edef15f522b9fc016e137e" + } + Frame { + msec: 3520 + hash: "8b37b9d123504931d82bb06f6981bade" + } + Frame { + msec: 3536 + hash: "5eb39825003f405f353f629e236b3395" + } + Frame { + msec: 3552 + hash: "c4550722260c4a30ab1176c7e5cb62bf" + } + Frame { + msec: 3568 + hash: "bd33e3ecd4b59cd659588c0298b61095" + } + Frame { + msec: 3584 + hash: "4b3a62bff0019df7412aa2e1c07c0a23" + } + Frame { + msec: 3600 + hash: "a9b98adcc3350febbb89dbf725b81436" + } + Frame { + msec: 3616 + hash: "66eb8c84e75141d1575caf7d3cbc1ceb" + } + Frame { + msec: 3632 + hash: "238f2b1dc5bf5b65e827c860f9ee76b5" + } + Frame { + msec: 3648 + hash: "6d1fed0697370b2a2163c369fe559739" + } + Frame { + msec: 3664 + hash: "04ea478c785586d900bbe3472371bbc7" + } + Frame { + msec: 3680 + hash: "ba429e711c9363eebfb20e641fa44c84" + } + Frame { + msec: 3696 + hash: "0129dfba166ffcbaa15087467c864068" + } + Frame { + msec: 3712 + hash: "3fb340c874eee94e8baa1453b37c3fb5" + } + Frame { + msec: 3728 + hash: "068c51d99c458f3edefe3371f46de260" + } + Frame { + msec: 3744 + hash: "dd1e04ed3d610c2712158d73ee2c5b9d" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 195; y: 95 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3760 + hash: "840154afb9e7e0c859c66667bb6944b6" + } + Frame { + msec: 3776 + hash: "239c2e33800e386b468a95341d0e23f4" + } + Frame { + msec: 3792 + hash: "0a00515f2d297362862c1a5cf6519845" + } + Frame { + msec: 3808 + hash: "f855df3495e44291aed8f085163c804b" + } + Frame { + msec: 3824 + hash: "b4eb31e48c65550bb78d175b48e0e9fb" + } + Frame { + msec: 3840 + hash: "70243664f9db83614e5972fc18ee81a1" + } + Frame { + msec: 3856 + image: "follow.4.png" + } + Frame { + msec: 3872 + hash: "c48ce2a4cf28ab706b9c097bddc74c27" + } + Frame { + msec: 3888 + hash: "754a957e0df02839dd2fe33fefb7a721" + } + Frame { + msec: 3904 + hash: "ec3ebe7b941af9bf2163634d7f15e8aa" + } + Frame { + msec: 3920 + hash: "a76423ff2184cd9dac47abf7ae52ce5a" + } + Frame { + msec: 3936 + hash: "559bec54f51c36c6e90004ca5e77c23c" + } + Frame { + msec: 3952 + hash: "dc6fdd6a867a675afcb58f7052605614" + } + Frame { + msec: 3968 + hash: "b2fb0dbbec01490243f37fe5f80ab6c7" + } + Frame { + msec: 3984 + hash: "2bc1df7a913b1948ee7bb77eeaa55aa2" + } + Frame { + msec: 4000 + hash: "82c6430d85c6a94c4b55a9529d2bc78f" + } + Frame { + msec: 4016 + hash: "463e70dc9a9bdabdc158199bdcd7d2fa" + } + Frame { + msec: 4032 + hash: "c1e9553327f060b70caa713bf3015342" + } + Frame { + msec: 4048 + hash: "42f7f505d4e5ef316240e4f287a039bf" + } + Frame { + msec: 4064 + hash: "200500f600ffe43c5ad4d057bcfc0831" + } + Frame { + msec: 4080 + hash: "22e78edb813f7830776b2603b0aaae5c" + } + Frame { + msec: 4096 + hash: "32ebf3490832fd0693b1b922b4501251" + } + Frame { + msec: 4112 + hash: "1be622caa5ef94f87e2ec8297b6e1caa" + } + Frame { + msec: 4128 + hash: "d1480529e0cb94c51c412109663e5fab" + } + Frame { + msec: 4144 + hash: "e55e627d6d13b647f35233f18f0cbe89" + } + Frame { + msec: 4160 + hash: "87d7b349cd2898de7686e5f1a14f6338" + } + Frame { + msec: 4176 + hash: "2ac974836ee5e6092b55fcda20d7c35d" + } + Frame { + msec: 4192 + hash: "53867256c1dac4de2f02af1ae000b49f" + } + Frame { + msec: 4208 + hash: "08623509e9e5089fdaa1af2bf9a77eb1" + } + Frame { + msec: 4224 + hash: "e4692f42c12593ee865048aef00cbeb2" + } + Frame { + msec: 4240 + hash: "981ad6459e3e7483bb323ab4bc514630" + } + Frame { + msec: 4256 + hash: "79e8adfcdc9d6dae0d2b6a69e8e322fa" + } + Frame { + msec: 4272 + hash: "58f967a607972faa9daa13402eeb9912" + } + Frame { + msec: 4288 + hash: "1fd5b002b049132565b6a963fb7b3bb6" + } + Frame { + msec: 4304 + hash: "a16c96598f47404ec5f4ef55e87a1e70" + } + Frame { + msec: 4320 + hash: "3c632899804812c93c7edd3e3f3d2bac" + } + Frame { + msec: 4336 + hash: "af0eb810e0273f9bacb082d9f90612df" + } + Frame { + msec: 4352 + hash: "728d7ac4a5410482c7d86d03c2d8a996" + } + Frame { + msec: 4368 + hash: "416e76064f2be71a03eddddf61a33cb0" + } + Frame { + msec: 4384 + hash: "c41f20b4ac9a7b34eefd066f77ea351a" + } + Frame { + msec: 4400 + hash: "821d51db415a210b09ebdf8d861aadf2" + } + Frame { + msec: 4416 + hash: "9394266815a52f1779858bb088d557dc" + } + Frame { + msec: 4432 + hash: "cc475d1589665414e5aef051ec237ef4" + } + Frame { + msec: 4448 + hash: "a95f3b8128faa7820f36391fa9bd579f" + } + Frame { + msec: 4464 + hash: "d52687293a11891c364de52525039203" + } + Frame { + msec: 4480 + hash: "5333dc4f65b2f1e066edcd23f7621bd7" + } + Frame { + msec: 4496 + hash: "797bb5e27b2fe2b733a54402433901b4" + } + Frame { + msec: 4512 + hash: "84c610cdff7f8b04a34977216e37847d" + } + Frame { + msec: 4528 + hash: "0317f0406a566b2851c8bda62900e40c" + } + Frame { + msec: 4544 + hash: "6538ecd7abd35234c5cc5c2a17249fc1" + } + Frame { + msec: 4560 + hash: "f9019150a132eb5f5cfafcd5337aff7a" + } + Frame { + msec: 4576 + hash: "0f0136fffbc65c02cee249ece4c8c0ef" + } + Frame { + msec: 4592 + hash: "0027e0d236b8b33a451a0cc35e81b4ce" + } + Frame { + msec: 4608 + hash: "ac2f86b2d4f29f223fb78440d67ccd31" + } + Frame { + msec: 4624 + hash: "a6eb112a10c849e337f816ee408f22a6" + } + Frame { + msec: 4640 + hash: "dafbb01f2615a2513310478ebe484a05" + } + Frame { + msec: 4656 + hash: "17c400c4c29652dc278980ab578b75b3" + } + Frame { + msec: 4672 + hash: "48696c02a2a4839b893a4c0b431b78a3" + } + Frame { + msec: 4688 + hash: "04e05c7e722e53299d24cd0f1b7d17ee" + } + Frame { + msec: 4704 + hash: "55d158f13ffc7ccde5ee368656d2830b" + } + Frame { + msec: 4720 + hash: "fa478e1575acedae023322a520171a5b" + } + Frame { + msec: 4736 + hash: "e2147ddd6e19fde80bb76da24011400c" + } + Frame { + msec: 4752 + hash: "44ee0144db4c55aa90d2a931d83a895e" + } + Frame { + msec: 4768 + hash: "552e87bbce4ad48006c899052a2c8cad" + } + Frame { + msec: 4784 + hash: "3b6efe225303566f751c3f884ac8c069" + } + Frame { + msec: 4800 + hash: "3a7175916d1dc103506061607b910550" + } + Frame { + msec: 4816 + image: "follow.5.png" + } + Frame { + msec: 4832 + hash: "b2e5d5c14b02a13bca62673f87e85627" + } + Frame { + msec: 4848 + hash: "bd89a911d6fb13e4e841f8ee5b8b42af" + } + Frame { + msec: 4864 + hash: "89795784185e83d0299e656f2eec73c8" + } + Frame { + msec: 4880 + hash: "5b6d6fe78f341bdf0eb4bedfe3d975d0" + } + Frame { + msec: 4896 + hash: "e246bc451ee48e16ef6dee20d6256e9c" + } + Frame { + msec: 4912 + hash: "8c1bc37b1b268743aa314247ea949ef5" + } + Frame { + msec: 4928 + hash: "04f34203c34dc87efc708bfb232663df" + } + Frame { + msec: 4944 + hash: "d37a48545e81970d16951e3388f0ff8c" + } + Frame { + msec: 4960 + hash: "9411e846c9f59cc915288efb59d4c9de" + } + Frame { + msec: 4976 + hash: "6ee179741ac74837708afb55943f15bd" + } + Frame { + msec: 4992 + hash: "f626fc3166bd5b01171271ae9bfa9b22" + } + Frame { + msec: 5008 + hash: "e22898b2c0c566bbf531223234f98327" + } + Frame { + msec: 5024 + hash: "1343d90c5eae70713cd49110fe61237b" + } + Frame { + msec: 5040 + hash: "493d9322da6d01979a3f1a120c265f8c" + } + Frame { + msec: 5056 + hash: "defccc76caf3a7c7c67e8abf5ccc2def" + } + Frame { + msec: 5072 + hash: "fe3cad9227fcfa7ba2238465078f2ac7" + } + Frame { + msec: 5088 + hash: "66ebfeee3a63323c7d8b949db9aafd7e" + } + Frame { + msec: 5104 + hash: "805820b382d005894f9a615004b97b0d" + } + Frame { + msec: 5120 + hash: "eee1620f47bb071de8a9c788d1fd258e" + } + Frame { + msec: 5136 + hash: "f5a7d9a81fcfc8cfb9e7cc8ead0f1ff8" + } + Frame { + msec: 5152 + hash: "249903ee123090b27019350f120c8b79" + } + Frame { + msec: 5168 + hash: "019793a363c905809af32bf34ef52ec0" + } + Frame { + msec: 5184 + hash: "4f5ad5a3ebb6eca73dd7567199d07b08" + } + Frame { + msec: 5200 + hash: "fdc1b42d50c7a5c45458498788ff0abd" + } + Frame { + msec: 5216 + hash: "cc091469598cad28d0a00690f1acb412" + } + Frame { + msec: 5232 + hash: "5c8757e1f8f34a31d8b3717b64b84c07" + } + Frame { + msec: 5248 + hash: "5da75559f60eac1b9f518ed55a174e5b" + } + Frame { + msec: 5264 + hash: "1214c08daec4dcfb27690fdc18f2ac28" + } + Frame { + msec: 5280 + hash: "87d92c1ba694d0cf187d8616b0f622f0" + } + Frame { + msec: 5296 + hash: "d4af63638fe69b6c4f087a935351057e" + } + Frame { + msec: 5312 + hash: "0573c41f34c2c117cada987e4ee813a5" + } + Frame { + msec: 5328 + hash: "f179ef4b7bf0f915e25ffd8168a9126f" + } + Frame { + msec: 5344 + hash: "1618bf7c94e7898392eb5ffbf44b8aff" + } + Frame { + msec: 5360 + hash: "5af24b902e3729d544f70c77e189b8a7" + } + Frame { + msec: 5376 + hash: "4e5789404e58113cc2d8aa737a03ab58" + } + Frame { + msec: 5392 + hash: "e4bf91a249e47597e959bbaf25f0724d" + } + Frame { + msec: 5408 + hash: "39a3e3d6269522ed57a0e37319ab94d5" + } + Frame { + msec: 5424 + hash: "f2e2e47922e7e058e14537a0455cd77f" + } + Frame { + msec: 5440 + hash: "64abb3f2c9e05fd1dd7490d11c74f06a" + } + Frame { + msec: 5456 + hash: "a9bf45c29536ca34c42aa916747b485b" + } + Frame { + msec: 5472 + hash: "da21839b6635e5c4e0a589d163e62752" + } + Frame { + msec: 5488 + hash: "f31e49258bcbb2a144daa320e4567df1" + } + Frame { + msec: 5504 + hash: "f96c5b39f94bf2ac1e3f4de96767d720" + } + Frame { + msec: 5520 + hash: "281b90d1056803093cc37f30465f0e73" + } + Frame { + msec: 5536 + hash: "d63a2424e1947328957ad8f5f0bec043" + } + Frame { + msec: 5552 + hash: "bd510a0de7df02b1b5741824b6f90944" + } + Frame { + msec: 5568 + hash: "47dc4e5ff91cb84c89dd0fc0459f75f2" + } + Frame { + msec: 5584 + hash: "4bc46b5e116dd30e1db4d4bb650ed6ed" + } + Frame { + msec: 5600 + hash: "c6964b89f1962f120028057d1c588694" + } + Frame { + msec: 5616 + hash: "39a77544a1c88b68cb63da9a8910a35e" + } + Frame { + msec: 5632 + hash: "bd8ac21d7a507a8e195437ccac254ecc" + } + Frame { + msec: 5648 + hash: "7b39b2667a8f8efae20ec8696e35dbc4" + } + Frame { + msec: 5664 + hash: "7b39b2667a8f8efae20ec8696e35dbc4" + } + Frame { + msec: 5680 + hash: "8628f4f24670d17965fec40a02e0196f" + } + Frame { + msec: 5696 + hash: "515903d9896a853cb18cc7b7c45c1cce" + } + Frame { + msec: 5712 + hash: "b7a3f70bedcb3f90a2e294b447e05f70" + } + Frame { + msec: 5728 + hash: "8e8b104ef82b1e219021aa38276f8b45" + } + Frame { + msec: 5744 + hash: "70abe79da860bebd2d17a8c7abb20b4e" + } + Frame { + msec: 5760 + hash: "d99af176fb6cf9d9cbcf7cf4286a165c" + } + Frame { + msec: 5776 + image: "follow.6.png" + } + Frame { + msec: 5792 + hash: "67809c7daad6716d0a664c52de9906ce" + } + Frame { + msec: 5808 + hash: "29a27fd59b7316ce305803482686ea58" + } + Frame { + msec: 5824 + hash: "25b9ca40d1d6208d026e5c965923f8fb" + } + Frame { + msec: 5840 + hash: "126b1542415aea11dbb35492be4f66aa" + } + Frame { + msec: 5856 + hash: "26ca7034536e0e690236797df740f19a" + } + Frame { + msec: 5872 + hash: "fec9db60af63a4712b0da037cf1d89cd" + } + Frame { + msec: 5888 + hash: "d9b7e2729c75ca0c0f33b542525c4880" + } + Frame { + msec: 5904 + hash: "89149d16b893ea432b6d0fb05ead48cb" + } + Frame { + msec: 5920 + hash: "8e389d2ca706277ce06e1da557e2e6c1" + } + Frame { + msec: 5936 + hash: "fc5c74473410da1ddd451c5901572172" + } + Frame { + msec: 5952 + hash: "54514970eadff9362d31499a737e4c95" + } + Frame { + msec: 5968 + hash: "d5953bc29532ec49c20ee552c8756ba1" + } + Frame { + msec: 5984 + hash: "5f03be3ed5824e6a6f8f371ce6a47997" + } + Frame { + msec: 6000 + hash: "0431e2ec4765167d0099c59df400f3fd" + } + Frame { + msec: 6016 + hash: "0431e2ec4765167d0099c59df400f3fd" + } + Frame { + msec: 6032 + hash: "403e1f235770f2b7c8b1b2e86aea69a5" + } + Frame { + msec: 6048 + hash: "403e1f235770f2b7c8b1b2e86aea69a5" + } + Frame { + msec: 6064 + hash: "32ff9f959598972f5a264418587dca1f" + } + Frame { + msec: 6080 + hash: "b4c7c07e52a684f7ce21e47a4d66356a" + } + Frame { + msec: 6096 + hash: "e0f214bed2c3a31f473952929b8f3ea9" + } + Frame { + msec: 6112 + hash: "15328b8a205965f3f29fc63a6a8ac8ed" + } + Frame { + msec: 6128 + hash: "72c46ed63633e6879373f4783df25d8b" + } + Frame { + msec: 6144 + hash: "3f2570289df823446f85bbd8d620db4d" + } + Frame { + msec: 6160 + hash: "df9451c6634d72e6f794e962b3591086" + } + Frame { + msec: 6176 + hash: "773e10bbd133e64457e7ddbc73a10fc2" + } + Frame { + msec: 6192 + hash: "c79abb97eb86761b69053d77156dffd4" + } + Frame { + msec: 6208 + hash: "d927934b19ffd55ea7cea1916983351a" + } + Frame { + msec: 6224 + hash: "ae5058d935c1e44d103be66921b19e77" + } + Frame { + msec: 6240 + hash: "b6a1446b6be054d5785ba52ac23f8aa8" + } + Frame { + msec: 6256 + hash: "3dffbffded44249fdbe58aecd24ab97f" + } + Frame { + msec: 6272 + hash: "56445ab8554a23a786b70e4fd9f40451" + } + Frame { + msec: 6288 + hash: "56445ab8554a23a786b70e4fd9f40451" + } + Frame { + msec: 6304 + hash: "257ce16f529b99f28beb2e57625f52ee" + } + Frame { + msec: 6320 + hash: "257ce16f529b99f28beb2e57625f52ee" + } + Frame { + msec: 6336 + hash: "257ce16f529b99f28beb2e57625f52ee" + } + Frame { + msec: 6352 + hash: "257ce16f529b99f28beb2e57625f52ee" + } + Frame { + msec: 6368 + hash: "257ce16f529b99f28beb2e57625f52ee" + } + Frame { + msec: 6384 + hash: "cb2b0ddbc7b8485fbf32a537e5a98d0e" + } + Frame { + msec: 6400 + hash: "cb2b0ddbc7b8485fbf32a537e5a98d0e" + } + Frame { + msec: 6416 + hash: "cb2b0ddbc7b8485fbf32a537e5a98d0e" + } + Frame { + msec: 6432 + hash: "cb2b0ddbc7b8485fbf32a537e5a98d0e" + } + Frame { + msec: 6448 + hash: "cb2b0ddbc7b8485fbf32a537e5a98d0e" + } + Frame { + msec: 6464 + hash: "fa87436d5e51122022a005d815f97c32" + } + Frame { + msec: 6480 + hash: "fa87436d5e51122022a005d815f97c32" + } + Frame { + msec: 6496 + hash: "fa87436d5e51122022a005d815f97c32" + } + Frame { + msec: 6512 + hash: "fa87436d5e51122022a005d815f97c32" + } + Frame { + msec: 6528 + hash: "fa87436d5e51122022a005d815f97c32" + } + Frame { + msec: 6544 + hash: "fa87436d5e51122022a005d815f97c32" + } + Frame { + msec: 6560 + hash: "fa87436d5e51122022a005d815f97c32" + } + Frame { + msec: 6576 + hash: "fa87436d5e51122022a005d815f97c32" + } + Frame { + msec: 6592 + hash: "fa87436d5e51122022a005d815f97c32" + } + Frame { + msec: 6608 + hash: "fa87436d5e51122022a005d815f97c32" + } + Frame { + msec: 6624 + hash: "fa87436d5e51122022a005d815f97c32" + } + Frame { + msec: 6640 + hash: "fa87436d5e51122022a005d815f97c32" + } + Frame { + msec: 6656 + hash: "fa87436d5e51122022a005d815f97c32" + } + Frame { + msec: 6672 + hash: "fa87436d5e51122022a005d815f97c32" + } + Frame { + msec: 6688 + hash: "fa87436d5e51122022a005d815f97c32" + } + Frame { + msec: 6704 + hash: "da52e87ccd157c0330c07e480b8b0c06" + } + Frame { + msec: 6720 + hash: "da52e87ccd157c0330c07e480b8b0c06" + } + Frame { + msec: 6736 + image: "follow.7.png" + } + Frame { + msec: 6752 + hash: "da52e87ccd157c0330c07e480b8b0c06" + } + Frame { + msec: 6768 + hash: "da52e87ccd157c0330c07e480b8b0c06" + } + Frame { + msec: 6784 + hash: "da52e87ccd157c0330c07e480b8b0c06" + } + Frame { + msec: 6800 + hash: "da52e87ccd157c0330c07e480b8b0c06" + } + Frame { + msec: 6816 + hash: "da52e87ccd157c0330c07e480b8b0c06" + } + Frame { + msec: 6832 + hash: "257ce16f529b99f28beb2e57625f52ee" + } + Key { + type: 6 + key: 16777249 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 6848 + hash: "56445ab8554a23a786b70e4fd9f40451" + } + Frame { + msec: 6864 + hash: "56445ab8554a23a786b70e4fd9f40451" + } + Frame { + msec: 6880 + hash: "56445ab8554a23a786b70e4fd9f40451" + } + Frame { + msec: 6896 + hash: "56445ab8554a23a786b70e4fd9f40451" + } + Frame { + msec: 6912 + hash: "56445ab8554a23a786b70e4fd9f40451" + } + Frame { + msec: 6928 + hash: "56445ab8554a23a786b70e4fd9f40451" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/clock.0.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/clock.0.png new file mode 100644 index 00000000..a3bb3ac1 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/clock.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/clock.1.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/clock.1.png new file mode 100644 index 00000000..f159b6b2 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/clock.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/clock.2.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/clock.2.png new file mode 100644 index 00000000..d24af1aa Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/clock.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/clock.qml b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/clock.qml new file mode 100644 index 00000000..2e8337ec --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/clock.qml @@ -0,0 +1,615 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "clock.0.png" + } + Frame { + msec: 32 + hash: "cb33c89e5108c85e43b53489d1255862" + } + Frame { + msec: 48 + hash: "fcf631cb42237d2ce9e57ef5fef85f93" + } + Frame { + msec: 64 + hash: "a9f1e24d60588ff9b565b15847669438" + } + Frame { + msec: 80 + hash: "c5a07045cd24b835fdd0653db5b34f9f" + } + Frame { + msec: 96 + hash: "bce3e9bfa92f81f0c8746a4777ce1b3e" + } + Frame { + msec: 112 + hash: "6da93132be1be8b42aaf007306ce5990" + } + Frame { + msec: 128 + hash: "8695e73f009bd20f3f3aae4a6b8f0098" + } + Frame { + msec: 144 + hash: "172ece19e661999ce48053007a92f107" + } + Frame { + msec: 160 + hash: "6e02e658d8873dd678dc9cc7cc8035a0" + } + Frame { + msec: 176 + hash: "d8e9bad91fd91bce0310a24233ecb906" + } + Frame { + msec: 192 + hash: "9c23533f0a4d47ec192bed2e48f11c60" + } + Frame { + msec: 208 + hash: "9c23533f0a4d47ec192bed2e48f11c60" + } + Frame { + msec: 224 + hash: "be0ee20e9eb94b80171f66fa6f1c2441" + } + Frame { + msec: 240 + hash: "83b841f7ea7a5e92a21ec0d0130b4281" + } + Frame { + msec: 256 + hash: "3bbf822e403f4198fbfaa6973726947d" + } + Frame { + msec: 272 + hash: "172ece19e661999ce48053007a92f107" + } + Frame { + msec: 288 + hash: "602ca5ac2fc928b831d8e10de01f5bf7" + } + Frame { + msec: 304 + hash: "9f07659e63a5b3412ede3c8400678cc6" + } + Frame { + msec: 320 + hash: "6104f86706bd11cee6b5aeef495eacfa" + } + Frame { + msec: 336 + hash: "b564cfe8c73b3d51e07bbcf5320868f8" + } + Frame { + msec: 352 + hash: "b2136411eee23d64718a63269071499f" + } + Frame { + msec: 368 + hash: "7f610f3b80c2cf002c6565ac4b7a8325" + } + Frame { + msec: 384 + hash: "5480e79cc96fdaffecb2d9dec254c8d4" + } + Frame { + msec: 400 + hash: "50eea6c6f135c21ecf05fc83ad1ae9a8" + } + Frame { + msec: 416 + hash: "2d3634d621782194674da127abe66039" + } + Frame { + msec: 432 + hash: "285180aa632c9247c3b7aa26f5544da6" + } + Frame { + msec: 448 + hash: "8695e73f009bd20f3f3aae4a6b8f0098" + } + Frame { + msec: 464 + hash: "914dc6254f29a6cffc80e90a23b61130" + } + Frame { + msec: 480 + hash: "a564dc3a53b607ca7e9fc6920b65abc3" + } + Frame { + msec: 496 + hash: "6104f86706bd11cee6b5aeef495eacfa" + } + Frame { + msec: 512 + hash: "6f34176630c5d9d421a1a31cb3b97a28" + } + Frame { + msec: 528 + hash: "62199c5663263fee08ba5ce560c7429d" + } + Frame { + msec: 544 + hash: "1110cb0281044eb0679e9dc373a7d063" + } + Frame { + msec: 560 + hash: "0ec354101faf6603c9ca56fe82dc8ac3" + } + Frame { + msec: 576 + hash: "0ec354101faf6603c9ca56fe82dc8ac3" + } + Frame { + msec: 592 + hash: "1110cb0281044eb0679e9dc373a7d063" + } + Frame { + msec: 608 + hash: "1110cb0281044eb0679e9dc373a7d063" + } + Frame { + msec: 624 + hash: "62199c5663263fee08ba5ce560c7429d" + } + Frame { + msec: 640 + hash: "1716d50c65b4319845fdc7ea1ceafe4d" + } + Frame { + msec: 656 + hash: "d087befa8f95f70e33604748230d5dd5" + } + Frame { + msec: 672 + hash: "7ae892fbab85d76e713ab70ca13d3f1f" + } + Frame { + msec: 688 + hash: "fb069bfb88b35f9f15273e04a62a9534" + } + Frame { + msec: 704 + hash: "41c69834e756bafc051ff65e149f8994" + } + Frame { + msec: 720 + hash: "f0c13b542b9ee9b0c9f4ef800900db16" + } + Frame { + msec: 736 + hash: "f0c13b542b9ee9b0c9f4ef800900db16" + } + Frame { + msec: 752 + hash: "f0c13b542b9ee9b0c9f4ef800900db16" + } + Frame { + msec: 768 + hash: "2ff4e8f394a62892adb348271435205c" + } + Frame { + msec: 784 + hash: "2ff4e8f394a62892adb348271435205c" + } + Frame { + msec: 800 + hash: "2ff4e8f394a62892adb348271435205c" + } + Frame { + msec: 816 + hash: "2ff4e8f394a62892adb348271435205c" + } + Frame { + msec: 832 + hash: "2ff4e8f394a62892adb348271435205c" + } + Frame { + msec: 848 + hash: "2ff4e8f394a62892adb348271435205c" + } + Frame { + msec: 864 + hash: "2ff4e8f394a62892adb348271435205c" + } + Frame { + msec: 880 + hash: "2ff4e8f394a62892adb348271435205c" + } + Frame { + msec: 896 + hash: "2ff4e8f394a62892adb348271435205c" + } + Frame { + msec: 912 + hash: "2ff4e8f394a62892adb348271435205c" + } + Frame { + msec: 928 + hash: "2ff4e8f394a62892adb348271435205c" + } + Frame { + msec: 944 + hash: "2ff4e8f394a62892adb348271435205c" + } + Frame { + msec: 960 + hash: "2ff4e8f394a62892adb348271435205c" + } + Frame { + msec: 976 + image: "clock.1.png" + } + Frame { + msec: 992 + hash: "2ff4e8f394a62892adb348271435205c" + } + Frame { + msec: 1008 + hash: "2ff4e8f394a62892adb348271435205c" + } + Frame { + msec: 1024 + hash: "2ff4e8f394a62892adb348271435205c" + } + Frame { + msec: 1040 + hash: "0ec9e1163fe8284ab27aa55f94bf3b14" + } + Frame { + msec: 1056 + hash: "9b6efbb358b1c7928e005620a60ab4a9" + } + Frame { + msec: 1072 + hash: "5be6fe791a3bb6f72a6c6a3d1e2fa86e" + } + Frame { + msec: 1088 + hash: "41fefdc45bd52600f7f108d4163d484b" + } + Frame { + msec: 1104 + hash: "45828a5bef6c4ad4d274c0ea46f72e44" + } + Frame { + msec: 1120 + hash: "17f0925ae38ee4c523713592d6b9f541" + } + Frame { + msec: 1136 + hash: "ed3acc723c29321751702903b57a557a" + } + Frame { + msec: 1152 + hash: "ded71422852eec4464f54e9c1b01b28a" + } + Frame { + msec: 1168 + hash: "0318d105aa5f7d3bebb0d24a85065f90" + } + Frame { + msec: 1184 + hash: "9abe4cb4e8ff6ffafd993b10ac55aad9" + } + Frame { + msec: 1200 + hash: "b92dba35b477ce11822277ba64582232" + } + Frame { + msec: 1216 + hash: "3a9a6106e1f12ffbc81ae9d4b30376fe" + } + Frame { + msec: 1232 + hash: "4647b6e6c95e3339094c7e2641458137" + } + Frame { + msec: 1248 + hash: "0977f3ed3ab6426423f7a7bfb0bd1726" + } + Frame { + msec: 1264 + hash: "930002bcd6986af36678d23c3dc17330" + } + Frame { + msec: 1280 + hash: "ded71422852eec4464f54e9c1b01b28a" + } + Frame { + msec: 1296 + hash: "16164138479aed4db7fd9a1c785556cb" + } + Frame { + msec: 1312 + hash: "0b884e6a8a1c93d62fcee037f9ad8745" + } + Frame { + msec: 1328 + hash: "dd1323c721a0ede74910c16df4b47074" + } + Frame { + msec: 1344 + hash: "ed3acc723c29321751702903b57a557a" + } + Frame { + msec: 1360 + hash: "e8c528178425f7c6089ed6d094e734fb" + } + Frame { + msec: 1376 + hash: "f2954641b11004bc4d29a217791e3833" + } + Frame { + msec: 1392 + hash: "5d4d4086c4aebf04eb5b0045cf9a36a8" + } + Frame { + msec: 1408 + hash: "f2954641b11004bc4d29a217791e3833" + } + Frame { + msec: 1424 + hash: "c2e47da0e709c9ddeee01ae29d3ad059" + } + Frame { + msec: 1440 + hash: "e539f0142b3f6c2f7de084ddedbe979e" + } + Frame { + msec: 1456 + hash: "ed3acc723c29321751702903b57a557a" + } + Frame { + msec: 1472 + hash: "ae191ede94be250b60744d81179c5054" + } + Frame { + msec: 1488 + hash: "f985b1ab4feae3bd7066e15bdd026c1a" + } + Frame { + msec: 1504 + hash: "dd1323c721a0ede74910c16df4b47074" + } + Frame { + msec: 1520 + hash: "c99c541e424ebe82f1cceea204f3ffdc" + } + Frame { + msec: 1536 + hash: "dcdeb76d6e4c676e736ec9fcf68f993b" + } + Frame { + msec: 1552 + hash: "599bfdb42d46a31bf8639e7b1c89526b" + } + Frame { + msec: 1568 + hash: "bef384984df19143de0c290a6621146d" + } + Frame { + msec: 1584 + hash: "bef384984df19143de0c290a6621146d" + } + Frame { + msec: 1600 + hash: "04192a5408bc1aff5431b4ea0be94b27" + } + Frame { + msec: 1616 + hash: "8da64659fb7f532eac43a67accd319ee" + } + Frame { + msec: 1632 + hash: "dcdeb76d6e4c676e736ec9fcf68f993b" + } + Frame { + msec: 1648 + hash: "fba3a7729e46d8e78d203188ef29d829" + } + Frame { + msec: 1664 + hash: "c99c541e424ebe82f1cceea204f3ffdc" + } + Frame { + msec: 1680 + hash: "c99c541e424ebe82f1cceea204f3ffdc" + } + Frame { + msec: 1696 + hash: "a3e6173e6d82d2cb52149588b32851e4" + } + Frame { + msec: 1712 + hash: "7f62ba22b5567d4ea96725a6215ff98a" + } + Frame { + msec: 1728 + hash: "a21cc4fa347929fd816ad36f4b33efab" + } + Frame { + msec: 1744 + hash: "a21cc4fa347929fd816ad36f4b33efab" + } + Frame { + msec: 1760 + hash: "a21cc4fa347929fd816ad36f4b33efab" + } + Frame { + msec: 1776 + hash: "a3e6173e6d82d2cb52149588b32851e4" + } + Frame { + msec: 1792 + hash: "a3e6173e6d82d2cb52149588b32851e4" + } + Frame { + msec: 1808 + hash: "a3e6173e6d82d2cb52149588b32851e4" + } + Frame { + msec: 1824 + hash: "a3e6173e6d82d2cb52149588b32851e4" + } + Frame { + msec: 1840 + hash: "a3e6173e6d82d2cb52149588b32851e4" + } + Frame { + msec: 1856 + hash: "a3e6173e6d82d2cb52149588b32851e4" + } + Frame { + msec: 1872 + hash: "a3e6173e6d82d2cb52149588b32851e4" + } + Frame { + msec: 1888 + hash: "a3e6173e6d82d2cb52149588b32851e4" + } + Frame { + msec: 1904 + hash: "a3e6173e6d82d2cb52149588b32851e4" + } + Frame { + msec: 1920 + hash: "a3e6173e6d82d2cb52149588b32851e4" + } + Frame { + msec: 1936 + image: "clock.2.png" + } + Frame { + msec: 1952 + hash: "a3e6173e6d82d2cb52149588b32851e4" + } + Frame { + msec: 1968 + hash: "a3e6173e6d82d2cb52149588b32851e4" + } + Frame { + msec: 1984 + hash: "a3e6173e6d82d2cb52149588b32851e4" + } + Frame { + msec: 2000 + hash: "a3e6173e6d82d2cb52149588b32851e4" + } + Frame { + msec: 2016 + hash: "a3e6173e6d82d2cb52149588b32851e4" + } + Frame { + msec: 2032 + hash: "dba66886121f802a4a49ee1e220279db" + } + Frame { + msec: 2048 + hash: "b43648a05b6900bd0402bb56c98692df" + } + Frame { + msec: 2064 + hash: "8213e39455c952a589a90eea0040edfe" + } + Frame { + msec: 2080 + hash: "0d72dcbb2de67c84c0cf802e1de2b32b" + } + Frame { + msec: 2096 + hash: "db5b4994b46f3e0de86149af8b99abb6" + } + Frame { + msec: 2112 + hash: "440f7414e3db5339f2180bf1fcdc1c55" + } + Frame { + msec: 2128 + hash: "f757740304369ac45bb88657f79f304e" + } + Frame { + msec: 2144 + hash: "4521da9bcf198f78f7270cca959adfe4" + } + Frame { + msec: 2160 + hash: "92d602d139aedf31180f12349a1edcad" + } + Frame { + msec: 2176 + hash: "4092500cb913f0c9ae49d61e53553371" + } + Frame { + msec: 2192 + hash: "dee122e2c46b398c48a7ef1619683a6f" + } + Frame { + msec: 2208 + hash: "1817fa481e8648dd092e29403b0f887e" + } + Frame { + msec: 2224 + hash: "93a69d88553709c0f164b11d8d765805" + } + Frame { + msec: 2240 + hash: "92d602d139aedf31180f12349a1edcad" + } + Frame { + msec: 2256 + hash: "4ff6679a9615ca8bd5dd63c296cca3d5" + } + Frame { + msec: 2272 + hash: "4521da9bcf198f78f7270cca959adfe4" + } + Frame { + msec: 2288 + hash: "127b93b536f6266965941af5888a63dd" + } + Frame { + msec: 2304 + hash: "1a3e36e44069a8bf29b73acfd8340044" + } + Frame { + msec: 2320 + hash: "1065e18d2b41af8b0b5c4f5ae2a30d4d" + } + Frame { + msec: 2336 + hash: "37144e92ba8c7edd2ef87ecb6525ed5f" + } + Frame { + msec: 2352 + hash: "d6445d8270ddbf5fcd196b3d71393da4" + } + Frame { + msec: 2368 + hash: "b55cc8bdf97531912fa1df1f379e623c" + } + Frame { + msec: 2384 + hash: "fdb86be92fa17fd4e773e5fd65f249a3" + } + Frame { + msec: 2400 + hash: "b55cc8bdf97531912fa1df1f379e623c" + } + Frame { + msec: 2416 + hash: "eb0de8259f7a6be756102f79b5220f56" + } + Frame { + msec: 2432 + hash: "5afbb87fe77112b86282252a2ffe3821" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.0.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.0.png new file mode 100644 index 00000000..ae89849b Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.1.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.1.png new file mode 100644 index 00000000..7b7db056 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.2.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.2.png new file mode 100644 index 00000000..7c1442f4 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.3.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.3.png new file mode 100644 index 00000000..c01c9804 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.4.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.4.png new file mode 100644 index 00000000..8806e4c7 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.5.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.5.png new file mode 100644 index 00000000..b331119b Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.5.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.6.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.6.png new file mode 100644 index 00000000..76e3c6f4 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.6.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.7.png b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.7.png new file mode 100644 index 00000000..141753cd Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.7.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.qml b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.qml new file mode 100644 index 00000000..2cbd2781 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/data/follow.qml @@ -0,0 +1,1763 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "follow.0.png" + } + Frame { + msec: 32 + hash: "2ddcb50f5d285eb80a8136f0cf4cf85a" + } + Frame { + msec: 48 + hash: "519d93a844e05f8215139d91c9aef58b" + } + Frame { + msec: 64 + hash: "9f075a5547e4dc67cbe2ace2766395bb" + } + Frame { + msec: 80 + hash: "8fc48f74a51d45b4ea1fb7bd1d48002f" + } + Frame { + msec: 96 + hash: "a28fc4be5a5bb9ff36f796d9b071f02c" + } + Frame { + msec: 112 + hash: "ebc14c2905f3596ec451dd96409e6001" + } + Frame { + msec: 128 + hash: "4f270bdcff44006a56055edb1cda522a" + } + Frame { + msec: 144 + hash: "571f347e764bf38985768c85c2a13ba1" + } + Frame { + msec: 160 + hash: "b1aa23268167b7e2a1190288926f52c0" + } + Frame { + msec: 176 + hash: "06d548aef9a678edbf3ab4d3ce62a647" + } + Frame { + msec: 192 + hash: "daf6af0ae78f39566913c656450a66e5" + } + Frame { + msec: 208 + hash: "f101cd0c026ee0ed6ccef7a4aed302a0" + } + Frame { + msec: 224 + hash: "b3caa673f072c53d31d71109c9b33357" + } + Frame { + msec: 240 + hash: "8596f1d305d6b8f97b9feda9e69bdefe" + } + Frame { + msec: 256 + hash: "23c23df2c130aafb2092fe47a958a4cd" + } + Frame { + msec: 272 + hash: "66a4f2d8213264437a5f4d6cf10cd442" + } + Frame { + msec: 288 + hash: "6392490111813bad0a9467cc0c1746ed" + } + Frame { + msec: 304 + hash: "c115a47e0ecab63b881e2ec492d24e68" + } + Frame { + msec: 320 + hash: "c2a2b57e6f9ea2975c0846124d2dbc66" + } + Frame { + msec: 336 + hash: "8286c315dfda4241607b2de1154f869d" + } + Frame { + msec: 352 + hash: "3f0f7cae80357176892ff7628ec3153a" + } + Frame { + msec: 368 + hash: "d13bde4a5b5ed8202f92ae33913166c9" + } + Frame { + msec: 384 + hash: "b70cc32134b1b0d31a5e7f145af09495" + } + Frame { + msec: 400 + hash: "03ebc2ff317ac840f4508e8701d66955" + } + Frame { + msec: 416 + hash: "8dff08e72365e8e2fee8088c386dedca" + } + Frame { + msec: 432 + hash: "720f3bbaf3fa3e3a064747d5689e47a0" + } + Frame { + msec: 448 + hash: "350e3ebfcfef96969ef5b8d5944f7e62" + } + Frame { + msec: 464 + hash: "1e4e6e68b3a8eac0c5cd039164eec166" + } + Frame { + msec: 480 + hash: "62a10c4250ad025139a3f9e72109e8e1" + } + Frame { + msec: 496 + hash: "23cfd643adfc98f6a06c7e7b15dac954" + } + Frame { + msec: 512 + hash: "3a78930d5b86b886723fad85e77dd075" + } + Frame { + msec: 528 + hash: "64dc878e2f527e80403c766e61fe14a6" + } + Frame { + msec: 544 + hash: "d79160989d2584044042271e79a88e69" + } + Frame { + msec: 560 + hash: "22cbaea4affc88433834c7d0dc1f1644" + } + Frame { + msec: 576 + hash: "77cb616902257e1f239a0e6bfaabb33c" + } + Frame { + msec: 592 + hash: "a2fe73dced03b23c4acb9aae9b774b41" + } + Frame { + msec: 608 + hash: "230e21d3a9ed0e185593677233af1275" + } + Frame { + msec: 624 + hash: "4e10ecffac4e06d624855d3f8917f76c" + } + Frame { + msec: 640 + hash: "84f49d56baace4a02e50d3eafaea04ec" + } + Frame { + msec: 656 + hash: "e3cd0b334551a9f91723eb2c876d335a" + } + Frame { + msec: 672 + hash: "259330f3ec390c9926d9c2ddc2d77319" + } + Frame { + msec: 688 + hash: "cc659623bfa385d282d608684d7cdc2b" + } + Frame { + msec: 704 + hash: "47ed75d077143a6bfa0e10158550c542" + } + Frame { + msec: 720 + hash: "0de93bbd9f9ee63e97968089321003e1" + } + Frame { + msec: 736 + hash: "b33d867d4399879256a01344ce0b81f2" + } + Frame { + msec: 752 + hash: "97c31fce937d11f62bebc6169b464a42" + } + Frame { + msec: 768 + hash: "ea4166b8a4001bca3f27af30f251267f" + } + Frame { + msec: 784 + hash: "b56d270b7893565f8d7ed2a0bfe10d60" + } + Frame { + msec: 800 + hash: "88a42559fe22b45cff379258dd40ced9" + } + Frame { + msec: 816 + hash: "4ee1a711cb8d26087e1b75a3166ca5f0" + } + Frame { + msec: 832 + hash: "9b88a00d041092e79b4a08bccbaca0e1" + } + Frame { + msec: 848 + hash: "afea397b3d740dc42f0313624fc10efd" + } + Frame { + msec: 864 + hash: "39fd8e4cefbd9fed283d62a7aecded22" + } + Frame { + msec: 880 + hash: "916b783d2379ac054c749e7b6eae7ddf" + } + Frame { + msec: 896 + hash: "fccd44740ff7ffb0f2adccf00a7588bd" + } + Frame { + msec: 912 + hash: "c064f20703a13543e8273d251fd645fe" + } + Frame { + msec: 928 + hash: "1b9b0755101841e3d1cbe208d81575d5" + } + Frame { + msec: 944 + hash: "1eb5e4a301b565012bc8f6af8e879eb9" + } + Frame { + msec: 960 + hash: "032db65eb5c405e433f88df3975c322b" + } + Frame { + msec: 976 + image: "follow.1.png" + } + Frame { + msec: 992 + hash: "fdb67e11d7cc767b2389a8bbef752c7e" + } + Frame { + msec: 1008 + hash: "ed89cb161336c61b13e3514fdf816023" + } + Frame { + msec: 1024 + hash: "331b873c5367e0aaa62af85cb54a6a96" + } + Frame { + msec: 1040 + hash: "cde4503f02f0c3732e310a7d0418cd1e" + } + Frame { + msec: 1056 + hash: "f8c028c591fc1495d5bec8763da6f011" + } + Frame { + msec: 1072 + hash: "9dc68483218335afe41aa3cd052a98b5" + } + Frame { + msec: 1088 + hash: "31105c455418a3284700cf9c88571507" + } + Frame { + msec: 1104 + hash: "72724947167a1ac600aaa1d7f331f7ec" + } + Frame { + msec: 1120 + hash: "a4a1243326de6b9e93948fcb22fecac4" + } + Frame { + msec: 1136 + hash: "c3e26e62f12dd658f21a0330fefb0533" + } + Frame { + msec: 1152 + hash: "15d85b4a9ad761a911bbaa3e0c4b2b61" + } + Frame { + msec: 1168 + hash: "bce1400b437cc43b8ff57b1a5fbc9551" + } + Frame { + msec: 1184 + hash: "5d05848afcd8f697c1b3762f00a759f6" + } + Frame { + msec: 1200 + hash: "6c83f68ea72cd54793149f4c9e759d44" + } + Frame { + msec: 1216 + hash: "5206b93666e51cee3e25a7a85e27b5b8" + } + Frame { + msec: 1232 + hash: "a3ef5c76efece4455e5ad12bcc8bd8f5" + } + Frame { + msec: 1248 + hash: "c36c6ee7b6c8074f5dc1af7446fad1ad" + } + Frame { + msec: 1264 + hash: "bb0887f1f10548bb53f0dc1ffeec25ee" + } + Frame { + msec: 1280 + hash: "ebffe547a7c3528e5deddc590510506d" + } + Frame { + msec: 1296 + hash: "18962faef1a1a1207a3c6783116154a2" + } + Frame { + msec: 1312 + hash: "8aaa876e4a6c4de04e557f35ddd4fb61" + } + Frame { + msec: 1328 + hash: "c66123bb4e01ce267629f5b50d147db1" + } + Frame { + msec: 1344 + hash: "334e5acf84d90e70ca3085b9d5e057a7" + } + Frame { + msec: 1360 + hash: "9bb49ddcc775307c3c1159908323e010" + } + Frame { + msec: 1376 + hash: "1b3cfb8b6b6c39a34ea86a66ea1cc6b1" + } + Frame { + msec: 1392 + hash: "d2a68c6eb2b05390ab1049137f96f227" + } + Frame { + msec: 1408 + hash: "91e254fd2376ba35a283b18b947ca1a8" + } + Frame { + msec: 1424 + hash: "fe94e2e8b4978390e9e8cbfe77dfc241" + } + Frame { + msec: 1440 + hash: "e3d32b73c5c50e7aa59f4e4725de170e" + } + Frame { + msec: 1456 + hash: "a73b90254d7da5557cc3941db0017a65" + } + Frame { + msec: 1472 + hash: "9aa49cce5d63f8dd6409995ac6d91d63" + } + Frame { + msec: 1488 + hash: "0ba674df46accec28a3c1b81e656adc7" + } + Frame { + msec: 1504 + hash: "025a45417b8c75d47b5dac6c5ef913e9" + } + Frame { + msec: 1520 + hash: "742527b97c7f580b0b7ff9d6aa105d31" + } + Frame { + msec: 1536 + hash: "965ec8315d45894e704fcc5a3efc8c55" + } + Frame { + msec: 1552 + hash: "6abdd59e6bd2c31124eab254418a5322" + } + Frame { + msec: 1568 + hash: "9f6d06b176c55fa292e7f0ef4b5cd1cb" + } + Frame { + msec: 1584 + hash: "05eba8c6e02c0d4af49e59b3346c9e68" + } + Frame { + msec: 1600 + hash: "3c4215f6253aba836516cd51368bc471" + } + Frame { + msec: 1616 + hash: "c6339a290007c0106cb18ecef5b7392b" + } + Frame { + msec: 1632 + hash: "39a4bcd2ce84035f9db70f196ca00971" + } + Frame { + msec: 1648 + hash: "b75a4be472583c3b893fc894ebe7d4d8" + } + Frame { + msec: 1664 + hash: "d1efebbe748c43b3c1241753612e100d" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 195; y: 95 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1680 + hash: "f6f3ad64fb71ffb68a5ea0375cc94bae" + } + Frame { + msec: 1696 + hash: "778ecbafb5d235edde1683cabe3c3cfe" + } + Frame { + msec: 1712 + hash: "5a41b9196fe4a97e6ba2400806299bd8" + } + Frame { + msec: 1728 + hash: "1c8ddbc5910e35be389a1cb34fab9dec" + } + Frame { + msec: 1744 + hash: "5e8b236c00087a067d366afde67184f3" + } + Frame { + msec: 1760 + hash: "72fe42361833054cd9388bb98ac9b150" + } + Frame { + msec: 1776 + hash: "bbe9f0b030efa716f34a05f0af929c66" + } + Frame { + msec: 1792 + hash: "cd393fc19a30d896bfe62aa0000308f8" + } + Frame { + msec: 1808 + hash: "c390f5b1bcff54de203490d8f2616fcd" + } + Frame { + msec: 1824 + hash: "b5da2ea467c334dd13c75b811b94efb1" + } + Frame { + msec: 1840 + hash: "49887c9312c3a4dfc2d9719f47c83a15" + } + Frame { + msec: 1856 + hash: "7f077703e49f154d01c12a44f53469c5" + } + Frame { + msec: 1872 + hash: "7be4130ed767f0e0bf41c3bebf050cac" + } + Frame { + msec: 1888 + hash: "cc1590486c172000557b76c6eadb51e0" + } + Frame { + msec: 1904 + hash: "7ccd05236d9c1f8af0e9645404326122" + } + Frame { + msec: 1920 + hash: "2da165bf7e868b53b85bb630649ddc3e" + } + Frame { + msec: 1936 + image: "follow.2.png" + } + Frame { + msec: 1952 + hash: "2b6a24b6ceeaa956527c872af70fb5f9" + } + Frame { + msec: 1968 + hash: "8c882de21f4ed0fb68433c19b114c3f8" + } + Frame { + msec: 1984 + hash: "f75226c58726a687079d0d24e865ee6f" + } + Frame { + msec: 2000 + hash: "2fa9b69fe85b4e1361ba260545c10e06" + } + Frame { + msec: 2016 + hash: "6d513bc03f2798fbce1a0790969da6b5" + } + Frame { + msec: 2032 + hash: "7e359e605483493e9a865f6eb912c394" + } + Frame { + msec: 2048 + hash: "497c7c82c24408dcaff5ec981d3d4f35" + } + Frame { + msec: 2064 + hash: "8738b024cf75ef970ffe20166e85141c" + } + Frame { + msec: 2080 + hash: "014b805eb1ecf2ea1cd61727bfd1ca08" + } + Frame { + msec: 2096 + hash: "a81cde60979300f397054ea017382114" + } + Frame { + msec: 2112 + hash: "c46183b5224e762335eea98d9da65465" + } + Frame { + msec: 2128 + hash: "11afbb88994f298a1fed6575fae3d7fd" + } + Frame { + msec: 2144 + hash: "0195fa503143561d9ae3ffe68739ca3f" + } + Frame { + msec: 2160 + hash: "6d298df37d2116eb9a62b58853cb3344" + } + Frame { + msec: 2176 + hash: "1660865f00ea9adf94c8e56c7a8a73b2" + } + Frame { + msec: 2192 + hash: "9835b5527b84e8e8a8fea2bdf9653a99" + } + Frame { + msec: 2208 + hash: "ec1158b83daa9e98437abc9ce90b70f0" + } + Frame { + msec: 2224 + hash: "11ce5e37747e05ff5f5071b13324ce9e" + } + Frame { + msec: 2240 + hash: "6d7d427d5a15a31fd395f26c94ea455e" + } + Frame { + msec: 2256 + hash: "828949e0fbdb7c79719fb533febb5b35" + } + Frame { + msec: 2272 + hash: "7ef7f73ef6a59c9210cfa37df3894cb1" + } + Frame { + msec: 2288 + hash: "e74bec397b32ba2934ffdde23a3d60c6" + } + Frame { + msec: 2304 + hash: "09c2ca9c22e9b77bc166b4567b29bca7" + } + Frame { + msec: 2320 + hash: "44d87983f33c4e03f4be70b406bb9bd9" + } + Frame { + msec: 2336 + hash: "92844b36c2f30e618f04bfbc5cfbcad6" + } + Frame { + msec: 2352 + hash: "0245f39a8966c4addb3f8dbcee93cd3f" + } + Frame { + msec: 2368 + hash: "eb1e81cfa29295d4b1522c69d4501f51" + } + Frame { + msec: 2384 + hash: "2af9c3bea11b25c0f6c2b780d533a968" + } + Frame { + msec: 2400 + hash: "5062e9ab29c4a7a9657a4d29249ca822" + } + Frame { + msec: 2416 + hash: "d7652ddc85d3be3bb3a2fc268ae9bc29" + } + Frame { + msec: 2432 + hash: "7c924bf2ad6167db439723679b373a3a" + } + Frame { + msec: 2448 + hash: "a93b61dd26a2ca72100b747ac3ed81b6" + } + Frame { + msec: 2464 + hash: "5fedc849d3d21e0acf0ab4a4815a1285" + } + Frame { + msec: 2480 + hash: "4313d2458f4bede8d3b02ac60135e728" + } + Frame { + msec: 2496 + hash: "0f09e81d89262b569c56a9c876f3898d" + } + Frame { + msec: 2512 + hash: "ea932789ded14fc5c8bae565b67d004c" + } + Frame { + msec: 2528 + hash: "fd1f7b9b51f1284fee4d777ef83bba3f" + } + Frame { + msec: 2544 + hash: "e98b884a1ec8ce4b4dc20749b85b571e" + } + Frame { + msec: 2560 + hash: "d144072bb87bb88750b9df9cd92f7a4b" + } + Frame { + msec: 2576 + hash: "9d8ad80d3367292d7e89d67cf49862b8" + } + Frame { + msec: 2592 + hash: "c09b89e71e862da15d2b9edb0e00aa7b" + } + Frame { + msec: 2608 + hash: "551277add3f8f09951d9c8f55ccd40f7" + } + Frame { + msec: 2624 + hash: "1d0be0e7108516869374a9b985fd7543" + } + Frame { + msec: 2640 + hash: "12e7cfb6c4a26af54c4b35182294a7b7" + } + Frame { + msec: 2656 + hash: "a666a5a59d5854973668798eb8d508ba" + } + Frame { + msec: 2672 + hash: "420d2e21461dc45f134b7dfa11d04d25" + } + Frame { + msec: 2688 + hash: "95f848874899fb58a81c62b5921cf857" + } + Frame { + msec: 2704 + hash: "fa3ea7a0f90ca549cc9a857f0647b061" + } + Frame { + msec: 2720 + hash: "cbc5338de6157cd5dad511b246f5093b" + } + Frame { + msec: 2736 + hash: "e26b43c83197abab3746830bbfacc0f4" + } + Frame { + msec: 2752 + hash: "5225e854ff2763e562dee2810331d560" + } + Frame { + msec: 2768 + hash: "a1d114ea67233ac4c6351e18e3afa64e" + } + Frame { + msec: 2784 + hash: "bc9f12af2d0816bb84fd5040ed29bdad" + } + Frame { + msec: 2800 + hash: "d9337da38caa4ad3385249602a830df3" + } + Frame { + msec: 2816 + hash: "6ce20e0c89181b0f11e609b248da71d7" + } + Frame { + msec: 2832 + hash: "bbc8337950a78c7bfa48aab2635120a8" + } + Frame { + msec: 2848 + hash: "0e28ade7f52f3c27e1dbdd6e98be8c7d" + } + Frame { + msec: 2864 + hash: "0e28ade7f52f3c27e1dbdd6e98be8c7d" + } + Frame { + msec: 2880 + hash: "b496af17513d60d4028bd7402fbfba93" + } + Frame { + msec: 2896 + image: "follow.3.png" + } + Frame { + msec: 2912 + hash: "29aa7ce0fb1aa350753d3ec6da05bdf9" + } + Frame { + msec: 2928 + hash: "fde474797d8105d9d004a7020e010fa4" + } + Frame { + msec: 2944 + hash: "5a553d9a4bd2ef5d86f5eb37a863d28f" + } + Frame { + msec: 2960 + hash: "2dcbf6c84abd49529f0b5d85bfb74808" + } + Frame { + msec: 2976 + hash: "e96ec3b7d37bbf4c9ca297ad5afde31c" + } + Frame { + msec: 2992 + hash: "9d824068affe32c143226b0b530206fc" + } + Frame { + msec: 3008 + hash: "3e85f0ace68cffed47f4c9b00145f0f0" + } + Frame { + msec: 3024 + hash: "540b8e1e2bee7d2ba5e29fd3b1086cd1" + } + Frame { + msec: 3040 + hash: "0786585d11934c5e4a7e965eaac9a152" + } + Frame { + msec: 3056 + hash: "8271705df2ca697f4343007a7810d4ac" + } + Frame { + msec: 3072 + hash: "b98e1cd20ab2e4239f35d04df5e5175a" + } + Frame { + msec: 3088 + hash: "ab1a7eaa5c5d919ee76cba405d0dd4cd" + } + Frame { + msec: 3104 + hash: "52682386448379a395dc6c541224b7d4" + } + Frame { + msec: 3120 + hash: "31dffcb9da94dfc085ab8c561404c248" + } + Frame { + msec: 3136 + hash: "f3703eed8ebf9ece776ebe51e4c60ae6" + } + Frame { + msec: 3152 + hash: "1126b90345bb42691cd17f37ecec6bdb" + } + Frame { + msec: 3168 + hash: "7a63ab96d1c8d4992c03a6f59bba4e7e" + } + Frame { + msec: 3184 + hash: "91f4a00c9a7ea6164b334aa4b90da862" + } + Frame { + msec: 3200 + hash: "485471140f6a5336837377612e7a85bf" + } + Frame { + msec: 3216 + hash: "96881b4021aff05020e0a9342fbae75d" + } + Frame { + msec: 3232 + hash: "9891326646c3da4ff250aab69c862f96" + } + Frame { + msec: 3248 + hash: "f00f36bbb5a828824c596ee6f85bec2f" + } + Frame { + msec: 3264 + hash: "f00f36bbb5a828824c596ee6f85bec2f" + } + Frame { + msec: 3280 + hash: "f00f36bbb5a828824c596ee6f85bec2f" + } + Frame { + msec: 3296 + hash: "f00f36bbb5a828824c596ee6f85bec2f" + } + Frame { + msec: 3312 + hash: "9891326646c3da4ff250aab69c862f96" + } + Frame { + msec: 3328 + hash: "c766238db55f4704c2f29a6be6ee6907" + } + Frame { + msec: 3344 + hash: "0254665427dcbd1c155bc954cc7aa7cd" + } + Frame { + msec: 3360 + hash: "33ae1012816b997ef5c61c03ccfcc590" + } + Frame { + msec: 3376 + hash: "4c7857bbbcb9aa812fc2503af2b395cf" + } + Frame { + msec: 3392 + hash: "3a570e4af992d35e55923cea23c3c11b" + } + Frame { + msec: 3408 + hash: "533ef554538005512ce37c73c6def722" + } + Frame { + msec: 3424 + hash: "f863fa215d0642708bfa82780c766dc4" + } + Frame { + msec: 3440 + hash: "fcca3ec34521c4b9087a102ba1e47293" + } + Frame { + msec: 3456 + hash: "47d67cd74cb96b12801842b288a8b9ff" + } + Frame { + msec: 3472 + hash: "34c5ea76f297ec68cba70521caa468e4" + } + Frame { + msec: 3488 + hash: "7be247cc7a4032ff0478fca1a2aace8a" + } + Frame { + msec: 3504 + hash: "3ade2a1a48edef15f522b9fc016e137e" + } + Frame { + msec: 3520 + hash: "8b37b9d123504931d82bb06f6981bade" + } + Frame { + msec: 3536 + hash: "5eb39825003f405f353f629e236b3395" + } + Frame { + msec: 3552 + hash: "c4550722260c4a30ab1176c7e5cb62bf" + } + Frame { + msec: 3568 + hash: "bd33e3ecd4b59cd659588c0298b61095" + } + Frame { + msec: 3584 + hash: "4b3a62bff0019df7412aa2e1c07c0a23" + } + Frame { + msec: 3600 + hash: "a9b98adcc3350febbb89dbf725b81436" + } + Frame { + msec: 3616 + hash: "66eb8c84e75141d1575caf7d3cbc1ceb" + } + Frame { + msec: 3632 + hash: "238f2b1dc5bf5b65e827c860f9ee76b5" + } + Frame { + msec: 3648 + hash: "6d1fed0697370b2a2163c369fe559739" + } + Frame { + msec: 3664 + hash: "04ea478c785586d900bbe3472371bbc7" + } + Frame { + msec: 3680 + hash: "ba429e711c9363eebfb20e641fa44c84" + } + Frame { + msec: 3696 + hash: "0129dfba166ffcbaa15087467c864068" + } + Frame { + msec: 3712 + hash: "3fb340c874eee94e8baa1453b37c3fb5" + } + Frame { + msec: 3728 + hash: "068c51d99c458f3edefe3371f46de260" + } + Frame { + msec: 3744 + hash: "dd1e04ed3d610c2712158d73ee2c5b9d" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 195; y: 95 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3760 + hash: "840154afb9e7e0c859c66667bb6944b6" + } + Frame { + msec: 3776 + hash: "239c2e33800e386b468a95341d0e23f4" + } + Frame { + msec: 3792 + hash: "0a00515f2d297362862c1a5cf6519845" + } + Frame { + msec: 3808 + hash: "f855df3495e44291aed8f085163c804b" + } + Frame { + msec: 3824 + hash: "b4eb31e48c65550bb78d175b48e0e9fb" + } + Frame { + msec: 3840 + hash: "70243664f9db83614e5972fc18ee81a1" + } + Frame { + msec: 3856 + image: "follow.4.png" + } + Frame { + msec: 3872 + hash: "c48ce2a4cf28ab706b9c097bddc74c27" + } + Frame { + msec: 3888 + hash: "754a957e0df02839dd2fe33fefb7a721" + } + Frame { + msec: 3904 + hash: "ec3ebe7b941af9bf2163634d7f15e8aa" + } + Frame { + msec: 3920 + hash: "a76423ff2184cd9dac47abf7ae52ce5a" + } + Frame { + msec: 3936 + hash: "559bec54f51c36c6e90004ca5e77c23c" + } + Frame { + msec: 3952 + hash: "dc6fdd6a867a675afcb58f7052605614" + } + Frame { + msec: 3968 + hash: "b2fb0dbbec01490243f37fe5f80ab6c7" + } + Frame { + msec: 3984 + hash: "2bc1df7a913b1948ee7bb77eeaa55aa2" + } + Frame { + msec: 4000 + hash: "82c6430d85c6a94c4b55a9529d2bc78f" + } + Frame { + msec: 4016 + hash: "463e70dc9a9bdabdc158199bdcd7d2fa" + } + Frame { + msec: 4032 + hash: "c1e9553327f060b70caa713bf3015342" + } + Frame { + msec: 4048 + hash: "42f7f505d4e5ef316240e4f287a039bf" + } + Frame { + msec: 4064 + hash: "200500f600ffe43c5ad4d057bcfc0831" + } + Frame { + msec: 4080 + hash: "22e78edb813f7830776b2603b0aaae5c" + } + Frame { + msec: 4096 + hash: "32ebf3490832fd0693b1b922b4501251" + } + Frame { + msec: 4112 + hash: "1be622caa5ef94f87e2ec8297b6e1caa" + } + Frame { + msec: 4128 + hash: "d1480529e0cb94c51c412109663e5fab" + } + Frame { + msec: 4144 + hash: "e55e627d6d13b647f35233f18f0cbe89" + } + Frame { + msec: 4160 + hash: "87d7b349cd2898de7686e5f1a14f6338" + } + Frame { + msec: 4176 + hash: "2ac974836ee5e6092b55fcda20d7c35d" + } + Frame { + msec: 4192 + hash: "53867256c1dac4de2f02af1ae000b49f" + } + Frame { + msec: 4208 + hash: "08623509e9e5089fdaa1af2bf9a77eb1" + } + Frame { + msec: 4224 + hash: "e4692f42c12593ee865048aef00cbeb2" + } + Frame { + msec: 4240 + hash: "981ad6459e3e7483bb323ab4bc514630" + } + Frame { + msec: 4256 + hash: "79e8adfcdc9d6dae0d2b6a69e8e322fa" + } + Frame { + msec: 4272 + hash: "58f967a607972faa9daa13402eeb9912" + } + Frame { + msec: 4288 + hash: "1fd5b002b049132565b6a963fb7b3bb6" + } + Frame { + msec: 4304 + hash: "a16c96598f47404ec5f4ef55e87a1e70" + } + Frame { + msec: 4320 + hash: "3c632899804812c93c7edd3e3f3d2bac" + } + Frame { + msec: 4336 + hash: "af0eb810e0273f9bacb082d9f90612df" + } + Frame { + msec: 4352 + hash: "728d7ac4a5410482c7d86d03c2d8a996" + } + Frame { + msec: 4368 + hash: "416e76064f2be71a03eddddf61a33cb0" + } + Frame { + msec: 4384 + hash: "c41f20b4ac9a7b34eefd066f77ea351a" + } + Frame { + msec: 4400 + hash: "821d51db415a210b09ebdf8d861aadf2" + } + Frame { + msec: 4416 + hash: "9394266815a52f1779858bb088d557dc" + } + Frame { + msec: 4432 + hash: "cc475d1589665414e5aef051ec237ef4" + } + Frame { + msec: 4448 + hash: "a95f3b8128faa7820f36391fa9bd579f" + } + Frame { + msec: 4464 + hash: "d52687293a11891c364de52525039203" + } + Frame { + msec: 4480 + hash: "5333dc4f65b2f1e066edcd23f7621bd7" + } + Frame { + msec: 4496 + hash: "797bb5e27b2fe2b733a54402433901b4" + } + Frame { + msec: 4512 + hash: "84c610cdff7f8b04a34977216e37847d" + } + Frame { + msec: 4528 + hash: "0317f0406a566b2851c8bda62900e40c" + } + Frame { + msec: 4544 + hash: "6538ecd7abd35234c5cc5c2a17249fc1" + } + Frame { + msec: 4560 + hash: "f9019150a132eb5f5cfafcd5337aff7a" + } + Frame { + msec: 4576 + hash: "0f0136fffbc65c02cee249ece4c8c0ef" + } + Frame { + msec: 4592 + hash: "0027e0d236b8b33a451a0cc35e81b4ce" + } + Frame { + msec: 4608 + hash: "ac2f86b2d4f29f223fb78440d67ccd31" + } + Frame { + msec: 4624 + hash: "a6eb112a10c849e337f816ee408f22a6" + } + Frame { + msec: 4640 + hash: "dafbb01f2615a2513310478ebe484a05" + } + Frame { + msec: 4656 + hash: "17c400c4c29652dc278980ab578b75b3" + } + Frame { + msec: 4672 + hash: "48696c02a2a4839b893a4c0b431b78a3" + } + Frame { + msec: 4688 + hash: "04e05c7e722e53299d24cd0f1b7d17ee" + } + Frame { + msec: 4704 + hash: "55d158f13ffc7ccde5ee368656d2830b" + } + Frame { + msec: 4720 + hash: "fa478e1575acedae023322a520171a5b" + } + Frame { + msec: 4736 + hash: "e2147ddd6e19fde80bb76da24011400c" + } + Frame { + msec: 4752 + hash: "44ee0144db4c55aa90d2a931d83a895e" + } + Frame { + msec: 4768 + hash: "552e87bbce4ad48006c899052a2c8cad" + } + Frame { + msec: 4784 + hash: "3b6efe225303566f751c3f884ac8c069" + } + Frame { + msec: 4800 + hash: "3a7175916d1dc103506061607b910550" + } + Frame { + msec: 4816 + image: "follow.5.png" + } + Frame { + msec: 4832 + hash: "b2e5d5c14b02a13bca62673f87e85627" + } + Frame { + msec: 4848 + hash: "bd89a911d6fb13e4e841f8ee5b8b42af" + } + Frame { + msec: 4864 + hash: "89795784185e83d0299e656f2eec73c8" + } + Frame { + msec: 4880 + hash: "5b6d6fe78f341bdf0eb4bedfe3d975d0" + } + Frame { + msec: 4896 + hash: "e246bc451ee48e16ef6dee20d6256e9c" + } + Frame { + msec: 4912 + hash: "8c1bc37b1b268743aa314247ea949ef5" + } + Frame { + msec: 4928 + hash: "04f34203c34dc87efc708bfb232663df" + } + Frame { + msec: 4944 + hash: "d37a48545e81970d16951e3388f0ff8c" + } + Frame { + msec: 4960 + hash: "9411e846c9f59cc915288efb59d4c9de" + } + Frame { + msec: 4976 + hash: "6ee179741ac74837708afb55943f15bd" + } + Frame { + msec: 4992 + hash: "f626fc3166bd5b01171271ae9bfa9b22" + } + Frame { + msec: 5008 + hash: "e22898b2c0c566bbf531223234f98327" + } + Frame { + msec: 5024 + hash: "1343d90c5eae70713cd49110fe61237b" + } + Frame { + msec: 5040 + hash: "493d9322da6d01979a3f1a120c265f8c" + } + Frame { + msec: 5056 + hash: "defccc76caf3a7c7c67e8abf5ccc2def" + } + Frame { + msec: 5072 + hash: "fe3cad9227fcfa7ba2238465078f2ac7" + } + Frame { + msec: 5088 + hash: "66ebfeee3a63323c7d8b949db9aafd7e" + } + Frame { + msec: 5104 + hash: "805820b382d005894f9a615004b97b0d" + } + Frame { + msec: 5120 + hash: "eee1620f47bb071de8a9c788d1fd258e" + } + Frame { + msec: 5136 + hash: "f5a7d9a81fcfc8cfb9e7cc8ead0f1ff8" + } + Frame { + msec: 5152 + hash: "249903ee123090b27019350f120c8b79" + } + Frame { + msec: 5168 + hash: "019793a363c905809af32bf34ef52ec0" + } + Frame { + msec: 5184 + hash: "4f5ad5a3ebb6eca73dd7567199d07b08" + } + Frame { + msec: 5200 + hash: "fdc1b42d50c7a5c45458498788ff0abd" + } + Frame { + msec: 5216 + hash: "cc091469598cad28d0a00690f1acb412" + } + Frame { + msec: 5232 + hash: "5c8757e1f8f34a31d8b3717b64b84c07" + } + Frame { + msec: 5248 + hash: "5da75559f60eac1b9f518ed55a174e5b" + } + Frame { + msec: 5264 + hash: "1214c08daec4dcfb27690fdc18f2ac28" + } + Frame { + msec: 5280 + hash: "87d92c1ba694d0cf187d8616b0f622f0" + } + Frame { + msec: 5296 + hash: "d4af63638fe69b6c4f087a935351057e" + } + Frame { + msec: 5312 + hash: "0573c41f34c2c117cada987e4ee813a5" + } + Frame { + msec: 5328 + hash: "f179ef4b7bf0f915e25ffd8168a9126f" + } + Frame { + msec: 5344 + hash: "1618bf7c94e7898392eb5ffbf44b8aff" + } + Frame { + msec: 5360 + hash: "5af24b902e3729d544f70c77e189b8a7" + } + Frame { + msec: 5376 + hash: "4e5789404e58113cc2d8aa737a03ab58" + } + Frame { + msec: 5392 + hash: "e4bf91a249e47597e959bbaf25f0724d" + } + Frame { + msec: 5408 + hash: "39a3e3d6269522ed57a0e37319ab94d5" + } + Frame { + msec: 5424 + hash: "f2e2e47922e7e058e14537a0455cd77f" + } + Frame { + msec: 5440 + hash: "64abb3f2c9e05fd1dd7490d11c74f06a" + } + Frame { + msec: 5456 + hash: "a9bf45c29536ca34c42aa916747b485b" + } + Frame { + msec: 5472 + hash: "da21839b6635e5c4e0a589d163e62752" + } + Frame { + msec: 5488 + hash: "f31e49258bcbb2a144daa320e4567df1" + } + Frame { + msec: 5504 + hash: "f96c5b39f94bf2ac1e3f4de96767d720" + } + Frame { + msec: 5520 + hash: "281b90d1056803093cc37f30465f0e73" + } + Frame { + msec: 5536 + hash: "d63a2424e1947328957ad8f5f0bec043" + } + Frame { + msec: 5552 + hash: "bd510a0de7df02b1b5741824b6f90944" + } + Frame { + msec: 5568 + hash: "47dc4e5ff91cb84c89dd0fc0459f75f2" + } + Frame { + msec: 5584 + hash: "4bc46b5e116dd30e1db4d4bb650ed6ed" + } + Frame { + msec: 5600 + hash: "c6964b89f1962f120028057d1c588694" + } + Frame { + msec: 5616 + hash: "39a77544a1c88b68cb63da9a8910a35e" + } + Frame { + msec: 5632 + hash: "bd8ac21d7a507a8e195437ccac254ecc" + } + Frame { + msec: 5648 + hash: "7b39b2667a8f8efae20ec8696e35dbc4" + } + Frame { + msec: 5664 + hash: "7b39b2667a8f8efae20ec8696e35dbc4" + } + Frame { + msec: 5680 + hash: "8628f4f24670d17965fec40a02e0196f" + } + Frame { + msec: 5696 + hash: "515903d9896a853cb18cc7b7c45c1cce" + } + Frame { + msec: 5712 + hash: "b7a3f70bedcb3f90a2e294b447e05f70" + } + Frame { + msec: 5728 + hash: "8e8b104ef82b1e219021aa38276f8b45" + } + Frame { + msec: 5744 + hash: "70abe79da860bebd2d17a8c7abb20b4e" + } + Frame { + msec: 5760 + hash: "d99af176fb6cf9d9cbcf7cf4286a165c" + } + Frame { + msec: 5776 + image: "follow.6.png" + } + Frame { + msec: 5792 + hash: "67809c7daad6716d0a664c52de9906ce" + } + Frame { + msec: 5808 + hash: "29a27fd59b7316ce305803482686ea58" + } + Frame { + msec: 5824 + hash: "25b9ca40d1d6208d026e5c965923f8fb" + } + Frame { + msec: 5840 + hash: "126b1542415aea11dbb35492be4f66aa" + } + Frame { + msec: 5856 + hash: "26ca7034536e0e690236797df740f19a" + } + Frame { + msec: 5872 + hash: "fec9db60af63a4712b0da037cf1d89cd" + } + Frame { + msec: 5888 + hash: "d9b7e2729c75ca0c0f33b542525c4880" + } + Frame { + msec: 5904 + hash: "89149d16b893ea432b6d0fb05ead48cb" + } + Frame { + msec: 5920 + hash: "8e389d2ca706277ce06e1da557e2e6c1" + } + Frame { + msec: 5936 + hash: "fc5c74473410da1ddd451c5901572172" + } + Frame { + msec: 5952 + hash: "54514970eadff9362d31499a737e4c95" + } + Frame { + msec: 5968 + hash: "d5953bc29532ec49c20ee552c8756ba1" + } + Frame { + msec: 5984 + hash: "5f03be3ed5824e6a6f8f371ce6a47997" + } + Frame { + msec: 6000 + hash: "0431e2ec4765167d0099c59df400f3fd" + } + Frame { + msec: 6016 + hash: "0431e2ec4765167d0099c59df400f3fd" + } + Frame { + msec: 6032 + hash: "403e1f235770f2b7c8b1b2e86aea69a5" + } + Frame { + msec: 6048 + hash: "403e1f235770f2b7c8b1b2e86aea69a5" + } + Frame { + msec: 6064 + hash: "32ff9f959598972f5a264418587dca1f" + } + Frame { + msec: 6080 + hash: "b4c7c07e52a684f7ce21e47a4d66356a" + } + Frame { + msec: 6096 + hash: "e0f214bed2c3a31f473952929b8f3ea9" + } + Frame { + msec: 6112 + hash: "15328b8a205965f3f29fc63a6a8ac8ed" + } + Frame { + msec: 6128 + hash: "72c46ed63633e6879373f4783df25d8b" + } + Frame { + msec: 6144 + hash: "ae73e0adbdaacc648c2e97840cef4194" + } + Frame { + msec: 6160 + hash: "df9451c6634d72e6f794e962b3591086" + } + Frame { + msec: 6176 + hash: "773e10bbd133e64457e7ddbc73a10fc2" + } + Frame { + msec: 6192 + hash: "c79abb97eb86761b69053d77156dffd4" + } + Frame { + msec: 6208 + hash: "d927934b19ffd55ea7cea1916983351a" + } + Frame { + msec: 6224 + hash: "ae5058d935c1e44d103be66921b19e77" + } + Frame { + msec: 6240 + hash: "b6a1446b6be054d5785ba52ac23f8aa8" + } + Frame { + msec: 6256 + hash: "3dffbffded44249fdbe58aecd24ab97f" + } + Frame { + msec: 6272 + hash: "56445ab8554a23a786b70e4fd9f40451" + } + Frame { + msec: 6288 + hash: "56445ab8554a23a786b70e4fd9f40451" + } + Frame { + msec: 6304 + hash: "257ce16f529b99f28beb2e57625f52ee" + } + Frame { + msec: 6320 + hash: "257ce16f529b99f28beb2e57625f52ee" + } + Frame { + msec: 6336 + hash: "257ce16f529b99f28beb2e57625f52ee" + } + Frame { + msec: 6352 + hash: "257ce16f529b99f28beb2e57625f52ee" + } + Frame { + msec: 6368 + hash: "257ce16f529b99f28beb2e57625f52ee" + } + Frame { + msec: 6384 + hash: "cb2b0ddbc7b8485fbf32a537e5a98d0e" + } + Frame { + msec: 6400 + hash: "cb2b0ddbc7b8485fbf32a537e5a98d0e" + } + Frame { + msec: 6416 + hash: "cb2b0ddbc7b8485fbf32a537e5a98d0e" + } + Frame { + msec: 6432 + hash: "cb2b0ddbc7b8485fbf32a537e5a98d0e" + } + Frame { + msec: 6448 + hash: "cb2b0ddbc7b8485fbf32a537e5a98d0e" + } + Frame { + msec: 6464 + hash: "fa87436d5e51122022a005d815f97c32" + } + Frame { + msec: 6480 + hash: "fa87436d5e51122022a005d815f97c32" + } + Frame { + msec: 6496 + hash: "fa87436d5e51122022a005d815f97c32" + } + Frame { + msec: 6512 + hash: "fa87436d5e51122022a005d815f97c32" + } + Frame { + msec: 6528 + hash: "fa87436d5e51122022a005d815f97c32" + } + Frame { + msec: 6544 + hash: "fa87436d5e51122022a005d815f97c32" + } + Frame { + msec: 6560 + hash: "fa87436d5e51122022a005d815f97c32" + } + Frame { + msec: 6576 + hash: "fa87436d5e51122022a005d815f97c32" + } + Frame { + msec: 6592 + hash: "fa87436d5e51122022a005d815f97c32" + } + Frame { + msec: 6608 + hash: "fa87436d5e51122022a005d815f97c32" + } + Frame { + msec: 6624 + hash: "fa87436d5e51122022a005d815f97c32" + } + Frame { + msec: 6640 + hash: "fa87436d5e51122022a005d815f97c32" + } + Frame { + msec: 6656 + hash: "fa87436d5e51122022a005d815f97c32" + } + Frame { + msec: 6672 + hash: "fa87436d5e51122022a005d815f97c32" + } + Frame { + msec: 6688 + hash: "fa87436d5e51122022a005d815f97c32" + } + Frame { + msec: 6704 + hash: "da52e87ccd157c0330c07e480b8b0c06" + } + Frame { + msec: 6720 + hash: "da52e87ccd157c0330c07e480b8b0c06" + } + Frame { + msec: 6736 + image: "follow.7.png" + } + Frame { + msec: 6752 + hash: "da52e87ccd157c0330c07e480b8b0c06" + } + Frame { + msec: 6768 + hash: "da52e87ccd157c0330c07e480b8b0c06" + } + Frame { + msec: 6784 + hash: "da52e87ccd157c0330c07e480b8b0c06" + } + Frame { + msec: 6800 + hash: "da52e87ccd157c0330c07e480b8b0c06" + } + Frame { + msec: 6816 + hash: "da52e87ccd157c0330c07e480b8b0c06" + } + Frame { + msec: 6832 + hash: "257ce16f529b99f28beb2e57625f52ee" + } + Key { + type: 6 + key: 16777249 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 6848 + hash: "56445ab8554a23a786b70e4fd9f40451" + } + Frame { + msec: 6864 + hash: "56445ab8554a23a786b70e4fd9f40451" + } + Frame { + msec: 6880 + hash: "56445ab8554a23a786b70e4fd9f40451" + } + Frame { + msec: 6896 + hash: "56445ab8554a23a786b70e4fd9f40451" + } + Frame { + msec: 6912 + hash: "56445ab8554a23a786b70e4fd9f40451" + } + Frame { + msec: 6928 + hash: "56445ab8554a23a786b70e4fd9f40451" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/follow.qml b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/follow.qml new file mode 100644 index 00000000..0097449c --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativespringanimation/follow.qml @@ -0,0 +1,79 @@ +import QtQuick 1.0 + +Rectangle { + color: "#ffffff" + width: 320; height: 240 + + Rectangle { + id: rect + color: "#00ff00" + y: 200; width: 60; height: 20 + SequentialAnimation on y { + loops: Animation.Infinite + NumberAnimation { + to: 20; duration: 500 + easing.type: "InOutQuad" + } + NumberAnimation { + to: 200; duration: 2000 + easing.type: "OutBounce" + } + PauseAnimation { duration: 1000 } + } + } + + // Velocity + Rectangle { + color: "#ff0000" + x: rect.width; width: rect.width; height: 20 + y: rect.y + Behavior on y { SpringAnimation { velocity: 200 } } + } + + // Spring + Rectangle { + color: "#ff0000" + x: rect.width * 2; width: rect.width/2; height: 20 + y: rect.y + Behavior on y { SpringAnimation { spring: 1.0; damping: 0.2 } } + } + Rectangle { + color: "#880000" + x: rect.width * 2.5; width: rect.width/2; height: 20 + y: rect.y + Behavior on y { SpringAnimation { spring: 1.0; damping: 0.2; mass: 3.0 } } // "heavier" object + } + + // Follow mouse + MouseArea { + id: mouseRegion + anchors.fill: parent + Rectangle { + id: ball + property int targetX: mouseRegion.mouseX - 10 + property int targetY: mouseRegion.mouseY - 10 + + x: targetX + y: targetY + width: 20; height: 20 + radius: 10 + color: "#0000ff" + + Behavior on x { SpringAnimation { spring: 1.0; damping: 0.05; epsilon: 0.25 } } + Behavior on y { SpringAnimation { spring: 1.0; damping: 0.05; epsilon: 0.25 } } + + states: [ + State { + name: "following" + when: ball.x != ball.targetX || ball.y != ball.targetY + PropertyChanges { target: ball; color: "#ff0000" } + } + ] + transitions: [ + Transition { + ColorAnimation { duration: 200 } + } + ] + } + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/justify.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/justify.0.png new file mode 100644 index 00000000..74c6934c Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/justify.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/justify.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/justify.qml new file mode 100644 index 00000000..e4dbeb1b --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/justify.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "justify.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/multilineAlign.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/multilineAlign.0.png new file mode 100644 index 00000000..8b6329d9 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/multilineAlign.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/multilineAlign.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/multilineAlign.qml new file mode 100644 index 00000000..5485174e --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-MAC/multilineAlign.qml @@ -0,0 +1,247 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "multilineAlign.0.png" + } + Frame { + msec: 32 + hash: "3fc7ab44f913d350f7aef342b958e56d" + } + Frame { + msec: 48 + hash: "3fc7ab44f913d350f7aef342b958e56d" + } + Frame { + msec: 64 + hash: "3fc7ab44f913d350f7aef342b958e56d" + } + Frame { + msec: 80 + hash: "3fc7ab44f913d350f7aef342b958e56d" + } + Frame { + msec: 96 + hash: "3fc7ab44f913d350f7aef342b958e56d" + } + Frame { + msec: 112 + hash: "3fc7ab44f913d350f7aef342b958e56d" + } + Frame { + msec: 128 + hash: "3fc7ab44f913d350f7aef342b958e56d" + } + Frame { + msec: 144 + hash: "3fc7ab44f913d350f7aef342b958e56d" + } + Frame { + msec: 160 + hash: "3fc7ab44f913d350f7aef342b958e56d" + } + Frame { + msec: 176 + hash: "a495a8a95c8aa82ac437c2f2970bd42d" + } + Frame { + msec: 192 + hash: "a495a8a95c8aa82ac437c2f2970bd42d" + } + Frame { + msec: 208 + hash: "a495a8a95c8aa82ac437c2f2970bd42d" + } + Frame { + msec: 224 + hash: "a495a8a95c8aa82ac437c2f2970bd42d" + } + Frame { + msec: 240 + hash: "a495a8a95c8aa82ac437c2f2970bd42d" + } + Frame { + msec: 256 + hash: "a495a8a95c8aa82ac437c2f2970bd42d" + } + Frame { + msec: 272 + hash: "a495a8a95c8aa82ac437c2f2970bd42d" + } + Frame { + msec: 288 + hash: "a495a8a95c8aa82ac437c2f2970bd42d" + } + Frame { + msec: 304 + hash: "a495a8a95c8aa82ac437c2f2970bd42d" + } + Frame { + msec: 320 + hash: "a495a8a95c8aa82ac437c2f2970bd42d" + } + Frame { + msec: 336 + hash: "e2d2a6e60537b9a434d0029ef5ff26dc" + } + Frame { + msec: 352 + hash: "e2d2a6e60537b9a434d0029ef5ff26dc" + } + Frame { + msec: 368 + hash: "e2d2a6e60537b9a434d0029ef5ff26dc" + } + Frame { + msec: 384 + hash: "e2d2a6e60537b9a434d0029ef5ff26dc" + } + Frame { + msec: 400 + hash: "e2d2a6e60537b9a434d0029ef5ff26dc" + } + Frame { + msec: 416 + hash: "e2d2a6e60537b9a434d0029ef5ff26dc" + } + Frame { + msec: 432 + hash: "e2d2a6e60537b9a434d0029ef5ff26dc" + } + Frame { + msec: 448 + hash: "e2d2a6e60537b9a434d0029ef5ff26dc" + } + Frame { + msec: 464 + hash: "e2d2a6e60537b9a434d0029ef5ff26dc" + } + Frame { + msec: 480 + hash: "e2d2a6e60537b9a434d0029ef5ff26dc" + } + Frame { + msec: 496 + hash: "00cba961e67c2124ace75dddb657cd6c" + } + Frame { + msec: 512 + hash: "00cba961e67c2124ace75dddb657cd6c" + } + Frame { + msec: 528 + hash: "00cba961e67c2124ace75dddb657cd6c" + } + Frame { + msec: 544 + hash: "00cba961e67c2124ace75dddb657cd6c" + } + Frame { + msec: 560 + hash: "00cba961e67c2124ace75dddb657cd6c" + } + Frame { + msec: 576 + hash: "00cba961e67c2124ace75dddb657cd6c" + } + Frame { + msec: 592 + hash: "00cba961e67c2124ace75dddb657cd6c" + } + Frame { + msec: 608 + hash: "00cba961e67c2124ace75dddb657cd6c" + } + Frame { + msec: 624 + hash: "00cba961e67c2124ace75dddb657cd6c" + } + Frame { + msec: 640 + hash: "00cba961e67c2124ace75dddb657cd6c" + } + Frame { + msec: 656 + hash: "31d518de83e195def2d957b7d86b98e5" + } + Frame { + msec: 672 + hash: "31d518de83e195def2d957b7d86b98e5" + } + Frame { + msec: 688 + hash: "31d518de83e195def2d957b7d86b98e5" + } + Frame { + msec: 704 + hash: "31d518de83e195def2d957b7d86b98e5" + } + Frame { + msec: 720 + hash: "31d518de83e195def2d957b7d86b98e5" + } + Frame { + msec: 736 + hash: "31d518de83e195def2d957b7d86b98e5" + } + Frame { + msec: 752 + hash: "31d518de83e195def2d957b7d86b98e5" + } + Frame { + msec: 768 + hash: "31d518de83e195def2d957b7d86b98e5" + } + Frame { + msec: 784 + hash: "31d518de83e195def2d957b7d86b98e5" + } + Frame { + msec: 800 + hash: "31d518de83e195def2d957b7d86b98e5" + } + Frame { + msec: 816 + hash: "31d518de83e195def2d957b7d86b98e5" + } + Frame { + msec: 832 + hash: "31d518de83e195def2d957b7d86b98e5" + } + Frame { + msec: 848 + hash: "31d518de83e195def2d957b7d86b98e5" + } + Frame { + msec: 864 + hash: "31d518de83e195def2d957b7d86b98e5" + } + Frame { + msec: 880 + hash: "31d518de83e195def2d957b7d86b98e5" + } + Frame { + msec: 896 + hash: "31d518de83e195def2d957b7d86b98e5" + } + Frame { + msec: 912 + hash: "31d518de83e195def2d957b7d86b98e5" + } + Frame { + msec: 928 + hash: "31d518de83e195def2d957b7d86b98e5" + } + Frame { + msec: 944 + hash: "31d518de83e195def2d957b7d86b98e5" + } + Frame { + msec: 960 + hash: "31d518de83e195def2d957b7d86b98e5" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-X11/multilineAlign.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-X11/multilineAlign.0.png new file mode 100644 index 00000000..38f20513 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-X11/multilineAlign.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-X11/multilineAlign.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-X11/multilineAlign.qml new file mode 100644 index 00000000..75e68591 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data-X11/multilineAlign.qml @@ -0,0 +1,247 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "multilineAlign.0.png" + } + Frame { + msec: 32 + hash: "377fd9e347a2e6e0930d1422ce744c5c" + } + Frame { + msec: 48 + hash: "377fd9e347a2e6e0930d1422ce744c5c" + } + Frame { + msec: 64 + hash: "377fd9e347a2e6e0930d1422ce744c5c" + } + Frame { + msec: 80 + hash: "377fd9e347a2e6e0930d1422ce744c5c" + } + Frame { + msec: 96 + hash: "377fd9e347a2e6e0930d1422ce744c5c" + } + Frame { + msec: 112 + hash: "377fd9e347a2e6e0930d1422ce744c5c" + } + Frame { + msec: 128 + hash: "377fd9e347a2e6e0930d1422ce744c5c" + } + Frame { + msec: 144 + hash: "377fd9e347a2e6e0930d1422ce744c5c" + } + Frame { + msec: 160 + hash: "377fd9e347a2e6e0930d1422ce744c5c" + } + Frame { + msec: 176 + hash: "36106ba13106d262c02c67e82bba1443" + } + Frame { + msec: 192 + hash: "36106ba13106d262c02c67e82bba1443" + } + Frame { + msec: 208 + hash: "36106ba13106d262c02c67e82bba1443" + } + Frame { + msec: 224 + hash: "36106ba13106d262c02c67e82bba1443" + } + Frame { + msec: 240 + hash: "36106ba13106d262c02c67e82bba1443" + } + Frame { + msec: 256 + hash: "36106ba13106d262c02c67e82bba1443" + } + Frame { + msec: 272 + hash: "36106ba13106d262c02c67e82bba1443" + } + Frame { + msec: 288 + hash: "36106ba13106d262c02c67e82bba1443" + } + Frame { + msec: 304 + hash: "36106ba13106d262c02c67e82bba1443" + } + Frame { + msec: 320 + hash: "36106ba13106d262c02c67e82bba1443" + } + Frame { + msec: 336 + hash: "509d31a486ae2f83055b52ec12f33e76" + } + Frame { + msec: 352 + hash: "509d31a486ae2f83055b52ec12f33e76" + } + Frame { + msec: 368 + hash: "509d31a486ae2f83055b52ec12f33e76" + } + Frame { + msec: 384 + hash: "509d31a486ae2f83055b52ec12f33e76" + } + Frame { + msec: 400 + hash: "509d31a486ae2f83055b52ec12f33e76" + } + Frame { + msec: 416 + hash: "509d31a486ae2f83055b52ec12f33e76" + } + Frame { + msec: 432 + hash: "509d31a486ae2f83055b52ec12f33e76" + } + Frame { + msec: 448 + hash: "509d31a486ae2f83055b52ec12f33e76" + } + Frame { + msec: 464 + hash: "509d31a486ae2f83055b52ec12f33e76" + } + Frame { + msec: 480 + hash: "509d31a486ae2f83055b52ec12f33e76" + } + Frame { + msec: 496 + hash: "09b9249750ba637ef659cbc7b9a6055f" + } + Frame { + msec: 512 + hash: "09b9249750ba637ef659cbc7b9a6055f" + } + Frame { + msec: 528 + hash: "09b9249750ba637ef659cbc7b9a6055f" + } + Frame { + msec: 544 + hash: "09b9249750ba637ef659cbc7b9a6055f" + } + Frame { + msec: 560 + hash: "09b9249750ba637ef659cbc7b9a6055f" + } + Frame { + msec: 576 + hash: "09b9249750ba637ef659cbc7b9a6055f" + } + Frame { + msec: 592 + hash: "09b9249750ba637ef659cbc7b9a6055f" + } + Frame { + msec: 608 + hash: "09b9249750ba637ef659cbc7b9a6055f" + } + Frame { + msec: 624 + hash: "09b9249750ba637ef659cbc7b9a6055f" + } + Frame { + msec: 640 + hash: "09b9249750ba637ef659cbc7b9a6055f" + } + Frame { + msec: 656 + hash: "1ac7017fcf7c9775b66ed1fb78930a45" + } + Frame { + msec: 672 + hash: "1ac7017fcf7c9775b66ed1fb78930a45" + } + Frame { + msec: 688 + hash: "1ac7017fcf7c9775b66ed1fb78930a45" + } + Frame { + msec: 704 + hash: "1ac7017fcf7c9775b66ed1fb78930a45" + } + Frame { + msec: 720 + hash: "1ac7017fcf7c9775b66ed1fb78930a45" + } + Frame { + msec: 736 + hash: "1ac7017fcf7c9775b66ed1fb78930a45" + } + Frame { + msec: 752 + hash: "1ac7017fcf7c9775b66ed1fb78930a45" + } + Frame { + msec: 768 + hash: "1ac7017fcf7c9775b66ed1fb78930a45" + } + Frame { + msec: 784 + hash: "1ac7017fcf7c9775b66ed1fb78930a45" + } + Frame { + msec: 800 + hash: "1ac7017fcf7c9775b66ed1fb78930a45" + } + Frame { + msec: 816 + hash: "1ac7017fcf7c9775b66ed1fb78930a45" + } + Frame { + msec: 832 + hash: "1ac7017fcf7c9775b66ed1fb78930a45" + } + Frame { + msec: 848 + hash: "1ac7017fcf7c9775b66ed1fb78930a45" + } + Frame { + msec: 864 + hash: "1ac7017fcf7c9775b66ed1fb78930a45" + } + Frame { + msec: 880 + hash: "1ac7017fcf7c9775b66ed1fb78930a45" + } + Frame { + msec: 896 + hash: "1ac7017fcf7c9775b66ed1fb78930a45" + } + Frame { + msec: 912 + hash: "1ac7017fcf7c9775b66ed1fb78930a45" + } + Frame { + msec: 928 + hash: "1ac7017fcf7c9775b66ed1fb78930a45" + } + Frame { + msec: 944 + hash: "1ac7017fcf7c9775b66ed1fb78930a45" + } + Frame { + msec: 960 + hash: "1ac7017fcf7c9775b66ed1fb78930a45" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data/multilineAlign.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data/multilineAlign.0.png new file mode 100644 index 00000000..e6b2b3cc Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data/multilineAlign.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data/multilineAlign.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data/multilineAlign.qml new file mode 100644 index 00000000..1b43aa36 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/data/multilineAlign.qml @@ -0,0 +1,247 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + hash: "1ec47db85ba34bf1900445a2ab87b5e3" + } + Frame { + msec: 32 + hash: "1ec47db85ba34bf1900445a2ab87b5e3" + } + Frame { + msec: 48 + hash: "1ec47db85ba34bf1900445a2ab87b5e3" + } + Frame { + msec: 64 + hash: "1ec47db85ba34bf1900445a2ab87b5e3" + } + Frame { + msec: 80 + hash: "1ec47db85ba34bf1900445a2ab87b5e3" + } + Frame { + msec: 96 + hash: "1ec47db85ba34bf1900445a2ab87b5e3" + } + Frame { + msec: 112 + hash: "1ec47db85ba34bf1900445a2ab87b5e3" + } + Frame { + msec: 128 + hash: "1ec47db85ba34bf1900445a2ab87b5e3" + } + Frame { + msec: 144 + hash: "1ec47db85ba34bf1900445a2ab87b5e3" + } + Frame { + msec: 160 + hash: "1ec47db85ba34bf1900445a2ab87b5e3" + } + Frame { + msec: 176 + hash: "1fc2a63fa95e277bed60abfdecc7c82f" + } + Frame { + msec: 192 + hash: "1fc2a63fa95e277bed60abfdecc7c82f" + } + Frame { + msec: 208 + hash: "1fc2a63fa95e277bed60abfdecc7c82f" + } + Frame { + msec: 224 + hash: "1fc2a63fa95e277bed60abfdecc7c82f" + } + Frame { + msec: 240 + hash: "1fc2a63fa95e277bed60abfdecc7c82f" + } + Frame { + msec: 256 + hash: "1fc2a63fa95e277bed60abfdecc7c82f" + } + Frame { + msec: 272 + hash: "1fc2a63fa95e277bed60abfdecc7c82f" + } + Frame { + msec: 288 + hash: "1fc2a63fa95e277bed60abfdecc7c82f" + } + Frame { + msec: 304 + hash: "1fc2a63fa95e277bed60abfdecc7c82f" + } + Frame { + msec: 320 + hash: "1fc2a63fa95e277bed60abfdecc7c82f" + } + Frame { + msec: 336 + hash: "3a4e863d83f5d475e0c8c5121905bd87" + } + Frame { + msec: 352 + hash: "3a4e863d83f5d475e0c8c5121905bd87" + } + Frame { + msec: 368 + hash: "3a4e863d83f5d475e0c8c5121905bd87" + } + Frame { + msec: 384 + hash: "3a4e863d83f5d475e0c8c5121905bd87" + } + Frame { + msec: 400 + hash: "3a4e863d83f5d475e0c8c5121905bd87" + } + Frame { + msec: 416 + hash: "3a4e863d83f5d475e0c8c5121905bd87" + } + Frame { + msec: 432 + hash: "3a4e863d83f5d475e0c8c5121905bd87" + } + Frame { + msec: 448 + hash: "3a4e863d83f5d475e0c8c5121905bd87" + } + Frame { + msec: 464 + hash: "3a4e863d83f5d475e0c8c5121905bd87" + } + Frame { + msec: 480 + hash: "3a4e863d83f5d475e0c8c5121905bd87" + } + Frame { + msec: 496 + hash: "8887c8f40667f65a814d74b6edcfb81c" + } + Frame { + msec: 512 + hash: "8887c8f40667f65a814d74b6edcfb81c" + } + Frame { + msec: 528 + hash: "8887c8f40667f65a814d74b6edcfb81c" + } + Frame { + msec: 544 + hash: "8887c8f40667f65a814d74b6edcfb81c" + } + Frame { + msec: 560 + hash: "8887c8f40667f65a814d74b6edcfb81c" + } + Frame { + msec: 576 + hash: "8887c8f40667f65a814d74b6edcfb81c" + } + Frame { + msec: 592 + hash: "8887c8f40667f65a814d74b6edcfb81c" + } + Frame { + msec: 608 + hash: "8887c8f40667f65a814d74b6edcfb81c" + } + Frame { + msec: 624 + hash: "8887c8f40667f65a814d74b6edcfb81c" + } + Frame { + msec: 640 + hash: "8887c8f40667f65a814d74b6edcfb81c" + } + Frame { + msec: 656 + hash: "436000b48f688120d96919227d9e67b4" + } + Frame { + msec: 672 + hash: "436000b48f688120d96919227d9e67b4" + } + Frame { + msec: 688 + hash: "436000b48f688120d96919227d9e67b4" + } + Frame { + msec: 704 + hash: "436000b48f688120d96919227d9e67b4" + } + Frame { + msec: 720 + hash: "436000b48f688120d96919227d9e67b4" + } + Frame { + msec: 736 + hash: "436000b48f688120d96919227d9e67b4" + } + Frame { + msec: 752 + hash: "436000b48f688120d96919227d9e67b4" + } + Frame { + msec: 768 + hash: "436000b48f688120d96919227d9e67b4" + } + Frame { + msec: 784 + hash: "436000b48f688120d96919227d9e67b4" + } + Frame { + msec: 800 + hash: "436000b48f688120d96919227d9e67b4" + } + Frame { + msec: 816 + hash: "436000b48f688120d96919227d9e67b4" + } + Frame { + msec: 832 + hash: "436000b48f688120d96919227d9e67b4" + } + Frame { + msec: 848 + hash: "436000b48f688120d96919227d9e67b4" + } + Frame { + msec: 864 + hash: "436000b48f688120d96919227d9e67b4" + } + Frame { + msec: 880 + hash: "436000b48f688120d96919227d9e67b4" + } + Frame { + msec: 896 + hash: "436000b48f688120d96919227d9e67b4" + } + Frame { + msec: 912 + hash: "436000b48f688120d96919227d9e67b4" + } + Frame { + msec: 928 + hash: "436000b48f688120d96919227d9e67b4" + } + Frame { + msec: 944 + hash: "436000b48f688120d96919227d9e67b4" + } + Frame { + msec: 960 + image: "multilineAlign.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/justify.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/justify.qml new file mode 100644 index 00000000..c3a7aaaf --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/justify.qml @@ -0,0 +1,22 @@ +import QtQuick 1.0 +import "../../shared" 1.0 + +Rectangle { + width: 450 + height: 250 + + TestText { + anchors.fill: parent + anchors { leftMargin: 10; rightMargin: 10; topMargin:10; bottomMargin: 10 } + wrapMode: Text.Wrap + horizontalAlignment: Text.AlignJustify + + text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin a aliquet massa. Integer id velit a nibh imperdiet sagittis. Cras fringilla enim non nulla porta bibendum. Integer risus urna, hendrerit non interdum ut, dapibus id velit. Nullam fermentum viverra pellentesque. In molestie scelerisque lorem molestie ultrices. Curabitur dolor arcu, tristique in sodales in, varius sed diam. Quisque magna velit, tincidunt sed ullamcorper sit amet, ornare adipiscing ligula. In hac habitasse platea dictumst. Ut tincidunt urna vel mauris fermentum ornare quis a ligula. Suspendisse cursus volutpat sapien eget cursus." + + Rectangle { + anchors.fill: parent + color: "transparent" + border.color: "red" + } + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/align/multilineAlign.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/multilineAlign.qml new file mode 100644 index 00000000..a4277192 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/align/multilineAlign.qml @@ -0,0 +1,25 @@ +import QtQuick 1.0 +import "../../shared" 1.0 + +/*Tests both the alignments of multiline text, and that + it can deal with changing them properly +*/ +Item{ + width: 100 + height: 80 + property int stage: 0 + onStageChanged: if(stage == 6) Qt.quit(); + TestText{ + text: "I am the very model of a modern major general." + anchors.fill: parent; + wrapMode: Text.WordWrap + horizontalAlignment: (stage<1 ? Text.AlignRight : (stage<3 ? Text.AlignHCenter : Text.AlignLeft)) + verticalAlignment: (stage<2 ? Text.AlignBottom : (stage<4 ? Text.AlignVCenter : Text.AlignTop)) + } + Timer{ + interval: 160 + running: true + repeat: true + onTriggered: stage += 1 + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-MAC/parentanchor.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-MAC/parentanchor.0.png new file mode 100644 index 00000000..1fd02137 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-MAC/parentanchor.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-MAC/parentanchor.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-MAC/parentanchor.qml new file mode 100644 index 00000000..c5a5a761 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-MAC/parentanchor.qml @@ -0,0 +1,131 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "parentanchor.0.png" + } + Frame { + msec: 32 + hash: "f45eda9414f7db5ed1f97a8275459abd" + } + Frame { + msec: 48 + hash: "f45eda9414f7db5ed1f97a8275459abd" + } + Frame { + msec: 64 + hash: "f45eda9414f7db5ed1f97a8275459abd" + } + Frame { + msec: 80 + hash: "f45eda9414f7db5ed1f97a8275459abd" + } + Frame { + msec: 96 + hash: "f45eda9414f7db5ed1f97a8275459abd" + } + Frame { + msec: 112 + hash: "f45eda9414f7db5ed1f97a8275459abd" + } + Frame { + msec: 128 + hash: "f45eda9414f7db5ed1f97a8275459abd" + } + Frame { + msec: 144 + hash: "f45eda9414f7db5ed1f97a8275459abd" + } + Frame { + msec: 160 + hash: "f45eda9414f7db5ed1f97a8275459abd" + } + Frame { + msec: 176 + hash: "f45eda9414f7db5ed1f97a8275459abd" + } + Frame { + msec: 192 + hash: "f45eda9414f7db5ed1f97a8275459abd" + } + Frame { + msec: 208 + hash: "f45eda9414f7db5ed1f97a8275459abd" + } + Frame { + msec: 224 + hash: "f45eda9414f7db5ed1f97a8275459abd" + } + Frame { + msec: 240 + hash: "f45eda9414f7db5ed1f97a8275459abd" + } + Frame { + msec: 256 + hash: "f45eda9414f7db5ed1f97a8275459abd" + } + Frame { + msec: 272 + hash: "f45eda9414f7db5ed1f97a8275459abd" + } + Frame { + msec: 288 + hash: "f45eda9414f7db5ed1f97a8275459abd" + } + Frame { + msec: 304 + hash: "f45eda9414f7db5ed1f97a8275459abd" + } + Frame { + msec: 320 + hash: "f45eda9414f7db5ed1f97a8275459abd" + } + Frame { + msec: 336 + hash: "f45eda9414f7db5ed1f97a8275459abd" + } + Frame { + msec: 352 + hash: "f45eda9414f7db5ed1f97a8275459abd" + } + Frame { + msec: 368 + hash: "f45eda9414f7db5ed1f97a8275459abd" + } + Frame { + msec: 384 + hash: "f45eda9414f7db5ed1f97a8275459abd" + } + Frame { + msec: 400 + hash: "f45eda9414f7db5ed1f97a8275459abd" + } + Frame { + msec: 416 + hash: "f45eda9414f7db5ed1f97a8275459abd" + } + Frame { + msec: 432 + hash: "f45eda9414f7db5ed1f97a8275459abd" + } + Frame { + msec: 448 + hash: "f45eda9414f7db5ed1f97a8275459abd" + } + Frame { + msec: 464 + hash: "f45eda9414f7db5ed1f97a8275459abd" + } + Frame { + msec: 480 + hash: "f45eda9414f7db5ed1f97a8275459abd" + } + Frame { + msec: 496 + hash: "f45eda9414f7db5ed1f97a8275459abd" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-X11/parentanchor.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-X11/parentanchor.0.png new file mode 100644 index 00000000..d85498b4 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-X11/parentanchor.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-X11/parentanchor.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-X11/parentanchor.qml new file mode 100644 index 00000000..4bf06970 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data-X11/parentanchor.qml @@ -0,0 +1,131 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "parentanchor.0.png" + } + Frame { + msec: 32 + hash: "7e082fa05e000cc20fcda7cb61d98edd" + } + Frame { + msec: 48 + hash: "7e082fa05e000cc20fcda7cb61d98edd" + } + Frame { + msec: 64 + hash: "7e082fa05e000cc20fcda7cb61d98edd" + } + Frame { + msec: 80 + hash: "7e082fa05e000cc20fcda7cb61d98edd" + } + Frame { + msec: 96 + hash: "7e082fa05e000cc20fcda7cb61d98edd" + } + Frame { + msec: 112 + hash: "7e082fa05e000cc20fcda7cb61d98edd" + } + Frame { + msec: 128 + hash: "7e082fa05e000cc20fcda7cb61d98edd" + } + Frame { + msec: 144 + hash: "7e082fa05e000cc20fcda7cb61d98edd" + } + Frame { + msec: 160 + hash: "7e082fa05e000cc20fcda7cb61d98edd" + } + Frame { + msec: 176 + hash: "7e082fa05e000cc20fcda7cb61d98edd" + } + Frame { + msec: 192 + hash: "7e082fa05e000cc20fcda7cb61d98edd" + } + Frame { + msec: 208 + hash: "7e082fa05e000cc20fcda7cb61d98edd" + } + Frame { + msec: 224 + hash: "7e082fa05e000cc20fcda7cb61d98edd" + } + Frame { + msec: 240 + hash: "7e082fa05e000cc20fcda7cb61d98edd" + } + Frame { + msec: 256 + hash: "7e082fa05e000cc20fcda7cb61d98edd" + } + Frame { + msec: 272 + hash: "7e082fa05e000cc20fcda7cb61d98edd" + } + Frame { + msec: 288 + hash: "7e082fa05e000cc20fcda7cb61d98edd" + } + Frame { + msec: 304 + hash: "7e082fa05e000cc20fcda7cb61d98edd" + } + Frame { + msec: 320 + hash: "7e082fa05e000cc20fcda7cb61d98edd" + } + Frame { + msec: 336 + hash: "7e082fa05e000cc20fcda7cb61d98edd" + } + Frame { + msec: 352 + hash: "7e082fa05e000cc20fcda7cb61d98edd" + } + Frame { + msec: 368 + hash: "7e082fa05e000cc20fcda7cb61d98edd" + } + Frame { + msec: 384 + hash: "7e082fa05e000cc20fcda7cb61d98edd" + } + Frame { + msec: 400 + hash: "7e082fa05e000cc20fcda7cb61d98edd" + } + Frame { + msec: 416 + hash: "7e082fa05e000cc20fcda7cb61d98edd" + } + Frame { + msec: 432 + hash: "7e082fa05e000cc20fcda7cb61d98edd" + } + Frame { + msec: 448 + hash: "7e082fa05e000cc20fcda7cb61d98edd" + } + Frame { + msec: 464 + hash: "7e082fa05e000cc20fcda7cb61d98edd" + } + Frame { + msec: 480 + hash: "7e082fa05e000cc20fcda7cb61d98edd" + } + Frame { + msec: 496 + hash: "7e082fa05e000cc20fcda7cb61d98edd" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data/parentanchor.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data/parentanchor.qml new file mode 100644 index 00000000..880609b6 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/data/parentanchor.qml @@ -0,0 +1,131 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + hash: "3e022a120a2dbe688d53657508de36cf" + } + Frame { + msec: 32 + hash: "3e022a120a2dbe688d53657508de36cf" + } + Frame { + msec: 48 + hash: "3e022a120a2dbe688d53657508de36cf" + } + Frame { + msec: 64 + hash: "3e022a120a2dbe688d53657508de36cf" + } + Frame { + msec: 80 + hash: "3e022a120a2dbe688d53657508de36cf" + } + Frame { + msec: 96 + hash: "3e022a120a2dbe688d53657508de36cf" + } + Frame { + msec: 112 + hash: "3e022a120a2dbe688d53657508de36cf" + } + Frame { + msec: 128 + hash: "3e022a120a2dbe688d53657508de36cf" + } + Frame { + msec: 144 + hash: "3e022a120a2dbe688d53657508de36cf" + } + Frame { + msec: 160 + hash: "3e022a120a2dbe688d53657508de36cf" + } + Frame { + msec: 176 + hash: "3e022a120a2dbe688d53657508de36cf" + } + Frame { + msec: 192 + hash: "3e022a120a2dbe688d53657508de36cf" + } + Frame { + msec: 208 + hash: "3e022a120a2dbe688d53657508de36cf" + } + Frame { + msec: 224 + hash: "3e022a120a2dbe688d53657508de36cf" + } + Frame { + msec: 240 + hash: "3e022a120a2dbe688d53657508de36cf" + } + Frame { + msec: 256 + hash: "3e022a120a2dbe688d53657508de36cf" + } + Frame { + msec: 272 + hash: "3e022a120a2dbe688d53657508de36cf" + } + Frame { + msec: 288 + hash: "3e022a120a2dbe688d53657508de36cf" + } + Frame { + msec: 304 + hash: "3e022a120a2dbe688d53657508de36cf" + } + Frame { + msec: 320 + hash: "3e022a120a2dbe688d53657508de36cf" + } + Frame { + msec: 336 + hash: "3e022a120a2dbe688d53657508de36cf" + } + Frame { + msec: 352 + hash: "3e022a120a2dbe688d53657508de36cf" + } + Frame { + msec: 368 + hash: "3e022a120a2dbe688d53657508de36cf" + } + Frame { + msec: 384 + hash: "3e022a120a2dbe688d53657508de36cf" + } + Frame { + msec: 400 + hash: "3e022a120a2dbe688d53657508de36cf" + } + Frame { + msec: 416 + hash: "3e022a120a2dbe688d53657508de36cf" + } + Frame { + msec: 432 + hash: "3e022a120a2dbe688d53657508de36cf" + } + Frame { + msec: 448 + hash: "3e022a120a2dbe688d53657508de36cf" + } + Frame { + msec: 464 + hash: "3e022a120a2dbe688d53657508de36cf" + } + Frame { + msec: 480 + hash: "3e022a120a2dbe688d53657508de36cf" + } + Frame { + msec: 496 + hash: "3e022a120a2dbe688d53657508de36cf" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/parentanchor.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/parentanchor.qml new file mode 100644 index 00000000..618a65f0 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/baseline/parentanchor.qml @@ -0,0 +1,15 @@ +import QtQuick 1.0 +import "../../shared" 1.0 + +Rectangle { + id: s; width: 600; height: 100; + property string text: "The quick brown fox jumps over the lazy dog." + TestText { + text: s.text + anchors.verticalCenter: s.verticalCenter + } + TestText { + text: s.text + anchors.baseline: s.verticalCenter + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/QTBUG-14469.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/QTBUG-14469.qml new file mode 100644 index 00000000..aca7c2dd --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/QTBUG-14469.qml @@ -0,0 +1,23 @@ +import QtQuick 1.0 +import "../../shared" 1.0 + +/* The bug was that if text was set to "" or the size didn't increase, the text didn't repaint + ended up only repainting for 1, 10, 11, 12. + Test passes if it goes from "" to 13 back to "" with all numbers being painted (and the text disappearing at 0) + */ + +Item{ + width: 80 + height: 80 + property int val: 0 + Text{ + id: txt; + text: val == 0 ? "" : val + } + Timer{ + interval: 100 + running: true + repeat: true; + onTriggered: {val = (val + 1) % 14;} + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.0.png new file mode 100644 index 00000000..4d6bf55f Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.1.png new file mode 100644 index 00000000..a75da16e Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.qml new file mode 100644 index 00000000..002e1c8d --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-MAC/QTBUG-14469.qml @@ -0,0 +1,475 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "QTBUG-14469.0.png" + } + Frame { + msec: 32 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 48 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 64 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 80 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 96 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 112 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 128 + hash: "cf74324c2a0c8f45c728d42390aac1e0" + } + Frame { + msec: 144 + hash: "cf74324c2a0c8f45c728d42390aac1e0" + } + Frame { + msec: 160 + hash: "cf74324c2a0c8f45c728d42390aac1e0" + } + Frame { + msec: 176 + hash: "cf74324c2a0c8f45c728d42390aac1e0" + } + Frame { + msec: 192 + hash: "cf74324c2a0c8f45c728d42390aac1e0" + } + Frame { + msec: 208 + hash: "cf74324c2a0c8f45c728d42390aac1e0" + } + Frame { + msec: 224 + hash: "07c938ac9ff9f591e84fc553291c7c49" + } + Frame { + msec: 240 + hash: "07c938ac9ff9f591e84fc553291c7c49" + } + Frame { + msec: 256 + hash: "07c938ac9ff9f591e84fc553291c7c49" + } + Frame { + msec: 272 + hash: "07c938ac9ff9f591e84fc553291c7c49" + } + Frame { + msec: 288 + hash: "07c938ac9ff9f591e84fc553291c7c49" + } + Frame { + msec: 304 + hash: "07c938ac9ff9f591e84fc553291c7c49" + } + Frame { + msec: 320 + hash: "7b585eb6226e6ce2de355f9730dba377" + } + Frame { + msec: 336 + hash: "7b585eb6226e6ce2de355f9730dba377" + } + Frame { + msec: 352 + hash: "7b585eb6226e6ce2de355f9730dba377" + } + Frame { + msec: 368 + hash: "7b585eb6226e6ce2de355f9730dba377" + } + Frame { + msec: 384 + hash: "7b585eb6226e6ce2de355f9730dba377" + } + Frame { + msec: 400 + hash: "7b585eb6226e6ce2de355f9730dba377" + } + Frame { + msec: 416 + hash: "a7817a7d902ab2fe2875183feb6513dd" + } + Frame { + msec: 432 + hash: "a7817a7d902ab2fe2875183feb6513dd" + } + Frame { + msec: 448 + hash: "a7817a7d902ab2fe2875183feb6513dd" + } + Frame { + msec: 464 + hash: "a7817a7d902ab2fe2875183feb6513dd" + } + Frame { + msec: 480 + hash: "a7817a7d902ab2fe2875183feb6513dd" + } + Frame { + msec: 496 + hash: "a7817a7d902ab2fe2875183feb6513dd" + } + Frame { + msec: 512 + hash: "a7817a7d902ab2fe2875183feb6513dd" + } + Frame { + msec: 528 + hash: "067dfe70eca44e2157b723858897c90e" + } + Frame { + msec: 544 + hash: "067dfe70eca44e2157b723858897c90e" + } + Frame { + msec: 560 + hash: "067dfe70eca44e2157b723858897c90e" + } + Frame { + msec: 576 + hash: "067dfe70eca44e2157b723858897c90e" + } + Frame { + msec: 592 + hash: "067dfe70eca44e2157b723858897c90e" + } + Frame { + msec: 608 + hash: "067dfe70eca44e2157b723858897c90e" + } + Frame { + msec: 624 + hash: "b1ac0015f173bf5789daa5d45d04dadd" + } + Frame { + msec: 640 + hash: "b1ac0015f173bf5789daa5d45d04dadd" + } + Frame { + msec: 656 + hash: "b1ac0015f173bf5789daa5d45d04dadd" + } + Frame { + msec: 672 + hash: "b1ac0015f173bf5789daa5d45d04dadd" + } + Frame { + msec: 688 + hash: "b1ac0015f173bf5789daa5d45d04dadd" + } + Frame { + msec: 704 + hash: "b1ac0015f173bf5789daa5d45d04dadd" + } + Frame { + msec: 720 + hash: "431cb09ccdcfab7c3ff7d498aa1f0816" + } + Frame { + msec: 736 + hash: "431cb09ccdcfab7c3ff7d498aa1f0816" + } + Frame { + msec: 752 + hash: "431cb09ccdcfab7c3ff7d498aa1f0816" + } + Frame { + msec: 768 + hash: "431cb09ccdcfab7c3ff7d498aa1f0816" + } + Frame { + msec: 784 + hash: "431cb09ccdcfab7c3ff7d498aa1f0816" + } + Frame { + msec: 800 + hash: "431cb09ccdcfab7c3ff7d498aa1f0816" + } + Frame { + msec: 816 + hash: "533b23f29fe5f9dc85a6ca390c6dd023" + } + Frame { + msec: 832 + hash: "533b23f29fe5f9dc85a6ca390c6dd023" + } + Frame { + msec: 848 + hash: "533b23f29fe5f9dc85a6ca390c6dd023" + } + Frame { + msec: 864 + hash: "533b23f29fe5f9dc85a6ca390c6dd023" + } + Frame { + msec: 880 + hash: "533b23f29fe5f9dc85a6ca390c6dd023" + } + Frame { + msec: 896 + hash: "533b23f29fe5f9dc85a6ca390c6dd023" + } + Frame { + msec: 912 + hash: "533b23f29fe5f9dc85a6ca390c6dd023" + } + Frame { + msec: 928 + hash: "cd397908009ddf16ec3101efb0d7468e" + } + Frame { + msec: 944 + hash: "cd397908009ddf16ec3101efb0d7468e" + } + Frame { + msec: 960 + hash: "cd397908009ddf16ec3101efb0d7468e" + } + Frame { + msec: 976 + image: "QTBUG-14469.1.png" + } + Frame { + msec: 992 + hash: "cd397908009ddf16ec3101efb0d7468e" + } + Frame { + msec: 1008 + hash: "cd397908009ddf16ec3101efb0d7468e" + } + Frame { + msec: 1024 + hash: "a1eebf1a97314851b5154802f05abe8d" + } + Frame { + msec: 1040 + hash: "a1eebf1a97314851b5154802f05abe8d" + } + Frame { + msec: 1056 + hash: "a1eebf1a97314851b5154802f05abe8d" + } + Frame { + msec: 1072 + hash: "a1eebf1a97314851b5154802f05abe8d" + } + Frame { + msec: 1088 + hash: "a1eebf1a97314851b5154802f05abe8d" + } + Frame { + msec: 1104 + hash: "a1eebf1a97314851b5154802f05abe8d" + } + Frame { + msec: 1120 + hash: "71d91d85b9c555eb9b39dac79b35dd46" + } + Frame { + msec: 1136 + hash: "71d91d85b9c555eb9b39dac79b35dd46" + } + Frame { + msec: 1152 + hash: "71d91d85b9c555eb9b39dac79b35dd46" + } + Frame { + msec: 1168 + hash: "71d91d85b9c555eb9b39dac79b35dd46" + } + Frame { + msec: 1184 + hash: "71d91d85b9c555eb9b39dac79b35dd46" + } + Frame { + msec: 1200 + hash: "71d91d85b9c555eb9b39dac79b35dd46" + } + Frame { + msec: 1216 + hash: "b1da2d1f4aad2a197a80788607bd867d" + } + Frame { + msec: 1232 + hash: "b1da2d1f4aad2a197a80788607bd867d" + } + Frame { + msec: 1248 + hash: "b1da2d1f4aad2a197a80788607bd867d" + } + Frame { + msec: 1264 + hash: "b1da2d1f4aad2a197a80788607bd867d" + } + Frame { + msec: 1280 + hash: "b1da2d1f4aad2a197a80788607bd867d" + } + Frame { + msec: 1296 + hash: "b1da2d1f4aad2a197a80788607bd867d" + } + Frame { + msec: 1312 + hash: "b1da2d1f4aad2a197a80788607bd867d" + } + Frame { + msec: 1328 + hash: "df14e9cfeba3850bae7cad111fdbc8df" + } + Frame { + msec: 1344 + hash: "df14e9cfeba3850bae7cad111fdbc8df" + } + Frame { + msec: 1360 + hash: "df14e9cfeba3850bae7cad111fdbc8df" + } + Frame { + msec: 1376 + hash: "df14e9cfeba3850bae7cad111fdbc8df" + } + Frame { + msec: 1392 + hash: "df14e9cfeba3850bae7cad111fdbc8df" + } + Frame { + msec: 1408 + hash: "df14e9cfeba3850bae7cad111fdbc8df" + } + Frame { + msec: 1424 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 1440 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 1456 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 1472 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 1488 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 1504 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 1520 + hash: "cf74324c2a0c8f45c728d42390aac1e0" + } + Frame { + msec: 1536 + hash: "cf74324c2a0c8f45c728d42390aac1e0" + } + Frame { + msec: 1552 + hash: "cf74324c2a0c8f45c728d42390aac1e0" + } + Frame { + msec: 1568 + hash: "cf74324c2a0c8f45c728d42390aac1e0" + } + Frame { + msec: 1584 + hash: "cf74324c2a0c8f45c728d42390aac1e0" + } + Frame { + msec: 1600 + hash: "cf74324c2a0c8f45c728d42390aac1e0" + } + Frame { + msec: 1616 + hash: "07c938ac9ff9f591e84fc553291c7c49" + } + Frame { + msec: 1632 + hash: "07c938ac9ff9f591e84fc553291c7c49" + } + Frame { + msec: 1648 + hash: "07c938ac9ff9f591e84fc553291c7c49" + } + Frame { + msec: 1664 + hash: "07c938ac9ff9f591e84fc553291c7c49" + } + Frame { + msec: 1680 + hash: "07c938ac9ff9f591e84fc553291c7c49" + } + Frame { + msec: 1696 + hash: "07c938ac9ff9f591e84fc553291c7c49" + } + Frame { + msec: 1712 + hash: "07c938ac9ff9f591e84fc553291c7c49" + } + Frame { + msec: 1728 + hash: "7b585eb6226e6ce2de355f9730dba377" + } + Frame { + msec: 1744 + hash: "7b585eb6226e6ce2de355f9730dba377" + } + Frame { + msec: 1760 + hash: "7b585eb6226e6ce2de355f9730dba377" + } + Frame { + msec: 1776 + hash: "7b585eb6226e6ce2de355f9730dba377" + } + Frame { + msec: 1792 + hash: "7b585eb6226e6ce2de355f9730dba377" + } + Frame { + msec: 1808 + hash: "7b585eb6226e6ce2de355f9730dba377" + } + Frame { + msec: 1824 + hash: "a7817a7d902ab2fe2875183feb6513dd" + } + Frame { + msec: 1840 + hash: "a7817a7d902ab2fe2875183feb6513dd" + } + Frame { + msec: 1856 + hash: "a7817a7d902ab2fe2875183feb6513dd" + } + Frame { + msec: 1872 + hash: "a7817a7d902ab2fe2875183feb6513dd" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-X11/QTBUG-14469.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-X11/QTBUG-14469.0.png new file mode 100644 index 00000000..ee3c7447 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-X11/QTBUG-14469.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-X11/QTBUG-14469.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-X11/QTBUG-14469.qml new file mode 100644 index 00000000..b7708363 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data-X11/QTBUG-14469.qml @@ -0,0 +1,475 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "QTBUG-14469.0.png" + } + Frame { + msec: 32 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 48 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 64 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 80 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 96 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 112 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 128 + hash: "6971eb49a32b8f9e09c24ac1340728cb" + } + Frame { + msec: 144 + hash: "6971eb49a32b8f9e09c24ac1340728cb" + } + Frame { + msec: 160 + hash: "6971eb49a32b8f9e09c24ac1340728cb" + } + Frame { + msec: 176 + hash: "6971eb49a32b8f9e09c24ac1340728cb" + } + Frame { + msec: 192 + hash: "6971eb49a32b8f9e09c24ac1340728cb" + } + Frame { + msec: 208 + hash: "6971eb49a32b8f9e09c24ac1340728cb" + } + Frame { + msec: 224 + hash: "834338b693368e154163f806f49d5ba3" + } + Frame { + msec: 240 + hash: "834338b693368e154163f806f49d5ba3" + } + Frame { + msec: 256 + hash: "834338b693368e154163f806f49d5ba3" + } + Frame { + msec: 272 + hash: "834338b693368e154163f806f49d5ba3" + } + Frame { + msec: 288 + hash: "834338b693368e154163f806f49d5ba3" + } + Frame { + msec: 304 + hash: "834338b693368e154163f806f49d5ba3" + } + Frame { + msec: 320 + hash: "4b79bd737312a5aa026b73c07bfd840c" + } + Frame { + msec: 336 + hash: "4b79bd737312a5aa026b73c07bfd840c" + } + Frame { + msec: 352 + hash: "4b79bd737312a5aa026b73c07bfd840c" + } + Frame { + msec: 368 + hash: "4b79bd737312a5aa026b73c07bfd840c" + } + Frame { + msec: 384 + hash: "4b79bd737312a5aa026b73c07bfd840c" + } + Frame { + msec: 400 + hash: "4b79bd737312a5aa026b73c07bfd840c" + } + Frame { + msec: 416 + hash: "daa67aed3e94e9e8823e8bed04aee960" + } + Frame { + msec: 432 + hash: "daa67aed3e94e9e8823e8bed04aee960" + } + Frame { + msec: 448 + hash: "daa67aed3e94e9e8823e8bed04aee960" + } + Frame { + msec: 464 + hash: "daa67aed3e94e9e8823e8bed04aee960" + } + Frame { + msec: 480 + hash: "daa67aed3e94e9e8823e8bed04aee960" + } + Frame { + msec: 496 + hash: "daa67aed3e94e9e8823e8bed04aee960" + } + Frame { + msec: 512 + hash: "daa67aed3e94e9e8823e8bed04aee960" + } + Frame { + msec: 528 + hash: "75f26b0bbb2663bcadcedce260ef848a" + } + Frame { + msec: 544 + hash: "75f26b0bbb2663bcadcedce260ef848a" + } + Frame { + msec: 560 + hash: "75f26b0bbb2663bcadcedce260ef848a" + } + Frame { + msec: 576 + hash: "75f26b0bbb2663bcadcedce260ef848a" + } + Frame { + msec: 592 + hash: "75f26b0bbb2663bcadcedce260ef848a" + } + Frame { + msec: 608 + hash: "75f26b0bbb2663bcadcedce260ef848a" + } + Frame { + msec: 624 + hash: "6a8c8c0b7727e5e3063d93de59c7f0a2" + } + Frame { + msec: 640 + hash: "6a8c8c0b7727e5e3063d93de59c7f0a2" + } + Frame { + msec: 656 + hash: "6a8c8c0b7727e5e3063d93de59c7f0a2" + } + Frame { + msec: 672 + hash: "6a8c8c0b7727e5e3063d93de59c7f0a2" + } + Frame { + msec: 688 + hash: "6a8c8c0b7727e5e3063d93de59c7f0a2" + } + Frame { + msec: 704 + hash: "6a8c8c0b7727e5e3063d93de59c7f0a2" + } + Frame { + msec: 720 + hash: "d5bb5dd464f38af1790e0109033eb8ad" + } + Frame { + msec: 736 + hash: "d5bb5dd464f38af1790e0109033eb8ad" + } + Frame { + msec: 752 + hash: "d5bb5dd464f38af1790e0109033eb8ad" + } + Frame { + msec: 768 + hash: "d5bb5dd464f38af1790e0109033eb8ad" + } + Frame { + msec: 784 + hash: "d5bb5dd464f38af1790e0109033eb8ad" + } + Frame { + msec: 800 + hash: "d5bb5dd464f38af1790e0109033eb8ad" + } + Frame { + msec: 816 + hash: "8535be394c177dbdcb0435e35680e776" + } + Frame { + msec: 832 + hash: "8535be394c177dbdcb0435e35680e776" + } + Frame { + msec: 848 + hash: "8535be394c177dbdcb0435e35680e776" + } + Frame { + msec: 864 + hash: "8535be394c177dbdcb0435e35680e776" + } + Frame { + msec: 880 + hash: "8535be394c177dbdcb0435e35680e776" + } + Frame { + msec: 896 + hash: "8535be394c177dbdcb0435e35680e776" + } + Frame { + msec: 912 + hash: "8535be394c177dbdcb0435e35680e776" + } + Frame { + msec: 928 + hash: "0ec4eba50495b474faf3feca4be64f7b" + } + Frame { + msec: 944 + hash: "0ec4eba50495b474faf3feca4be64f7b" + } + Frame { + msec: 960 + hash: "0ec4eba50495b474faf3feca4be64f7b" + } + Frame { + msec: 976 + image: "QTBUG-14469.1.png" + } + Frame { + msec: 992 + hash: "0ec4eba50495b474faf3feca4be64f7b" + } + Frame { + msec: 1008 + hash: "0ec4eba50495b474faf3feca4be64f7b" + } + Frame { + msec: 1024 + hash: "43993c686f4c10e91177297d8bb6eae9" + } + Frame { + msec: 1040 + hash: "43993c686f4c10e91177297d8bb6eae9" + } + Frame { + msec: 1056 + hash: "43993c686f4c10e91177297d8bb6eae9" + } + Frame { + msec: 1072 + hash: "43993c686f4c10e91177297d8bb6eae9" + } + Frame { + msec: 1088 + hash: "43993c686f4c10e91177297d8bb6eae9" + } + Frame { + msec: 1104 + hash: "43993c686f4c10e91177297d8bb6eae9" + } + Frame { + msec: 1120 + hash: "e1b070e2bf36e5d8a34cabc0d52b2830" + } + Frame { + msec: 1136 + hash: "e1b070e2bf36e5d8a34cabc0d52b2830" + } + Frame { + msec: 1152 + hash: "e1b070e2bf36e5d8a34cabc0d52b2830" + } + Frame { + msec: 1168 + hash: "e1b070e2bf36e5d8a34cabc0d52b2830" + } + Frame { + msec: 1184 + hash: "e1b070e2bf36e5d8a34cabc0d52b2830" + } + Frame { + msec: 1200 + hash: "e1b070e2bf36e5d8a34cabc0d52b2830" + } + Frame { + msec: 1216 + hash: "5f18ee7410e2d0b4d739abcec1b14bb4" + } + Frame { + msec: 1232 + hash: "5f18ee7410e2d0b4d739abcec1b14bb4" + } + Frame { + msec: 1248 + hash: "5f18ee7410e2d0b4d739abcec1b14bb4" + } + Frame { + msec: 1264 + hash: "5f18ee7410e2d0b4d739abcec1b14bb4" + } + Frame { + msec: 1280 + hash: "5f18ee7410e2d0b4d739abcec1b14bb4" + } + Frame { + msec: 1296 + hash: "5f18ee7410e2d0b4d739abcec1b14bb4" + } + Frame { + msec: 1312 + hash: "5f18ee7410e2d0b4d739abcec1b14bb4" + } + Frame { + msec: 1328 + hash: "34ebe59f64ebc72fc2bf22af4118ec1f" + } + Frame { + msec: 1344 + hash: "34ebe59f64ebc72fc2bf22af4118ec1f" + } + Frame { + msec: 1360 + hash: "34ebe59f64ebc72fc2bf22af4118ec1f" + } + Frame { + msec: 1376 + hash: "34ebe59f64ebc72fc2bf22af4118ec1f" + } + Frame { + msec: 1392 + hash: "34ebe59f64ebc72fc2bf22af4118ec1f" + } + Frame { + msec: 1408 + hash: "34ebe59f64ebc72fc2bf22af4118ec1f" + } + Frame { + msec: 1424 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 1440 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 1456 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 1472 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 1488 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 1504 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 1520 + hash: "6971eb49a32b8f9e09c24ac1340728cb" + } + Frame { + msec: 1536 + hash: "6971eb49a32b8f9e09c24ac1340728cb" + } + Frame { + msec: 1552 + hash: "6971eb49a32b8f9e09c24ac1340728cb" + } + Frame { + msec: 1568 + hash: "6971eb49a32b8f9e09c24ac1340728cb" + } + Frame { + msec: 1584 + hash: "6971eb49a32b8f9e09c24ac1340728cb" + } + Frame { + msec: 1600 + hash: "6971eb49a32b8f9e09c24ac1340728cb" + } + Frame { + msec: 1616 + hash: "834338b693368e154163f806f49d5ba3" + } + Frame { + msec: 1632 + hash: "834338b693368e154163f806f49d5ba3" + } + Frame { + msec: 1648 + hash: "834338b693368e154163f806f49d5ba3" + } + Frame { + msec: 1664 + hash: "834338b693368e154163f806f49d5ba3" + } + Frame { + msec: 1680 + hash: "834338b693368e154163f806f49d5ba3" + } + Frame { + msec: 1696 + hash: "834338b693368e154163f806f49d5ba3" + } + Frame { + msec: 1712 + hash: "834338b693368e154163f806f49d5ba3" + } + Frame { + msec: 1728 + hash: "4b79bd737312a5aa026b73c07bfd840c" + } + Frame { + msec: 1744 + hash: "4b79bd737312a5aa026b73c07bfd840c" + } + Frame { + msec: 1760 + hash: "4b79bd737312a5aa026b73c07bfd840c" + } + Frame { + msec: 1776 + hash: "4b79bd737312a5aa026b73c07bfd840c" + } + Frame { + msec: 1792 + hash: "4b79bd737312a5aa026b73c07bfd840c" + } + Frame { + msec: 1808 + hash: "4b79bd737312a5aa026b73c07bfd840c" + } + Frame { + msec: 1824 + hash: "daa67aed3e94e9e8823e8bed04aee960" + } + Frame { + msec: 1840 + hash: "daa67aed3e94e9e8823e8bed04aee960" + } + Frame { + msec: 1856 + hash: "daa67aed3e94e9e8823e8bed04aee960" + } + Frame { + msec: 1872 + hash: "daa67aed3e94e9e8823e8bed04aee960" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data/QTBUG-14469.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data/QTBUG-14469.0.png new file mode 100644 index 00000000..b8cc1c70 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data/QTBUG-14469.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data/QTBUG-14469.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data/QTBUG-14469.qml new file mode 100644 index 00000000..6201c72f --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/bugs/data/QTBUG-14469.qml @@ -0,0 +1,475 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 32 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 48 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 64 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 80 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 96 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 112 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 128 + hash: "6971eb49a32b8f9e09c24ac1340728cb" + } + Frame { + msec: 144 + hash: "6971eb49a32b8f9e09c24ac1340728cb" + } + Frame { + msec: 160 + hash: "6971eb49a32b8f9e09c24ac1340728cb" + } + Frame { + msec: 176 + hash: "6971eb49a32b8f9e09c24ac1340728cb" + } + Frame { + msec: 192 + hash: "6971eb49a32b8f9e09c24ac1340728cb" + } + Frame { + msec: 208 + hash: "6971eb49a32b8f9e09c24ac1340728cb" + } + Frame { + msec: 224 + hash: "449c6b632a3b85462fe3947a071ffa91" + } + Frame { + msec: 240 + hash: "449c6b632a3b85462fe3947a071ffa91" + } + Frame { + msec: 256 + hash: "449c6b632a3b85462fe3947a071ffa91" + } + Frame { + msec: 272 + hash: "449c6b632a3b85462fe3947a071ffa91" + } + Frame { + msec: 288 + hash: "449c6b632a3b85462fe3947a071ffa91" + } + Frame { + msec: 304 + hash: "449c6b632a3b85462fe3947a071ffa91" + } + Frame { + msec: 320 + hash: "9c804e5eec3b31acd55a510d301cc419" + } + Frame { + msec: 336 + hash: "9c804e5eec3b31acd55a510d301cc419" + } + Frame { + msec: 352 + hash: "9c804e5eec3b31acd55a510d301cc419" + } + Frame { + msec: 368 + hash: "9c804e5eec3b31acd55a510d301cc419" + } + Frame { + msec: 384 + hash: "9c804e5eec3b31acd55a510d301cc419" + } + Frame { + msec: 400 + hash: "9c804e5eec3b31acd55a510d301cc419" + } + Frame { + msec: 416 + hash: "799c7a637b061686c1456c9c535594d3" + } + Frame { + msec: 432 + hash: "799c7a637b061686c1456c9c535594d3" + } + Frame { + msec: 448 + hash: "799c7a637b061686c1456c9c535594d3" + } + Frame { + msec: 464 + hash: "799c7a637b061686c1456c9c535594d3" + } + Frame { + msec: 480 + hash: "799c7a637b061686c1456c9c535594d3" + } + Frame { + msec: 496 + hash: "799c7a637b061686c1456c9c535594d3" + } + Frame { + msec: 512 + hash: "799c7a637b061686c1456c9c535594d3" + } + Frame { + msec: 528 + hash: "51cd7a5bc24cdb50832066cc04cae313" + } + Frame { + msec: 544 + hash: "51cd7a5bc24cdb50832066cc04cae313" + } + Frame { + msec: 560 + hash: "51cd7a5bc24cdb50832066cc04cae313" + } + Frame { + msec: 576 + hash: "51cd7a5bc24cdb50832066cc04cae313" + } + Frame { + msec: 592 + hash: "51cd7a5bc24cdb50832066cc04cae313" + } + Frame { + msec: 608 + hash: "51cd7a5bc24cdb50832066cc04cae313" + } + Frame { + msec: 624 + hash: "bac094de06155c73e4d2d9e2fd99b038" + } + Frame { + msec: 640 + hash: "bac094de06155c73e4d2d9e2fd99b038" + } + Frame { + msec: 656 + hash: "bac094de06155c73e4d2d9e2fd99b038" + } + Frame { + msec: 672 + hash: "bac094de06155c73e4d2d9e2fd99b038" + } + Frame { + msec: 688 + hash: "bac094de06155c73e4d2d9e2fd99b038" + } + Frame { + msec: 704 + hash: "bac094de06155c73e4d2d9e2fd99b038" + } + Frame { + msec: 720 + hash: "3159c438d2cb58e31b4b458ba417f794" + } + Frame { + msec: 736 + hash: "3159c438d2cb58e31b4b458ba417f794" + } + Frame { + msec: 752 + hash: "3159c438d2cb58e31b4b458ba417f794" + } + Frame { + msec: 768 + hash: "3159c438d2cb58e31b4b458ba417f794" + } + Frame { + msec: 784 + hash: "3159c438d2cb58e31b4b458ba417f794" + } + Frame { + msec: 800 + hash: "3159c438d2cb58e31b4b458ba417f794" + } + Frame { + msec: 816 + hash: "a4f9c320c8aa558c66dd25d132bb5834" + } + Frame { + msec: 832 + hash: "a4f9c320c8aa558c66dd25d132bb5834" + } + Frame { + msec: 848 + hash: "a4f9c320c8aa558c66dd25d132bb5834" + } + Frame { + msec: 864 + hash: "a4f9c320c8aa558c66dd25d132bb5834" + } + Frame { + msec: 880 + hash: "a4f9c320c8aa558c66dd25d132bb5834" + } + Frame { + msec: 896 + hash: "a4f9c320c8aa558c66dd25d132bb5834" + } + Frame { + msec: 912 + hash: "a4f9c320c8aa558c66dd25d132bb5834" + } + Frame { + msec: 928 + hash: "b1a283365bbffbc0ddaa4aa661e52add" + } + Frame { + msec: 944 + hash: "b1a283365bbffbc0ddaa4aa661e52add" + } + Frame { + msec: 960 + image: "QTBUG-14469.0.png" + } + Frame { + msec: 976 + hash: "b1a283365bbffbc0ddaa4aa661e52add" + } + Frame { + msec: 992 + hash: "b1a283365bbffbc0ddaa4aa661e52add" + } + Frame { + msec: 1008 + hash: "b1a283365bbffbc0ddaa4aa661e52add" + } + Frame { + msec: 1024 + hash: "57ba00590bed6fe1b0f8fc3e54b9637e" + } + Frame { + msec: 1040 + hash: "57ba00590bed6fe1b0f8fc3e54b9637e" + } + Frame { + msec: 1056 + hash: "57ba00590bed6fe1b0f8fc3e54b9637e" + } + Frame { + msec: 1072 + hash: "57ba00590bed6fe1b0f8fc3e54b9637e" + } + Frame { + msec: 1088 + hash: "57ba00590bed6fe1b0f8fc3e54b9637e" + } + Frame { + msec: 1104 + hash: "57ba00590bed6fe1b0f8fc3e54b9637e" + } + Frame { + msec: 1120 + hash: "e1b070e2bf36e5d8a34cabc0d52b2830" + } + Frame { + msec: 1136 + hash: "e1b070e2bf36e5d8a34cabc0d52b2830" + } + Frame { + msec: 1152 + hash: "e1b070e2bf36e5d8a34cabc0d52b2830" + } + Frame { + msec: 1168 + hash: "e1b070e2bf36e5d8a34cabc0d52b2830" + } + Frame { + msec: 1184 + hash: "e1b070e2bf36e5d8a34cabc0d52b2830" + } + Frame { + msec: 1200 + hash: "e1b070e2bf36e5d8a34cabc0d52b2830" + } + Frame { + msec: 1216 + hash: "bc81044e90cc001fc351a1518ba4b41e" + } + Frame { + msec: 1232 + hash: "bc81044e90cc001fc351a1518ba4b41e" + } + Frame { + msec: 1248 + hash: "bc81044e90cc001fc351a1518ba4b41e" + } + Frame { + msec: 1264 + hash: "bc81044e90cc001fc351a1518ba4b41e" + } + Frame { + msec: 1280 + hash: "bc81044e90cc001fc351a1518ba4b41e" + } + Frame { + msec: 1296 + hash: "bc81044e90cc001fc351a1518ba4b41e" + } + Frame { + msec: 1312 + hash: "bc81044e90cc001fc351a1518ba4b41e" + } + Frame { + msec: 1328 + hash: "18386b56e44b1f3981b3aa8fe980410b" + } + Frame { + msec: 1344 + hash: "18386b56e44b1f3981b3aa8fe980410b" + } + Frame { + msec: 1360 + hash: "18386b56e44b1f3981b3aa8fe980410b" + } + Frame { + msec: 1376 + hash: "18386b56e44b1f3981b3aa8fe980410b" + } + Frame { + msec: 1392 + hash: "18386b56e44b1f3981b3aa8fe980410b" + } + Frame { + msec: 1408 + hash: "18386b56e44b1f3981b3aa8fe980410b" + } + Frame { + msec: 1424 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 1440 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 1456 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 1472 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 1488 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 1504 + hash: "fab978e1e0ee5140d8131320ff2322e9" + } + Frame { + msec: 1520 + hash: "6971eb49a32b8f9e09c24ac1340728cb" + } + Frame { + msec: 1536 + hash: "6971eb49a32b8f9e09c24ac1340728cb" + } + Frame { + msec: 1552 + hash: "6971eb49a32b8f9e09c24ac1340728cb" + } + Frame { + msec: 1568 + hash: "6971eb49a32b8f9e09c24ac1340728cb" + } + Frame { + msec: 1584 + hash: "6971eb49a32b8f9e09c24ac1340728cb" + } + Frame { + msec: 1600 + hash: "6971eb49a32b8f9e09c24ac1340728cb" + } + Frame { + msec: 1616 + hash: "449c6b632a3b85462fe3947a071ffa91" + } + Frame { + msec: 1632 + hash: "449c6b632a3b85462fe3947a071ffa91" + } + Frame { + msec: 1648 + hash: "449c6b632a3b85462fe3947a071ffa91" + } + Frame { + msec: 1664 + hash: "449c6b632a3b85462fe3947a071ffa91" + } + Frame { + msec: 1680 + hash: "449c6b632a3b85462fe3947a071ffa91" + } + Frame { + msec: 1696 + hash: "449c6b632a3b85462fe3947a071ffa91" + } + Frame { + msec: 1712 + hash: "449c6b632a3b85462fe3947a071ffa91" + } + Frame { + msec: 1728 + hash: "9c804e5eec3b31acd55a510d301cc419" + } + Frame { + msec: 1744 + hash: "9c804e5eec3b31acd55a510d301cc419" + } + Frame { + msec: 1760 + hash: "9c804e5eec3b31acd55a510d301cc419" + } + Frame { + msec: 1776 + hash: "9c804e5eec3b31acd55a510d301cc419" + } + Frame { + msec: 1792 + hash: "9c804e5eec3b31acd55a510d301cc419" + } + Frame { + msec: 1808 + hash: "9c804e5eec3b31acd55a510d301cc419" + } + Frame { + msec: 1824 + hash: "799c7a637b061686c1456c9c535594d3" + } + Frame { + msec: 1840 + hash: "799c7a637b061686c1456c9c535594d3" + } + Frame { + msec: 1856 + hash: "799c7a637b061686c1456c9c535594d3" + } + Frame { + msec: 1872 + hash: "799c7a637b061686c1456c9c535594d3" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.0.png new file mode 100644 index 00000000..75478566 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.1.png new file mode 100644 index 00000000..84430bb7 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.qml new file mode 100644 index 00000000..d6d8c2aa --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-MAC/qtbug_14865.qml @@ -0,0 +1,447 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "qtbug_14865.0.png" + } + Frame { + msec: 32 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 48 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 64 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 80 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 96 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 112 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 128 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 144 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 160 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 176 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 192 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 208 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 224 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 240 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 256 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 272 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 288 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 304 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 320 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 336 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 352 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 368 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 384 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 400 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 416 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 432 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 448 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 464 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 480 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 496 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 512 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 528 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 544 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 560 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 576 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 592 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 608 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 624 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 640 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 656 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 672 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 688 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 704 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 720 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 736 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 752 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 768 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 784 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 800 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 816 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 832 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 848 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 864 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 880 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 896 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 912 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 928 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 944 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 960 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 976 + image: "qtbug_14865.1.png" + } + Frame { + msec: 992 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 1008 + hash: "212d34fa7425fe24398c9de6d4f10422" + } + Frame { + msec: 1024 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1040 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1056 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1072 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1088 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1104 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1120 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1136 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1152 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1168 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1184 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1200 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1216 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1232 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1248 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1264 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1280 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1296 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1312 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1328 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1344 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1360 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1376 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1392 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1408 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1424 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1440 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1456 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1472 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1488 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1504 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1520 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1536 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1552 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1568 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1584 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1600 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1616 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1632 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1648 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1664 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1680 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1696 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1712 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1728 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1744 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } + Frame { + msec: 1760 + hash: "3ccd3d26158a50d8f0567bafd7a23e06" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.0.png new file mode 100644 index 00000000..026d06c3 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.1.png new file mode 100644 index 00000000..026d06c3 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.qml new file mode 100644 index 00000000..481c9aa0 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/data-X11/qtbug_14865.qml @@ -0,0 +1,447 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "qtbug_14865.0.png" + } + Frame { + msec: 32 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 48 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 64 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 80 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 96 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 112 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 128 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 144 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 160 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 176 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 192 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 208 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 224 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 240 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 256 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 272 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 288 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 304 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 320 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 336 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 352 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 368 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 384 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 400 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 416 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 432 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 448 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 464 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 480 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 496 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 512 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 528 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 544 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 560 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 576 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 592 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 608 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 624 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 640 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 656 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 672 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 688 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 704 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 720 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 736 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 752 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 768 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 784 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 800 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 816 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 832 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 848 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 864 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 880 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 896 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 912 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 928 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 944 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 960 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 976 + image: "qtbug_14865.1.png" + } + Frame { + msec: 992 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 1008 + hash: "bd09363ea401e07a38d216bf29806592" + } + Frame { + msec: 1024 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1040 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1056 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1072 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1088 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1104 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1120 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1136 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1152 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1168 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1184 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1200 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1216 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1232 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1248 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1264 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1280 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1296 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1312 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1328 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1344 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1360 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1376 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1392 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1408 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1424 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1440 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1456 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1472 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1488 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1504 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1520 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1536 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1552 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1568 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1584 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1600 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1616 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1632 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1648 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1664 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1680 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1696 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1712 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1728 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1744 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } + Frame { + msec: 1760 + hash: "a3e4ab9c6151c9acb4c9dd41c9c2c596" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/data/qtbug_14865.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/data/qtbug_14865.0.png new file mode 100644 index 00000000..a4bae3a2 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/data/qtbug_14865.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/data/qtbug_14865.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/data/qtbug_14865.qml new file mode 100644 index 00000000..a470a66d --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/data/qtbug_14865.qml @@ -0,0 +1,447 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 32 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 48 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 64 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 80 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 96 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 112 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 128 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 144 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 160 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 176 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 192 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 208 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 224 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 240 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 256 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 272 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 288 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 304 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 320 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 336 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 352 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 368 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 384 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 400 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 416 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 432 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 448 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 464 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 480 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 496 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 512 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 528 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 544 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 560 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 576 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 592 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 608 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 624 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 640 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 656 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 672 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 688 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 704 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 720 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 736 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 752 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 768 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 784 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 800 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 816 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 832 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 848 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 864 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 880 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 896 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 912 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 928 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 944 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 960 + image: "qtbug_14865.0.png" + } + Frame { + msec: 976 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 992 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 1008 + hash: "fd4d35de0a95388dd92ffbb82fbe0e8a" + } + Frame { + msec: 1024 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1040 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1056 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1072 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1088 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1104 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1120 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1136 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1152 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1168 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1184 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1200 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1216 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1232 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1248 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1264 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1280 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1296 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1312 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1328 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1344 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1360 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1376 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1392 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1408 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1424 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1440 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1456 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1472 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1488 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1504 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1520 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1536 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1552 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1568 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1584 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1600 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1616 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1632 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1648 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1664 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1680 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1696 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1712 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1728 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1744 + hash: "eee4600ac08b458ac7ac2320e225674c" + } + Frame { + msec: 1760 + hash: "eee4600ac08b458ac7ac2320e225674c" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.0.png new file mode 100644 index 00000000..749a9c5e Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.1.png new file mode 100644 index 00000000..749a9c5e Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.qml new file mode 100644 index 00000000..fbb542e3 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide.qml @@ -0,0 +1,279 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "elide.0.png" + } + Frame { + msec: 32 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 48 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 64 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 80 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 96 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 112 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 128 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 144 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 160 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 176 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 192 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 208 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 224 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 240 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 256 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 272 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 288 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 304 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 320 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 336 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 352 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 368 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 384 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 400 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 416 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 432 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 448 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 464 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 480 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 496 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 512 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 528 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 544 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 560 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 576 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 592 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 608 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 624 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 640 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 656 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 672 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 688 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 704 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 720 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 736 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 752 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 768 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 784 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 800 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 816 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 832 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 848 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 864 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 880 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 896 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 912 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 928 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 944 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 960 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 976 + image: "elide.1.png" + } + Key { + type: 6 + key: 16777249 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 992 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 1008 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 1024 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 1040 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } + Frame { + msec: 1056 + hash: "4d49ec1a14a321ea9c0d506663df55c2" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.0.png new file mode 100644 index 00000000..b84b8a91 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.1.png new file mode 100644 index 00000000..dbae0ce2 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.2.png new file mode 100644 index 00000000..bf56c80f Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.3.png new file mode 100644 index 00000000..c4f6e180 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.4.png new file mode 100644 index 00000000..ea86925f Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.qml new file mode 100644 index 00000000..e780ea65 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/elide2.qml @@ -0,0 +1,991 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "elide2.0.png" + } + Frame { + msec: 32 + hash: "1c45bbf4494aeb017d7ad53c5e29cbc0" + } + Frame { + msec: 48 + hash: "1c45bbf4494aeb017d7ad53c5e29cbc0" + } + Frame { + msec: 64 + hash: "1c45bbf4494aeb017d7ad53c5e29cbc0" + } + Frame { + msec: 80 + hash: "1c45bbf4494aeb017d7ad53c5e29cbc0" + } + Frame { + msec: 96 + hash: "1c45bbf4494aeb017d7ad53c5e29cbc0" + } + Frame { + msec: 112 + hash: "452d8e4da326413e4961f20a0d24d0f0" + } + Frame { + msec: 128 + hash: "452d8e4da326413e4961f20a0d24d0f0" + } + Frame { + msec: 144 + hash: "452d8e4da326413e4961f20a0d24d0f0" + } + Frame { + msec: 160 + hash: "452d8e4da326413e4961f20a0d24d0f0" + } + Frame { + msec: 176 + hash: "452d8e4da326413e4961f20a0d24d0f0" + } + Frame { + msec: 192 + hash: "8dc43f316fd36a877c773c10c23b5703" + } + Frame { + msec: 208 + hash: "8dc43f316fd36a877c773c10c23b5703" + } + Frame { + msec: 224 + hash: "8dc43f316fd36a877c773c10c23b5703" + } + Frame { + msec: 240 + hash: "8dc43f316fd36a877c773c10c23b5703" + } + Frame { + msec: 256 + hash: "b7e055ce8d510c5ec66e71fa5a78fddf" + } + Frame { + msec: 272 + hash: "b7e055ce8d510c5ec66e71fa5a78fddf" + } + Frame { + msec: 288 + hash: "b7e055ce8d510c5ec66e71fa5a78fddf" + } + Frame { + msec: 304 + hash: "b7e055ce8d510c5ec66e71fa5a78fddf" + } + Frame { + msec: 320 + hash: "e9b0abe5719027348cd267eb4823fc5f" + } + Frame { + msec: 336 + hash: "e9b0abe5719027348cd267eb4823fc5f" + } + Frame { + msec: 352 + hash: "e9b0abe5719027348cd267eb4823fc5f" + } + Frame { + msec: 368 + hash: "e9b0abe5719027348cd267eb4823fc5f" + } + Frame { + msec: 384 + hash: "e9b0abe5719027348cd267eb4823fc5f" + } + Frame { + msec: 400 + hash: "441102f2f69e9f4e10335c1746d47bd3" + } + Frame { + msec: 416 + hash: "441102f2f69e9f4e10335c1746d47bd3" + } + Frame { + msec: 432 + hash: "441102f2f69e9f4e10335c1746d47bd3" + } + Frame { + msec: 448 + hash: "441102f2f69e9f4e10335c1746d47bd3" + } + Frame { + msec: 464 + hash: "441102f2f69e9f4e10335c1746d47bd3" + } + Frame { + msec: 480 + hash: "95668288170720989adde2a0b41d5ee8" + } + Frame { + msec: 496 + hash: "95668288170720989adde2a0b41d5ee8" + } + Frame { + msec: 512 + hash: "95668288170720989adde2a0b41d5ee8" + } + Frame { + msec: 528 + hash: "95668288170720989adde2a0b41d5ee8" + } + Frame { + msec: 544 + hash: "16bba6b72993e474b4c302af3f682834" + } + Frame { + msec: 560 + hash: "16bba6b72993e474b4c302af3f682834" + } + Frame { + msec: 576 + hash: "16bba6b72993e474b4c302af3f682834" + } + Frame { + msec: 592 + hash: "16bba6b72993e474b4c302af3f682834" + } + Frame { + msec: 608 + hash: "86c4d8bd1b19116411b6a6e450547425" + } + Frame { + msec: 624 + hash: "86c4d8bd1b19116411b6a6e450547425" + } + Frame { + msec: 640 + hash: "86c4d8bd1b19116411b6a6e450547425" + } + Frame { + msec: 656 + hash: "86c4d8bd1b19116411b6a6e450547425" + } + Frame { + msec: 672 + hash: "86c4d8bd1b19116411b6a6e450547425" + } + Frame { + msec: 688 + hash: "d0d3cfa922ebca20c590ab7e59985268" + } + Frame { + msec: 704 + hash: "d0d3cfa922ebca20c590ab7e59985268" + } + Frame { + msec: 720 + hash: "d0d3cfa922ebca20c590ab7e59985268" + } + Frame { + msec: 736 + hash: "d0d3cfa922ebca20c590ab7e59985268" + } + Frame { + msec: 752 + hash: "d0d3cfa922ebca20c590ab7e59985268" + } + Frame { + msec: 768 + hash: "397d72a090171090f897283729b19bc8" + } + Frame { + msec: 784 + hash: "397d72a090171090f897283729b19bc8" + } + Frame { + msec: 800 + hash: "397d72a090171090f897283729b19bc8" + } + Frame { + msec: 816 + hash: "397d72a090171090f897283729b19bc8" + } + Frame { + msec: 832 + hash: "2b038e59289d2e3cef02245d2d128271" + } + Frame { + msec: 848 + hash: "2b038e59289d2e3cef02245d2d128271" + } + Frame { + msec: 864 + hash: "2b038e59289d2e3cef02245d2d128271" + } + Frame { + msec: 880 + hash: "2b038e59289d2e3cef02245d2d128271" + } + Frame { + msec: 896 + hash: "2b038e59289d2e3cef02245d2d128271" + } + Frame { + msec: 912 + hash: "5f64aa763acdd8f5d6cc249be36e226a" + } + Frame { + msec: 928 + hash: "5f64aa763acdd8f5d6cc249be36e226a" + } + Frame { + msec: 944 + hash: "5f64aa763acdd8f5d6cc249be36e226a" + } + Frame { + msec: 960 + hash: "5f64aa763acdd8f5d6cc249be36e226a" + } + Frame { + msec: 976 + image: "elide2.1.png" + } + Frame { + msec: 992 + hash: "4f8c81adc72fce17c7e54f4d45ec08e4" + } + Frame { + msec: 1008 + hash: "4f8c81adc72fce17c7e54f4d45ec08e4" + } + Frame { + msec: 1024 + hash: "4f8c81adc72fce17c7e54f4d45ec08e4" + } + Frame { + msec: 1040 + hash: "91a7a0c0f686975d0087ee0e066911eb" + } + Frame { + msec: 1056 + hash: "91a7a0c0f686975d0087ee0e066911eb" + } + Frame { + msec: 1072 + hash: "91a7a0c0f686975d0087ee0e066911eb" + } + Frame { + msec: 1088 + hash: "91a7a0c0f686975d0087ee0e066911eb" + } + Frame { + msec: 1104 + hash: "91a7a0c0f686975d0087ee0e066911eb" + } + Frame { + msec: 1120 + hash: "b19f6b8b4dc9d2a2d9aba82983e41889" + } + Frame { + msec: 1136 + hash: "b19f6b8b4dc9d2a2d9aba82983e41889" + } + Frame { + msec: 1152 + hash: "b19f6b8b4dc9d2a2d9aba82983e41889" + } + Frame { + msec: 1168 + hash: "b19f6b8b4dc9d2a2d9aba82983e41889" + } + Frame { + msec: 1184 + hash: "b19f6b8b4dc9d2a2d9aba82983e41889" + } + Frame { + msec: 1200 + hash: "456542b672303ddae500b96e9b66a558" + } + Frame { + msec: 1216 + hash: "456542b672303ddae500b96e9b66a558" + } + Frame { + msec: 1232 + hash: "456542b672303ddae500b96e9b66a558" + } + Frame { + msec: 1248 + hash: "456542b672303ddae500b96e9b66a558" + } + Frame { + msec: 1264 + hash: "8ec69f05d929c3b397dc721198ccacd4" + } + Frame { + msec: 1280 + hash: "8ec69f05d929c3b397dc721198ccacd4" + } + Frame { + msec: 1296 + hash: "8ec69f05d929c3b397dc721198ccacd4" + } + Frame { + msec: 1312 + hash: "8ec69f05d929c3b397dc721198ccacd4" + } + Frame { + msec: 1328 + hash: "2d63fd91f4b01f6b178c795838e78990" + } + Frame { + msec: 1344 + hash: "2d63fd91f4b01f6b178c795838e78990" + } + Frame { + msec: 1360 + hash: "2d63fd91f4b01f6b178c795838e78990" + } + Frame { + msec: 1376 + hash: "2d63fd91f4b01f6b178c795838e78990" + } + Frame { + msec: 1392 + hash: "2d63fd91f4b01f6b178c795838e78990" + } + Frame { + msec: 1408 + hash: "c7c1d2c288653b414fe534ff6fab3381" + } + Frame { + msec: 1424 + hash: "c7c1d2c288653b414fe534ff6fab3381" + } + Frame { + msec: 1440 + hash: "c7c1d2c288653b414fe534ff6fab3381" + } + Frame { + msec: 1456 + hash: "c7c1d2c288653b414fe534ff6fab3381" + } + Frame { + msec: 1472 + hash: "c7c1d2c288653b414fe534ff6fab3381" + } + Frame { + msec: 1488 + hash: "23188e926a855a7a06211783ee51d22a" + } + Frame { + msec: 1504 + hash: "23188e926a855a7a06211783ee51d22a" + } + Frame { + msec: 1520 + hash: "23188e926a855a7a06211783ee51d22a" + } + Frame { + msec: 1536 + hash: "23188e926a855a7a06211783ee51d22a" + } + Frame { + msec: 1552 + hash: "cfc64d8876d59e0d75f079c2e08cea5f" + } + Frame { + msec: 1568 + hash: "cfc64d8876d59e0d75f079c2e08cea5f" + } + Frame { + msec: 1584 + hash: "cfc64d8876d59e0d75f079c2e08cea5f" + } + Frame { + msec: 1600 + hash: "cfc64d8876d59e0d75f079c2e08cea5f" + } + Frame { + msec: 1616 + hash: "cfc64d8876d59e0d75f079c2e08cea5f" + } + Frame { + msec: 1632 + hash: "766c679eaec4bd28dc92cb3642d5be83" + } + Frame { + msec: 1648 + hash: "766c679eaec4bd28dc92cb3642d5be83" + } + Frame { + msec: 1664 + hash: "766c679eaec4bd28dc92cb3642d5be83" + } + Frame { + msec: 1680 + hash: "766c679eaec4bd28dc92cb3642d5be83" + } + Frame { + msec: 1696 + hash: "a86ba05a854fde208e6cf7849327d5d0" + } + Frame { + msec: 1712 + hash: "a86ba05a854fde208e6cf7849327d5d0" + } + Frame { + msec: 1728 + hash: "a86ba05a854fde208e6cf7849327d5d0" + } + Frame { + msec: 1744 + hash: "a86ba05a854fde208e6cf7849327d5d0" + } + Key { + type: 6 + key: 16777249 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1760 + hash: "a86ba05a854fde208e6cf7849327d5d0" + } + Frame { + msec: 1776 + hash: "23b60817be2a741cada2af663b0d7f54" + } + Frame { + msec: 1792 + hash: "23b60817be2a741cada2af663b0d7f54" + } + Frame { + msec: 1808 + hash: "23b60817be2a741cada2af663b0d7f54" + } + Frame { + msec: 1824 + hash: "23b60817be2a741cada2af663b0d7f54" + } + Frame { + msec: 1840 + hash: "c098c1c0d5239c59735a5c9450e9d531" + } + Frame { + msec: 1856 + hash: "c098c1c0d5239c59735a5c9450e9d531" + } + Frame { + msec: 1872 + hash: "c098c1c0d5239c59735a5c9450e9d531" + } + Frame { + msec: 1888 + hash: "c098c1c0d5239c59735a5c9450e9d531" + } + Frame { + msec: 1904 + hash: "c098c1c0d5239c59735a5c9450e9d531" + } + Frame { + msec: 1920 + hash: "09f6ee218d314d3a405ae43e32588c07" + } + Frame { + msec: 1936 + image: "elide2.2.png" + } + Frame { + msec: 1952 + hash: "09f6ee218d314d3a405ae43e32588c07" + } + Frame { + msec: 1968 + hash: "09f6ee218d314d3a405ae43e32588c07" + } + Frame { + msec: 1984 + hash: "6ee480e7d8b0abe295ae12a660119102" + } + Frame { + msec: 2000 + hash: "6ee480e7d8b0abe295ae12a660119102" + } + Frame { + msec: 2016 + hash: "6ee480e7d8b0abe295ae12a660119102" + } + Frame { + msec: 2032 + hash: "6ee480e7d8b0abe295ae12a660119102" + } + Frame { + msec: 2048 + hash: "6ee480e7d8b0abe295ae12a660119102" + } + Frame { + msec: 2064 + hash: "b43ca0ea75f4c17c09248f78170d3839" + } + Frame { + msec: 2080 + hash: "b43ca0ea75f4c17c09248f78170d3839" + } + Frame { + msec: 2096 + hash: "b43ca0ea75f4c17c09248f78170d3839" + } + Frame { + msec: 2112 + hash: "b43ca0ea75f4c17c09248f78170d3839" + } + Frame { + msec: 2128 + hash: "92e0ee1174ffcb710403bb831aeec353" + } + Frame { + msec: 2144 + hash: "92e0ee1174ffcb710403bb831aeec353" + } + Frame { + msec: 2160 + hash: "92e0ee1174ffcb710403bb831aeec353" + } + Frame { + msec: 2176 + hash: "92e0ee1174ffcb710403bb831aeec353" + } + Frame { + msec: 2192 + hash: "92e0ee1174ffcb710403bb831aeec353" + } + Frame { + msec: 2208 + hash: "bba79ad6f3630b7aa382541cc2d3a2cd" + } + Frame { + msec: 2224 + hash: "bba79ad6f3630b7aa382541cc2d3a2cd" + } + Frame { + msec: 2240 + hash: "bba79ad6f3630b7aa382541cc2d3a2cd" + } + Frame { + msec: 2256 + hash: "bba79ad6f3630b7aa382541cc2d3a2cd" + } + Frame { + msec: 2272 + hash: "7efeb1565125f25252ce3f03dadc3bea" + } + Frame { + msec: 2288 + hash: "7efeb1565125f25252ce3f03dadc3bea" + } + Frame { + msec: 2304 + hash: "7efeb1565125f25252ce3f03dadc3bea" + } + Frame { + msec: 2320 + hash: "7efeb1565125f25252ce3f03dadc3bea" + } + Frame { + msec: 2336 + hash: "7efeb1565125f25252ce3f03dadc3bea" + } + Frame { + msec: 2352 + hash: "9086d24dff90f8c9e4543c6b14c99bf6" + } + Frame { + msec: 2368 + hash: "9086d24dff90f8c9e4543c6b14c99bf6" + } + Frame { + msec: 2384 + hash: "9086d24dff90f8c9e4543c6b14c99bf6" + } + Frame { + msec: 2400 + hash: "9086d24dff90f8c9e4543c6b14c99bf6" + } + Frame { + msec: 2416 + hash: "9086d24dff90f8c9e4543c6b14c99bf6" + } + Frame { + msec: 2432 + hash: "15d8e99a0676e0a1588dfddc00ab0d16" + } + Frame { + msec: 2448 + hash: "15d8e99a0676e0a1588dfddc00ab0d16" + } + Frame { + msec: 2464 + hash: "15d8e99a0676e0a1588dfddc00ab0d16" + } + Frame { + msec: 2480 + hash: "15d8e99a0676e0a1588dfddc00ab0d16" + } + Frame { + msec: 2496 + hash: "ecc25b88c29dc9d6c70df6e36a91f95c" + } + Frame { + msec: 2512 + hash: "ecc25b88c29dc9d6c70df6e36a91f95c" + } + Frame { + msec: 2528 + hash: "ecc25b88c29dc9d6c70df6e36a91f95c" + } + Frame { + msec: 2544 + hash: "ecc25b88c29dc9d6c70df6e36a91f95c" + } + Frame { + msec: 2560 + hash: "905c81686d8d2ecdde513622c35c0ea6" + } + Frame { + msec: 2576 + hash: "905c81686d8d2ecdde513622c35c0ea6" + } + Frame { + msec: 2592 + hash: "905c81686d8d2ecdde513622c35c0ea6" + } + Frame { + msec: 2608 + hash: "905c81686d8d2ecdde513622c35c0ea6" + } + Frame { + msec: 2624 + hash: "905c81686d8d2ecdde513622c35c0ea6" + } + Frame { + msec: 2640 + hash: "537a2cf41a5e15220d2ca2218ac49a5a" + } + Frame { + msec: 2656 + hash: "537a2cf41a5e15220d2ca2218ac49a5a" + } + Frame { + msec: 2672 + hash: "537a2cf41a5e15220d2ca2218ac49a5a" + } + Frame { + msec: 2688 + hash: "537a2cf41a5e15220d2ca2218ac49a5a" + } + Frame { + msec: 2704 + hash: "53325ce7d011eeb72369463721f15e87" + } + Frame { + msec: 2720 + hash: "53325ce7d011eeb72369463721f15e87" + } + Frame { + msec: 2736 + hash: "53325ce7d011eeb72369463721f15e87" + } + Frame { + msec: 2752 + hash: "53325ce7d011eeb72369463721f15e87" + } + Frame { + msec: 2768 + hash: "53325ce7d011eeb72369463721f15e87" + } + Frame { + msec: 2784 + hash: "9ad2565cc95647a83d3ce3acc106485a" + } + Frame { + msec: 2800 + hash: "9ad2565cc95647a83d3ce3acc106485a" + } + Frame { + msec: 2816 + hash: "9ad2565cc95647a83d3ce3acc106485a" + } + Frame { + msec: 2832 + hash: "9ad2565cc95647a83d3ce3acc106485a" + } + Frame { + msec: 2848 + hash: "de7b66581e0743385a984f76c993b01b" + } + Frame { + msec: 2864 + hash: "de7b66581e0743385a984f76c993b01b" + } + Frame { + msec: 2880 + hash: "de7b66581e0743385a984f76c993b01b" + } + Frame { + msec: 2896 + image: "elide2.3.png" + } + Frame { + msec: 2912 + hash: "de7b66581e0743385a984f76c993b01b" + } + Frame { + msec: 2928 + hash: "f66852df1738e4fe29ac1f6938d814c2" + } + Frame { + msec: 2944 + hash: "f66852df1738e4fe29ac1f6938d814c2" + } + Frame { + msec: 2960 + hash: "f66852df1738e4fe29ac1f6938d814c2" + } + Frame { + msec: 2976 + hash: "f66852df1738e4fe29ac1f6938d814c2" + } + Frame { + msec: 2992 + hash: "cf6dde6c590879a9e905a0f559f089ca" + } + Frame { + msec: 3008 + hash: "cf6dde6c590879a9e905a0f559f089ca" + } + Frame { + msec: 3024 + hash: "cf6dde6c590879a9e905a0f559f089ca" + } + Frame { + msec: 3040 + hash: "cf6dde6c590879a9e905a0f559f089ca" + } + Frame { + msec: 3056 + hash: "cf6dde6c590879a9e905a0f559f089ca" + } + Frame { + msec: 3072 + hash: "bd63e4df280010ed9f67fc7976b86cb5" + } + Frame { + msec: 3088 + hash: "bd63e4df280010ed9f67fc7976b86cb5" + } + Frame { + msec: 3104 + hash: "bd63e4df280010ed9f67fc7976b86cb5" + } + Frame { + msec: 3120 + hash: "bd63e4df280010ed9f67fc7976b86cb5" + } + Frame { + msec: 3136 + hash: "bd63e4df280010ed9f67fc7976b86cb5" + } + Frame { + msec: 3152 + hash: "065d3d370faa58aed9899cae0f86f032" + } + Frame { + msec: 3168 + hash: "065d3d370faa58aed9899cae0f86f032" + } + Frame { + msec: 3184 + hash: "065d3d370faa58aed9899cae0f86f032" + } + Frame { + msec: 3200 + hash: "065d3d370faa58aed9899cae0f86f032" + } + Frame { + msec: 3216 + hash: "b5623d05c578a6f09bcfacd4d3163b09" + } + Frame { + msec: 3232 + hash: "b5623d05c578a6f09bcfacd4d3163b09" + } + Frame { + msec: 3248 + hash: "b5623d05c578a6f09bcfacd4d3163b09" + } + Frame { + msec: 3264 + hash: "b5623d05c578a6f09bcfacd4d3163b09" + } + Frame { + msec: 3280 + hash: "83c70529d05911ea26a5cbbab5aa20f2" + } + Frame { + msec: 3296 + hash: "83c70529d05911ea26a5cbbab5aa20f2" + } + Frame { + msec: 3312 + hash: "83c70529d05911ea26a5cbbab5aa20f2" + } + Frame { + msec: 3328 + hash: "83c70529d05911ea26a5cbbab5aa20f2" + } + Frame { + msec: 3344 + hash: "83c70529d05911ea26a5cbbab5aa20f2" + } + Frame { + msec: 3360 + hash: "17927c706da1bc222ba5462af66a9d2f" + } + Frame { + msec: 3376 + hash: "17927c706da1bc222ba5462af66a9d2f" + } + Frame { + msec: 3392 + hash: "17927c706da1bc222ba5462af66a9d2f" + } + Frame { + msec: 3408 + hash: "17927c706da1bc222ba5462af66a9d2f" + } + Frame { + msec: 3424 + hash: "17927c706da1bc222ba5462af66a9d2f" + } + Frame { + msec: 3440 + hash: "f49627ba8d3e257e0e94404da24d12dc" + } + Frame { + msec: 3456 + hash: "f49627ba8d3e257e0e94404da24d12dc" + } + Frame { + msec: 3472 + hash: "f49627ba8d3e257e0e94404da24d12dc" + } + Frame { + msec: 3488 + hash: "f49627ba8d3e257e0e94404da24d12dc" + } + Frame { + msec: 3504 + hash: "37a0c9dc20431c8398409d4522a0fdd3" + } + Frame { + msec: 3520 + hash: "37a0c9dc20431c8398409d4522a0fdd3" + } + Frame { + msec: 3536 + hash: "37a0c9dc20431c8398409d4522a0fdd3" + } + Frame { + msec: 3552 + hash: "37a0c9dc20431c8398409d4522a0fdd3" + } + Frame { + msec: 3568 + hash: "67bebfe9fb5ac745f40040ff8083e999" + } + Frame { + msec: 3584 + hash: "67bebfe9fb5ac745f40040ff8083e999" + } + Frame { + msec: 3600 + hash: "67bebfe9fb5ac745f40040ff8083e999" + } + Frame { + msec: 3616 + hash: "67bebfe9fb5ac745f40040ff8083e999" + } + Frame { + msec: 3632 + hash: "67bebfe9fb5ac745f40040ff8083e999" + } + Frame { + msec: 3648 + hash: "84f8b27b83b566c99e65ea39b29772c1" + } + Frame { + msec: 3664 + hash: "84f8b27b83b566c99e65ea39b29772c1" + } + Frame { + msec: 3680 + hash: "84f8b27b83b566c99e65ea39b29772c1" + } + Frame { + msec: 3696 + hash: "84f8b27b83b566c99e65ea39b29772c1" + } + Frame { + msec: 3712 + hash: "84f8b27b83b566c99e65ea39b29772c1" + } + Frame { + msec: 3728 + hash: "c6ba663536f19b9f291ef35b7a70e490" + } + Frame { + msec: 3744 + hash: "c6ba663536f19b9f291ef35b7a70e490" + } + Frame { + msec: 3760 + hash: "c6ba663536f19b9f291ef35b7a70e490" + } + Frame { + msec: 3776 + hash: "c6ba663536f19b9f291ef35b7a70e490" + } + Frame { + msec: 3792 + hash: "65f22784730aa27b2628d015a1cc4abe" + } + Frame { + msec: 3808 + hash: "65f22784730aa27b2628d015a1cc4abe" + } + Frame { + msec: 3824 + hash: "65f22784730aa27b2628d015a1cc4abe" + } + Frame { + msec: 3840 + hash: "65f22784730aa27b2628d015a1cc4abe" + } + Frame { + msec: 3856 + image: "elide2.4.png" + } + Frame { + msec: 3872 + hash: "b11a511d80de87329501b9c11aebbc58" + } + Frame { + msec: 3888 + hash: "b11a511d80de87329501b9c11aebbc58" + } + Frame { + msec: 3904 + hash: "b11a511d80de87329501b9c11aebbc58" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.0.png new file mode 100644 index 00000000..3861b4f2 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.1.png new file mode 100644 index 00000000..ce166f19 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.qml new file mode 100644 index 00000000..84778ac3 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-MAC/multilength.qml @@ -0,0 +1,303 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "multilength.0.png" + } + Frame { + msec: 32 + hash: "58d757783e6d57c5ac2596219dfd37be" + } + Frame { + msec: 48 + hash: "e76b3b98f447b706c59ba0c175e1829d" + } + Frame { + msec: 64 + hash: "f0dbb0b55d1d27bf7c0260db5b5782a2" + } + Frame { + msec: 80 + hash: "00845517336befd7ead0141312ea38ce" + } + Frame { + msec: 96 + hash: "99723ae092407e5291ed3a13f5a7be61" + } + Frame { + msec: 112 + hash: "2d531f1dd1545a4e2f8ca4c65338e0c3" + } + Frame { + msec: 128 + hash: "9f273323f48a70be279302b194203a36" + } + Frame { + msec: 144 + hash: "7de4bd5f82369953c2a4a990ddaf4339" + } + Frame { + msec: 160 + hash: "96c5f74c01723a15a57db161604bc245" + } + Frame { + msec: 176 + hash: "df2eac6300919044cfe2a2f591c3bd99" + } + Frame { + msec: 192 + hash: "a153904cdfa0be697a25bebc4ce1fbca" + } + Frame { + msec: 208 + hash: "de243731b92ac1cac05e194aed0acd1e" + } + Frame { + msec: 224 + hash: "f6ccc0f127bfc6212885c3c6470639ed" + } + Frame { + msec: 240 + hash: "a2d56227aebedb9590a1124e44fe8e84" + } + Frame { + msec: 256 + hash: "5f8c0a42a231580dcfff6a534e77bef8" + } + Frame { + msec: 272 + hash: "e631663ac692ab097cb28095b45e8563" + } + Frame { + msec: 288 + hash: "2a03f6ba3c67a9e9732cc1f5cdc42c23" + } + Frame { + msec: 304 + hash: "26b85080d624b232e5209aa082fc11b1" + } + Frame { + msec: 320 + hash: "1c027f4a0114bb9050a3a8d9de2b8a56" + } + Frame { + msec: 336 + hash: "788e6ad3cb5f6e120e40fd3dc6ac8483" + } + Frame { + msec: 352 + hash: "7e1b0fb71528dfa17a87950c0ff86111" + } + Frame { + msec: 368 + hash: "e1878e6e8ba14d8945e1f71ac8d42c1e" + } + Frame { + msec: 384 + hash: "556f42297eb1e57d6a8af0946651a75e" + } + Frame { + msec: 400 + hash: "73df08e7e3391b339cea9f5f082fd83a" + } + Frame { + msec: 416 + hash: "de3bd8a12c2a448738ce77036b97bda7" + } + Frame { + msec: 432 + hash: "0ab187aa7a478dbf005f35416a93c456" + } + Frame { + msec: 448 + hash: "e5baf64ccafa6a4d2bf74aacf52019c6" + } + Frame { + msec: 464 + hash: "0ed2ee4a773ade712ef207549006aa7b" + } + Frame { + msec: 480 + hash: "b23dd49bdfe8fb155e2055262e6a1478" + } + Frame { + msec: 496 + hash: "871f82636a03d6fa8cbfb580038bd0b7" + } + Frame { + msec: 512 + hash: "463cdc2cbde034d7d7a5061338b319c7" + } + Frame { + msec: 528 + hash: "22ff8e25136877fd6f5dce1b01e65c08" + } + Frame { + msec: 544 + hash: "97d4e49622d877e9e1e0102786e1ee55" + } + Frame { + msec: 560 + hash: "ebf5304185abe4bc33be44c3df09a93a" + } + Frame { + msec: 576 + hash: "307887d9973e807c52b2143cdfe438ad" + } + Frame { + msec: 592 + hash: "d89547539741f387fdd6aa80ef239fbd" + } + Frame { + msec: 608 + hash: "b818215b4cdd6e811057f1a0f5eb1a5a" + } + Frame { + msec: 624 + hash: "84f7e523c0f21236ff8aad1333470d11" + } + Frame { + msec: 640 + hash: "7f974663c7add6d10ebdd401794e087a" + } + Frame { + msec: 656 + hash: "4c824dc01e8fead2706608ca68293d11" + } + Frame { + msec: 672 + hash: "86b0f617eb3bfff944c3b670b3b51c71" + } + Frame { + msec: 688 + hash: "86c5660c22003099cc4121381c11de85" + } + Frame { + msec: 704 + hash: "3c2bd08ea17aaa920949239f06b255cf" + } + Frame { + msec: 720 + hash: "2380278cc065a3ac5355127d9873796c" + } + Frame { + msec: 736 + hash: "e5d8624e841476926b3e2a5ebca8c65f" + } + Frame { + msec: 752 + hash: "eab70f5005a6b39e3ead6e4452df1a54" + } + Frame { + msec: 768 + hash: "46acef023d154bad3f91e0267996421b" + } + Frame { + msec: 784 + hash: "26ba9f30a4bfd72c9b6dae2a25660ea9" + } + Frame { + msec: 800 + hash: "9fabdd5cf1190fb34bdc7834eba01cd3" + } + Frame { + msec: 816 + hash: "b1e7af47d4ee706374365fdd4b4d52be" + } + Frame { + msec: 832 + hash: "86fa2e142e75d9d2a074a5376992f139" + } + Frame { + msec: 848 + hash: "a3dea2bf8f84743d35070e82ec585c9a" + } + Frame { + msec: 864 + hash: "ab649fbbe0ca508812de9839d14b3f8c" + } + Frame { + msec: 880 + hash: "08f8a334e121d4edb0ca1617353bfebc" + } + Frame { + msec: 896 + hash: "bb7997c1e18b90cfaad4c3e4ec44356e" + } + Frame { + msec: 912 + hash: "31a7e5d71c28eebfcd29e9ea4950ad17" + } + Frame { + msec: 928 + hash: "2b759276e03c2884bff7ed863c032dfc" + } + Frame { + msec: 944 + hash: "aa0868f006097a435c46368ea9e3ba36" + } + Frame { + msec: 960 + hash: "6454753699c21589d2523a83da0aaa34" + } + Frame { + msec: 976 + image: "multilength.1.png" + } + Frame { + msec: 992 + hash: "ac26abff68fbc1cf89dc5efc4a714a04" + } + Frame { + msec: 1008 + hash: "d3f9dc8cb653d996fb57652f85abcbc1" + } + Frame { + msec: 1024 + hash: "002a94f067eef532f63b6ef916977c2c" + } + Frame { + msec: 1040 + hash: "f7935d01ee9b497034cc1d8f007a0fdf" + } + Frame { + msec: 1056 + hash: "4a1bfdcc85e5444c1bd836399e86ee05" + } + Frame { + msec: 1072 + hash: "1b86514f3c85a8438ef183cc4772e997" + } + Frame { + msec: 1088 + hash: "7bf4c1ca946288e9d1a7ad055d8cacaa" + } + Frame { + msec: 1104 + hash: "b3a00861967157786a80c80030d5495b" + } + Frame { + msec: 1120 + hash: "b9c6195d3336d7519cc72b16e75d00f6" + } + Frame { + msec: 1136 + hash: "6dba6d030a5ff6a92a57f0bdcf0fe781" + } + Frame { + msec: 1152 + hash: "cc97a2721f4339094819c8b7aec6d74c" + } + Frame { + msec: 1168 + hash: "190f67abce51f58fdd1591651633d67e" + } + Frame { + msec: 1184 + hash: "b255f75cfc4918663b8bd47c887cfb3c" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.0.png new file mode 100644 index 00000000..f2e61178 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.1.png new file mode 100644 index 00000000..16202c49 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.qml new file mode 100644 index 00000000..f306f5c5 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide.qml @@ -0,0 +1,279 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "elide.0.png" + } + Frame { + msec: 32 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 48 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 64 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 80 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 96 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 112 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 128 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 144 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 160 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 176 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 192 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 208 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 224 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 240 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 256 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 272 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 288 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 304 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 320 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 336 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 352 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 368 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 384 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 400 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 416 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 432 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 448 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 464 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 480 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 496 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 512 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 528 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 544 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 560 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 576 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 592 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 608 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 624 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 640 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 656 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 672 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 688 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 704 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 720 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 736 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 752 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 768 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 784 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 800 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 816 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 832 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 848 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 864 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 880 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 896 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 912 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 928 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 944 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 960 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 976 + image: "elide.1.png" + } + Key { + type: 6 + key: 16777249 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 992 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 1008 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 1024 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 1040 + hash: "a2003f5b238564e9b68b38db156431d2" + } + Frame { + msec: 1056 + hash: "a2003f5b238564e9b68b38db156431d2" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.0.png new file mode 100644 index 00000000..38b9668a Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.1.png new file mode 100644 index 00000000..801ec2be Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.2.png new file mode 100644 index 00000000..785093e0 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.3.png new file mode 100644 index 00000000..28f95c9e Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.4.png new file mode 100644 index 00000000..963c4ead Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.qml new file mode 100644 index 00000000..6e9057c1 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/elide2.qml @@ -0,0 +1,991 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "elide2.0.png" + } + Frame { + msec: 32 + hash: "716f5d150bd8757952d7b4ba327fb8bd" + } + Frame { + msec: 48 + hash: "716f5d150bd8757952d7b4ba327fb8bd" + } + Frame { + msec: 64 + hash: "716f5d150bd8757952d7b4ba327fb8bd" + } + Frame { + msec: 80 + hash: "716f5d150bd8757952d7b4ba327fb8bd" + } + Frame { + msec: 96 + hash: "716f5d150bd8757952d7b4ba327fb8bd" + } + Frame { + msec: 112 + hash: "716f5d150bd8757952d7b4ba327fb8bd" + } + Frame { + msec: 128 + hash: "8ec55fba2017a56c641c7baca5345b8b" + } + Frame { + msec: 144 + hash: "8ec55fba2017a56c641c7baca5345b8b" + } + Frame { + msec: 160 + hash: "8ec55fba2017a56c641c7baca5345b8b" + } + Frame { + msec: 176 + hash: "8ec55fba2017a56c641c7baca5345b8b" + } + Frame { + msec: 192 + hash: "79dc1645a5486ddfa3d957f3bd4ffbda" + } + Frame { + msec: 208 + hash: "79dc1645a5486ddfa3d957f3bd4ffbda" + } + Frame { + msec: 224 + hash: "79dc1645a5486ddfa3d957f3bd4ffbda" + } + Frame { + msec: 240 + hash: "79dc1645a5486ddfa3d957f3bd4ffbda" + } + Frame { + msec: 256 + hash: "476eae8ca9f6698cf67e2d20c5c24b66" + } + Frame { + msec: 272 + hash: "476eae8ca9f6698cf67e2d20c5c24b66" + } + Frame { + msec: 288 + hash: "476eae8ca9f6698cf67e2d20c5c24b66" + } + Frame { + msec: 304 + hash: "476eae8ca9f6698cf67e2d20c5c24b66" + } + Frame { + msec: 320 + hash: "bef1a9585daf30f1739a190ffa2e4b46" + } + Frame { + msec: 336 + hash: "bef1a9585daf30f1739a190ffa2e4b46" + } + Frame { + msec: 352 + hash: "bef1a9585daf30f1739a190ffa2e4b46" + } + Frame { + msec: 368 + hash: "bef1a9585daf30f1739a190ffa2e4b46" + } + Frame { + msec: 384 + hash: "bef1a9585daf30f1739a190ffa2e4b46" + } + Frame { + msec: 400 + hash: "156dfc4e9fbc1af5e8c6c48ecd2afe8f" + } + Frame { + msec: 416 + hash: "156dfc4e9fbc1af5e8c6c48ecd2afe8f" + } + Frame { + msec: 432 + hash: "156dfc4e9fbc1af5e8c6c48ecd2afe8f" + } + Frame { + msec: 448 + hash: "156dfc4e9fbc1af5e8c6c48ecd2afe8f" + } + Frame { + msec: 464 + hash: "2fe675a360e61452c31dda42070c137f" + } + Frame { + msec: 480 + hash: "2fe675a360e61452c31dda42070c137f" + } + Frame { + msec: 496 + hash: "2fe675a360e61452c31dda42070c137f" + } + Frame { + msec: 512 + hash: "2fe675a360e61452c31dda42070c137f" + } + Frame { + msec: 528 + hash: "0f1bac7c35b9f5bdbce10fb577c9cf28" + } + Frame { + msec: 544 + hash: "0f1bac7c35b9f5bdbce10fb577c9cf28" + } + Frame { + msec: 560 + hash: "0f1bac7c35b9f5bdbce10fb577c9cf28" + } + Frame { + msec: 576 + hash: "0f1bac7c35b9f5bdbce10fb577c9cf28" + } + Frame { + msec: 592 + hash: "0f1bac7c35b9f5bdbce10fb577c9cf28" + } + Frame { + msec: 608 + hash: "c79f68e9481f91f6f6a6816a655efc24" + } + Frame { + msec: 624 + hash: "c79f68e9481f91f6f6a6816a655efc24" + } + Frame { + msec: 640 + hash: "c79f68e9481f91f6f6a6816a655efc24" + } + Frame { + msec: 656 + hash: "c79f68e9481f91f6f6a6816a655efc24" + } + Frame { + msec: 672 + hash: "9a189e9d9249fb04fd98c4e91aba1cb5" + } + Frame { + msec: 688 + hash: "9a189e9d9249fb04fd98c4e91aba1cb5" + } + Frame { + msec: 704 + hash: "9a189e9d9249fb04fd98c4e91aba1cb5" + } + Frame { + msec: 720 + hash: "9a189e9d9249fb04fd98c4e91aba1cb5" + } + Frame { + msec: 736 + hash: "9a189e9d9249fb04fd98c4e91aba1cb5" + } + Frame { + msec: 752 + hash: "42c1ac48858ab5901601dc5a950a398f" + } + Frame { + msec: 768 + hash: "42c1ac48858ab5901601dc5a950a398f" + } + Frame { + msec: 784 + hash: "42c1ac48858ab5901601dc5a950a398f" + } + Frame { + msec: 800 + hash: "42c1ac48858ab5901601dc5a950a398f" + } + Frame { + msec: 816 + hash: "f05bf4e3cc562c5a900fb389a7c093de" + } + Frame { + msec: 832 + hash: "f05bf4e3cc562c5a900fb389a7c093de" + } + Frame { + msec: 848 + hash: "f05bf4e3cc562c5a900fb389a7c093de" + } + Frame { + msec: 864 + hash: "f05bf4e3cc562c5a900fb389a7c093de" + } + Frame { + msec: 880 + hash: "1b5d1234aa02009ec447ac8fefc403bb" + } + Frame { + msec: 896 + hash: "1b5d1234aa02009ec447ac8fefc403bb" + } + Frame { + msec: 912 + hash: "1b5d1234aa02009ec447ac8fefc403bb" + } + Frame { + msec: 928 + hash: "1b5d1234aa02009ec447ac8fefc403bb" + } + Frame { + msec: 944 + hash: "1b5d1234aa02009ec447ac8fefc403bb" + } + Frame { + msec: 960 + hash: "ec7cfc539d7bde448c631da211de8f44" + } + Frame { + msec: 976 + image: "elide2.1.png" + } + Frame { + msec: 992 + hash: "ec7cfc539d7bde448c631da211de8f44" + } + Frame { + msec: 1008 + hash: "ec7cfc539d7bde448c631da211de8f44" + } + Frame { + msec: 1024 + hash: "646394dd534a32bc3a066e606cc485f3" + } + Frame { + msec: 1040 + hash: "646394dd534a32bc3a066e606cc485f3" + } + Frame { + msec: 1056 + hash: "646394dd534a32bc3a066e606cc485f3" + } + Frame { + msec: 1072 + hash: "646394dd534a32bc3a066e606cc485f3" + } + Frame { + msec: 1088 + hash: "6b66b968aaed1896e2e9fafe27bba50f" + } + Frame { + msec: 1104 + hash: "6b66b968aaed1896e2e9fafe27bba50f" + } + Frame { + msec: 1120 + hash: "6b66b968aaed1896e2e9fafe27bba50f" + } + Frame { + msec: 1136 + hash: "6b66b968aaed1896e2e9fafe27bba50f" + } + Frame { + msec: 1152 + hash: "6b66b968aaed1896e2e9fafe27bba50f" + } + Frame { + msec: 1168 + hash: "869f75182b9a4b452da1689a5921085f" + } + Frame { + msec: 1184 + hash: "869f75182b9a4b452da1689a5921085f" + } + Frame { + msec: 1200 + hash: "869f75182b9a4b452da1689a5921085f" + } + Frame { + msec: 1216 + hash: "869f75182b9a4b452da1689a5921085f" + } + Frame { + msec: 1232 + hash: "b2017890ac543b9224e85a44157d9fbb" + } + Frame { + msec: 1248 + hash: "b2017890ac543b9224e85a44157d9fbb" + } + Frame { + msec: 1264 + hash: "b2017890ac543b9224e85a44157d9fbb" + } + Frame { + msec: 1280 + hash: "b2017890ac543b9224e85a44157d9fbb" + } + Frame { + msec: 1296 + hash: "b2017890ac543b9224e85a44157d9fbb" + } + Frame { + msec: 1312 + hash: "acac3eb92619e01b3470511cef1a91c8" + } + Frame { + msec: 1328 + hash: "acac3eb92619e01b3470511cef1a91c8" + } + Frame { + msec: 1344 + hash: "acac3eb92619e01b3470511cef1a91c8" + } + Frame { + msec: 1360 + hash: "acac3eb92619e01b3470511cef1a91c8" + } + Frame { + msec: 1376 + hash: "7f6d45b22e5cb86a7fb45d3f9bcebfc1" + } + Frame { + msec: 1392 + hash: "7f6d45b22e5cb86a7fb45d3f9bcebfc1" + } + Frame { + msec: 1408 + hash: "7f6d45b22e5cb86a7fb45d3f9bcebfc1" + } + Frame { + msec: 1424 + hash: "7f6d45b22e5cb86a7fb45d3f9bcebfc1" + } + Frame { + msec: 1440 + hash: "481f661e2613242d253498e467c91105" + } + Frame { + msec: 1456 + hash: "481f661e2613242d253498e467c91105" + } + Frame { + msec: 1472 + hash: "481f661e2613242d253498e467c91105" + } + Frame { + msec: 1488 + hash: "481f661e2613242d253498e467c91105" + } + Frame { + msec: 1504 + hash: "481f661e2613242d253498e467c91105" + } + Frame { + msec: 1520 + hash: "4c342918351f0165ce63129afbd60074" + } + Frame { + msec: 1536 + hash: "4c342918351f0165ce63129afbd60074" + } + Frame { + msec: 1552 + hash: "4c342918351f0165ce63129afbd60074" + } + Frame { + msec: 1568 + hash: "4c342918351f0165ce63129afbd60074" + } + Frame { + msec: 1584 + hash: "4f21a25c75cfabbcbd7c485c7c479bfc" + } + Frame { + msec: 1600 + hash: "4f21a25c75cfabbcbd7c485c7c479bfc" + } + Frame { + msec: 1616 + hash: "4f21a25c75cfabbcbd7c485c7c479bfc" + } + Frame { + msec: 1632 + hash: "4f21a25c75cfabbcbd7c485c7c479bfc" + } + Frame { + msec: 1648 + hash: "b627f215fdb6f62e6cbf2ddbe14dc794" + } + Frame { + msec: 1664 + hash: "b627f215fdb6f62e6cbf2ddbe14dc794" + } + Frame { + msec: 1680 + hash: "b627f215fdb6f62e6cbf2ddbe14dc794" + } + Frame { + msec: 1696 + hash: "b627f215fdb6f62e6cbf2ddbe14dc794" + } + Frame { + msec: 1712 + hash: "b627f215fdb6f62e6cbf2ddbe14dc794" + } + Frame { + msec: 1728 + hash: "8c490b27882c58d34cbc941a0b10e6fe" + } + Frame { + msec: 1744 + hash: "8c490b27882c58d34cbc941a0b10e6fe" + } + Key { + type: 6 + key: 16777249 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1760 + hash: "8c490b27882c58d34cbc941a0b10e6fe" + } + Frame { + msec: 1776 + hash: "8c490b27882c58d34cbc941a0b10e6fe" + } + Frame { + msec: 1792 + hash: "739abcde4a980e05932aa079245136cd" + } + Frame { + msec: 1808 + hash: "739abcde4a980e05932aa079245136cd" + } + Frame { + msec: 1824 + hash: "739abcde4a980e05932aa079245136cd" + } + Frame { + msec: 1840 + hash: "739abcde4a980e05932aa079245136cd" + } + Frame { + msec: 1856 + hash: "739abcde4a980e05932aa079245136cd" + } + Frame { + msec: 1872 + hash: "af47b93ee81b0e4add42d9addad92219" + } + Frame { + msec: 1888 + hash: "af47b93ee81b0e4add42d9addad92219" + } + Frame { + msec: 1904 + hash: "af47b93ee81b0e4add42d9addad92219" + } + Frame { + msec: 1920 + hash: "af47b93ee81b0e4add42d9addad92219" + } + Frame { + msec: 1936 + image: "elide2.2.png" + } + Frame { + msec: 1952 + hash: "43d7bee700464080f7535d398d60af25" + } + Frame { + msec: 1968 + hash: "43d7bee700464080f7535d398d60af25" + } + Frame { + msec: 1984 + hash: "43d7bee700464080f7535d398d60af25" + } + Frame { + msec: 2000 + hash: "31bf9784a1e1b84cc0ed4a342284ce1a" + } + Frame { + msec: 2016 + hash: "31bf9784a1e1b84cc0ed4a342284ce1a" + } + Frame { + msec: 2032 + hash: "31bf9784a1e1b84cc0ed4a342284ce1a" + } + Frame { + msec: 2048 + hash: "31bf9784a1e1b84cc0ed4a342284ce1a" + } + Frame { + msec: 2064 + hash: "31bf9784a1e1b84cc0ed4a342284ce1a" + } + Frame { + msec: 2080 + hash: "59db6dabc6c6930b9561bc906f49cc3c" + } + Frame { + msec: 2096 + hash: "59db6dabc6c6930b9561bc906f49cc3c" + } + Frame { + msec: 2112 + hash: "59db6dabc6c6930b9561bc906f49cc3c" + } + Frame { + msec: 2128 + hash: "59db6dabc6c6930b9561bc906f49cc3c" + } + Frame { + msec: 2144 + hash: "9e9cd1f4b9ad0980d6601e52c3d21402" + } + Frame { + msec: 2160 + hash: "9e9cd1f4b9ad0980d6601e52c3d21402" + } + Frame { + msec: 2176 + hash: "9e9cd1f4b9ad0980d6601e52c3d21402" + } + Frame { + msec: 2192 + hash: "9e9cd1f4b9ad0980d6601e52c3d21402" + } + Frame { + msec: 2208 + hash: "f8e23813215634224d2fb00f3d1993c5" + } + Frame { + msec: 2224 + hash: "f8e23813215634224d2fb00f3d1993c5" + } + Frame { + msec: 2240 + hash: "f8e23813215634224d2fb00f3d1993c5" + } + Frame { + msec: 2256 + hash: "f8e23813215634224d2fb00f3d1993c5" + } + Frame { + msec: 2272 + hash: "f8e23813215634224d2fb00f3d1993c5" + } + Frame { + msec: 2288 + hash: "e867db62cb8ec10228ea7b2eceda3723" + } + Frame { + msec: 2304 + hash: "e867db62cb8ec10228ea7b2eceda3723" + } + Frame { + msec: 2320 + hash: "e867db62cb8ec10228ea7b2eceda3723" + } + Frame { + msec: 2336 + hash: "e867db62cb8ec10228ea7b2eceda3723" + } + Frame { + msec: 2352 + hash: "36da8cc7019fae8b1abc877961d3af41" + } + Frame { + msec: 2368 + hash: "36da8cc7019fae8b1abc877961d3af41" + } + Frame { + msec: 2384 + hash: "36da8cc7019fae8b1abc877961d3af41" + } + Frame { + msec: 2400 + hash: "36da8cc7019fae8b1abc877961d3af41" + } + Frame { + msec: 2416 + hash: "36da8cc7019fae8b1abc877961d3af41" + } + Frame { + msec: 2432 + hash: "ea907beaf860fa21684fc524e876346c" + } + Frame { + msec: 2448 + hash: "ea907beaf860fa21684fc524e876346c" + } + Frame { + msec: 2464 + hash: "ea907beaf860fa21684fc524e876346c" + } + Frame { + msec: 2480 + hash: "ea907beaf860fa21684fc524e876346c" + } + Frame { + msec: 2496 + hash: "2b3eb80e842df2fa2b6c217a2948af45" + } + Frame { + msec: 2512 + hash: "2b3eb80e842df2fa2b6c217a2948af45" + } + Frame { + msec: 2528 + hash: "2b3eb80e842df2fa2b6c217a2948af45" + } + Frame { + msec: 2544 + hash: "2b3eb80e842df2fa2b6c217a2948af45" + } + Frame { + msec: 2560 + hash: "05ffb4d0af3fea65151596ea5b9b43c5" + } + Frame { + msec: 2576 + hash: "05ffb4d0af3fea65151596ea5b9b43c5" + } + Frame { + msec: 2592 + hash: "05ffb4d0af3fea65151596ea5b9b43c5" + } + Frame { + msec: 2608 + hash: "05ffb4d0af3fea65151596ea5b9b43c5" + } + Frame { + msec: 2624 + hash: "05ffb4d0af3fea65151596ea5b9b43c5" + } + Frame { + msec: 2640 + hash: "612517436b6ef76f29b213944f742624" + } + Frame { + msec: 2656 + hash: "612517436b6ef76f29b213944f742624" + } + Frame { + msec: 2672 + hash: "612517436b6ef76f29b213944f742624" + } + Frame { + msec: 2688 + hash: "612517436b6ef76f29b213944f742624" + } + Frame { + msec: 2704 + hash: "a62c646572c94d55971445c0546e06fc" + } + Frame { + msec: 2720 + hash: "a62c646572c94d55971445c0546e06fc" + } + Frame { + msec: 2736 + hash: "a62c646572c94d55971445c0546e06fc" + } + Frame { + msec: 2752 + hash: "a62c646572c94d55971445c0546e06fc" + } + Frame { + msec: 2768 + hash: "91be655836fbf7f811a44ffa1e80b72a" + } + Frame { + msec: 2784 + hash: "91be655836fbf7f811a44ffa1e80b72a" + } + Frame { + msec: 2800 + hash: "91be655836fbf7f811a44ffa1e80b72a" + } + Frame { + msec: 2816 + hash: "91be655836fbf7f811a44ffa1e80b72a" + } + Frame { + msec: 2832 + hash: "91be655836fbf7f811a44ffa1e80b72a" + } + Frame { + msec: 2848 + hash: "4fdf23d15633bd9dbcc1767fca797ef6" + } + Frame { + msec: 2864 + hash: "4fdf23d15633bd9dbcc1767fca797ef6" + } + Frame { + msec: 2880 + hash: "4fdf23d15633bd9dbcc1767fca797ef6" + } + Frame { + msec: 2896 + image: "elide2.3.png" + } + Frame { + msec: 2912 + hash: "a81f41ab4e100d92f643ae188c1a5b8a" + } + Frame { + msec: 2928 + hash: "a81f41ab4e100d92f643ae188c1a5b8a" + } + Frame { + msec: 2944 + hash: "a81f41ab4e100d92f643ae188c1a5b8a" + } + Frame { + msec: 2960 + hash: "a81f41ab4e100d92f643ae188c1a5b8a" + } + Frame { + msec: 2976 + hash: "a81f41ab4e100d92f643ae188c1a5b8a" + } + Frame { + msec: 2992 + hash: "6785dbb1bd05081c5b5d890d4b4f28d5" + } + Frame { + msec: 3008 + hash: "6785dbb1bd05081c5b5d890d4b4f28d5" + } + Frame { + msec: 3024 + hash: "6785dbb1bd05081c5b5d890d4b4f28d5" + } + Frame { + msec: 3040 + hash: "6785dbb1bd05081c5b5d890d4b4f28d5" + } + Frame { + msec: 3056 + hash: "ca4fc26d93d4767ef7cdbac6b2e24cf5" + } + Frame { + msec: 3072 + hash: "ca4fc26d93d4767ef7cdbac6b2e24cf5" + } + Frame { + msec: 3088 + hash: "ca4fc26d93d4767ef7cdbac6b2e24cf5" + } + Frame { + msec: 3104 + hash: "ca4fc26d93d4767ef7cdbac6b2e24cf5" + } + Frame { + msec: 3120 + hash: "706fd39d5945f9f698e7fa6e26631b58" + } + Frame { + msec: 3136 + hash: "706fd39d5945f9f698e7fa6e26631b58" + } + Frame { + msec: 3152 + hash: "706fd39d5945f9f698e7fa6e26631b58" + } + Frame { + msec: 3168 + hash: "706fd39d5945f9f698e7fa6e26631b58" + } + Frame { + msec: 3184 + hash: "706fd39d5945f9f698e7fa6e26631b58" + } + Frame { + msec: 3200 + hash: "c4ed351cacc86b5ca2c8198be0a754e0" + } + Frame { + msec: 3216 + hash: "c4ed351cacc86b5ca2c8198be0a754e0" + } + Frame { + msec: 3232 + hash: "c4ed351cacc86b5ca2c8198be0a754e0" + } + Frame { + msec: 3248 + hash: "c4ed351cacc86b5ca2c8198be0a754e0" + } + Frame { + msec: 3264 + hash: "addbbaca2d29fbc8c7907d51a8e9cdce" + } + Frame { + msec: 3280 + hash: "addbbaca2d29fbc8c7907d51a8e9cdce" + } + Frame { + msec: 3296 + hash: "addbbaca2d29fbc8c7907d51a8e9cdce" + } + Frame { + msec: 3312 + hash: "addbbaca2d29fbc8c7907d51a8e9cdce" + } + Frame { + msec: 3328 + hash: "fcb6b78276df1a6c839d6f30f8fe6495" + } + Frame { + msec: 3344 + hash: "fcb6b78276df1a6c839d6f30f8fe6495" + } + Frame { + msec: 3360 + hash: "fcb6b78276df1a6c839d6f30f8fe6495" + } + Frame { + msec: 3376 + hash: "fcb6b78276df1a6c839d6f30f8fe6495" + } + Frame { + msec: 3392 + hash: "fcb6b78276df1a6c839d6f30f8fe6495" + } + Frame { + msec: 3408 + hash: "b066cbbb00a4bef4e730ea8131c2bbe5" + } + Frame { + msec: 3424 + hash: "b066cbbb00a4bef4e730ea8131c2bbe5" + } + Frame { + msec: 3440 + hash: "b066cbbb00a4bef4e730ea8131c2bbe5" + } + Frame { + msec: 3456 + hash: "b066cbbb00a4bef4e730ea8131c2bbe5" + } + Frame { + msec: 3472 + hash: "e6d801e738ed3265b0127b79da7e8ec5" + } + Frame { + msec: 3488 + hash: "e6d801e738ed3265b0127b79da7e8ec5" + } + Frame { + msec: 3504 + hash: "e6d801e738ed3265b0127b79da7e8ec5" + } + Frame { + msec: 3520 + hash: "e6d801e738ed3265b0127b79da7e8ec5" + } + Frame { + msec: 3536 + hash: "e6d801e738ed3265b0127b79da7e8ec5" + } + Frame { + msec: 3552 + hash: "5b9a527ce399d0467b29c8813bbc7e6a" + } + Frame { + msec: 3568 + hash: "5b9a527ce399d0467b29c8813bbc7e6a" + } + Frame { + msec: 3584 + hash: "5b9a527ce399d0467b29c8813bbc7e6a" + } + Frame { + msec: 3600 + hash: "5b9a527ce399d0467b29c8813bbc7e6a" + } + Frame { + msec: 3616 + hash: "e9dd6c70c22d7b100a07ee837add697b" + } + Frame { + msec: 3632 + hash: "e9dd6c70c22d7b100a07ee837add697b" + } + Frame { + msec: 3648 + hash: "e9dd6c70c22d7b100a07ee837add697b" + } + Frame { + msec: 3664 + hash: "e9dd6c70c22d7b100a07ee837add697b" + } + Frame { + msec: 3680 + hash: "92e553a6e8385ceba6804075e5ed6add" + } + Frame { + msec: 3696 + hash: "92e553a6e8385ceba6804075e5ed6add" + } + Frame { + msec: 3712 + hash: "92e553a6e8385ceba6804075e5ed6add" + } + Frame { + msec: 3728 + hash: "92e553a6e8385ceba6804075e5ed6add" + } + Frame { + msec: 3744 + hash: "92e553a6e8385ceba6804075e5ed6add" + } + Frame { + msec: 3760 + hash: "eafdc541e5bb2937cc472511758bd494" + } + Frame { + msec: 3776 + hash: "eafdc541e5bb2937cc472511758bd494" + } + Frame { + msec: 3792 + hash: "eafdc541e5bb2937cc472511758bd494" + } + Frame { + msec: 3808 + hash: "eafdc541e5bb2937cc472511758bd494" + } + Frame { + msec: 3824 + hash: "3d207efb5d563ec0a8640091710aa9fd" + } + Frame { + msec: 3840 + hash: "3d207efb5d563ec0a8640091710aa9fd" + } + Frame { + msec: 3856 + image: "elide2.4.png" + } + Frame { + msec: 3872 + hash: "3d207efb5d563ec0a8640091710aa9fd" + } + Frame { + msec: 3888 + hash: "d837a68f291b44c8ea4b92088ebccb2c" + } + Frame { + msec: 3904 + hash: "d837a68f291b44c8ea4b92088ebccb2c" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.0.png new file mode 100644 index 00000000..f71c1aca Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.1.png new file mode 100644 index 00000000..ddd6cc58 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.2.png new file mode 100644 index 00000000..4679774b Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.3.png new file mode 100644 index 00000000..51018b43 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.4.png new file mode 100644 index 00000000..f5ed905f Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.5.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.5.png new file mode 100644 index 00000000..50057245 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.5.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.qml new file mode 100644 index 00000000..6e802f48 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/data-X11/multilength.qml @@ -0,0 +1,1323 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "multilength.0.png" + } + Frame { + msec: 32 + hash: "fde26fa3d17fb92d676afe61ca6a2170" + } + Frame { + msec: 48 + hash: "54c7a0ea10fa212959dc4f7606c31f3c" + } + Frame { + msec: 64 + hash: "e73c4521144b2c810f15239e6d8fa468" + } + Frame { + msec: 80 + hash: "31a68bfd57846795db57bb30d1d60341" + } + Frame { + msec: 96 + hash: "55edcaeed37c1390eee2619d52a2eb03" + } + Frame { + msec: 112 + hash: "2c27d9c3dc215c68630495e255c1670e" + } + Frame { + msec: 128 + hash: "b27dd9260f6da3ab414076e83bf5a2bd" + } + Frame { + msec: 144 + hash: "bfcbba7e970af922ee87fbbe936eaa84" + } + Frame { + msec: 160 + hash: "75af84ff6f21648737cef4a215410cc6" + } + Frame { + msec: 176 + hash: "71fd1fe13a14632ff54ad7a87be68bca" + } + Frame { + msec: 192 + hash: "69f553a1893403dc6fc82d3c9c47f501" + } + Frame { + msec: 208 + hash: "9456b12d49cc2a1f9212dba98a83c8ab" + } + Frame { + msec: 224 + hash: "cfd826f91f6f880816d505c93a8f125a" + } + Frame { + msec: 240 + hash: "d8e3291525eff9f905102ed7654f986b" + } + Frame { + msec: 256 + hash: "044c1f37e37a68fbfbb9ddbc2da4300a" + } + Frame { + msec: 272 + hash: "d640cba5f14d9c065bec6f6c23f2831f" + } + Frame { + msec: 288 + hash: "9e15b68dace4b39b937dfea8777ae503" + } + Frame { + msec: 304 + hash: "7ea72711e3f8bdd1087181e127e093c7" + } + Frame { + msec: 320 + hash: "c45dae8eb1768c8aba2d92dea4f268a2" + } + Frame { + msec: 336 + hash: "181ebf6597be2d9e54c1d01a5ab54b46" + } + Frame { + msec: 352 + hash: "094b6cc486b60882836a9ba35411ae7d" + } + Frame { + msec: 368 + hash: "031f1bcb864b4507bf93caab88756317" + } + Frame { + msec: 384 + hash: "42b4d89a1026327f180ecc414dcd0ef0" + } + Frame { + msec: 400 + hash: "a99c5d1d434687e2f16e7054bcff8a69" + } + Frame { + msec: 416 + hash: "91cf18d3f8538ee8550f7e190911b072" + } + Frame { + msec: 432 + hash: "1c11a328d74bc7bf77da10f094db8d4a" + } + Frame { + msec: 448 + hash: "e4da6dc99c962e8f37dc8d99669616d0" + } + Frame { + msec: 464 + hash: "628d4c1455f58a304887050c0552499a" + } + Frame { + msec: 480 + hash: "dd17a403f45bcd1001cb08e7f4ae8443" + } + Frame { + msec: 496 + hash: "1ed042d0289fc6167143ddcd92f708f6" + } + Frame { + msec: 512 + hash: "b55abb6249925cf06439b3177310dcfc" + } + Frame { + msec: 528 + hash: "251c3346640a2aa7a9c18ca84ff2d5bb" + } + Frame { + msec: 544 + hash: "6f5e18d84c4107213599b57bf7284c4b" + } + Frame { + msec: 560 + hash: "2179c1d7d7acb3c2f6354b493cfe74e0" + } + Frame { + msec: 576 + hash: "bbc757e8f3c08f93ffcdd68b392c8cdb" + } + Frame { + msec: 592 + hash: "7eefd9c7291c1a23679efd42f2c29539" + } + Frame { + msec: 608 + hash: "fa375510d3850614aebceb2bc31ab4de" + } + Frame { + msec: 624 + hash: "f643c5ba39bb90f396f00c0a9df995c8" + } + Frame { + msec: 640 + hash: "c6b7792f780b00b1b07c0ce948dff13b" + } + Frame { + msec: 656 + hash: "d43d82ee9b0da8f237469c555b48bee8" + } + Frame { + msec: 672 + hash: "addaa9d2aa8f54d6a4e82dc7e029f19d" + } + Frame { + msec: 688 + hash: "b12af2fd05a1ccd4664c5093456bae01" + } + Frame { + msec: 704 + hash: "982d3505c51fc1bac026c744e2d1db11" + } + Frame { + msec: 720 + hash: "a67a0705ce893dcafdcfc3a7fe71f608" + } + Frame { + msec: 736 + hash: "6e00f746695ca67fb4c4462740b13c8f" + } + Frame { + msec: 752 + hash: "bc4235d556a1e18d591b9afd87b29826" + } + Frame { + msec: 768 + hash: "830ebf4b9214f1dc31975c83cf49d31e" + } + Frame { + msec: 784 + hash: "bac049ae3d6676db8bca99620c9f5bd3" + } + Frame { + msec: 800 + hash: "0f9623c23e4e45126078c3c93015d26c" + } + Frame { + msec: 816 + hash: "bedde76baa8905970ea5fa8da62355a6" + } + Frame { + msec: 832 + hash: "018b9b1444d921b8cfd823265556c8f6" + } + Frame { + msec: 848 + hash: "2be3e0693f54ffefd24e44f552d59e3f" + } + Frame { + msec: 864 + hash: "c8c99f68125df2a1f41f6b44fdcc0406" + } + Frame { + msec: 880 + hash: "3e18d6a24a1c6983f3f2ce984d22dbe4" + } + Frame { + msec: 896 + hash: "aa336c4e5ace2b33689ca280de2299db" + } + Frame { + msec: 912 + hash: "fd7245f879bbd72b6e72c563a588eea7" + } + Frame { + msec: 928 + hash: "e484656517fcb5763c0c8992b22efe91" + } + Frame { + msec: 944 + hash: "fbd58b050963fc7cdbd5ae89aa7a4a70" + } + Frame { + msec: 960 + hash: "b47ad6fb8b364e3c2764bf31e62f21e0" + } + Frame { + msec: 976 + image: "multilength.1.png" + } + Frame { + msec: 992 + hash: "ac1a6692030ed80cd34c082ac70ea06e" + } + Frame { + msec: 1008 + hash: "068a6b82a35d94e3db3eae772c7da56a" + } + Frame { + msec: 1024 + hash: "8252bb45e74bc09e1d5e6b3951fbb08e" + } + Frame { + msec: 1040 + hash: "a5d7ad9287238780cb45c61bb70d6cd4" + } + Frame { + msec: 1056 + hash: "e0307f3a1193af0df0cd52d7dac44db9" + } + Frame { + msec: 1072 + hash: "d649cf0c4a768dba1a0380b64bc7e48b" + } + Frame { + msec: 1088 + hash: "3fd512a0860c17abbb6ed71488cd7255" + } + Frame { + msec: 1104 + hash: "26032efe6efd1de4b5fae23ce4e28a0a" + } + Frame { + msec: 1120 + hash: "846652a87d93e397d1a84b187b7aafea" + } + Frame { + msec: 1136 + hash: "4dfdaa030da4c72a0e1a19bfd70b5856" + } + Frame { + msec: 1152 + hash: "365ad99db7302dfe078f4283af13f5ca" + } + Frame { + msec: 1168 + hash: "f378a096243bd2c6f7e33e0baf24716a" + } + Frame { + msec: 1184 + hash: "e972a84715d314e8814cb7fcab1ad379" + } + Frame { + msec: 1200 + hash: "8826dbafd12ba2a7437623c8967f2699" + } + Frame { + msec: 1216 + hash: "effa889b33b97f665a21d6562acc45fc" + } + Frame { + msec: 1232 + hash: "6ebb408651cf5fbb2fa8788e0ec544d6" + } + Frame { + msec: 1248 + hash: "c4f45fd05b7b4f00acf80f768e99af38" + } + Frame { + msec: 1264 + hash: "735a7c461f6b10cd967b03c173bfd81d" + } + Frame { + msec: 1280 + hash: "608cf5ebac88726ffe7e66d763d74e27" + } + Frame { + msec: 1296 + hash: "6322c5aebdf814bfc5bfaef8b6bb4d91" + } + Frame { + msec: 1312 + hash: "730b7cef2e0cf57a4721e77e6849b862" + } + Frame { + msec: 1328 + hash: "13879c0772938e39d820b6fc10e0f7e5" + } + Frame { + msec: 1344 + hash: "0710bf8a2beff02009d4bb02f2404b7b" + } + Frame { + msec: 1360 + hash: "2cd38c2cbf3d8b7eb3a50b9db4bb8f7f" + } + Frame { + msec: 1376 + hash: "4e988a74a3846171f86d4d69ce3407d9" + } + Frame { + msec: 1392 + hash: "82cc4b40fe1190de5a2cbbf3f11ac7b0" + } + Frame { + msec: 1408 + hash: "f15bd345b992b39167165a640ad45794" + } + Frame { + msec: 1424 + hash: "be5ca66da00327ecc9f5dde2aa3660d2" + } + Frame { + msec: 1440 + hash: "f97a1e863c36477d31a78342c7aa21b7" + } + Frame { + msec: 1456 + hash: "d137a2a6ae95aba3f7a2b2a0560718a5" + } + Frame { + msec: 1472 + hash: "e7529db7cf310e41eb0ac42ab86ae317" + } + Frame { + msec: 1488 + hash: "66914e90881a4a8751ba5391ac41a70b" + } + Frame { + msec: 1504 + hash: "249863a5ef1a14ca0eb4397d206dfc1e" + } + Frame { + msec: 1520 + hash: "26095384b724a5e704c7b627930f4e22" + } + Frame { + msec: 1536 + hash: "98281eed5ae9d9f933e47a8fba8709f1" + } + Frame { + msec: 1552 + hash: "d9b50c54255edb300e36af2648ef8f30" + } + Frame { + msec: 1568 + hash: "9bde860d92f5ec979fa5c274fd1c13a1" + } + Frame { + msec: 1584 + hash: "39c13a42f920f57d9f9fe85ebc4e68fa" + } + Frame { + msec: 1600 + hash: "e80bd130bad05078212089586d6c2731" + } + Frame { + msec: 1616 + hash: "753732b5309fd8dd7daa16761dd7dad0" + } + Frame { + msec: 1632 + hash: "2eb56a98f728b224f7db073c6ea3c3b9" + } + Frame { + msec: 1648 + hash: "21ab167d173e244ffb471faddf704e81" + } + Frame { + msec: 1664 + hash: "9964a0386ae349b909424f588d8decf5" + } + Frame { + msec: 1680 + hash: "cee42f46df4c879fa6fc378481ec728c" + } + Frame { + msec: 1696 + hash: "4779aeed276cbe4112484d189d1baf8b" + } + Frame { + msec: 1712 + hash: "d482cd14db734f5fed2eaec7d8c0c555" + } + Frame { + msec: 1728 + hash: "1f8b0681711c46afcf8af66df6d7caf8" + } + Frame { + msec: 1744 + hash: "44b0e6d69fcd2b7acb499dfdfced026b" + } + Frame { + msec: 1760 + hash: "b6e25c4a276917b7f7f9189e65d965a8" + } + Frame { + msec: 1776 + hash: "07e5da936f8d5c84606fcdc49fc6aca2" + } + Frame { + msec: 1792 + hash: "f27a54a8d37ec62f54e083f1ca65aada" + } + Frame { + msec: 1808 + hash: "074403259022efd08fcbd9d3a3052c79" + } + Frame { + msec: 1824 + hash: "a126762087c8f94beef81216b6010f0c" + } + Frame { + msec: 1840 + hash: "96b8c7cebbb9676ea4f028907de71bbf" + } + Frame { + msec: 1856 + hash: "e6f073522d0af8e504fdb7df971f5e0a" + } + Frame { + msec: 1872 + hash: "9223ed285f322fae3ba2b52afb408586" + } + Frame { + msec: 1888 + hash: "b24575dd4c0b0da0b99a03c46209ed3a" + } + Frame { + msec: 1904 + hash: "5c82bc860f64183e66aead451ee5b893" + } + Frame { + msec: 1920 + hash: "3172ab9c62b0870d6894b13720e54918" + } + Frame { + msec: 1936 + image: "multilength.2.png" + } + Frame { + msec: 1952 + hash: "5f8e85839f9ac82f46a17f871c3fffbc" + } + Frame { + msec: 1968 + hash: "245219fb6c4aa37d8cba7b5e1f74265f" + } + Frame { + msec: 1984 + hash: "b68cfc5366c4ed8d1e5950a1facf0d85" + } + Frame { + msec: 2000 + hash: "dd5c2d2470cc87d57d35ecc9ae8a3528" + } + Frame { + msec: 2016 + hash: "1a15d7f02b35d046305b40f9e6a6839d" + } + Frame { + msec: 2032 + hash: "d44c382ea28d429e6f8bbef9ae17338a" + } + Frame { + msec: 2048 + hash: "63598cb09d5ecbeb991c6db778c5c002" + } + Frame { + msec: 2064 + hash: "b3fcd0180ecd01e2ad0c0114b3dfbf78" + } + Frame { + msec: 2080 + hash: "8d441044f5f10da23708d7ddf0472989" + } + Frame { + msec: 2096 + hash: "6e87518a368c39d68521046773c2f922" + } + Frame { + msec: 2112 + hash: "59e377ccc851ee361e3874ad5ec18e55" + } + Frame { + msec: 2128 + hash: "57a9b0431c7db130bfe4d6603f98c1f5" + } + Frame { + msec: 2144 + hash: "526c93727c6321782a373ea6952a8784" + } + Frame { + msec: 2160 + hash: "fcd0a4605e27ecb0bac18686e7846b3b" + } + Frame { + msec: 2176 + hash: "d697892f9944c67b5aadd7ad641e3ee5" + } + Frame { + msec: 2192 + hash: "f46fd7e568d0995c518749ec0f5a0882" + } + Frame { + msec: 2208 + hash: "31cd2243fb23d4332c02e91f9956f648" + } + Frame { + msec: 2224 + hash: "3b29a9c0121ff127b69abba9c0b13c2c" + } + Frame { + msec: 2240 + hash: "ecd789e744ebb5dee7f25ebb089407bf" + } + Frame { + msec: 2256 + hash: "c99a6dfad8d750b7e67c1e3ef1021cbb" + } + Frame { + msec: 2272 + hash: "82d18b0c193f0ada9cae68e9f6ad5ff5" + } + Frame { + msec: 2288 + hash: "a09e8144b06db76f5849561d880f037e" + } + Frame { + msec: 2304 + hash: "3e6922ca54c809a32ed5ef72e19d7ff0" + } + Frame { + msec: 2320 + hash: "28e46da32bf34b3e1cd3d351e4c40317" + } + Frame { + msec: 2336 + hash: "297aeeaadc5f3268d95320bc3b33a429" + } + Frame { + msec: 2352 + hash: "31721528cdb17b03d3d6ca9f9a91370b" + } + Frame { + msec: 2368 + hash: "52fd1721330321daaea0b56122a72e5b" + } + Frame { + msec: 2384 + hash: "739c5179b9739021dbb522d01812388c" + } + Frame { + msec: 2400 + hash: "4ae07f58d3a514f5c08f314c5dd445c4" + } + Frame { + msec: 2416 + hash: "4305ea97d47bac3fb0eebf9181b3ce48" + } + Frame { + msec: 2432 + hash: "21c99059dba068bc145896217cc0883c" + } + Frame { + msec: 2448 + hash: "0a514ae5d36acc07c7809a7b4f21ed8e" + } + Frame { + msec: 2464 + hash: "550ce887f462ace686bc6a9021c5cb73" + } + Frame { + msec: 2480 + hash: "b65857dcfa0b1281dd5b9821a12dd8e8" + } + Frame { + msec: 2496 + hash: "5a6bb448a570e1a3eef142b8054f3717" + } + Frame { + msec: 2512 + hash: "b38e2f6b4063e1b8a40292017c5ed4ec" + } + Frame { + msec: 2528 + hash: "fa7545e6e3fc92d62af2f7651077da5b" + } + Frame { + msec: 2544 + hash: "ebf0c79720a5692b761b62c4ba360875" + } + Frame { + msec: 2560 + hash: "cb5356376d97308a4d102c9a53e93abe" + } + Frame { + msec: 2576 + hash: "879f434f4901bdcb166294336c60e26a" + } + Frame { + msec: 2592 + hash: "3ab575ac04bdd455346c0460aed413a0" + } + Frame { + msec: 2608 + hash: "8f08366cb474ca2a1988ebba9d65ecaa" + } + Frame { + msec: 2624 + hash: "2939cf0235f98aeaf48b3f28964cdddd" + } + Frame { + msec: 2640 + hash: "9cf4b339914e48f896dda17e08759472" + } + Frame { + msec: 2656 + hash: "3f5568ac7a4386f1d5072f1cda0c35b8" + } + Frame { + msec: 2672 + hash: "107edbf8181f79cd7847d0154b6eda11" + } + Frame { + msec: 2688 + hash: "9254497b95b89a7d40903edb04a3764a" + } + Frame { + msec: 2704 + hash: "7e7d25a2ee3fbfd67a3b8fecb9fe9202" + } + Frame { + msec: 2720 + hash: "03759f59bbd2be573acd6c03eb088edd" + } + Frame { + msec: 2736 + hash: "58689762be6c7d3d6de6f23580ec8886" + } + Frame { + msec: 2752 + hash: "0d4e315f9b079a30e6a4294a667f9ebc" + } + Frame { + msec: 2768 + hash: "3f3dfa1c8d160238dae2da79a6a569f3" + } + Frame { + msec: 2784 + hash: "b3cd7c3034e2a34c4ae9ed7f3144b2cc" + } + Frame { + msec: 2800 + hash: "c27d3a9057d1f15c6e0b2d427ac12ad2" + } + Frame { + msec: 2816 + hash: "9b25ab315d9bfc582e41c05e88812cbe" + } + Frame { + msec: 2832 + hash: "e75671bfb99741dcff476690ede42166" + } + Frame { + msec: 2848 + hash: "7dd3307fb41277ebcc4339cdb7747d7c" + } + Frame { + msec: 2864 + hash: "a148bce140f1637e27ae5f0207b75351" + } + Frame { + msec: 2880 + hash: "64e57a31c1baa16bcf47f2202fd6e2ed" + } + Frame { + msec: 2896 + image: "multilength.3.png" + } + Frame { + msec: 2912 + hash: "83381c54b1923356c403cad2ae2c3519" + } + Frame { + msec: 2928 + hash: "e110f28619c2ec7c1c8d479793b93e54" + } + Frame { + msec: 2944 + hash: "996a9a698f1a7c673eeef67501d7b81b" + } + Frame { + msec: 2960 + hash: "6cf2465c8b7c70343a26e981e6492212" + } + Frame { + msec: 2976 + hash: "3a9078adf3d4ca207c97b62ad525998f" + } + Frame { + msec: 2992 + hash: "0bf0d9a6a202119daa6a44f17d03b9ed" + } + Frame { + msec: 3008 + hash: "6dfadc21810c9176dad599a6f7f672b9" + } + Frame { + msec: 3024 + hash: "f1f866c6245bd6fd8141abfb8a040d46" + } + Frame { + msec: 3040 + hash: "84329287c7555bc6207039ea632632b2" + } + Frame { + msec: 3056 + hash: "da7e80527f58c93bce9267958ce4c5d7" + } + Frame { + msec: 3072 + hash: "cd8eea7543ebc42971b3f41ea21dd4ed" + } + Frame { + msec: 3088 + hash: "b9abb526dc3447370d847a5bca868b50" + } + Frame { + msec: 3104 + hash: "b8d63ac8331a9375ca06adacb56d12ea" + } + Frame { + msec: 3120 + hash: "20fcdd73a4cc2abebbc462c32fb9b2c8" + } + Frame { + msec: 3136 + hash: "3f656f80771828ee6696a2e0a0626ae4" + } + Frame { + msec: 3152 + hash: "0d99110edca4f8ec544d10d680d27092" + } + Frame { + msec: 3168 + hash: "48026f803bd17f56d13dd946fb359e3a" + } + Frame { + msec: 3184 + hash: "40759d794139327e2e66685c9fcb047b" + } + Frame { + msec: 3200 + hash: "419953a3f882008e82bd733e63e66ab6" + } + Frame { + msec: 3216 + hash: "ddcd288b0a825ef6899755fbad56f2dd" + } + Frame { + msec: 3232 + hash: "bc203d9f0f32efdd177353b9589bd127" + } + Frame { + msec: 3248 + hash: "a4ae6c449b53545a683cd33bc9274d59" + } + Frame { + msec: 3264 + hash: "59e7c218b5a1b857469972f966489a43" + } + Frame { + msec: 3280 + hash: "521fc5833ab0e3088200e1fea9a887b0" + } + Frame { + msec: 3296 + hash: "bd2386f85afb7516d147bff4c07e239f" + } + Frame { + msec: 3312 + hash: "5298fdee07ff2ff34121f064fed3db4e" + } + Frame { + msec: 3328 + hash: "311a8f163cebf7bafcb47c8e6db40ed1" + } + Frame { + msec: 3344 + hash: "ad6342bed57257a1616a74e19f2bb484" + } + Frame { + msec: 3360 + hash: "4eb186c5f4963dc72b3dbc3a9da4df65" + } + Frame { + msec: 3376 + hash: "58f1f128001dd1ce0d405595acbaab2a" + } + Frame { + msec: 3392 + hash: "ba4a39b66cac22fceba9c4ecfdbae363" + } + Frame { + msec: 3408 + hash: "bbfde54a4de637bc1c54248e2e342544" + } + Frame { + msec: 3424 + hash: "ddc3b4e87782e0472630e2f9f8a57099" + } + Frame { + msec: 3440 + hash: "1bf1212686520da772fc18ca7684a924" + } + Frame { + msec: 3456 + hash: "706ec5a3b48123d3b5113d55b71f7968" + } + Frame { + msec: 3472 + hash: "62b08db0c3c4f1313bcf4a1e7b90badb" + } + Frame { + msec: 3488 + hash: "ae8409fed9d8919b1af2b4d0eafce670" + } + Frame { + msec: 3504 + hash: "9f6ed6ada78e42f06f33514e363c736f" + } + Frame { + msec: 3520 + hash: "97e9a504c2c4ba5329a616810fc19505" + } + Frame { + msec: 3536 + hash: "348b6d15b8ef6862818b4fbdb938f241" + } + Frame { + msec: 3552 + hash: "c1845df466f5690a8d7a439d33a27f7d" + } + Frame { + msec: 3568 + hash: "aee2486331275b9f4116b61588ce169e" + } + Frame { + msec: 3584 + hash: "efca3eaffa3421d68d788ee3f0ec068c" + } + Frame { + msec: 3600 + hash: "35f2940b51ed8c4734c23a43bf6fe448" + } + Frame { + msec: 3616 + hash: "92b7d34480b7fab4dd39bbccfa8455a5" + } + Frame { + msec: 3632 + hash: "4408049f405ecf5c3c696780390e2155" + } + Frame { + msec: 3648 + hash: "29aa30678d5c87c79ac67198e4dd7bd4" + } + Frame { + msec: 3664 + hash: "2f88ac156017b20795f01716d9e9f2e8" + } + Frame { + msec: 3680 + hash: "4d72dec4a2e8edcff806c11f3742cf07" + } + Frame { + msec: 3696 + hash: "3f5ebad282a4aa9c03a17d32aea03151" + } + Frame { + msec: 3712 + hash: "a8d289d15353d45159607377de285732" + } + Frame { + msec: 3728 + hash: "af2d2fcfa4510e0d26ea90fc7711b0cf" + } + Frame { + msec: 3744 + hash: "aed6897bc8b2163822a052e1cc9ad36b" + } + Frame { + msec: 3760 + hash: "bf7077614b5045f79c8697bab1e83839" + } + Frame { + msec: 3776 + hash: "e5c8c0bf1fce3a964f4bb911ffee0bdb" + } + Frame { + msec: 3792 + hash: "bcfe4aebc880809f56d480f23b17dfd1" + } + Frame { + msec: 3808 + hash: "2ce342f7864ab26124093edc88585c97" + } + Frame { + msec: 3824 + hash: "8be15d95125e03a0282e897096abb443" + } + Frame { + msec: 3840 + hash: "a4486f30becceca3ec3cc5c8718af82a" + } + Frame { + msec: 3856 + image: "multilength.4.png" + } + Frame { + msec: 3872 + hash: "38de7ed0d05015f9b06a4bb278fc96c1" + } + Frame { + msec: 3888 + hash: "1cd9a38bb1fc8b06d5c05cd28719d4b3" + } + Frame { + msec: 3904 + hash: "682ba6e2eb83ce1b6bf8526b21cf2694" + } + Frame { + msec: 3920 + hash: "3da075fccb3d26f30530a69f86d999a8" + } + Frame { + msec: 3936 + hash: "b0fb39798dfa94d0898e5e0d7afd1277" + } + Frame { + msec: 3952 + hash: "7e41bbe233d6bc7354ba4516edec4841" + } + Frame { + msec: 3968 + hash: "1d3f24f20ba123940d97f09949cfcc0f" + } + Frame { + msec: 3984 + hash: "abc7a82d91e28c5a3ee9ffd663c8c7bd" + } + Frame { + msec: 4000 + hash: "e685c0218a3d80584013806707693eb0" + } + Frame { + msec: 4016 + hash: "6ff98dc7eb0453f058a5d4cadf86ddf4" + } + Frame { + msec: 4032 + hash: "5a3d0c2c95cb85678f32a8b68dc8d399" + } + Frame { + msec: 4048 + hash: "d5bde2f063d524ac0e7bcef26d543668" + } + Frame { + msec: 4064 + hash: "64e7bc5e0798ecd009fd05cbc1523977" + } + Frame { + msec: 4080 + hash: "3c87a9ee92661da2aacc09b71dd393ca" + } + Frame { + msec: 4096 + hash: "bf4806e0e8cb73cded37ca97966078d7" + } + Frame { + msec: 4112 + hash: "a5956031dac15dba64bf49c9d308c9c7" + } + Frame { + msec: 4128 + hash: "51395284acf731266eaed86387ad768a" + } + Frame { + msec: 4144 + hash: "489ab28b773d48b8fdf9cf674b1da87f" + } + Frame { + msec: 4160 + hash: "4c6a5b7442a4ff241329157657b8c9f7" + } + Frame { + msec: 4176 + hash: "629faa780676c705ca8349b8765ed38b" + } + Frame { + msec: 4192 + hash: "28654cb8801bea906a4f181004ed0e85" + } + Frame { + msec: 4208 + hash: "2abf774ccf33e6d0af4a8c4154e2ab2a" + } + Frame { + msec: 4224 + hash: "f1cbdf35081b08b676d1661834829c9a" + } + Frame { + msec: 4240 + hash: "a49ef4ec40d59be1e872c6f8bcdbbb4c" + } + Frame { + msec: 4256 + hash: "dab02c8afd3914177bfdf29e68b54291" + } + Frame { + msec: 4272 + hash: "7bdca9571a346117277b0de6fa1f6e5e" + } + Frame { + msec: 4288 + hash: "11dc19768b1a4a787f46082a583c068c" + } + Frame { + msec: 4304 + hash: "5e72d13702108d55d650a01c1caf2cfb" + } + Frame { + msec: 4320 + hash: "e5a379841ae54f07d54c4baa78fa7b69" + } + Frame { + msec: 4336 + hash: "88d2363709d377cad251dc956b0ff866" + } + Frame { + msec: 4352 + hash: "5e6db7322e69f41d37efdd35a769df4e" + } + Frame { + msec: 4368 + hash: "cc781d136bb48a1a41bd9243327bacc3" + } + Frame { + msec: 4384 + hash: "69612d6379a204fa1e1c6d7b58f78370" + } + Frame { + msec: 4400 + hash: "a81c15225bc81a19e22375532a5457ab" + } + Frame { + msec: 4416 + hash: "a97bb0ac528a1377ef8f6bf655795b69" + } + Frame { + msec: 4432 + hash: "7fa6d66219c66ae8aec43e44626b427a" + } + Frame { + msec: 4448 + hash: "99f47bc80b706692f16c6c5fa3c0c85d" + } + Frame { + msec: 4464 + hash: "55d6cf7f545c74ed59a8bf040f9d5d58" + } + Frame { + msec: 4480 + hash: "1a07d14fa7866c5268e622d0925cbf4d" + } + Frame { + msec: 4496 + hash: "a41b281563c401d0e4ff55f4a3c45e18" + } + Frame { + msec: 4512 + hash: "6bff67c2f53a4e620c63eea539f4abe0" + } + Frame { + msec: 4528 + hash: "a5f06e5ff2fd7f390279f7df822c8297" + } + Frame { + msec: 4544 + hash: "213b174770c13105b89a1d88cd2f0b7c" + } + Frame { + msec: 4560 + hash: "dde34ca92317a54ddaa2f9bff515d91c" + } + Frame { + msec: 4576 + hash: "12446cca2aae19fd721cda11bbb51bae" + } + Frame { + msec: 4592 + hash: "f4d00502cab0a843563fcfd336b74596" + } + Frame { + msec: 4608 + hash: "b6ae2b396adf6068ef3a6027e4b175db" + } + Frame { + msec: 4624 + hash: "370dabffdfc0bebf5d25abfaefff399c" + } + Frame { + msec: 4640 + hash: "fd496e8c03f85a872bd5ee6e8a85db7f" + } + Frame { + msec: 4656 + hash: "0999335427d63f318e166ea8662c4c22" + } + Frame { + msec: 4672 + hash: "5a4eb9267cd35a71f6c2daaca1a582be" + } + Frame { + msec: 4688 + hash: "4270d7a26d56f1d805b647c5ec7cc6ce" + } + Frame { + msec: 4704 + hash: "334f1e3c8520196016352bf4d00fbc18" + } + Frame { + msec: 4720 + hash: "2bf704e85c197c776a188927a80deaad" + } + Frame { + msec: 4736 + hash: "e2c5c42e55dc185977bd5049eb4bd3d2" + } + Frame { + msec: 4752 + hash: "7ead4353fdc135d6b959be0ce22955e3" + } + Frame { + msec: 4768 + hash: "ab42998e1e17ac8637d76dc0cf356c7a" + } + Frame { + msec: 4784 + hash: "030f34f8caf0814eaaf18ea5fda669dd" + } + Frame { + msec: 4800 + hash: "6e12a04ac25553142875a10a5c8e46e8" + } + Frame { + msec: 4816 + image: "multilength.5.png" + } + Frame { + msec: 4832 + hash: "e2f2ab9a3fe6a3a375341010c91017bd" + } + Frame { + msec: 4848 + hash: "9301889debd3932772a1c81314eb1ef2" + } + Frame { + msec: 4864 + hash: "671feec6eb1166c612a22405db9c044e" + } + Frame { + msec: 4880 + hash: "648215ffa5448dc173165d24389c014e" + } + Frame { + msec: 4896 + hash: "a70806b54806f29d0e240cd63d86b77e" + } + Frame { + msec: 4912 + hash: "4bf9ffe611c52c21fbdb84221d3d4dba" + } + Frame { + msec: 4928 + hash: "ae78202b0ebd4c13a92d468a7470bdc9" + } + Frame { + msec: 4944 + hash: "fb0c3d6c3e3479abb6a1b44b1a5f3785" + } + Frame { + msec: 4960 + hash: "48906c21e17479807f736d7f7713f6b0" + } + Frame { + msec: 4976 + hash: "a661a461542b3078dd1dad25bf6d8414" + } + Frame { + msec: 4992 + hash: "387deb0df0c59cfb120313946c4e5c9a" + } + Frame { + msec: 5008 + hash: "f2473c6e4877f3035f0b511ff2d27684" + } + Frame { + msec: 5024 + hash: "f88d3767ccd773930ef9d99dfd0e8c17" + } + Frame { + msec: 5040 + hash: "aef8a93d2caafec839d425184176bcc7" + } + Frame { + msec: 5056 + hash: "e73c4521144b2c810f15239e6d8fa468" + } + Frame { + msec: 5072 + hash: "a66856750cc5aa7a21ffb6e0a9c94306" + } + Frame { + msec: 5088 + hash: "22bce57e360790c356564a0568ec3bee" + } + Frame { + msec: 5104 + hash: "55edcaeed37c1390eee2619d52a2eb03" + } + Frame { + msec: 5120 + hash: "51d8495324954f1bd62caa67d15e9ab2" + } + Frame { + msec: 5136 + hash: "bfcbba7e970af922ee87fbbe936eaa84" + } + Frame { + msec: 5152 + hash: "a7652fe427ca7b8ef37dbf9a6097f8af" + } + Frame { + msec: 5168 + hash: "d5ab00fc274a7fd568af514c55f24e04" + } + Frame { + msec: 5184 + hash: "71fd1fe13a14632ff54ad7a87be68bca" + } + Frame { + msec: 5200 + hash: "761f9b41ce4136619f89c73746ab176e" + } + Frame { + msec: 5216 + hash: "cfd826f91f6f880816d505c93a8f125a" + } + Frame { + msec: 5232 + hash: "33fbc77640cc73c17a0f68db5f70ddec" + } + Frame { + msec: 5248 + hash: "ef925f6709f7603d8acddbbe3e3b0426" + } + Frame { + msec: 5264 + hash: "044c1f37e37a68fbfbb9ddbc2da4300a" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/elide.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/elide.qml new file mode 100644 index 00000000..e52c6093 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/elide.qml @@ -0,0 +1,32 @@ +import QtQuick 1.0 +import "../../shared" 1.0 + +Rectangle { + width: childrenRect.width + height: childrenRect.height + Column { + width: 80 + height: myText.height*4 + TestText { + elide: "ElideLeft" + text: "aaa bbb ccc ddd eee fff" + width: 80 + id: myText + } + TestText { + elide: "ElideMiddle" + text: "aaa bbb ccc ddd eee fff" + width: 80 + } + TestText { + elide: "ElideRight" + text: "aaa bbb ccc ddd eee fff" + width: 80 + } + TestText { + elide: "ElideNone" + text: "aaa bbb ccc ddd eee fff" + width: 80 + } + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/elide2.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/elide2.qml new file mode 100644 index 00000000..0370a73b --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/elide2.qml @@ -0,0 +1,13 @@ +import QtQuick 1.0 +import "../../shared" 1.0 + +Rectangle { + width: 500 + height: 100 + + TestText { + NumberAnimation on width { from: 500; to: 0; loops: Animation.Infinite; duration: 5000 } + elide: Text.ElideRight + text: 'Here is some very long text that we should truncate when sizing window' + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/multilength.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/multilength.qml new file mode 100644 index 00000000..db991a2d --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/elide/multilength.qml @@ -0,0 +1,20 @@ +import QtQuick 1.0 +import "../../shared" 1.0 + +Rectangle { + width: 500 + height: 50 + color: "lightBlue" + Rectangle { + width: myText.width + height: myText.height + color: "white" + anchors.centerIn: parent + TestText { + id: myText + NumberAnimation on width { from: 500; to: 0; loops: Animation.Infinite; duration: 5000 } + elide: "ElideRight" + text: "Brevity is the soul of wit, and tediousness the limbs and outward flourishes.\x9CBrevity is a great charm of eloquence.\x9CBe concise!\x9CSHHHHHHHHHHHHHHHHHHHHHHHHHHHH" + } + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/BorderedText.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/BorderedText.qml new file mode 100644 index 00000000..fe4e2e70 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/BorderedText.qml @@ -0,0 +1,9 @@ +import QtQuick 1.0 +import "../../shared" 1.0 + +TestText { + property color bcolor: "blue" + font.pixelSize: 10 + text: "The quick brown fox\njumps over\nthe lazy dog." + Rectangle { id: border; color: "transparent"; border.color: bcolor; anchors.fill: parent; opacity: 0.2 } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext.0.png new file mode 100644 index 00000000..cfa61a9a Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext.qml new file mode 100644 index 00000000..fdf23106 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "plaintext.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext2.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext2.0.png new file mode 100644 index 00000000..e47b4795 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext2.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext2.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext2.qml new file mode 100644 index 00000000..f6cddc43 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext2.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "plaintext2.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext3.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext3.0.png new file mode 100644 index 00000000..0d3c6728 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext3.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext3.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext3.qml new file mode 100644 index 00000000..13f413a1 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/plaintext3.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "plaintext3.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext.0.png new file mode 100644 index 00000000..76e5b9f8 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext.qml new file mode 100644 index 00000000..3da391dc --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "richtext.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext2.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext2.0.png new file mode 100644 index 00000000..bb65aded Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext2.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext2.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext2.qml new file mode 100644 index 00000000..afae3f89 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-MAC/richtext2.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "richtext2.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext.0.png new file mode 100644 index 00000000..56d98ff0 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext.qml new file mode 100644 index 00000000..fdf23106 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "plaintext.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext2.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext2.0.png new file mode 100644 index 00000000..1ab1eb5b Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext2.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext2.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext2.qml new file mode 100644 index 00000000..f6cddc43 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext2.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "plaintext2.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext3.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext3.0.png new file mode 100644 index 00000000..04e0f5e8 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext3.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext3.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext3.qml new file mode 100644 index 00000000..13f413a1 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/plaintext3.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "plaintext3.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/richtext.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/richtext.0.png new file mode 100644 index 00000000..68921f65 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/richtext.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/richtext.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/richtext.qml new file mode 100644 index 00000000..3da391dc --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/richtext.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "richtext.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/richtext2.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/richtext2.0.png new file mode 100644 index 00000000..c9450c7c Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/richtext2.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/richtext2.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/richtext2.qml new file mode 100644 index 00000000..afae3f89 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data-X11/richtext2.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "richtext2.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext.0.png new file mode 100644 index 00000000..89195ae7 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext.qml new file mode 100644 index 00000000..fdf23106 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "plaintext.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext2.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext2.0.png new file mode 100644 index 00000000..0574f63f Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext2.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext2.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext2.qml new file mode 100644 index 00000000..f6cddc43 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext2.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "plaintext2.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext3.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext3.0.png new file mode 100644 index 00000000..0d3c6728 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext3.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext3.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext3.qml new file mode 100644 index 00000000..13f413a1 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/plaintext3.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "plaintext3.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/richtext.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/richtext.0.png new file mode 100644 index 00000000..6a487283 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/richtext.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/richtext.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/richtext.qml new file mode 100644 index 00000000..3da391dc --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/richtext.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "richtext.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/richtext2.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/richtext2.0.png new file mode 100644 index 00000000..34f8e387 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/richtext2.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/richtext2.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/richtext2.qml new file mode 100644 index 00000000..afae3f89 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/data/richtext2.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "richtext2.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/plaintext.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/plaintext.qml new file mode 100644 index 00000000..64ab65b8 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/plaintext.qml @@ -0,0 +1,101 @@ +import QtQuick 1.0 +import "../../shared" 1.0 + +Rectangle { + id: s; width: 620; height: 360; color: "lightsteelblue" + property string text: "Jackdaws love my big sphinx of quartz." + + Column { + spacing: 8 + TestText { + text: s.text; horizontalAlignment: Text.AlignLeft; width: s.width + } + TestText { + font.pixelSize: 18 + text: s.text; horizontalAlignment: Text.AlignHCenter; verticalAlignment: Text.AlignVCenter; width: s.width; + } + TestText { + font.pixelSize: 24 + text: s.text; horizontalAlignment: Text.AlignRight; verticalAlignment: Text.AlignBottom; width: s.width; + } + Grid{ + columns: 2 + spacing: 4 + TestText { + text: s.text; color: "red"; smooth: true + } + TestText { + text: s.text; font.capitalization: "AllUppercase" + } + TestText { + text: s.text; font.underline: true + } + TestText { + text: s.text; font.overline: true; smooth: true + } + TestText { + text: s.text; font.strikeout: true + } + TestText { + text: s.text; font.underline: true; font.overline: true; font.strikeout: true + } + TestText { + text: s.text; style: Text.Outline; styleColor: "white" + } + TestText { + text: s.text; style: Text.Sunken; styleColor: "gray" + } + TestText { + text: s.text; style: Text.Raised; styleColor: "yellow" + } + TestText { + text: s.text; font.letterSpacing: 2 + } + } + TestText { + text: s.text; font.underline: true; font.letterSpacing: 2; font.capitalization: "AllUppercase"; color: "blue" + } + TestText { + text: s.text; font.overline: true; font.wordSpacing: 25; font.capitalization: "Capitalize"; color: "green" + } + Row{ + height: childrenRect.height + spacing: 4 + TestText { + text: s.text; elide: Text.ElideLeft; width: 200 + } + TestText { + text: s.text; elide: Text.ElideMiddle; width: 200 + } + TestText { + text: s.text; elide: Text.ElideRight; width: 200 + } + } + Row{ + height: childrenRect.height + spacing: 4 + TestText{ + text: s.text; elide: Text.ElideLeft; width: 200; wrapMode: Text.WordWrap + } + TestText { + text: s.text; elide: Text.ElideMiddle; width: 200; wrapMode: Text.WordWrap + } + TestText { + text: s.text; elide: Text.ElideRight; width: 200; wrapMode: Text.WordWrap + } + } + Row{ + height: childrenRect.height + spacing: 4 + TestText { + text: s.text + " thisisaverylongstringwithnospaces"; width: 150; wrapMode: Text.WrapAnywhere + } + TestText { + text: s.text + " thisisaverylongstringwithnospaces"; width: 150; wrapMode: Text.Wrap + } + TestText { +text: s.text; font.pixelSize: 18; style: Text.Outline; styleColor: "white"; wrapMode: Text.WordWrap; width: 200 + } + } + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/plaintext2.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/plaintext2.qml new file mode 100644 index 00000000..01de1f00 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/plaintext2.qml @@ -0,0 +1,23 @@ +import QtQuick 1.0 +import "../../shared" 1.0 + +Rectangle { + width: 400; height: 200 + + Row { + spacing: 20 + anchors.centerIn: parent + TestText { + text: "First line\nSecond line"; wrapMode: Text.Wrap + } + TestText { + text: "First line\nSecond line"; width: 70 + } + TestText { + text: "First Second\nThird Fourth"; wrapMode: Text.Wrap; width: 50 + } + TestText { + text: "First line
Second line"; textFormat: Text.StyledText + } + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/plaintext3.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/plaintext3.qml new file mode 100644 index 00000000..10a2d9ab --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/plaintext3.qml @@ -0,0 +1,62 @@ +import QtQuick 1.0 + +Rectangle { + id: main + width: 620; height: 280 + + + Grid { + x: 4; y: 4 + spacing: 8 + columns: 4 + + Column { + spacing: 4 + BorderedText { } + BorderedText { horizontalAlignment: Text.AlignHCenter } + BorderedText { horizontalAlignment: Text.AlignRight } + } + + Column { + spacing: 4 + BorderedText { wrapMode: Text.Wrap } + BorderedText { horizontalAlignment: Text.AlignHCenter; wrapMode: Text.Wrap } + BorderedText { horizontalAlignment: Text.AlignRight; wrapMode: Text.Wrap } + } + + Column { + spacing: 4 + BorderedText { wrapMode: Text.Wrap; elide: Text.ElideRight } + BorderedText { horizontalAlignment: Text.AlignHCenter; wrapMode: Text.Wrap; elide: Text.ElideRight } + BorderedText { horizontalAlignment: Text.AlignRight; wrapMode: Text.Wrap; elide: Text.ElideRight } + } + + Column { + spacing: 4 + BorderedText { width: 230; wrapMode: Text.Wrap; elide: Text.ElideRight } + BorderedText { width: 230; horizontalAlignment: Text.AlignHCenter; wrapMode: Text.Wrap; elide: Text.ElideRight } + BorderedText { width: 230; horizontalAlignment: Text.AlignRight; wrapMode: Text.Wrap; elide: Text.ElideRight } + } + + Column { + spacing: 4 + BorderedText { width: 120; wrapMode: Text.Wrap; elide: Text.ElideRight } + BorderedText { width: 120; horizontalAlignment: Text.AlignHCenter; wrapMode: Text.Wrap; elide: Text.ElideRight } + BorderedText { width: 120; horizontalAlignment: Text.AlignRight; wrapMode: Text.Wrap; elide: Text.ElideRight } + } + + Column { + spacing: 4 + BorderedText { width: 120; wrapMode: Text.Wrap } + BorderedText { width: 120; horizontalAlignment: Text.AlignHCenter; wrapMode: Text.Wrap } + BorderedText { width: 120; horizontalAlignment: Text.AlignRight; wrapMode: Text.Wrap } + } + + Column { + spacing: 4 + BorderedText { width: 120 } + BorderedText { width: 120; horizontalAlignment: Text.AlignHCenter } + BorderedText { width: 120; horizontalAlignment: Text.AlignRight } + } + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/richtext.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/richtext.qml new file mode 100644 index 00000000..a748b686 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/richtext.qml @@ -0,0 +1,47 @@ +import QtQuick 1.0 +import "../../shared" 1.0 + +Rectangle { + id: s; width: 620; height: 300; color: "lightsteelblue" + property string text: "The quick brown fox jumps over the lazy dog." + + Column { + spacing: 6 + TestText { + text: s.text + } + TestText { + text: s.text; font.pixelSize: 18 + } + TestText { + text: s.text; font.pixelSize: 24 + } + TestText { + text: s.text; color: "red"; smooth: true + } + TestText { + text: s.text; font.capitalization: "AllUppercase" + } + TestText { + text: s.text; font.underline: true + } + TestText { + text: s.text; font.overline: true; smooth: true + } + TestText { + text: s.text; font.strikeout: true + } + TestText { + text: s.text; font.underline: true; font.overline: true; font.strikeout: true + } + TestText { + text: s.text; font.letterSpacing: 2 + } + TestText { + text: s.text; font.underline: true; font.letterSpacing: 2; font.capitalization: "AllUppercase"; color: "blue" + } + TestText { + text: s.text; font.overline: true; font.wordSpacing: 25; font.capitalization: "Capitalize"; color: "green" + } + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/font/richtext2.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/richtext2.qml new file mode 100644 index 00000000..f5e85fa0 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/font/richtext2.qml @@ -0,0 +1,43 @@ +import QtQuick 1.0 +import "../../shared" 1.0 + +//This is a continuation of richtext.qml, it was bisected so that it could fit on smaller screens +Rectangle { + id: s; width: 620; height: 300; color: "lightsteelblue" + property string text: "The quick brown fox jumps over the lazy dog." + + Column { + spacing: 6 + TestText { + text: s.text; font.pixelSize: 18; style: Text.Outline; styleColor: "white" + } + TestText { + text: s.text; font.pixelSize: 18; style: Text.Sunken; styleColor: "gray" + } + TestText { + text: s.text; font.pixelSize: 18; style: Text.Raised; styleColor: "yellow" + } + TestText { + text: s.text; horizontalAlignment: Text.AlignLeft; width: s.width + } + TestText { + text: s.text; horizontalAlignment: Text.AlignHCenter; verticalAlignment: Text.AlignVCenter; width: s.width; height: 20 + } + TestText { + text: s.text; horizontalAlignment: Text.AlignRight; verticalAlignment: Text.AlignBottom; width: s.width; height: 20 + } + Row{ + height: childrenRect.height; + spacing: 4 + TestText { + text: s.text + " thisisaverylongstringwithnospaces"; width: 150; wrapMode: Text.WrapAnywhere + } + TestText { + text: s.text + " thisisaverylongstringwithnospaces"; width: 150; wrapMode: Text.Wrap + } + TestText { + text: s.text; font.pixelSize: 18; style: Text.Outline; styleColor: "white"; wrapMode: Text.WordWrap; width: 200 + } + } + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines.0.png new file mode 100644 index 00000000..c24c7c65 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines.qml new file mode 100644 index 00000000..affd3a61 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "newLines.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines_wrap.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines_wrap.0.png new file mode 100644 index 00000000..0ba68e5a Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines_wrap.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines_wrap.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines_wrap.qml new file mode 100644 index 00000000..410b47d1 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines_wrap.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "newLines_wrap.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines_wrap_elide.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines_wrap_elide.0.png new file mode 100644 index 00000000..3f1144b8 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines_wrap_elide.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines_wrap_elide.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines_wrap_elide.qml new file mode 100644 index 00000000..94cf1d25 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/newLines_wrap_elide.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "newLines_wrap_elide.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/wrap.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/wrap.0.png new file mode 100644 index 00000000..f0ad9651 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/wrap.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/wrap.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/wrap.qml new file mode 100644 index 00000000..4b55312c --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/wrap.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "wrap.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/wrap_elide.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/wrap_elide.0.png new file mode 100644 index 00000000..62274ce3 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/wrap_elide.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/wrap_elide.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/wrap_elide.qml new file mode 100644 index 00000000..7d002ea4 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data-X11/wrap_elide.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "wrap_elide.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines.0.png new file mode 100644 index 00000000..c24c7c65 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines.qml new file mode 100644 index 00000000..affd3a61 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "newLines.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines_wrap.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines_wrap.0.png new file mode 100644 index 00000000..0ba68e5a Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines_wrap.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines_wrap.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines_wrap.qml new file mode 100644 index 00000000..410b47d1 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines_wrap.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "newLines_wrap.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines_wrap_elide.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines_wrap_elide.0.png new file mode 100644 index 00000000..3f1144b8 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines_wrap_elide.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines_wrap_elide.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines_wrap_elide.qml new file mode 100644 index 00000000..94cf1d25 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/newLines_wrap_elide.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "newLines_wrap_elide.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/wrap.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/wrap.0.png new file mode 100644 index 00000000..f0ad9651 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/wrap.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/wrap.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/wrap.qml new file mode 100644 index 00000000..4b55312c --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/wrap.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "wrap.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/wrap_elide.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/wrap_elide.0.png new file mode 100644 index 00000000..62274ce3 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/wrap_elide.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/wrap_elide.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/wrap_elide.qml new file mode 100644 index 00000000..7d002ea4 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/data/wrap_elide.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "wrap_elide.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/newLines.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/newLines.qml new file mode 100644 index 00000000..4e993c69 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/newLines.qml @@ -0,0 +1,13 @@ +import QtQuick 1.0 +import "../../shared" 1.0 + +Rectangle { + width: childrenRect.width + height: childrenRect.height + + TestText { + width: 80 + maximumLineCount: 2 + text: "Line1\nLine2\nLine3\nLine4" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/newLines_wrap.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/newLines_wrap.qml new file mode 100644 index 00000000..5d8f50b5 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/newLines_wrap.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 +import "../../shared" 1.0 + +Rectangle { + width: childrenRect.width + height: childrenRect.height + + TestText { + width: 80 + maximumLineCount: 3 + wrapMode: Text.WordWrap + text: "Line1 has a more\nLine2\nLine3\nLine4" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/newLines_wrap_elide.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/newLines_wrap_elide.qml new file mode 100644 index 00000000..ac7b5cbe --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/newLines_wrap_elide.qml @@ -0,0 +1,15 @@ +import QtQuick 1.0 +import "../../shared" 1.0 + +Rectangle { + width: childrenRect.width + height: childrenRect.height + + TestText { + width: 80 + maximumLineCount: 3 + wrapMode: Text.WordWrap + elide: Text.ElideRight + text: "Line1 has a more\nLine2\nLine3\nLine4" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/wrap.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/wrap.qml new file mode 100644 index 00000000..6d72430e --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/wrap.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 +import "../../shared" 1.0 + +Rectangle { + width: childrenRect.width + height: childrenRect.height + + TestText { + width: 80 + maximumLineCount: 3 + wrapMode: Text.WordWrap + text: "The quick brown fox jumped over the lazy dog" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/wrap_elide.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/wrap_elide.qml new file mode 100644 index 00000000..785c5f53 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/maximumLineCount/wrap_elide.qml @@ -0,0 +1,15 @@ +import QtQuick 1.0 +import "../../shared" 1.0 + +Rectangle { + width: childrenRect.width + height: childrenRect.height + + TestText { + width: 80 + maximumLineCount: 3 + wrapMode: Text.WordWrap + elide: Text.ElideRight + text: "The quick brown fox jumped over the lazy dog" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetext/qtbug_14865.qml b/tests/auto/declarative/qmlvisual/qdeclarativetext/qtbug_14865.qml new file mode 100644 index 00000000..6699076c --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetext/qtbug_14865.qml @@ -0,0 +1,18 @@ +import QtQuick 1.0 +import "../shared" 1.0 + +Rectangle { + width: 100; height: 20 + + TestText { + id: label + objectName: "label" + text: "Hello world!" + width: 10 + } + + Timer { + running: true; interval: 1000 + onTriggered: label.text = "" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/MultilineEdit.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/MultilineEdit.qml new file mode 100644 index 00000000..17709ba9 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/MultilineEdit.qml @@ -0,0 +1,76 @@ +import QtQuick 1.0 +import "../shared" 1.0 + +Item { + id:lineedit + property alias text: textEdit.text + + width: 240 + 11 //Should be set manually in most cases + height: textEdit.height + 11 + + Rectangle { + color: 'lightsteelblue' + anchors.fill: parent + } + clip: true + Component.onCompleted: textEdit.cursorPosition = 0; + TestTextEdit { + id:textEdit + cursorDelegate: Item { + Rectangle { + visible: parent.parent.focus + color: "#009BCE" + height: 13 + width: 2 + y: 1 + } + } + property int leftMargin: 6 + property int topMargin: 6 + property int rightMargin: 6 + property int bottomMargin: 6 + x: leftMargin + width: parent.width - leftMargin - rightMargin; + y: 5 + //Below function implements all scrolling logic + onCursorPositionChanged: { + if(cursorRectangle.y < topMargin - textEdit.y){//Cursor went off the front + textEdit.y = topMargin - Math.max(0, cursorRectangle.y); + }else if(cursorRectangle.y > parent.height - topMargin - bottomMargin - textEdit.y){//Cursor went off the end + textEdit.y = topMargin - Math.max(0, cursorRectangle.y - (parent.height - topMargin - bottomMargin) + cursorRectangle.height); + } + } + onHeightChanged: y=topMargin//reset scroll + + text:"" + horizontalAlignment: TextInput.AlignLeft + wrapMode: TextEdit.WordWrap + font.pixelSize:15 + selectionColor: 'steelblue' + } + MouseArea { + //Implements all line edit mouse handling + id: mainMouseArea + anchors.fill: parent; + function translateY(y){ + return y - textEdit.y + } + function translateX(x){ + return x - textEdit.x + } + onPressed: { + textEdit.focus = true; + textEdit.cursorPosition = textEdit.positionAt(translateX(mouse.x), translateY(mouse.y)); + } + onPositionChanged: { + textEdit.moveCursorSelection(textEdit.positionAt(translateX(mouse.x), translateY(mouse.y))); + } + onReleased: { + } + onDoubleClicked: { + textEdit.selectAll() + } + z: textEdit.z + 1 + } + +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/cursorDelegate.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/cursorDelegate.qml new file mode 100644 index 00000000..1e0f71a5 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/cursorDelegate.qml @@ -0,0 +1,36 @@ +import QtQuick 1.0 +import "../shared" 1.0 + +Rectangle { + resources: [ + Component { id: cursorA + Item { id: cPage; + Behavior on x { NumberAnimation { } } + Behavior on y { NumberAnimation { } } + Behavior on height { NumberAnimation { duration: 200 } } + Rectangle { id: cRectangle; color: "black"; y: 1; width: 1; height: parent.height-2; + Rectangle { id:top; color: "black"; width: 3; height: 1; x: -1; y:0} + Rectangle { id:bottom; color: "black"; width: 3; height: 1; x: -1; anchors.bottom: parent.bottom;} + } + SequentialAnimation on opacity { running: true; loops: Animation.Infinite; + NumberAnimation { to: 0; duration: 500; easing.type: "OutQuad"} + NumberAnimation { to: 1; duration: 500; easing.type: "InQuad"} + } + width: 1; + } + } + ] + width: 400 + height: 200 + color: "white" + TestTextEdit { id: mainText + text: "Hello World" + cursorDelegate: cursorA + focus: true + font.pixelSize: 28 + selectionColor: "lightsteelblue" + selectedTextColor: "deeppink" + color: "forestgreen" + anchors.centerIn: parent + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.0.png new file mode 100644 index 00000000..adbdfa74 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.1.png new file mode 100644 index 00000000..d3fbdc6e Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.2.png new file mode 100644 index 00000000..9a96d462 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.3.png new file mode 100644 index 00000000..2026aca7 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.4.png new file mode 100644 index 00000000..c4350294 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.5.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.5.png new file mode 100644 index 00000000..70f273df Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.5.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.6.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.6.png new file mode 100644 index 00000000..80b960c1 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.6.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.7.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.7.png new file mode 100644 index 00000000..72472771 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.7.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.8.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.8.png new file mode 100644 index 00000000..af5a996b Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.8.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.9.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.9.png new file mode 100644 index 00000000..b254164f Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.9.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.qml new file mode 100644 index 00000000..0f3bd2cf --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/cursorDelegate.qml @@ -0,0 +1,1499 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "cursorDelegate.0.png" + } + Frame { + msec: 32 + hash: "b742ebe441dde1f30dab6d19954a9e8c" + } + Frame { + msec: 48 + hash: "d3be942cfb93c4a5d5aa906410125d02" + } + Frame { + msec: 64 + hash: "062574e74354b104db2ee6d3c3af5802" + } + Frame { + msec: 80 + hash: "575dd420067e4ebe5733eb4e35a447ab" + } + Frame { + msec: 96 + hash: "4213f35c4cd233a08d98ba0380b7ab0a" + } + Frame { + msec: 112 + hash: "505e740aacf4ca7e6ad24367ddad8678" + } + Frame { + msec: 128 + hash: "007e76fb247e11a442802c7cfb4e6a24" + } + Frame { + msec: 144 + hash: "5cf6cb0afffb791da1c4d0fe00cf6326" + } + Frame { + msec: 160 + hash: "aff4097bd39c87c5d1459d99f314dade" + } + Frame { + msec: 176 + hash: "009dc0c6ff28333ac2fdfa3d79ad2fd6" + } + Frame { + msec: 192 + hash: "4bf8e82220ea0d0c4298d5374e149de2" + } + Frame { + msec: 208 + hash: "938a6eea45c4412e847a8700172d80ac" + } + Frame { + msec: 224 + hash: "6502416042993d05dd514119512ed61f" + } + Frame { + msec: 240 + hash: "5d6702b9475e69bda2ed38f6e2d583d9" + } + Frame { + msec: 256 + hash: "8e5fdc8e6cc38089d1e8ff5e91a5c894" + } + Frame { + msec: 272 + hash: "c0249d07bcf25af69bf929b4d5ac00a3" + } + Frame { + msec: 288 + hash: "efe333c2b8cccea0bd7135484049db06" + } + Frame { + msec: 304 + hash: "57e49e9094691a204f7507b0231352b3" + } + Frame { + msec: 320 + hash: "d0a45bd3cfc5e4e6f9a48534c768daba" + } + Frame { + msec: 336 + hash: "6960ab817c67a61af31cc187efe65016" + } + Key { + type: 6 + key: 16777249 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 352 + hash: "3b0d483ff765f36a196411967b6dfd70" + } + Frame { + msec: 368 + hash: "559713749d65246b185c0c91eb7ad39e" + } + Frame { + msec: 384 + hash: "9aea32722fd4f8b0cde3c06c61cecde6" + } + Frame { + msec: 400 + hash: "25dfa32ce92b6044f5ea68411ab5de5b" + } + Frame { + msec: 416 + hash: "dab689ed2bbe663df309548e615e8621" + } + Frame { + msec: 432 + hash: "26ad44cef380ff9f64c12180fb54c695" + } + Key { + type: 6 + key: 16777248 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 448 + hash: "5e8bbcd46b5692e66963387b80971e90" + } + Frame { + msec: 464 + hash: "747df5357daa951fbedeadf909f9dbf3" + } + Frame { + msec: 480 + hash: "af99069cdddfa9d099fbe25ba586e138" + } + Frame { + msec: 496 + hash: "af99069cdddfa9d099fbe25ba586e138" + } + Key { + type: 6 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 512 + hash: "cb6ca047657a99dbbb037c1c45b40866" + } + Frame { + msec: 528 + hash: "cb6ca047657a99dbbb037c1c45b40866" + } + Frame { + msec: 544 + hash: "cb6ca047657a99dbbb037c1c45b40866" + } + Frame { + msec: 560 + hash: "cb6ca047657a99dbbb037c1c45b40866" + } + Frame { + msec: 576 + hash: "1684711d2c492de2093357168b8726c6" + } + Frame { + msec: 592 + hash: "6d960ca89faec6e3d81f78911b9b5ecf" + } + Frame { + msec: 608 + hash: "1fdd91b57f5832d5c4d797d150892156" + } + Frame { + msec: 624 + hash: "4e0f1ec936cacf3ab6fbc7899a6bc92d" + } + Key { + type: 7 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 640 + hash: "9e67145b58051fd7dc4a18ee0e6a72ad" + } + Frame { + msec: 656 + hash: "14dfb4b356ec851275ddd8e93f04e2d2" + } + Frame { + msec: 672 + hash: "e9b8f691ad62d10877aacb94f98ea308" + } + Key { + type: 6 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 688 + hash: "a44b5f63ec1f98b6bc34e95214c9d79e" + } + Frame { + msec: 704 + hash: "6bc0e035c90b74de024d379388fd7014" + } + Frame { + msec: 720 + hash: "61d8f417f7ca5cba2e98a7a7427ea635" + } + Frame { + msec: 736 + hash: "f50adb10f55bcd4c2eb0955f6e1ff78e" + } + Frame { + msec: 752 + hash: "9e160aefac79a9804f6cb8622e45ba71" + } + Frame { + msec: 768 + hash: "6555a0bd60dbbad66283fe37b2f0c362" + } + Frame { + msec: 784 + hash: "0cacc38d86ebf497d31b01556b8a5924" + } + Key { + type: 7 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 800 + hash: "b2fe1d5cb5e0a5f07d84ff7a494ae07a" + } + Frame { + msec: 816 + hash: "2c6dbd777bba27b481a8a6ef34d213f9" + } + Frame { + msec: 832 + hash: "989e53620edc6b9b0990545459e7f787" + } + Frame { + msec: 848 + hash: "a89686a7802da3fd07a265a5814255f4" + } + Frame { + msec: 864 + hash: "9f707497eb0c224c8b0a3bba1533217a" + } + Frame { + msec: 880 + hash: "29df155c0b75de8e1bd6361372a51797" + } + Frame { + msec: 896 + hash: "fb7cbeb1e3689cc38acf7a02d671a955" + } + Frame { + msec: 912 + hash: "9045ada282ec37b1681cef89dfcc8f67" + } + Frame { + msec: 928 + hash: "b3816b225eaf5ab49bb31f86ecdd52cb" + } + Frame { + msec: 944 + hash: "0956fccb8e1bf2c218a9e39947846aaa" + } + Frame { + msec: 960 + hash: "01f4ba2e0b4eb018c620efa5e92ec9fe" + } + Frame { + msec: 976 + image: "cursorDelegate.1.png" + } + Frame { + msec: 992 + hash: "c19ec2d067d30a6d42056c9799b0c0c3" + } + Frame { + msec: 1008 + hash: "43a9d066887a89372136619ae8eec100" + } + Frame { + msec: 1024 + hash: "43a9d066887a89372136619ae8eec100" + } + Key { + type: 7 + key: 16777249 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1040 + hash: "c19ec2d067d30a6d42056c9799b0c0c3" + } + Frame { + msec: 1056 + hash: "8303d8b19e6e5b249aaf2ffbb6d29f91" + } + Frame { + msec: 1072 + hash: "01f4ba2e0b4eb018c620efa5e92ec9fe" + } + Frame { + msec: 1088 + hash: "0956fccb8e1bf2c218a9e39947846aaa" + } + Frame { + msec: 1104 + hash: "b3816b225eaf5ab49bb31f86ecdd52cb" + } + Frame { + msec: 1120 + hash: "9045ada282ec37b1681cef89dfcc8f67" + } + Frame { + msec: 1136 + hash: "fb7cbeb1e3689cc38acf7a02d671a955" + } + Frame { + msec: 1152 + hash: "29df155c0b75de8e1bd6361372a51797" + } + Frame { + msec: 1168 + hash: "9f707497eb0c224c8b0a3bba1533217a" + } + Key { + type: 6 + key: 16777234 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1184 + hash: "9f712a688504fff9719b38c067b32c50" + } + Frame { + msec: 1200 + hash: "24f1467e3be5f4d0509800bef97f4401" + } + Frame { + msec: 1216 + hash: "d56e5fd86addad3bc53417b82ff68829" + } + Frame { + msec: 1232 + hash: "f1c60934ef284840e61fd46c758dd14b" + } + Frame { + msec: 1248 + hash: "7be9fc54278572116f9bd9be8f6994a4" + } + Frame { + msec: 1264 + hash: "0e0ea7ca1b8479d62ae81fb53a1ec264" + } + Frame { + msec: 1280 + hash: "f8b19dbaeec469896a081687d80a2ac4" + } + Key { + type: 7 + key: 16777234 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1296 + hash: "a28665925ec121a2bf01733e0a20e18b" + } + Frame { + msec: 1312 + hash: "baa0c601f3d84e344847dcb7f3bd18cf" + } + Frame { + msec: 1328 + hash: "a80d59a1e5af45bc799c19200a3c44ec" + } + Frame { + msec: 1344 + hash: "2a6f833e2fd2930c8ec49016809d8cf6" + } + Frame { + msec: 1360 + hash: "efdc2daad00aaec2c39541261d6d1a98" + } + Frame { + msec: 1376 + hash: "65b75f2a074d4ac5d84fb762d1762231" + } + Frame { + msec: 1392 + hash: "2a170e51a83e902d2699501877225ee3" + } + Frame { + msec: 1408 + hash: "1e4c78e279ff4ab7a875e4d67f68f8ca" + } + Frame { + msec: 1424 + hash: "fd515cf3ec7b987e0e36c02f1da5b8a7" + } + Frame { + msec: 1440 + hash: "54126910ea7a303ea3e7726309d8bf39" + } + Frame { + msec: 1456 + hash: "89263867df0cfa623f80e1578532d98d" + } + Frame { + msec: 1472 + hash: "1bf04aafab1177182eec9a0ff459cd7b" + } + Frame { + msec: 1488 + hash: "1bf04aafab1177182eec9a0ff459cd7b" + } + Frame { + msec: 1504 + hash: "1bf04aafab1177182eec9a0ff459cd7b" + } + Frame { + msec: 1520 + hash: "1bf04aafab1177182eec9a0ff459cd7b" + } + Frame { + msec: 1536 + hash: "1bf04aafab1177182eec9a0ff459cd7b" + } + Frame { + msec: 1552 + hash: "1bf04aafab1177182eec9a0ff459cd7b" + } + Frame { + msec: 1568 + hash: "c824a8bbf60514c20713b1fa583451b2" + } + Frame { + msec: 1584 + hash: "f6282cd20d7f3f64415a0a24df578964" + } + Frame { + msec: 1600 + hash: "a4633c7dc825f20a7ada2079712f7b5e" + } + Frame { + msec: 1616 + hash: "240c839fc986573523b30567afe05623" + } + Frame { + msec: 1632 + hash: "9e3098ea355a80e7e439f3cdecd15b77" + } + Frame { + msec: 1648 + hash: "d8ec7fd807f345509703f4ecf94b583d" + } + Key { + type: 6 + key: 16777249 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1664 + hash: "5b6e0bedeca1784610081762850813a1" + } + Frame { + msec: 1680 + hash: "13a596d7aefa3c8ce61660dd5ce27627" + } + Frame { + msec: 1696 + hash: "295bbee587f2fdbadab7aa4e3900b6e0" + } + Frame { + msec: 1712 + hash: "645da4001b1489b12e0bb5dd1b5c114b" + } + Frame { + msec: 1728 + hash: "8e7e4f5b8eb437ab92e466b1d79aee01" + } + Frame { + msec: 1744 + hash: "1a7ec33aa8a19a36a7fc99c3040e427a" + } + Frame { + msec: 1760 + hash: "85f6c7d9f86910e7cceeaf9efc375355" + } + Frame { + msec: 1776 + hash: "8e54b0699d681cfbfc3b605b010c6b76" + } + Key { + type: 6 + key: 16777234 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1792 + hash: "5d6702b9475e69bda2ed38f6e2d583d9" + } + Frame { + msec: 1808 + hash: "6502416042993d05dd514119512ed61f" + } + Frame { + msec: 1824 + hash: "938a6eea45c4412e847a8700172d80ac" + } + Frame { + msec: 1840 + hash: "4bf8e82220ea0d0c4298d5374e149de2" + } + Frame { + msec: 1856 + hash: "009dc0c6ff28333ac2fdfa3d79ad2fd6" + } + Frame { + msec: 1872 + hash: "aff4097bd39c87c5d1459d99f314dade" + } + Frame { + msec: 1888 + hash: "5cf6cb0afffb791da1c4d0fe00cf6326" + } + Frame { + msec: 1904 + hash: "007e76fb247e11a442802c7cfb4e6a24" + } + Key { + type: 7 + key: 16777234 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1920 + hash: "505e740aacf4ca7e6ad24367ddad8678" + } + Frame { + msec: 1936 + image: "cursorDelegate.2.png" + } + Frame { + msec: 1952 + hash: "575dd420067e4ebe5733eb4e35a447ab" + } + Frame { + msec: 1968 + hash: "062574e74354b104db2ee6d3c3af5802" + } + Frame { + msec: 1984 + hash: "d3be942cfb93c4a5d5aa906410125d02" + } + Frame { + msec: 2000 + hash: "b742ebe441dde1f30dab6d19954a9e8c" + } + Frame { + msec: 2016 + hash: "bbe3a292c59e2f7ae6b8877f6736c96e" + } + Frame { + msec: 2032 + hash: "b742ebe441dde1f30dab6d19954a9e8c" + } + Frame { + msec: 2048 + hash: "d3be942cfb93c4a5d5aa906410125d02" + } + Frame { + msec: 2064 + hash: "062574e74354b104db2ee6d3c3af5802" + } + Frame { + msec: 2080 + hash: "575dd420067e4ebe5733eb4e35a447ab" + } + Frame { + msec: 2096 + hash: "4213f35c4cd233a08d98ba0380b7ab0a" + } + Frame { + msec: 2112 + hash: "505e740aacf4ca7e6ad24367ddad8678" + } + Frame { + msec: 2128 + hash: "007e76fb247e11a442802c7cfb4e6a24" + } + Frame { + msec: 2144 + hash: "5cf6cb0afffb791da1c4d0fe00cf6326" + } + Frame { + msec: 2160 + hash: "aff4097bd39c87c5d1459d99f314dade" + } + Frame { + msec: 2176 + hash: "009dc0c6ff28333ac2fdfa3d79ad2fd6" + } + Frame { + msec: 2192 + hash: "4bf8e82220ea0d0c4298d5374e149de2" + } + Frame { + msec: 2208 + hash: "938a6eea45c4412e847a8700172d80ac" + } + Frame { + msec: 2224 + hash: "6502416042993d05dd514119512ed61f" + } + Key { + type: 7 + key: 16777248 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2240 + hash: "5d6702b9475e69bda2ed38f6e2d583d9" + } + Frame { + msec: 2256 + hash: "8e5fdc8e6cc38089d1e8ff5e91a5c894" + } + Frame { + msec: 2272 + hash: "c0249d07bcf25af69bf929b4d5ac00a3" + } + Frame { + msec: 2288 + hash: "efe333c2b8cccea0bd7135484049db06" + } + Frame { + msec: 2304 + hash: "57e49e9094691a204f7507b0231352b3" + } + Frame { + msec: 2320 + hash: "d0a45bd3cfc5e4e6f9a48534c768daba" + } + Frame { + msec: 2336 + hash: "6960ab817c67a61af31cc187efe65016" + } + Frame { + msec: 2352 + hash: "3b0d483ff765f36a196411967b6dfd70" + } + Key { + type: 6 + key: 16777234 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2368 + hash: "559713749d65246b185c0c91eb7ad39e" + } + Frame { + msec: 2384 + hash: "9aea32722fd4f8b0cde3c06c61cecde6" + } + Frame { + msec: 2400 + hash: "25dfa32ce92b6044f5ea68411ab5de5b" + } + Frame { + msec: 2416 + hash: "dab689ed2bbe663df309548e615e8621" + } + Frame { + msec: 2432 + hash: "26ad44cef380ff9f64c12180fb54c695" + } + Frame { + msec: 2448 + hash: "5e8bbcd46b5692e66963387b80971e90" + } + Frame { + msec: 2464 + hash: "747df5357daa951fbedeadf909f9dbf3" + } + Frame { + msec: 2480 + hash: "af99069cdddfa9d099fbe25ba586e138" + } + Key { + type: 7 + key: 16777234 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2496 + hash: "af99069cdddfa9d099fbe25ba586e138" + } + Frame { + msec: 2512 + hash: "af99069cdddfa9d099fbe25ba586e138" + } + Frame { + msec: 2528 + hash: "af99069cdddfa9d099fbe25ba586e138" + } + Frame { + msec: 2544 + hash: "af99069cdddfa9d099fbe25ba586e138" + } + Frame { + msec: 2560 + hash: "af99069cdddfa9d099fbe25ba586e138" + } + Frame { + msec: 2576 + hash: "1568d4b93d2a284c46f23a0cb17acc24" + } + Frame { + msec: 2592 + hash: "0665a6cfc09981cd8a7ffd0d02e6fbdc" + } + Frame { + msec: 2608 + hash: "49892aa44c8e3584239d245a7ca98af3" + } + Frame { + msec: 2624 + hash: "c9def393bb5d6c447c45b127d32b5e50" + } + Frame { + msec: 2640 + hash: "679d94007b33197ce7decb4df6e8343c" + } + Frame { + msec: 2656 + hash: "817987bcd9f1147ba047333b42ed289d" + } + Frame { + msec: 2672 + hash: "fdd9331015c289b8e33b094999b11dce" + } + Frame { + msec: 2688 + hash: "e4fa13ba2770c0d390945ee4505fea9b" + } + Frame { + msec: 2704 + hash: "69965c88d2273acf680af243610efcf3" + } + Frame { + msec: 2720 + hash: "6cbeb6787a0a7fb7f654f877e41eed57" + } + Frame { + msec: 2736 + hash: "e7528c074b3c65afe3873a3cdf96f041" + } + Frame { + msec: 2752 + hash: "c06c72abe46087f0db87a84fdcbcf601" + } + Frame { + msec: 2768 + hash: "b6840f1d7cf2caed17d763b782553071" + } + Frame { + msec: 2784 + hash: "71fdb77c4133f37180d581e4b1fe9c83" + } + Frame { + msec: 2800 + hash: "f5e2075ed86f146e0162ae4f0a9c6b90" + } + Frame { + msec: 2816 + hash: "5e76b741f49bd279b9f62ae3f474e5b5" + } + Frame { + msec: 2832 + hash: "28c8003699352c3c9563556939d49cd8" + } + Frame { + msec: 2848 + hash: "15ab751c8463326c870dc9ee1af3c1d7" + } + Key { + type: 6 + key: 16777236 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2864 + hash: "6035ef1252d4f28b965b0bf4771540e4" + } + Frame { + msec: 2880 + hash: "7c79170b07db90ca94f5642f3c0d3998" + } + Frame { + msec: 2896 + image: "cursorDelegate.3.png" + } + Frame { + msec: 2912 + hash: "3b4d1f5e1506c851887c86883eb1a6ac" + } + Frame { + msec: 2928 + hash: "5aff09b0e9078ca6d4ed93694d1fa6f9" + } + Frame { + msec: 2944 + hash: "16813ebf88f881a4cebf75a2325dc064" + } + Frame { + msec: 2960 + hash: "5b901505bb1ab80cd4d5bc85b73ae8ad" + } + Frame { + msec: 2976 + hash: "04c7f2e959c31bf6d3e7bea25d27eb87" + } + Key { + type: 7 + key: 16777236 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2992 + hash: "408bb423b93cb48afb97a7744848fc5e" + } + Frame { + msec: 3008 + hash: "1a58d66b4d42736eea49a602923a0941" + } + Frame { + msec: 3024 + hash: "1a58d66b4d42736eea49a602923a0941" + } + Frame { + msec: 3040 + hash: "408bb423b93cb48afb97a7744848fc5e" + } + Frame { + msec: 3056 + hash: "04c7f2e959c31bf6d3e7bea25d27eb87" + } + Frame { + msec: 3072 + hash: "5b901505bb1ab80cd4d5bc85b73ae8ad" + } + Frame { + msec: 3088 + hash: "16813ebf88f881a4cebf75a2325dc064" + } + Frame { + msec: 3104 + hash: "5aff09b0e9078ca6d4ed93694d1fa6f9" + } + Frame { + msec: 3120 + hash: "3b4d1f5e1506c851887c86883eb1a6ac" + } + Frame { + msec: 3136 + hash: "6a0a21ed890b475ce506714cc0501381" + } + Frame { + msec: 3152 + hash: "7c79170b07db90ca94f5642f3c0d3998" + } + Frame { + msec: 3168 + hash: "6035ef1252d4f28b965b0bf4771540e4" + } + Frame { + msec: 3184 + hash: "9529b5b70b76541ec82be173deedadfb" + } + Frame { + msec: 3200 + hash: "174bbd347422c46923d6a5831cb5cd94" + } + Frame { + msec: 3216 + hash: "1eb95daf505b817161f1a251cdde1b3c" + } + Key { + type: 6 + key: 16777236 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3232 + hash: "10f59fadaa27f78b7a1fb25d3a30adf7" + } + Frame { + msec: 3248 + hash: "b87417c77b43bdbfdc3d8293c9a23216" + } + Frame { + msec: 3264 + hash: "64345c713d61638bcc32f277208f2665" + } + Frame { + msec: 3280 + hash: "753dbe02fa95ee2b1387b98d7d456dcf" + } + Frame { + msec: 3296 + hash: "fce9a58aaf8d5cadbb029194317dcae3" + } + Frame { + msec: 3312 + hash: "367083bd88443558002601acbc355b1a" + } + Frame { + msec: 3328 + hash: "8e6ffccf321fa30faec432a4b4138967" + } + Key { + type: 7 + key: 16777236 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3344 + hash: "4dd4e0dafeed0fc11790145d39f7c85f" + } + Frame { + msec: 3360 + hash: "d612765c6b43035ea4e4683f968a18d3" + } + Frame { + msec: 3376 + hash: "fa77d4d8d339b78e5a28dcf69336c116" + } + Frame { + msec: 3392 + hash: "34cf572a432bdd6dcfcc4fdfa032a800" + } + Frame { + msec: 3408 + hash: "150b5a2f2e916b7023764c481c768492" + } + Frame { + msec: 3424 + hash: "fbc93f511d6f3093c2ecf624a2c63749" + } + Frame { + msec: 3440 + hash: "f9e0bd08b722c16493a8886a19920dda" + } + Frame { + msec: 3456 + hash: "f499f4b3017c88c63f0a2035ad527a0e" + } + Frame { + msec: 3472 + hash: "af99069cdddfa9d099fbe25ba586e138" + } + Frame { + msec: 3488 + hash: "af99069cdddfa9d099fbe25ba586e138" + } + Frame { + msec: 3504 + hash: "af99069cdddfa9d099fbe25ba586e138" + } + Frame { + msec: 3520 + hash: "af99069cdddfa9d099fbe25ba586e138" + } + Frame { + msec: 3536 + hash: "af99069cdddfa9d099fbe25ba586e138" + } + Frame { + msec: 3552 + hash: "af99069cdddfa9d099fbe25ba586e138" + } + Frame { + msec: 3568 + hash: "68d331f508b43e756d6e30ba9b60f9aa" + } + Frame { + msec: 3584 + hash: "c9147c159aebb7aa51d4bac28f96cb57" + } + Frame { + msec: 3600 + hash: "0636b7c5cc215882c60b50f62133c715" + } + Frame { + msec: 3616 + hash: "10b52296e40380a915f7538d21d321a4" + } + Frame { + msec: 3632 + hash: "9c56e2c5e04e8767b70d357558e179de" + } + Frame { + msec: 3648 + hash: "0b1538af23c78cc779174df9fd01f60b" + } + Frame { + msec: 3664 + hash: "1632c7df93f1a735236eaa2464e75ba6" + } + Frame { + msec: 3680 + hash: "a08e8b921e61c79d57c0bc4fa5e79914" + } + Frame { + msec: 3696 + hash: "8220951034b6f1a5755bedd53b947b4a" + } + Frame { + msec: 3712 + hash: "f4c18c333796ff10218fa9145781ea7f" + } + Frame { + msec: 3728 + hash: "7547d3bb0f9c4a53396cfe0252436395" + } + Key { + type: 6 + key: 16777234 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3744 + hash: "efe333c2b8cccea0bd7135484049db06" + } + Frame { + msec: 3760 + hash: "c0249d07bcf25af69bf929b4d5ac00a3" + } + Frame { + msec: 3776 + hash: "8e5fdc8e6cc38089d1e8ff5e91a5c894" + } + Frame { + msec: 3792 + hash: "5d6702b9475e69bda2ed38f6e2d583d9" + } + Frame { + msec: 3808 + hash: "6502416042993d05dd514119512ed61f" + } + Frame { + msec: 3824 + hash: "938a6eea45c4412e847a8700172d80ac" + } + Frame { + msec: 3840 + hash: "4bf8e82220ea0d0c4298d5374e149de2" + } + Key { + type: 7 + key: 16777234 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3856 + image: "cursorDelegate.4.png" + } + Frame { + msec: 3872 + hash: "aff4097bd39c87c5d1459d99f314dade" + } + Frame { + msec: 3888 + hash: "5cf6cb0afffb791da1c4d0fe00cf6326" + } + Frame { + msec: 3904 + hash: "007e76fb247e11a442802c7cfb4e6a24" + } + Frame { + msec: 3920 + hash: "505e740aacf4ca7e6ad24367ddad8678" + } + Frame { + msec: 3936 + hash: "4213f35c4cd233a08d98ba0380b7ab0a" + } + Frame { + msec: 3952 + hash: "575dd420067e4ebe5733eb4e35a447ab" + } + Frame { + msec: 3968 + hash: "062574e74354b104db2ee6d3c3af5802" + } + Frame { + msec: 3984 + hash: "d3be942cfb93c4a5d5aa906410125d02" + } + Frame { + msec: 4000 + hash: "b742ebe441dde1f30dab6d19954a9e8c" + } + Frame { + msec: 4016 + hash: "bbe3a292c59e2f7ae6b8877f6736c96e" + } + Frame { + msec: 4032 + hash: "b742ebe441dde1f30dab6d19954a9e8c" + } + Frame { + msec: 4048 + hash: "d3be942cfb93c4a5d5aa906410125d02" + } + Frame { + msec: 4064 + hash: "062574e74354b104db2ee6d3c3af5802" + } + Key { + type: 7 + key: 16777249 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 4080 + hash: "575dd420067e4ebe5733eb4e35a447ab" + } + Frame { + msec: 4096 + hash: "4213f35c4cd233a08d98ba0380b7ab0a" + } + Frame { + msec: 4112 + hash: "505e740aacf4ca7e6ad24367ddad8678" + } + Frame { + msec: 4128 + hash: "007e76fb247e11a442802c7cfb4e6a24" + } + Frame { + msec: 4144 + hash: "5cf6cb0afffb791da1c4d0fe00cf6326" + } + Frame { + msec: 4160 + hash: "aff4097bd39c87c5d1459d99f314dade" + } + Frame { + msec: 4176 + hash: "009dc0c6ff28333ac2fdfa3d79ad2fd6" + } + Frame { + msec: 4192 + hash: "4bf8e82220ea0d0c4298d5374e149de2" + } + Frame { + msec: 4208 + hash: "938a6eea45c4412e847a8700172d80ac" + } + Frame { + msec: 4224 + hash: "6502416042993d05dd514119512ed61f" + } + Frame { + msec: 4240 + hash: "5d6702b9475e69bda2ed38f6e2d583d9" + } + Frame { + msec: 4256 + hash: "8e5fdc8e6cc38089d1e8ff5e91a5c894" + } + Frame { + msec: 4272 + hash: "c0249d07bcf25af69bf929b4d5ac00a3" + } + Frame { + msec: 4288 + hash: "efe333c2b8cccea0bd7135484049db06" + } + Frame { + msec: 4304 + hash: "57e49e9094691a204f7507b0231352b3" + } + Frame { + msec: 4320 + hash: "d0a45bd3cfc5e4e6f9a48534c768daba" + } + Frame { + msec: 4336 + hash: "6960ab817c67a61af31cc187efe65016" + } + Frame { + msec: 4352 + hash: "3b0d483ff765f36a196411967b6dfd70" + } + Frame { + msec: 4368 + hash: "559713749d65246b185c0c91eb7ad39e" + } + Frame { + msec: 4384 + hash: "9aea32722fd4f8b0cde3c06c61cecde6" + } + Frame { + msec: 4400 + hash: "25dfa32ce92b6044f5ea68411ab5de5b" + } + Frame { + msec: 4416 + hash: "dab689ed2bbe663df309548e615e8621" + } + Frame { + msec: 4432 + hash: "26ad44cef380ff9f64c12180fb54c695" + } + Frame { + msec: 4448 + hash: "5e8bbcd46b5692e66963387b80971e90" + } + Frame { + msec: 4464 + hash: "747df5357daa951fbedeadf909f9dbf3" + } + Frame { + msec: 4480 + hash: "af99069cdddfa9d099fbe25ba586e138" + } + Frame { + msec: 4496 + hash: "af99069cdddfa9d099fbe25ba586e138" + } + Frame { + msec: 4512 + hash: "af99069cdddfa9d099fbe25ba586e138" + } + Frame { + msec: 4528 + hash: "af99069cdddfa9d099fbe25ba586e138" + } + Frame { + msec: 4544 + hash: "af99069cdddfa9d099fbe25ba586e138" + } + Frame { + msec: 4560 + hash: "af99069cdddfa9d099fbe25ba586e138" + } + Frame { + msec: 4576 + hash: "1568d4b93d2a284c46f23a0cb17acc24" + } + Frame { + msec: 4592 + hash: "0665a6cfc09981cd8a7ffd0d02e6fbdc" + } + Frame { + msec: 4608 + hash: "49892aa44c8e3584239d245a7ca98af3" + } + Frame { + msec: 4624 + hash: "c9def393bb5d6c447c45b127d32b5e50" + } + Frame { + msec: 4640 + hash: "679d94007b33197ce7decb4df6e8343c" + } + Frame { + msec: 4656 + hash: "817987bcd9f1147ba047333b42ed289d" + } + Frame { + msec: 4672 + hash: "fdd9331015c289b8e33b094999b11dce" + } + Frame { + msec: 4688 + hash: "e4fa13ba2770c0d390945ee4505fea9b" + } + Frame { + msec: 4704 + hash: "69965c88d2273acf680af243610efcf3" + } + Frame { + msec: 4720 + hash: "6cbeb6787a0a7fb7f654f877e41eed57" + } + Frame { + msec: 4736 + hash: "e7528c074b3c65afe3873a3cdf96f041" + } + Frame { + msec: 4752 + hash: "c06c72abe46087f0db87a84fdcbcf601" + } + Frame { + msec: 4768 + hash: "b6840f1d7cf2caed17d763b782553071" + } + Frame { + msec: 4784 + hash: "71fdb77c4133f37180d581e4b1fe9c83" + } + Frame { + msec: 4800 + hash: "f5e2075ed86f146e0162ae4f0a9c6b90" + } + Frame { + msec: 4816 + image: "cursorDelegate.5.png" + } + Frame { + msec: 4832 + hash: "28c8003699352c3c9563556939d49cd8" + } + Frame { + msec: 4848 + hash: "15ab751c8463326c870dc9ee1af3c1d7" + } + Frame { + msec: 4864 + hash: "b745b2aee5ec623163ea22614b8ab54b" + } + Frame { + msec: 4880 + hash: "b3f3b8e325dcd56b696eab7228c3db09" + } + Frame { + msec: 4896 + hash: "12ba65e0f70a670b2832235391d3ed05" + } + Frame { + msec: 4912 + hash: "9dfac03113b662a63bddcac9c7ae8f64" + } + Frame { + msec: 4928 + hash: "085bbc44102ae0d1d62531f6b6dbda98" + } + Frame { + msec: 4944 + hash: "007887862e2234f4c308778ecac5e16b" + } + Frame { + msec: 4960 + hash: "61e8e34755db1fb99b44830676ad95ad" + } + Frame { + msec: 4976 + hash: "48c8b1b0d549f7b6d85a81803b9fe31d" + } + Frame { + msec: 4992 + hash: "834cf51445f88394e33a3f3f0a5569f4" + } + Frame { + msec: 5008 + hash: "a43224f77583bb7235895506f49daee6" + } + Frame { + msec: 5024 + hash: "a43224f77583bb7235895506f49daee6" + } + Frame { + msec: 5040 + hash: "834cf51445f88394e33a3f3f0a5569f4" + } + Frame { + msec: 5056 + hash: "48c8b1b0d549f7b6d85a81803b9fe31d" + } + Frame { + msec: 5072 + hash: "61e8e34755db1fb99b44830676ad95ad" + } + Frame { + msec: 5088 + hash: "007887862e2234f4c308778ecac5e16b" + } + Frame { + msec: 5104 + hash: "085bbc44102ae0d1d62531f6b6dbda98" + } + Frame { + msec: 5120 + hash: "9dfac03113b662a63bddcac9c7ae8f64" + } + Frame { + msec: 5136 + hash: "12ba65e0f70a670b2832235391d3ed05" + } + Frame { + msec: 5152 + hash: "b3f3b8e325dcd56b696eab7228c3db09" + } + Frame { + msec: 5168 + hash: "b745b2aee5ec623163ea22614b8ab54b" + } + Frame { + msec: 5184 + hash: "15ab751c8463326c870dc9ee1af3c1d7" + } + Frame { + msec: 5200 + hash: "28c8003699352c3c9563556939d49cd8" + } + Frame { + msec: 5216 + hash: "5e76b741f49bd279b9f62ae3f474e5b5" + } + Frame { + msec: 5232 + hash: "f5e2075ed86f146e0162ae4f0a9c6b90" + } + Frame { + msec: 5248 + hash: "71fdb77c4133f37180d581e4b1fe9c83" + } + Frame { + msec: 5264 + hash: "b6840f1d7cf2caed17d763b782553071" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/justify.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/justify.0.png new file mode 100644 index 00000000..74c6934c Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/justify.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/justify.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/justify.qml new file mode 100644 index 00000000..e4dbeb1b --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/justify.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "justify.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.0.png new file mode 100644 index 00000000..852fc66a Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.1.png new file mode 100644 index 00000000..4b283d01 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.2.png new file mode 100644 index 00000000..342fe056 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.3.png new file mode 100644 index 00000000..fb4a774c Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.4.png new file mode 100644 index 00000000..852fc66a Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.qml new file mode 100644 index 00000000..d7b26cb3 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/qt-669.qml @@ -0,0 +1,1371 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "qt-669.0.png" + } + Frame { + msec: 32 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 48 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 64 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 80 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 96 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 112 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 128 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 144 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 160 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 176 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 192 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 208 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 224 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 240 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 256 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 272 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 288 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 304 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 320 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 336 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 352 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 368 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 384 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 400 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 416 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 432 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 448 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 464 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 480 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 496 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 512 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 528 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 544 + hash: "e2a49d72741ba08c258bb70d3a13c7f6" + } + Frame { + msec: 560 + hash: "e2a49d72741ba08c258bb70d3a13c7f6" + } + Frame { + msec: 576 + hash: "e2a49d72741ba08c258bb70d3a13c7f6" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 592 + hash: "e2a49d72741ba08c258bb70d3a13c7f6" + } + Frame { + msec: 608 + hash: "e2a49d72741ba08c258bb70d3a13c7f6" + } + Frame { + msec: 624 + hash: "e2a49d72741ba08c258bb70d3a13c7f6" + } + Frame { + msec: 640 + hash: "e2a49d72741ba08c258bb70d3a13c7f6" + } + Frame { + msec: 656 + hash: "e2a49d72741ba08c258bb70d3a13c7f6" + } + Frame { + msec: 672 + hash: "e2a49d72741ba08c258bb70d3a13c7f6" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 688 + hash: "e5fd0e8d81d75fb53e21b6daa8e0fc7f" + } + Frame { + msec: 704 + hash: "e5fd0e8d81d75fb53e21b6daa8e0fc7f" + } + Frame { + msec: 720 + hash: "e5fd0e8d81d75fb53e21b6daa8e0fc7f" + } + Frame { + msec: 736 + hash: "e5fd0e8d81d75fb53e21b6daa8e0fc7f" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 752 + hash: "e5fd0e8d81d75fb53e21b6daa8e0fc7f" + } + Frame { + msec: 768 + hash: "e5fd0e8d81d75fb53e21b6daa8e0fc7f" + } + Frame { + msec: 784 + hash: "e5fd0e8d81d75fb53e21b6daa8e0fc7f" + } + Frame { + msec: 800 + hash: "e5fd0e8d81d75fb53e21b6daa8e0fc7f" + } + Frame { + msec: 816 + hash: "e5fd0e8d81d75fb53e21b6daa8e0fc7f" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 832 + hash: "86e1ba72951c0c193bfd2cd2162c500e" + } + Frame { + msec: 848 + hash: "86e1ba72951c0c193bfd2cd2162c500e" + } + Frame { + msec: 864 + hash: "86e1ba72951c0c193bfd2cd2162c500e" + } + Frame { + msec: 880 + hash: "86e1ba72951c0c193bfd2cd2162c500e" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 896 + hash: "86e1ba72951c0c193bfd2cd2162c500e" + } + Frame { + msec: 912 + hash: "86e1ba72951c0c193bfd2cd2162c500e" + } + Frame { + msec: 928 + hash: "86e1ba72951c0c193bfd2cd2162c500e" + } + Frame { + msec: 944 + hash: "86e1ba72951c0c193bfd2cd2162c500e" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 960 + hash: "a719560bf7912aa6cf4e8e5bfc13cb06" + } + Frame { + msec: 976 + image: "qt-669.1.png" + } + Frame { + msec: 992 + hash: "a719560bf7912aa6cf4e8e5bfc13cb06" + } + Frame { + msec: 1008 + hash: "a719560bf7912aa6cf4e8e5bfc13cb06" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1024 + hash: "a719560bf7912aa6cf4e8e5bfc13cb06" + } + Frame { + msec: 1040 + hash: "a719560bf7912aa6cf4e8e5bfc13cb06" + } + Frame { + msec: 1056 + hash: "a719560bf7912aa6cf4e8e5bfc13cb06" + } + Frame { + msec: 1072 + hash: "a719560bf7912aa6cf4e8e5bfc13cb06" + } + Frame { + msec: 1088 + hash: "a719560bf7912aa6cf4e8e5bfc13cb06" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1104 + hash: "f531e8dd89482e3d7c501d0b3a8b3392" + } + Frame { + msec: 1120 + hash: "f531e8dd89482e3d7c501d0b3a8b3392" + } + Frame { + msec: 1136 + hash: "f531e8dd89482e3d7c501d0b3a8b3392" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1152 + hash: "f531e8dd89482e3d7c501d0b3a8b3392" + } + Frame { + msec: 1168 + hash: "f531e8dd89482e3d7c501d0b3a8b3392" + } + Frame { + msec: 1184 + hash: "f531e8dd89482e3d7c501d0b3a8b3392" + } + Frame { + msec: 1200 + hash: "f531e8dd89482e3d7c501d0b3a8b3392" + } + Frame { + msec: 1216 + hash: "f531e8dd89482e3d7c501d0b3a8b3392" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1232 + hash: "fca9d1748195f0d4388694baf901c498" + } + Frame { + msec: 1248 + hash: "fca9d1748195f0d4388694baf901c498" + } + Frame { + msec: 1264 + hash: "fca9d1748195f0d4388694baf901c498" + } + Frame { + msec: 1280 + hash: "fca9d1748195f0d4388694baf901c498" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1296 + hash: "fca9d1748195f0d4388694baf901c498" + } + Frame { + msec: 1312 + hash: "fca9d1748195f0d4388694baf901c498" + } + Frame { + msec: 1328 + hash: "fca9d1748195f0d4388694baf901c498" + } + Frame { + msec: 1344 + hash: "fca9d1748195f0d4388694baf901c498" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1360 + hash: "9ec7c9965d3ce810553b1182b746d148" + } + Frame { + msec: 1376 + hash: "9ec7c9965d3ce810553b1182b746d148" + } + Frame { + msec: 1392 + hash: "9ec7c9965d3ce810553b1182b746d148" + } + Frame { + msec: 1408 + hash: "9ec7c9965d3ce810553b1182b746d148" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1424 + hash: "9ec7c9965d3ce810553b1182b746d148" + } + Frame { + msec: 1440 + hash: "9ec7c9965d3ce810553b1182b746d148" + } + Frame { + msec: 1456 + hash: "9ec7c9965d3ce810553b1182b746d148" + } + Frame { + msec: 1472 + hash: "9ec7c9965d3ce810553b1182b746d148" + } + Frame { + msec: 1488 + hash: "9ec7c9965d3ce810553b1182b746d148" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1504 + hash: "389d0ac399e709482600181b4869be43" + } + Frame { + msec: 1520 + hash: "389d0ac399e709482600181b4869be43" + } + Frame { + msec: 1536 + hash: "389d0ac399e709482600181b4869be43" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1552 + hash: "389d0ac399e709482600181b4869be43" + } + Frame { + msec: 1568 + hash: "389d0ac399e709482600181b4869be43" + } + Frame { + msec: 1584 + hash: "389d0ac399e709482600181b4869be43" + } + Frame { + msec: 1600 + hash: "389d0ac399e709482600181b4869be43" + } + Frame { + msec: 1616 + hash: "389d0ac399e709482600181b4869be43" + } + Frame { + msec: 1632 + hash: "389d0ac399e709482600181b4869be43" + } + Frame { + msec: 1648 + hash: "389d0ac399e709482600181b4869be43" + } + Frame { + msec: 1664 + hash: "389d0ac399e709482600181b4869be43" + } + Frame { + msec: 1680 + hash: "389d0ac399e709482600181b4869be43" + } + Frame { + msec: 1696 + hash: "389d0ac399e709482600181b4869be43" + } + Frame { + msec: 1712 + hash: "389d0ac399e709482600181b4869be43" + } + Frame { + msec: 1728 + hash: "389d0ac399e709482600181b4869be43" + } + Frame { + msec: 1744 + hash: "389d0ac399e709482600181b4869be43" + } + Frame { + msec: 1760 + hash: "389d0ac399e709482600181b4869be43" + } + Frame { + msec: 1776 + hash: "389d0ac399e709482600181b4869be43" + } + Frame { + msec: 1792 + hash: "389d0ac399e709482600181b4869be43" + } + Frame { + msec: 1808 + hash: "389d0ac399e709482600181b4869be43" + } + Frame { + msec: 1824 + hash: "389d0ac399e709482600181b4869be43" + } + Frame { + msec: 1840 + hash: "389d0ac399e709482600181b4869be43" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1856 + hash: "9ec7c9965d3ce810553b1182b746d148" + } + Frame { + msec: 1872 + hash: "9ec7c9965d3ce810553b1182b746d148" + } + Frame { + msec: 1888 + hash: "9ec7c9965d3ce810553b1182b746d148" + } + Frame { + msec: 1904 + hash: "9ec7c9965d3ce810553b1182b746d148" + } + Frame { + msec: 1920 + hash: "9ec7c9965d3ce810553b1182b746d148" + } + Frame { + msec: 1936 + image: "qt-669.2.png" + } + Frame { + msec: 1952 + hash: "9ec7c9965d3ce810553b1182b746d148" + } + Frame { + msec: 1968 + hash: "9ec7c9965d3ce810553b1182b746d148" + } + Frame { + msec: 1984 + hash: "9ec7c9965d3ce810553b1182b746d148" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2000 + hash: "9ec7c9965d3ce810553b1182b746d148" + } + Frame { + msec: 2016 + hash: "9ec7c9965d3ce810553b1182b746d148" + } + Frame { + msec: 2032 + hash: "9ec7c9965d3ce810553b1182b746d148" + } + Frame { + msec: 2048 + hash: "9ec7c9965d3ce810553b1182b746d148" + } + Frame { + msec: 2064 + hash: "9ec7c9965d3ce810553b1182b746d148" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2080 + hash: "fca9d1748195f0d4388694baf901c498" + } + Frame { + msec: 2096 + hash: "fca9d1748195f0d4388694baf901c498" + } + Frame { + msec: 2112 + hash: "fca9d1748195f0d4388694baf901c498" + } + Frame { + msec: 2128 + hash: "fca9d1748195f0d4388694baf901c498" + } + Frame { + msec: 2144 + hash: "fca9d1748195f0d4388694baf901c498" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2160 + hash: "fca9d1748195f0d4388694baf901c498" + } + Frame { + msec: 2176 + hash: "fca9d1748195f0d4388694baf901c498" + } + Frame { + msec: 2192 + hash: "fca9d1748195f0d4388694baf901c498" + } + Frame { + msec: 2208 + hash: "fca9d1748195f0d4388694baf901c498" + } + Frame { + msec: 2224 + hash: "fca9d1748195f0d4388694baf901c498" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2240 + hash: "f531e8dd89482e3d7c501d0b3a8b3392" + } + Frame { + msec: 2256 + hash: "f531e8dd89482e3d7c501d0b3a8b3392" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2272 + hash: "f531e8dd89482e3d7c501d0b3a8b3392" + } + Frame { + msec: 2288 + hash: "f531e8dd89482e3d7c501d0b3a8b3392" + } + Frame { + msec: 2304 + hash: "f531e8dd89482e3d7c501d0b3a8b3392" + } + Frame { + msec: 2320 + hash: "f531e8dd89482e3d7c501d0b3a8b3392" + } + Frame { + msec: 2336 + hash: "f531e8dd89482e3d7c501d0b3a8b3392" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2352 + hash: "a719560bf7912aa6cf4e8e5bfc13cb06" + } + Frame { + msec: 2368 + hash: "a719560bf7912aa6cf4e8e5bfc13cb06" + } + Frame { + msec: 2384 + hash: "a719560bf7912aa6cf4e8e5bfc13cb06" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2400 + hash: "a719560bf7912aa6cf4e8e5bfc13cb06" + } + Frame { + msec: 2416 + hash: "a719560bf7912aa6cf4e8e5bfc13cb06" + } + Frame { + msec: 2432 + hash: "a719560bf7912aa6cf4e8e5bfc13cb06" + } + Frame { + msec: 2448 + hash: "a719560bf7912aa6cf4e8e5bfc13cb06" + } + Frame { + msec: 2464 + hash: "a719560bf7912aa6cf4e8e5bfc13cb06" + } + Frame { + msec: 2480 + hash: "a719560bf7912aa6cf4e8e5bfc13cb06" + } + Frame { + msec: 2496 + hash: "a719560bf7912aa6cf4e8e5bfc13cb06" + } + Frame { + msec: 2512 + hash: "a719560bf7912aa6cf4e8e5bfc13cb06" + } + Frame { + msec: 2528 + hash: "a719560bf7912aa6cf4e8e5bfc13cb06" + } + Frame { + msec: 2544 + hash: "a719560bf7912aa6cf4e8e5bfc13cb06" + } + Frame { + msec: 2560 + hash: "a719560bf7912aa6cf4e8e5bfc13cb06" + } + Frame { + msec: 2576 + hash: "a719560bf7912aa6cf4e8e5bfc13cb06" + } + Frame { + msec: 2592 + hash: "a719560bf7912aa6cf4e8e5bfc13cb06" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2608 + hash: "86e1ba72951c0c193bfd2cd2162c500e" + } + Frame { + msec: 2624 + hash: "86e1ba72951c0c193bfd2cd2162c500e" + } + Frame { + msec: 2640 + hash: "86e1ba72951c0c193bfd2cd2162c500e" + } + Frame { + msec: 2656 + hash: "86e1ba72951c0c193bfd2cd2162c500e" + } + Frame { + msec: 2672 + hash: "86e1ba72951c0c193bfd2cd2162c500e" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2688 + hash: "86e1ba72951c0c193bfd2cd2162c500e" + } + Frame { + msec: 2704 + hash: "86e1ba72951c0c193bfd2cd2162c500e" + } + Frame { + msec: 2720 + hash: "86e1ba72951c0c193bfd2cd2162c500e" + } + Frame { + msec: 2736 + hash: "86e1ba72951c0c193bfd2cd2162c500e" + } + Frame { + msec: 2752 + hash: "86e1ba72951c0c193bfd2cd2162c500e" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2768 + hash: "e5fd0e8d81d75fb53e21b6daa8e0fc7f" + } + Frame { + msec: 2784 + hash: "e5fd0e8d81d75fb53e21b6daa8e0fc7f" + } + Frame { + msec: 2800 + hash: "e5fd0e8d81d75fb53e21b6daa8e0fc7f" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2816 + hash: "e5fd0e8d81d75fb53e21b6daa8e0fc7f" + } + Frame { + msec: 2832 + hash: "e5fd0e8d81d75fb53e21b6daa8e0fc7f" + } + Frame { + msec: 2848 + hash: "e5fd0e8d81d75fb53e21b6daa8e0fc7f" + } + Frame { + msec: 2864 + hash: "e5fd0e8d81d75fb53e21b6daa8e0fc7f" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2880 + hash: "e2a49d72741ba08c258bb70d3a13c7f6" + } + Frame { + msec: 2896 + image: "qt-669.3.png" + } + Frame { + msec: 2912 + hash: "e2a49d72741ba08c258bb70d3a13c7f6" + } + Frame { + msec: 2928 + hash: "e2a49d72741ba08c258bb70d3a13c7f6" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2944 + hash: "e2a49d72741ba08c258bb70d3a13c7f6" + } + Frame { + msec: 2960 + hash: "e2a49d72741ba08c258bb70d3a13c7f6" + } + Frame { + msec: 2976 + hash: "e2a49d72741ba08c258bb70d3a13c7f6" + } + Frame { + msec: 2992 + hash: "e2a49d72741ba08c258bb70d3a13c7f6" + } + Frame { + msec: 3008 + hash: "e2a49d72741ba08c258bb70d3a13c7f6" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3024 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3040 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3056 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3072 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3088 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3104 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3120 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3136 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3152 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3168 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3184 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3200 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3216 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3232 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3248 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3264 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3280 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3296 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3312 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3328 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3344 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3360 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3376 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3392 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3408 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3424 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3440 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3456 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3472 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3488 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3504 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3520 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3536 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3552 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3568 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3584 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3600 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3616 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3632 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3648 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3664 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3680 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Frame { + msec: 3696 + hash: "1d69ccdf88fa78b44a77147190bf1dfc" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3712 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 3728 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 3744 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 3760 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 3776 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 3792 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3808 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 3824 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 3840 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 3856 + image: "qt-669.4.png" + } + Frame { + msec: 3872 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 3888 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 3904 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 3920 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 3936 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 3952 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 3968 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 3984 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 4000 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 4016 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 4032 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 4048 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 4064 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 4080 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 4096 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 4112 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 4128 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 4144 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 4160 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 4176 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 4192 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 4208 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 4224 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 4240 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 4256 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 4272 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 4288 + hash: "32c2b08a6123015ca72f283f89ee1663" + } + Frame { + msec: 4304 + hash: "32c2b08a6123015ca72f283f89ee1663" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.0.png new file mode 100644 index 00000000..5049c3f8 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.1.png new file mode 100644 index 00000000..ee6e16a3 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.10.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.10.png new file mode 100644 index 00000000..d9d22520 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.10.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.11.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.11.png new file mode 100644 index 00000000..d9d22520 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.11.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.12.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.12.png new file mode 100644 index 00000000..5cd2d7d4 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.12.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.2.png new file mode 100644 index 00000000..cf99d98c Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.3.png new file mode 100644 index 00000000..e3937f03 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.4.png new file mode 100644 index 00000000..2fe33379 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.5.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.5.png new file mode 100644 index 00000000..97b99134 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.5.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.6.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.6.png new file mode 100644 index 00000000..08e059f8 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.6.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.7.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.7.png new file mode 100644 index 00000000..bbc5ba24 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.7.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.8.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.8.png new file mode 100644 index 00000000..465b64e8 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.8.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.9.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.9.png new file mode 100644 index 00000000..d9d22520 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.9.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.qml new file mode 100644 index 00000000..a064bf37 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/usingMultilineEdit.qml @@ -0,0 +1,4687 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "usingMultilineEdit.0.png" + } + Frame { + msec: 32 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 48 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 64 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 80 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 96 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 112 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 128 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 144 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 160 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 176 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 192 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 208 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 224 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 240 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 256 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 272 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 288 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 304 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 320 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 118; y: 70 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 336 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 352 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 368 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 384 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 400 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 118; y: 70 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 416 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 432 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 448 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 464 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 480 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 496 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 512 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 528 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 544 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 560 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 576 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 592 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 608 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 624 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Frame { + msec: 640 + hash: "9d5bfe023a03fde612678d000e7d4135" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 117; y: 102 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 656 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 672 + hash: "73232e1c199b5dda158a7e765386a716" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 117; y: 102 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 688 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 704 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 720 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 736 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 752 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 768 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 784 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 800 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 816 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 832 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 848 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 864 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 880 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 896 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 912 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 928 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 944 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 960 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 976 + image: "usingMultilineEdit.1.png" + } + Frame { + msec: 992 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 1008 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 1024 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 1040 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 1056 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 1072 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 1088 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 1104 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 1120 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 1136 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 1152 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 1168 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 1184 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 1200 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 1216 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 1232 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 1248 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 1264 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 1280 + hash: "73232e1c199b5dda158a7e765386a716" + } + Frame { + msec: 1296 + hash: "73232e1c199b5dda158a7e765386a716" + } + Key { + type: 6 + key: 44 + modifiers: 0 + text: "2c" + autorep: false + count: 1 + } + Frame { + msec: 1312 + hash: "75aa32bf4bfdda0dfcf04768bf931da6" + } + Frame { + msec: 1328 + hash: "75aa32bf4bfdda0dfcf04768bf931da6" + } + Frame { + msec: 1344 + hash: "75aa32bf4bfdda0dfcf04768bf931da6" + } + Frame { + msec: 1360 + hash: "75aa32bf4bfdda0dfcf04768bf931da6" + } + Frame { + msec: 1376 + hash: "75aa32bf4bfdda0dfcf04768bf931da6" + } + Key { + type: 7 + key: 44 + modifiers: 0 + text: "2c" + autorep: false + count: 1 + } + Frame { + msec: 1392 + hash: "75aa32bf4bfdda0dfcf04768bf931da6" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 1408 + hash: "7243b903b5b7d8c323a233ae13a2ddf3" + } + Frame { + msec: 1424 + hash: "7243b903b5b7d8c323a233ae13a2ddf3" + } + Frame { + msec: 1440 + hash: "7243b903b5b7d8c323a233ae13a2ddf3" + } + Frame { + msec: 1456 + hash: "7243b903b5b7d8c323a233ae13a2ddf3" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 1472 + hash: "7243b903b5b7d8c323a233ae13a2ddf3" + } + Frame { + msec: 1488 + hash: "7243b903b5b7d8c323a233ae13a2ddf3" + } + Frame { + msec: 1504 + hash: "7243b903b5b7d8c323a233ae13a2ddf3" + } + Frame { + msec: 1520 + hash: "7243b903b5b7d8c323a233ae13a2ddf3" + } + Frame { + msec: 1536 + hash: "7243b903b5b7d8c323a233ae13a2ddf3" + } + Frame { + msec: 1552 + hash: "7243b903b5b7d8c323a233ae13a2ddf3" + } + Key { + type: 6 + key: 68 + modifiers: 0 + text: "64" + autorep: false + count: 1 + } + Frame { + msec: 1568 + hash: "676834a4ee84cb251c6ed102be89ea2e" + } + Frame { + msec: 1584 + hash: "676834a4ee84cb251c6ed102be89ea2e" + } + Frame { + msec: 1600 + hash: "676834a4ee84cb251c6ed102be89ea2e" + } + Key { + type: 7 + key: 68 + modifiers: 0 + text: "64" + autorep: false + count: 1 + } + Frame { + msec: 1616 + hash: "676834a4ee84cb251c6ed102be89ea2e" + } + Key { + type: 6 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 1632 + hash: "74a81081cd0547624cc4168e824b48b8" + } + Frame { + msec: 1648 + hash: "74a81081cd0547624cc4168e824b48b8" + } + Frame { + msec: 1664 + hash: "74a81081cd0547624cc4168e824b48b8" + } + Frame { + msec: 1680 + hash: "74a81081cd0547624cc4168e824b48b8" + } + Frame { + msec: 1696 + hash: "74a81081cd0547624cc4168e824b48b8" + } + Key { + type: 7 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 1712 + hash: "74a81081cd0547624cc4168e824b48b8" + } + Frame { + msec: 1728 + hash: "74a81081cd0547624cc4168e824b48b8" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 1744 + hash: "4c736b2bffb38df898478e3d0ce37fb0" + } + Frame { + msec: 1760 + hash: "4c736b2bffb38df898478e3d0ce37fb0" + } + Frame { + msec: 1776 + hash: "4c736b2bffb38df898478e3d0ce37fb0" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 1792 + hash: "4c736b2bffb38df898478e3d0ce37fb0" + } + Frame { + msec: 1808 + hash: "4c736b2bffb38df898478e3d0ce37fb0" + } + Frame { + msec: 1824 + hash: "4c736b2bffb38df898478e3d0ce37fb0" + } + Key { + type: 6 + key: 89 + modifiers: 0 + text: "79" + autorep: false + count: 1 + } + Frame { + msec: 1840 + hash: "fd070c77e33e1498bacf0076903d33d7" + } + Frame { + msec: 1856 + hash: "fd070c77e33e1498bacf0076903d33d7" + } + Frame { + msec: 1872 + hash: "fd070c77e33e1498bacf0076903d33d7" + } + Frame { + msec: 1888 + hash: "fd070c77e33e1498bacf0076903d33d7" + } + Frame { + msec: 1904 + hash: "fd070c77e33e1498bacf0076903d33d7" + } + Key { + type: 7 + key: 89 + modifiers: 0 + text: "79" + autorep: false + count: 1 + } + Key { + type: 6 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 1920 + hash: "2ce31e62bfe5c1a62621fe4ea6bb07ab" + } + Frame { + msec: 1936 + image: "usingMultilineEdit.2.png" + } + Frame { + msec: 1952 + hash: "2ce31e62bfe5c1a62621fe4ea6bb07ab" + } + Frame { + msec: 1968 + hash: "2ce31e62bfe5c1a62621fe4ea6bb07ab" + } + Key { + type: 6 + key: 85 + modifiers: 0 + text: "75" + autorep: false + count: 1 + } + Frame { + msec: 1984 + hash: "77f7b91dba63e20e92b47575ae2f1a85" + } + Frame { + msec: 2000 + hash: "77f7b91dba63e20e92b47575ae2f1a85" + } + Key { + type: 7 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 2016 + hash: "77f7b91dba63e20e92b47575ae2f1a85" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 2032 + hash: "6c881ac1c94b6648ce1a2c39e477906c" + } + Frame { + msec: 2048 + hash: "6c881ac1c94b6648ce1a2c39e477906c" + } + Key { + type: 7 + key: 85 + modifiers: 0 + text: "75" + autorep: false + count: 1 + } + Frame { + msec: 2064 + hash: "6c881ac1c94b6648ce1a2c39e477906c" + } + Frame { + msec: 2080 + hash: "6c881ac1c94b6648ce1a2c39e477906c" + } + Frame { + msec: 2096 + hash: "6c881ac1c94b6648ce1a2c39e477906c" + } + Frame { + msec: 2112 + hash: "6c881ac1c94b6648ce1a2c39e477906c" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 2128 + hash: "6c881ac1c94b6648ce1a2c39e477906c" + } + Frame { + msec: 2144 + hash: "6c881ac1c94b6648ce1a2c39e477906c" + } + Key { + type: 6 + key: 87 + modifiers: 0 + text: "77" + autorep: false + count: 1 + } + Frame { + msec: 2160 + hash: "8799a9ee6ae4334c0e595c75160cbb35" + } + Frame { + msec: 2176 + hash: "8799a9ee6ae4334c0e595c75160cbb35" + } + Frame { + msec: 2192 + hash: "8799a9ee6ae4334c0e595c75160cbb35" + } + Frame { + msec: 2208 + hash: "8799a9ee6ae4334c0e595c75160cbb35" + } + Frame { + msec: 2224 + hash: "8799a9ee6ae4334c0e595c75160cbb35" + } + Frame { + msec: 2240 + hash: "8799a9ee6ae4334c0e595c75160cbb35" + } + Key { + type: 7 + key: 87 + modifiers: 0 + text: "77" + autorep: false + count: 1 + } + Key { + type: 6 + key: 82 + modifiers: 0 + text: "72" + autorep: false + count: 1 + } + Frame { + msec: 2256 + hash: "1947b07da95b6fb20dfa0189d2e099f4" + } + Frame { + msec: 2272 + hash: "1947b07da95b6fb20dfa0189d2e099f4" + } + Frame { + msec: 2288 + hash: "1947b07da95b6fb20dfa0189d2e099f4" + } + Frame { + msec: 2304 + hash: "1947b07da95b6fb20dfa0189d2e099f4" + } + Frame { + msec: 2320 + hash: "1947b07da95b6fb20dfa0189d2e099f4" + } + Key { + type: 7 + key: 82 + modifiers: 0 + text: "72" + autorep: false + count: 1 + } + Frame { + msec: 2336 + hash: "1947b07da95b6fb20dfa0189d2e099f4" + } + Frame { + msec: 2352 + hash: "1947b07da95b6fb20dfa0189d2e099f4" + } + Key { + type: 6 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 2368 + hash: "f4831fddbb6dccd2add6c381abe18ff5" + } + Frame { + msec: 2384 + hash: "f4831fddbb6dccd2add6c381abe18ff5" + } + Frame { + msec: 2400 + hash: "f4831fddbb6dccd2add6c381abe18ff5" + } + Frame { + msec: 2416 + hash: "f4831fddbb6dccd2add6c381abe18ff5" + } + Key { + type: 7 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 2432 + hash: "f4831fddbb6dccd2add6c381abe18ff5" + } + Key { + type: 6 + key: 80 + modifiers: 0 + text: "70" + autorep: false + count: 1 + } + Frame { + msec: 2448 + hash: "c8e601e39d6399c3bcbe99080e10e77b" + } + Frame { + msec: 2464 + hash: "c8e601e39d6399c3bcbe99080e10e77b" + } + Frame { + msec: 2480 + hash: "c8e601e39d6399c3bcbe99080e10e77b" + } + Frame { + msec: 2496 + hash: "c8e601e39d6399c3bcbe99080e10e77b" + } + Frame { + msec: 2512 + hash: "c8e601e39d6399c3bcbe99080e10e77b" + } + Frame { + msec: 2528 + hash: "c8e601e39d6399c3bcbe99080e10e77b" + } + Key { + type: 7 + key: 80 + modifiers: 0 + text: "70" + autorep: false + count: 1 + } + Frame { + msec: 2544 + hash: "c8e601e39d6399c3bcbe99080e10e77b" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 2560 + hash: "895b6084f9cd58d0746270468d037fc3" + } + Frame { + msec: 2576 + hash: "895b6084f9cd58d0746270468d037fc3" + } + Frame { + msec: 2592 + hash: "895b6084f9cd58d0746270468d037fc3" + } + Frame { + msec: 2608 + hash: "895b6084f9cd58d0746270468d037fc3" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 2624 + hash: "895b6084f9cd58d0746270468d037fc3" + } + Frame { + msec: 2640 + hash: "895b6084f9cd58d0746270468d037fc3" + } + Frame { + msec: 2656 + hash: "895b6084f9cd58d0746270468d037fc3" + } + Frame { + msec: 2672 + hash: "895b6084f9cd58d0746270468d037fc3" + } + Frame { + msec: 2688 + hash: "895b6084f9cd58d0746270468d037fc3" + } + Key { + type: 6 + key: 76 + modifiers: 0 + text: "6c" + autorep: false + count: 1 + } + Frame { + msec: 2704 + hash: "ded3a272885f24140fb8d21835ae6b3a" + } + Frame { + msec: 2720 + hash: "ded3a272885f24140fb8d21835ae6b3a" + } + Frame { + msec: 2736 + hash: "ded3a272885f24140fb8d21835ae6b3a" + } + Frame { + msec: 2752 + hash: "ded3a272885f24140fb8d21835ae6b3a" + } + Frame { + msec: 2768 + hash: "ded3a272885f24140fb8d21835ae6b3a" + } + Frame { + msec: 2784 + hash: "ded3a272885f24140fb8d21835ae6b3a" + } + Key { + type: 6 + key: 73 + modifiers: 0 + text: "69" + autorep: false + count: 1 + } + Frame { + msec: 2800 + hash: "9339ea22fd115b8ae025c0b3a588ca1c" + } + Key { + type: 7 + key: 76 + modifiers: 0 + text: "6c" + autorep: false + count: 1 + } + Frame { + msec: 2816 + hash: "9339ea22fd115b8ae025c0b3a588ca1c" + } + Frame { + msec: 2832 + hash: "9339ea22fd115b8ae025c0b3a588ca1c" + } + Frame { + msec: 2848 + hash: "9339ea22fd115b8ae025c0b3a588ca1c" + } + Frame { + msec: 2864 + hash: "9339ea22fd115b8ae025c0b3a588ca1c" + } + Key { + type: 7 + key: 73 + modifiers: 0 + text: "69" + autorep: false + count: 1 + } + Frame { + msec: 2880 + hash: "9339ea22fd115b8ae025c0b3a588ca1c" + } + Frame { + msec: 2896 + image: "usingMultilineEdit.3.png" + } + Frame { + msec: 2912 + hash: "9339ea22fd115b8ae025c0b3a588ca1c" + } + Frame { + msec: 2928 + hash: "9339ea22fd115b8ae025c0b3a588ca1c" + } + Key { + type: 6 + key: 75 + modifiers: 0 + text: "6b" + autorep: false + count: 1 + } + Frame { + msec: 2944 + hash: "1f219781fb7a7682d27cb875900d077a" + } + Frame { + msec: 2960 + hash: "1f219781fb7a7682d27cb875900d077a" + } + Frame { + msec: 2976 + hash: "1f219781fb7a7682d27cb875900d077a" + } + Key { + type: 7 + key: 75 + modifiers: 0 + text: "6b" + autorep: false + count: 1 + } + Key { + type: 6 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Frame { + msec: 2992 + hash: "20bd65f158440301e6cf14463e498368" + } + Frame { + msec: 3008 + hash: "20bd65f158440301e6cf14463e498368" + } + Frame { + msec: 3024 + hash: "20bd65f158440301e6cf14463e498368" + } + Frame { + msec: 3040 + hash: "20bd65f158440301e6cf14463e498368" + } + Key { + type: 7 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Frame { + msec: 3056 + hash: "20bd65f158440301e6cf14463e498368" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 3072 + hash: "3e73d53051a3175393f4ecb486645bf9" + } + Frame { + msec: 3088 + hash: "3e73d53051a3175393f4ecb486645bf9" + } + Frame { + msec: 3104 + hash: "3e73d53051a3175393f4ecb486645bf9" + } + Key { + type: 6 + key: 16777248 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3120 + hash: "3e73d53051a3175393f4ecb486645bf9" + } + Key { + type: 7 + key: 32 + modifiers: 33554432 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 3136 + hash: "3e73d53051a3175393f4ecb486645bf9" + } + Frame { + msec: 3152 + hash: "3e73d53051a3175393f4ecb486645bf9" + } + Key { + type: 6 + key: 73 + modifiers: 33554432 + text: "49" + autorep: false + count: 1 + } + Frame { + msec: 3168 + hash: "6f566097d23557bef60969852cd3515e" + } + Frame { + msec: 3184 + hash: "6f566097d23557bef60969852cd3515e" + } + Frame { + msec: 3200 + hash: "6f566097d23557bef60969852cd3515e" + } + Frame { + msec: 3216 + hash: "6f566097d23557bef60969852cd3515e" + } + Key { + type: 7 + key: 73 + modifiers: 33554432 + text: "49" + autorep: false + count: 1 + } + Frame { + msec: 3232 + hash: "6f566097d23557bef60969852cd3515e" + } + Key { + type: 7 + key: 16777248 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 3248 + hash: "4767592fe68e8d32d286cf5eaf4510ff" + } + Frame { + msec: 3264 + hash: "4767592fe68e8d32d286cf5eaf4510ff" + } + Frame { + msec: 3280 + hash: "4767592fe68e8d32d286cf5eaf4510ff" + } + Frame { + msec: 3296 + hash: "4767592fe68e8d32d286cf5eaf4510ff" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 3312 + hash: "4767592fe68e8d32d286cf5eaf4510ff" + } + Key { + type: 6 + key: 87 + modifiers: 0 + text: "77" + autorep: false + count: 1 + } + Frame { + msec: 3328 + hash: "d7fd1a19be4f061fc39c4accf18ba0dc" + } + Frame { + msec: 3344 + hash: "d7fd1a19be4f061fc39c4accf18ba0dc" + } + Frame { + msec: 3360 + hash: "d7fd1a19be4f061fc39c4accf18ba0dc" + } + Frame { + msec: 3376 + hash: "d7fd1a19be4f061fc39c4accf18ba0dc" + } + Frame { + msec: 3392 + hash: "d7fd1a19be4f061fc39c4accf18ba0dc" + } + Key { + type: 7 + key: 87 + modifiers: 0 + text: "77" + autorep: false + count: 1 + } + Frame { + msec: 3408 + hash: "d7fd1a19be4f061fc39c4accf18ba0dc" + } + Key { + type: 6 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 3424 + hash: "03e74ddf4c94d322c1b1b35419157948" + } + Frame { + msec: 3440 + hash: "03e74ddf4c94d322c1b1b35419157948" + } + Frame { + msec: 3456 + hash: "03e74ddf4c94d322c1b1b35419157948" + } + Frame { + msec: 3472 + hash: "03e74ddf4c94d322c1b1b35419157948" + } + Frame { + msec: 3488 + hash: "03e74ddf4c94d322c1b1b35419157948" + } + Key { + type: 7 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Key { + type: 6 + key: 78 + modifiers: 0 + text: "6e" + autorep: false + count: 1 + } + Frame { + msec: 3504 + hash: "32712a89ba577f55319fe90873668138" + } + Frame { + msec: 3520 + hash: "32712a89ba577f55319fe90873668138" + } + Frame { + msec: 3536 + hash: "32712a89ba577f55319fe90873668138" + } + Frame { + msec: 3552 + hash: "32712a89ba577f55319fe90873668138" + } + Frame { + msec: 3568 + hash: "32712a89ba577f55319fe90873668138" + } + Frame { + msec: 3584 + hash: "32712a89ba577f55319fe90873668138" + } + Key { + type: 7 + key: 78 + modifiers: 0 + text: "6e" + autorep: false + count: 1 + } + Frame { + msec: 3600 + hash: "32712a89ba577f55319fe90873668138" + } + Key { + type: 6 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 3616 + hash: "9f1cf9784c0659f4902d632542fe9d52" + } + Frame { + msec: 3632 + hash: "9f1cf9784c0659f4902d632542fe9d52" + } + Frame { + msec: 3648 + hash: "9f1cf9784c0659f4902d632542fe9d52" + } + Frame { + msec: 3664 + hash: "9f1cf9784c0659f4902d632542fe9d52" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 3680 + hash: "b350f3b710a0d36ba56bdce6c86f902e" + } + Key { + type: 7 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 3696 + hash: "b350f3b710a0d36ba56bdce6c86f902e" + } + Frame { + msec: 3712 + hash: "b350f3b710a0d36ba56bdce6c86f902e" + } + Frame { + msec: 3728 + hash: "b350f3b710a0d36ba56bdce6c86f902e" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 3744 + hash: "b350f3b710a0d36ba56bdce6c86f902e" + } + Frame { + msec: 3760 + hash: "b350f3b710a0d36ba56bdce6c86f902e" + } + Frame { + msec: 3776 + hash: "b350f3b710a0d36ba56bdce6c86f902e" + } + Frame { + msec: 3792 + hash: "b350f3b710a0d36ba56bdce6c86f902e" + } + Frame { + msec: 3808 + hash: "b350f3b710a0d36ba56bdce6c86f902e" + } + Frame { + msec: 3824 + hash: "b350f3b710a0d36ba56bdce6c86f902e" + } + Frame { + msec: 3840 + hash: "b350f3b710a0d36ba56bdce6c86f902e" + } + Frame { + msec: 3856 + image: "usingMultilineEdit.4.png" + } + Frame { + msec: 3872 + hash: "b350f3b710a0d36ba56bdce6c86f902e" + } + Frame { + msec: 3888 + hash: "b350f3b710a0d36ba56bdce6c86f902e" + } + Frame { + msec: 3904 + hash: "b350f3b710a0d36ba56bdce6c86f902e" + } + Frame { + msec: 3920 + hash: "b350f3b710a0d36ba56bdce6c86f902e" + } + Frame { + msec: 3936 + hash: "b350f3b710a0d36ba56bdce6c86f902e" + } + Frame { + msec: 3952 + hash: "b350f3b710a0d36ba56bdce6c86f902e" + } + Frame { + msec: 3968 + hash: "b350f3b710a0d36ba56bdce6c86f902e" + } + Key { + type: 6 + key: 89 + modifiers: 0 + text: "79" + autorep: false + count: 1 + } + Frame { + msec: 3984 + hash: "2b44bf2548bd887f22e5689946e24de5" + } + Frame { + msec: 4000 + hash: "2b44bf2548bd887f22e5689946e24de5" + } + Frame { + msec: 4016 + hash: "2b44bf2548bd887f22e5689946e24de5" + } + Frame { + msec: 4032 + hash: "2b44bf2548bd887f22e5689946e24de5" + } + Frame { + msec: 4048 + hash: "2b44bf2548bd887f22e5689946e24de5" + } + Key { + type: 6 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 4064 + hash: "925c7c96166cc75dc92bd280fd354e43" + } + Key { + type: 7 + key: 89 + modifiers: 0 + text: "79" + autorep: false + count: 1 + } + Frame { + msec: 4080 + hash: "925c7c96166cc75dc92bd280fd354e43" + } + Frame { + msec: 4096 + hash: "925c7c96166cc75dc92bd280fd354e43" + } + Frame { + msec: 4112 + hash: "925c7c96166cc75dc92bd280fd354e43" + } + Frame { + msec: 4128 + hash: "925c7c96166cc75dc92bd280fd354e43" + } + Key { + type: 6 + key: 85 + modifiers: 0 + text: "75" + autorep: false + count: 1 + } + Frame { + msec: 4144 + hash: "61d6f7583f143917b86adcad6a5ba909" + } + Frame { + msec: 4160 + hash: "61d6f7583f143917b86adcad6a5ba909" + } + Key { + type: 7 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 4176 + hash: "61d6f7583f143917b86adcad6a5ba909" + } + Frame { + msec: 4192 + hash: "61d6f7583f143917b86adcad6a5ba909" + } + Frame { + msec: 4208 + hash: "61d6f7583f143917b86adcad6a5ba909" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 4224 + hash: "679e0940be9c40435aebb05a6e0da685" + } + Frame { + msec: 4240 + hash: "679e0940be9c40435aebb05a6e0da685" + } + Key { + type: 7 + key: 85 + modifiers: 0 + text: "75" + autorep: false + count: 1 + } + Frame { + msec: 4256 + hash: "679e0940be9c40435aebb05a6e0da685" + } + Frame { + msec: 4272 + hash: "679e0940be9c40435aebb05a6e0da685" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 4288 + hash: "679e0940be9c40435aebb05a6e0da685" + } + Frame { + msec: 4304 + hash: "679e0940be9c40435aebb05a6e0da685" + } + Frame { + msec: 4320 + hash: "679e0940be9c40435aebb05a6e0da685" + } + Frame { + msec: 4336 + hash: "679e0940be9c40435aebb05a6e0da685" + } + Frame { + msec: 4352 + hash: "679e0940be9c40435aebb05a6e0da685" + } + Frame { + msec: 4368 + hash: "679e0940be9c40435aebb05a6e0da685" + } + Key { + type: 6 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 4384 + hash: "e819d25f605ec1347e89de65682edb7d" + } + Frame { + msec: 4400 + hash: "e819d25f605ec1347e89de65682edb7d" + } + Frame { + msec: 4416 + hash: "e819d25f605ec1347e89de65682edb7d" + } + Frame { + msec: 4432 + hash: "e819d25f605ec1347e89de65682edb7d" + } + Frame { + msec: 4448 + hash: "e819d25f605ec1347e89de65682edb7d" + } + Key { + type: 7 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 4464 + hash: "e819d25f605ec1347e89de65682edb7d" + } + Key { + type: 6 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 4480 + hash: "ef65860a90a96d521a860c4e73e833ee" + } + Frame { + msec: 4496 + hash: "ef65860a90a96d521a860c4e73e833ee" + } + Frame { + msec: 4512 + hash: "ef65860a90a96d521a860c4e73e833ee" + } + Frame { + msec: 4528 + hash: "ef65860a90a96d521a860c4e73e833ee" + } + Frame { + msec: 4544 + hash: "ef65860a90a96d521a860c4e73e833ee" + } + Key { + type: 7 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 4560 + hash: "ef65860a90a96d521a860c4e73e833ee" + } + Frame { + msec: 4576 + hash: "ef65860a90a96d521a860c4e73e833ee" + } + Frame { + msec: 4592 + hash: "ef65860a90a96d521a860c4e73e833ee" + } + Key { + type: 6 + key: 16777248 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 4608 + hash: "ef65860a90a96d521a860c4e73e833ee" + } + Frame { + msec: 4624 + hash: "ef65860a90a96d521a860c4e73e833ee" + } + Frame { + msec: 4640 + hash: "ef65860a90a96d521a860c4e73e833ee" + } + Frame { + msec: 4656 + hash: "ef65860a90a96d521a860c4e73e833ee" + } + Frame { + msec: 4672 + hash: "ef65860a90a96d521a860c4e73e833ee" + } + Frame { + msec: 4688 + hash: "ef65860a90a96d521a860c4e73e833ee" + } + Frame { + msec: 4704 + hash: "ef65860a90a96d521a860c4e73e833ee" + } + Frame { + msec: 4720 + hash: "ef65860a90a96d521a860c4e73e833ee" + } + Frame { + msec: 4736 + hash: "ef65860a90a96d521a860c4e73e833ee" + } + Frame { + msec: 4752 + hash: "ef65860a90a96d521a860c4e73e833ee" + } + Frame { + msec: 4768 + hash: "ef65860a90a96d521a860c4e73e833ee" + } + Frame { + msec: 4784 + hash: "ef65860a90a96d521a860c4e73e833ee" + } + Frame { + msec: 4800 + hash: "ef65860a90a96d521a860c4e73e833ee" + } + Frame { + msec: 4816 + image: "usingMultilineEdit.5.png" + } + Frame { + msec: 4832 + hash: "ef65860a90a96d521a860c4e73e833ee" + } + Key { + type: 6 + key: 63 + modifiers: 33554432 + text: "3f" + autorep: false + count: 1 + } + Frame { + msec: 4848 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 4864 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 4880 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 4896 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 4912 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 4928 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 4944 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Key { + type: 7 + key: 63 + modifiers: 33554432 + text: "3f" + autorep: false + count: 1 + } + Frame { + msec: 4960 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 4976 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 4992 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5008 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Key { + type: 7 + key: 16777248 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 5024 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5040 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5056 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5072 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5088 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5104 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5120 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5136 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5152 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5168 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5184 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5200 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5216 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5232 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5248 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5264 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5280 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5296 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5312 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5328 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5344 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5360 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5376 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5392 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5408 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5424 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5440 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5456 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5472 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5488 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5504 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5520 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5536 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5552 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5568 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5584 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5600 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5616 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5632 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5648 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5664 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5680 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5696 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5712 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5728 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5744 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Frame { + msec: 5760 + hash: "84497b5307b95f59693b71dc13c838ef" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 48; y: 19 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5776 + image: "usingMultilineEdit.6.png" + } + Frame { + msec: 5792 + hash: "a3d9bdf8086303458ae5d35294551894" + } + Frame { + msec: 5808 + hash: "a3d9bdf8086303458ae5d35294551894" + } + Frame { + msec: 5824 + hash: "a3d9bdf8086303458ae5d35294551894" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 49; y: 21 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 50; y: 22 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5840 + hash: "a3d9bdf8086303458ae5d35294551894" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 50; y: 23 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 51; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5856 + hash: "ee9722d220435828b919fa4d8e314b78" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 53; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 54; y: 33 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5872 + hash: "ee9722d220435828b919fa4d8e314b78" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 55; y: 36 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 56; y: 41 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5888 + hash: "8a06a84965166774ff160984ed05b5ad" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 56; y: 44 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 57; y: 48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5904 + hash: "0a9ec173aa0436b9b9edf3f20946ae5a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 58; y: 52 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 59; y: 58 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5920 + hash: "0a9ec173aa0436b9b9edf3f20946ae5a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 59; y: 64 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 61; y: 69 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5936 + hash: "5511590b6b6826d8e863956220eee2e4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 62; y: 75 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 64; y: 80 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5952 + hash: "4d413c13e43c57809af8ee83a165dcb1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 64; y: 86 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 66; y: 90 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5968 + hash: "cc0c5811bc845540c2c550cefe45ab1c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 67; y: 97 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5984 + hash: "cc0c5811bc845540c2c550cefe45ab1c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 67; y: 101 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 67; y: 105 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6000 + hash: "cc0c5811bc845540c2c550cefe45ab1c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 69; y: 108 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 69; y: 111 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6016 + hash: "cc0c5811bc845540c2c550cefe45ab1c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 69; y: 114 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 69; y: 116 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6032 + hash: "cc0c5811bc845540c2c550cefe45ab1c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 119 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 122 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6048 + hash: "cc0c5811bc845540c2c550cefe45ab1c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 124 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 128 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6064 + hash: "cc0c5811bc845540c2c550cefe45ab1c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 130 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 132 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6080 + hash: "cc0c5811bc845540c2c550cefe45ab1c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 134 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 137 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6096 + hash: "cc0c5811bc845540c2c550cefe45ab1c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 138 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 140 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6112 + hash: "cc0c5811bc845540c2c550cefe45ab1c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 141 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 144 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6128 + hash: "cc0c5811bc845540c2c550cefe45ab1c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 69; y: 145 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 69; y: 148 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6144 + hash: "cc0c5811bc845540c2c550cefe45ab1c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 69; y: 149 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 69; y: 151 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6160 + hash: "cc0c5811bc845540c2c550cefe45ab1c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 69; y: 153 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 68; y: 154 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6176 + hash: "cc0c5811bc845540c2c550cefe45ab1c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 68; y: 155 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6192 + hash: "cc0c5811bc845540c2c550cefe45ab1c" + } + Frame { + msec: 6208 + hash: "cc0c5811bc845540c2c550cefe45ab1c" + } + Frame { + msec: 6224 + hash: "cc0c5811bc845540c2c550cefe45ab1c" + } + Frame { + msec: 6240 + hash: "cc0c5811bc845540c2c550cefe45ab1c" + } + Frame { + msec: 6256 + hash: "cc0c5811bc845540c2c550cefe45ab1c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 68; y: 154 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6272 + hash: "cc0c5811bc845540c2c550cefe45ab1c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 68; y: 152 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 68; y: 149 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6288 + hash: "cc0c5811bc845540c2c550cefe45ab1c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 68; y: 145 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 66; y: 139 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6304 + hash: "cc0c5811bc845540c2c550cefe45ab1c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 66; y: 126 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 64; y: 117 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6320 + hash: "cc0c5811bc845540c2c550cefe45ab1c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 64; y: 108 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 63; y: 98 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6336 + hash: "cc0c5811bc845540c2c550cefe45ab1c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 61; y: 88 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 61; y: 80 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6352 + hash: "cc0c5811bc845540c2c550cefe45ab1c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 59; y: 72 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 59; y: 64 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6368 + hash: "cc0c5811bc845540c2c550cefe45ab1c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 59; y: 58 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 57; y: 51 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6384 + hash: "b35bc1db0fd5b95bb830a9be9ded1659" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 57; y: 37 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6400 + hash: "b35bc1db0fd5b95bb830a9be9ded1659" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 55; y: 30 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 54; y: 23 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6416 + hash: "576bbe32d2b6f582cbb0102d2b0e079b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 54; y: 16 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 52; y: 6 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6432 + hash: "15a7ee7f58f286ae22385c2817b9b697" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 50; y: -2 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 50; y: -9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6448 + hash: "5cd516c20c91c407ca9932ea89afd100" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 48; y: -23 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6464 + hash: "40ce8b3c3588727a37e03dd83cb3d536" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 47; y: -31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 47; y: -38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6480 + hash: "a3d9bdf8086303458ae5d35294551894" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 47; y: -45 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 45; y: -48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6496 + hash: "384cc9f557dd56079a54c1f0460bf96f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 45; y: -48 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 45; y: -48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6512 + hash: "384cc9f557dd56079a54c1f0460bf96f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 45; y: -48 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6528 + hash: "384cc9f557dd56079a54c1f0460bf96f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -48 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6544 + hash: "384cc9f557dd56079a54c1f0460bf96f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -48 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6560 + hash: "384cc9f557dd56079a54c1f0460bf96f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -48 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6576 + hash: "384cc9f557dd56079a54c1f0460bf96f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -48 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6592 + hash: "384cc9f557dd56079a54c1f0460bf96f" + } + Frame { + msec: 6608 + hash: "384cc9f557dd56079a54c1f0460bf96f" + } + Frame { + msec: 6624 + hash: "384cc9f557dd56079a54c1f0460bf96f" + } + Frame { + msec: 6640 + hash: "384cc9f557dd56079a54c1f0460bf96f" + } + Frame { + msec: 6656 + hash: "384cc9f557dd56079a54c1f0460bf96f" + } + Frame { + msec: 6672 + hash: "384cc9f557dd56079a54c1f0460bf96f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -47 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -46 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6688 + hash: "384cc9f557dd56079a54c1f0460bf96f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -45 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 44; y: -42 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6704 + hash: "384cc9f557dd56079a54c1f0460bf96f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 44; y: -39 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 45; y: -36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6720 + hash: "384cc9f557dd56079a54c1f0460bf96f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 45; y: -33 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 46; y: -28 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6736 + image: "usingMultilineEdit.7.png" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 47; y: -25 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 47; y: -21 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6752 + hash: "384cc9f557dd56079a54c1f0460bf96f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 48; y: -18 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 49; y: -14 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6768 + hash: "384cc9f557dd56079a54c1f0460bf96f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 49; y: -10 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 50; y: -8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6784 + hash: "384cc9f557dd56079a54c1f0460bf96f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 50; y: -6 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 51; y: -3 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6800 + hash: "384cc9f557dd56079a54c1f0460bf96f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 51; y: -1 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 52; y: 0 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6816 + hash: "384cc9f557dd56079a54c1f0460bf96f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 52; y: 2 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 52; y: 3 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6832 + hash: "384cc9f557dd56079a54c1f0460bf96f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 53; y: 5 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 54; y: 7 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6848 + hash: "a3d9bdf8086303458ae5d35294551894" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 54; y: 8 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 55; y: 10 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6864 + hash: "a3d9bdf8086303458ae5d35294551894" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 55; y: 11 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 55; y: 12 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6880 + hash: "a3d9bdf8086303458ae5d35294551894" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 55; y: 12 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6896 + hash: "a3d9bdf8086303458ae5d35294551894" + } + Frame { + msec: 6912 + hash: "a3d9bdf8086303458ae5d35294551894" + } + Frame { + msec: 6928 + hash: "a3d9bdf8086303458ae5d35294551894" + } + Frame { + msec: 6944 + hash: "a3d9bdf8086303458ae5d35294551894" + } + Frame { + msec: 6960 + hash: "a3d9bdf8086303458ae5d35294551894" + } + Frame { + msec: 6976 + hash: "a3d9bdf8086303458ae5d35294551894" + } + Frame { + msec: 6992 + hash: "a3d9bdf8086303458ae5d35294551894" + } + Frame { + msec: 7008 + hash: "a3d9bdf8086303458ae5d35294551894" + } + Frame { + msec: 7024 + hash: "a3d9bdf8086303458ae5d35294551894" + } + Frame { + msec: 7040 + hash: "a3d9bdf8086303458ae5d35294551894" + } + Frame { + msec: 7056 + hash: "a3d9bdf8086303458ae5d35294551894" + } + Frame { + msec: 7072 + hash: "a3d9bdf8086303458ae5d35294551894" + } + Frame { + msec: 7088 + hash: "a3d9bdf8086303458ae5d35294551894" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 59; y: 44 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7104 + hash: "a5755969d822cae00af992085c419a17" + } + Frame { + msec: 7120 + hash: "a5755969d822cae00af992085c419a17" + } + Frame { + msec: 7136 + hash: "a5755969d822cae00af992085c419a17" + } + Frame { + msec: 7152 + hash: "a5755969d822cae00af992085c419a17" + } + Frame { + msec: 7168 + hash: "a5755969d822cae00af992085c419a17" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 59; y: 44 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7184 + hash: "a5755969d822cae00af992085c419a17" + } + Frame { + msec: 7200 + hash: "a5755969d822cae00af992085c419a17" + } + Frame { + msec: 7216 + hash: "a5755969d822cae00af992085c419a17" + } + Frame { + msec: 7232 + hash: "a5755969d822cae00af992085c419a17" + } + Frame { + msec: 7248 + hash: "a5755969d822cae00af992085c419a17" + } + Frame { + msec: 7264 + hash: "a5755969d822cae00af992085c419a17" + } + Frame { + msec: 7280 + hash: "a5755969d822cae00af992085c419a17" + } + Frame { + msec: 7296 + hash: "a5755969d822cae00af992085c419a17" + } + Frame { + msec: 7312 + hash: "a5755969d822cae00af992085c419a17" + } + Frame { + msec: 7328 + hash: "a5755969d822cae00af992085c419a17" + } + Frame { + msec: 7344 + hash: "a5755969d822cae00af992085c419a17" + } + Frame { + msec: 7360 + hash: "a5755969d822cae00af992085c419a17" + } + Frame { + msec: 7376 + hash: "a5755969d822cae00af992085c419a17" + } + Frame { + msec: 7392 + hash: "a5755969d822cae00af992085c419a17" + } + Frame { + msec: 7408 + hash: "a5755969d822cae00af992085c419a17" + } + Frame { + msec: 7424 + hash: "a5755969d822cae00af992085c419a17" + } + Frame { + msec: 7440 + hash: "a5755969d822cae00af992085c419a17" + } + Frame { + msec: 7456 + hash: "a5755969d822cae00af992085c419a17" + } + Frame { + msec: 7472 + hash: "a5755969d822cae00af992085c419a17" + } + Frame { + msec: 7488 + hash: "a5755969d822cae00af992085c419a17" + } + Frame { + msec: 7504 + hash: "a5755969d822cae00af992085c419a17" + } + Frame { + msec: 7520 + hash: "a5755969d822cae00af992085c419a17" + } + Frame { + msec: 7536 + hash: "a5755969d822cae00af992085c419a17" + } + Frame { + msec: 7552 + hash: "a5755969d822cae00af992085c419a17" + } + Frame { + msec: 7568 + hash: "a5755969d822cae00af992085c419a17" + } + Key { + type: 6 + key: 16777237 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 7584 + hash: "2395700fc4c3080e99b8871518113778" + } + Frame { + msec: 7600 + hash: "2395700fc4c3080e99b8871518113778" + } + Frame { + msec: 7616 + hash: "2395700fc4c3080e99b8871518113778" + } + Key { + type: 7 + key: 16777237 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 7632 + hash: "2395700fc4c3080e99b8871518113778" + } + Frame { + msec: 7648 + hash: "2395700fc4c3080e99b8871518113778" + } + Frame { + msec: 7664 + hash: "2395700fc4c3080e99b8871518113778" + } + Frame { + msec: 7680 + hash: "2395700fc4c3080e99b8871518113778" + } + Frame { + msec: 7696 + image: "usingMultilineEdit.8.png" + } + Frame { + msec: 7712 + hash: "2395700fc4c3080e99b8871518113778" + } + Key { + type: 6 + key: 16777237 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 7728 + hash: "71e055a9dbd940b3445d5ad9e277b483" + } + Frame { + msec: 7744 + hash: "71e055a9dbd940b3445d5ad9e277b483" + } + Frame { + msec: 7760 + hash: "71e055a9dbd940b3445d5ad9e277b483" + } + Frame { + msec: 7776 + hash: "71e055a9dbd940b3445d5ad9e277b483" + } + Frame { + msec: 7792 + hash: "71e055a9dbd940b3445d5ad9e277b483" + } + Frame { + msec: 7808 + hash: "71e055a9dbd940b3445d5ad9e277b483" + } + Frame { + msec: 7824 + hash: "71e055a9dbd940b3445d5ad9e277b483" + } + Frame { + msec: 7840 + hash: "71e055a9dbd940b3445d5ad9e277b483" + } + Frame { + msec: 7856 + hash: "71e055a9dbd940b3445d5ad9e277b483" + } + Frame { + msec: 7872 + hash: "71e055a9dbd940b3445d5ad9e277b483" + } + Frame { + msec: 7888 + hash: "71e055a9dbd940b3445d5ad9e277b483" + } + Frame { + msec: 7904 + hash: "71e055a9dbd940b3445d5ad9e277b483" + } + Frame { + msec: 7920 + hash: "71e055a9dbd940b3445d5ad9e277b483" + } + Frame { + msec: 7936 + hash: "71e055a9dbd940b3445d5ad9e277b483" + } + Frame { + msec: 7952 + hash: "71e055a9dbd940b3445d5ad9e277b483" + } + Key { + type: 7 + key: 16777237 + modifiers: 0 + text: "" + autorep: true + count: 1 + } + Key { + type: 6 + key: 16777237 + modifiers: 0 + text: "" + autorep: true + count: 1 + } + Frame { + msec: 7968 + hash: "2ed8cb467e60f2fb253abb37bdc18a9a" + } + Frame { + msec: 7984 + hash: "2ed8cb467e60f2fb253abb37bdc18a9a" + } + Key { + type: 7 + key: 16777237 + modifiers: 0 + text: "" + autorep: true + count: 1 + } + Key { + type: 6 + key: 16777237 + modifiers: 0 + text: "" + autorep: true + count: 1 + } + Frame { + msec: 8000 + hash: "5783992a07652cfc53bfa0e1f36c1415" + } + Frame { + msec: 8016 + hash: "5783992a07652cfc53bfa0e1f36c1415" + } + Key { + type: 7 + key: 16777237 + modifiers: 0 + text: "" + autorep: true + count: 1 + } + Key { + type: 6 + key: 16777237 + modifiers: 0 + text: "" + autorep: true + count: 1 + } + Frame { + msec: 8032 + hash: "0fa5790dcbcb740d530b6333063629d6" + } + Frame { + msec: 8048 + hash: "0fa5790dcbcb740d530b6333063629d6" + } + Key { + type: 7 + key: 16777237 + modifiers: 0 + text: "" + autorep: true + count: 1 + } + Key { + type: 6 + key: 16777237 + modifiers: 0 + text: "" + autorep: true + count: 1 + } + Frame { + msec: 8064 + hash: "00ae3b5d61a83fdd16fc05b7c3fde8ed" + } + Frame { + msec: 8080 + hash: "00ae3b5d61a83fdd16fc05b7c3fde8ed" + } + Key { + type: 6 + key: 16777248 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Key { + type: 7 + key: 16777237 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 8096 + hash: "00ae3b5d61a83fdd16fc05b7c3fde8ed" + } + Frame { + msec: 8112 + hash: "00ae3b5d61a83fdd16fc05b7c3fde8ed" + } + Frame { + msec: 8128 + hash: "00ae3b5d61a83fdd16fc05b7c3fde8ed" + } + Frame { + msec: 8144 + hash: "00ae3b5d61a83fdd16fc05b7c3fde8ed" + } + Frame { + msec: 8160 + hash: "00ae3b5d61a83fdd16fc05b7c3fde8ed" + } + Frame { + msec: 8176 + hash: "00ae3b5d61a83fdd16fc05b7c3fde8ed" + } + Frame { + msec: 8192 + hash: "00ae3b5d61a83fdd16fc05b7c3fde8ed" + } + Key { + type: 6 + key: 16777235 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 8208 + hash: "8f59f9f91dbcf608143925ff1f974151" + } + Frame { + msec: 8224 + hash: "8f59f9f91dbcf608143925ff1f974151" + } + Frame { + msec: 8240 + hash: "8f59f9f91dbcf608143925ff1f974151" + } + Frame { + msec: 8256 + hash: "8f59f9f91dbcf608143925ff1f974151" + } + Key { + type: 7 + key: 16777235 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 8272 + hash: "8f59f9f91dbcf608143925ff1f974151" + } + Frame { + msec: 8288 + hash: "8f59f9f91dbcf608143925ff1f974151" + } + Frame { + msec: 8304 + hash: "8f59f9f91dbcf608143925ff1f974151" + } + Frame { + msec: 8320 + hash: "8f59f9f91dbcf608143925ff1f974151" + } + Key { + type: 6 + key: 16777235 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 8336 + hash: "fc48aa2746eaaf31312de3c37d821ff0" + } + Frame { + msec: 8352 + hash: "fc48aa2746eaaf31312de3c37d821ff0" + } + Frame { + msec: 8368 + hash: "fc48aa2746eaaf31312de3c37d821ff0" + } + Frame { + msec: 8384 + hash: "fc48aa2746eaaf31312de3c37d821ff0" + } + Key { + type: 7 + key: 16777235 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 8400 + hash: "fc48aa2746eaaf31312de3c37d821ff0" + } + Frame { + msec: 8416 + hash: "fc48aa2746eaaf31312de3c37d821ff0" + } + Frame { + msec: 8432 + hash: "fc48aa2746eaaf31312de3c37d821ff0" + } + Frame { + msec: 8448 + hash: "fc48aa2746eaaf31312de3c37d821ff0" + } + Frame { + msec: 8464 + hash: "fc48aa2746eaaf31312de3c37d821ff0" + } + Key { + type: 6 + key: 16777235 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 8480 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 8496 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 8512 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 8528 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Key { + type: 7 + key: 16777235 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 8544 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 8560 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 8576 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 8592 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 8608 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 8624 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 8640 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 8656 + image: "usingMultilineEdit.9.png" + } + Key { + type: 7 + key: 16777248 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 8672 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 8688 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 8704 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 8720 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 8736 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 8752 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 8768 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 8784 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 8800 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 8816 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 8832 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 8848 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 8864 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 8880 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 8896 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 8912 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 8928 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 8944 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 8960 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 8976 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 8992 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 9008 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 9024 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 9040 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 9056 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 9072 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 9088 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 9104 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 9120 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 9136 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 9152 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 9168 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 9184 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 9200 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 70; y: 73 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9216 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 9232 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 74 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9248 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 75 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 76 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9264 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 77 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 78 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9280 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 70; y: 78 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9296 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 9312 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 9328 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 9344 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 9360 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 9376 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 9392 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 9408 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 9424 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Frame { + msec: 9440 + hash: "61856cf1f8f2ef6d0b365ab3d7eece51" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 71; y: 94 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9456 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 9472 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 9488 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 9504 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 9520 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 9536 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 71; y: 94 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9552 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 9568 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 9584 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 9600 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 9616 + image: "usingMultilineEdit.10.png" + } + Frame { + msec: 9632 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 9648 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 9664 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Key { + type: 6 + key: 16777248 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 9680 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 9696 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 9712 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 9728 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 9744 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 9760 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 9776 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 9792 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 9808 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 9824 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 9840 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 9856 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 9872 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 9888 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 9904 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 9920 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 9936 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 9952 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 9968 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 9984 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10000 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10016 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10032 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10048 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10064 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10080 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10096 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Key { + type: 6 + key: 16777237 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 10112 + hash: "2ccfdac58b836aa89d2a75d0bdca6624" + } + Frame { + msec: 10128 + hash: "2ccfdac58b836aa89d2a75d0bdca6624" + } + Frame { + msec: 10144 + hash: "2ccfdac58b836aa89d2a75d0bdca6624" + } + Frame { + msec: 10160 + hash: "2ccfdac58b836aa89d2a75d0bdca6624" + } + Frame { + msec: 10176 + hash: "2ccfdac58b836aa89d2a75d0bdca6624" + } + Frame { + msec: 10192 + hash: "2ccfdac58b836aa89d2a75d0bdca6624" + } + Frame { + msec: 10208 + hash: "2ccfdac58b836aa89d2a75d0bdca6624" + } + Frame { + msec: 10224 + hash: "2ccfdac58b836aa89d2a75d0bdca6624" + } + Key { + type: 7 + key: 16777237 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 10240 + hash: "2ccfdac58b836aa89d2a75d0bdca6624" + } + Frame { + msec: 10256 + hash: "2ccfdac58b836aa89d2a75d0bdca6624" + } + Frame { + msec: 10272 + hash: "2ccfdac58b836aa89d2a75d0bdca6624" + } + Frame { + msec: 10288 + hash: "2ccfdac58b836aa89d2a75d0bdca6624" + } + Frame { + msec: 10304 + hash: "2ccfdac58b836aa89d2a75d0bdca6624" + } + Frame { + msec: 10320 + hash: "2ccfdac58b836aa89d2a75d0bdca6624" + } + Frame { + msec: 10336 + hash: "2ccfdac58b836aa89d2a75d0bdca6624" + } + Frame { + msec: 10352 + hash: "2ccfdac58b836aa89d2a75d0bdca6624" + } + Key { + type: 6 + key: 16777235 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 10368 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10384 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10400 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10416 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10432 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10448 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Key { + type: 7 + key: 16777235 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 10464 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10480 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10496 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10512 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10528 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10544 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10560 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10576 + image: "usingMultilineEdit.11.png" + } + Frame { + msec: 10592 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10608 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10624 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10640 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Key { + type: 7 + key: 16777248 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 10656 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10672 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10688 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10704 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10720 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10736 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10752 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10768 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10784 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10800 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10816 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10832 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10848 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10864 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10880 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10896 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10912 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10928 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10944 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10960 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10976 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 10992 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11008 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11024 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11040 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11056 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11072 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11088 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11104 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11120 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11136 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11152 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11168 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11184 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11200 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11216 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11232 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11248 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11264 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11280 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11296 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11312 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11328 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11344 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11360 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11376 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11392 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11408 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11424 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11440 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11456 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11472 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11488 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11504 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11520 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11536 + image: "usingMultilineEdit.12.png" + } + Frame { + msec: 11552 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11568 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11584 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11600 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } + Frame { + msec: 11616 + hash: "37a675ab007d0e0a8f3735d4d84505de" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.0.png new file mode 100644 index 00000000..61606b2b Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.1.png new file mode 100644 index 00000000..a4b28fcd Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.2.png new file mode 100644 index 00000000..5be6bbb8 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.3.png new file mode 100644 index 00000000..a220f654 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.4.png new file mode 100644 index 00000000..6946707f Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.5.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.5.png new file mode 100644 index 00000000..4eeb8ec7 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.5.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.6.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.6.png new file mode 100644 index 00000000..4eeb8ec7 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.6.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.7.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.7.png new file mode 100644 index 00000000..f0748b21 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.7.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.qml new file mode 100644 index 00000000..f5af59f7 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-MAC/wrap.qml @@ -0,0 +1,2467 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "wrap.0.png" + } + Key { + type: 6 + key: 84 + modifiers: 33554432 + text: "54" + autorep: false + count: 1 + } + Frame { + msec: 32 + hash: "2b7fa5ced204393f05bf68d33e0ca2ad" + } + Key { + type: 7 + key: 16777248 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 48 + hash: "2b7fa5ced204393f05bf68d33e0ca2ad" + } + Frame { + msec: 64 + hash: "2b7fa5ced204393f05bf68d33e0ca2ad" + } + Key { + type: 7 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 80 + hash: "2b7fa5ced204393f05bf68d33e0ca2ad" + } + Frame { + msec: 96 + hash: "2b7fa5ced204393f05bf68d33e0ca2ad" + } + Key { + type: 6 + key: 72 + modifiers: 0 + text: "68" + autorep: false + count: 1 + } + Frame { + msec: 112 + hash: "5fe2c4c01922f0b0d3f65152bd80f689" + } + Frame { + msec: 128 + hash: "5fe2c4c01922f0b0d3f65152bd80f689" + } + Frame { + msec: 144 + hash: "5fe2c4c01922f0b0d3f65152bd80f689" + } + Key { + type: 6 + key: 73 + modifiers: 0 + text: "69" + autorep: false + count: 1 + } + Frame { + msec: 160 + hash: "9645f4ad60570c8a95e9ae6dda3f5060" + } + Frame { + msec: 176 + hash: "9645f4ad60570c8a95e9ae6dda3f5060" + } + Frame { + msec: 192 + hash: "9645f4ad60570c8a95e9ae6dda3f5060" + } + Key { + type: 7 + key: 72 + modifiers: 0 + text: "68" + autorep: false + count: 1 + } + Frame { + msec: 208 + hash: "9645f4ad60570c8a95e9ae6dda3f5060" + } + Frame { + msec: 224 + hash: "9645f4ad60570c8a95e9ae6dda3f5060" + } + Key { + type: 6 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 240 + hash: "f28f446cb8de8af0a49ae6e728c996fc" + } + Key { + type: 7 + key: 73 + modifiers: 0 + text: "69" + autorep: false + count: 1 + } + Frame { + msec: 256 + hash: "f28f446cb8de8af0a49ae6e728c996fc" + } + Frame { + msec: 272 + hash: "f28f446cb8de8af0a49ae6e728c996fc" + } + Frame { + msec: 288 + hash: "f28f446cb8de8af0a49ae6e728c996fc" + } + Frame { + msec: 304 + hash: "f28f446cb8de8af0a49ae6e728c996fc" + } + Key { + type: 7 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 320 + hash: "f28f446cb8de8af0a49ae6e728c996fc" + } + Frame { + msec: 336 + hash: "f28f446cb8de8af0a49ae6e728c996fc" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 352 + hash: "98c390c519cd0476de17be8bb49b0f65" + } + Frame { + msec: 368 + hash: "98c390c519cd0476de17be8bb49b0f65" + } + Frame { + msec: 384 + hash: "98c390c519cd0476de17be8bb49b0f65" + } + Frame { + msec: 400 + hash: "98c390c519cd0476de17be8bb49b0f65" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 416 + hash: "98c390c519cd0476de17be8bb49b0f65" + } + Frame { + msec: 432 + hash: "98c390c519cd0476de17be8bb49b0f65" + } + Frame { + msec: 448 + hash: "98c390c519cd0476de17be8bb49b0f65" + } + Frame { + msec: 464 + hash: "98c390c519cd0476de17be8bb49b0f65" + } + Key { + type: 6 + key: 73 + modifiers: 0 + text: "69" + autorep: false + count: 1 + } + Frame { + msec: 480 + hash: "d842a866459f3ecb4fa4fc1426a05411" + } + Frame { + msec: 496 + hash: "d842a866459f3ecb4fa4fc1426a05411" + } + Frame { + msec: 512 + hash: "d842a866459f3ecb4fa4fc1426a05411" + } + Frame { + msec: 528 + hash: "d842a866459f3ecb4fa4fc1426a05411" + } + Key { + type: 6 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Key { + type: 7 + key: 73 + modifiers: 0 + text: "69" + autorep: false + count: 1 + } + Frame { + msec: 544 + hash: "4c858bfd2e8ba7a959bbf2d1e17865e7" + } + Frame { + msec: 560 + hash: "4c858bfd2e8ba7a959bbf2d1e17865e7" + } + Frame { + msec: 576 + hash: "4c858bfd2e8ba7a959bbf2d1e17865e7" + } + Frame { + msec: 592 + hash: "4c858bfd2e8ba7a959bbf2d1e17865e7" + } + Frame { + msec: 608 + hash: "4c858bfd2e8ba7a959bbf2d1e17865e7" + } + Key { + type: 7 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 624 + hash: "9eed9c764b2c5b73a60df84fc0d68756" + } + Frame { + msec: 640 + hash: "9eed9c764b2c5b73a60df84fc0d68756" + } + Frame { + msec: 656 + hash: "9eed9c764b2c5b73a60df84fc0d68756" + } + Frame { + msec: 672 + hash: "9eed9c764b2c5b73a60df84fc0d68756" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 688 + hash: "9eed9c764b2c5b73a60df84fc0d68756" + } + Frame { + msec: 704 + hash: "9eed9c764b2c5b73a60df84fc0d68756" + } + Key { + type: 6 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 720 + hash: "7a1d64574a0a6b90695629fd443274e6" + } + Frame { + msec: 736 + hash: "7a1d64574a0a6b90695629fd443274e6" + } + Frame { + msec: 752 + hash: "7a1d64574a0a6b90695629fd443274e6" + } + Frame { + msec: 768 + hash: "7a1d64574a0a6b90695629fd443274e6" + } + Frame { + msec: 784 + hash: "7a1d64574a0a6b90695629fd443274e6" + } + Key { + type: 7 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 800 + hash: "7a1d64574a0a6b90695629fd443274e6" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 816 + hash: "31e9c4500448142ee2be3171a2bd5385" + } + Frame { + msec: 832 + hash: "31e9c4500448142ee2be3171a2bd5385" + } + Frame { + msec: 848 + hash: "31e9c4500448142ee2be3171a2bd5385" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 864 + hash: "31e9c4500448142ee2be3171a2bd5385" + } + Frame { + msec: 880 + hash: "31e9c4500448142ee2be3171a2bd5385" + } + Frame { + msec: 896 + hash: "31e9c4500448142ee2be3171a2bd5385" + } + Key { + type: 6 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 912 + hash: "7fcfd3706ba11c43ac0a4c2f96b1d80d" + } + Frame { + msec: 928 + hash: "7fcfd3706ba11c43ac0a4c2f96b1d80d" + } + Frame { + msec: 944 + hash: "7fcfd3706ba11c43ac0a4c2f96b1d80d" + } + Frame { + msec: 960 + hash: "7fcfd3706ba11c43ac0a4c2f96b1d80d" + } + Frame { + msec: 976 + image: "wrap.1.png" + } + Frame { + msec: 992 + hash: "7fcfd3706ba11c43ac0a4c2f96b1d80d" + } + Key { + type: 6 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Key { + type: 7 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 1008 + hash: "c05191599361c4171c086630f9608cd0" + } + Frame { + msec: 1024 + hash: "c05191599361c4171c086630f9608cd0" + } + Frame { + msec: 1040 + hash: "c05191599361c4171c086630f9608cd0" + } + Frame { + msec: 1056 + hash: "c05191599361c4171c086630f9608cd0" + } + Frame { + msec: 1072 + hash: "c05191599361c4171c086630f9608cd0" + } + Key { + type: 7 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Frame { + msec: 1088 + hash: "c05191599361c4171c086630f9608cd0" + } + Frame { + msec: 1104 + hash: "c05191599361c4171c086630f9608cd0" + } + Frame { + msec: 1120 + hash: "c05191599361c4171c086630f9608cd0" + } + Frame { + msec: 1136 + hash: "c05191599361c4171c086630f9608cd0" + } + Frame { + msec: 1152 + hash: "c05191599361c4171c086630f9608cd0" + } + Frame { + msec: 1168 + hash: "c05191599361c4171c086630f9608cd0" + } + Frame { + msec: 1184 + hash: "c05191599361c4171c086630f9608cd0" + } + Key { + type: 6 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 1200 + hash: "088e0567dd568019ccb2114d3108a1dd" + } + Frame { + msec: 1216 + hash: "088e0567dd568019ccb2114d3108a1dd" + } + Frame { + msec: 1232 + hash: "088e0567dd568019ccb2114d3108a1dd" + } + Frame { + msec: 1248 + hash: "088e0567dd568019ccb2114d3108a1dd" + } + Frame { + msec: 1264 + hash: "088e0567dd568019ccb2114d3108a1dd" + } + Key { + type: 7 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Key { + type: 6 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 1280 + hash: "35fde81ed66c4804b2b31c0d93fb010a" + } + Frame { + msec: 1296 + hash: "35fde81ed66c4804b2b31c0d93fb010a" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 1312 + hash: "0b212b2b1354e99db328c30d4c8e8b4e" + } + Frame { + msec: 1328 + hash: "0b212b2b1354e99db328c30d4c8e8b4e" + } + Frame { + msec: 1344 + hash: "0b212b2b1354e99db328c30d4c8e8b4e" + } + Key { + type: 7 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 1360 + hash: "0b212b2b1354e99db328c30d4c8e8b4e" + } + Frame { + msec: 1376 + hash: "0b212b2b1354e99db328c30d4c8e8b4e" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 1392 + hash: "0b212b2b1354e99db328c30d4c8e8b4e" + } + Frame { + msec: 1408 + hash: "0b212b2b1354e99db328c30d4c8e8b4e" + } + Frame { + msec: 1424 + hash: "0b212b2b1354e99db328c30d4c8e8b4e" + } + Frame { + msec: 1440 + hash: "0b212b2b1354e99db328c30d4c8e8b4e" + } + Key { + type: 6 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 1456 + hash: "1d19bc237d8de1598a629f2aea7e8e97" + } + Frame { + msec: 1472 + hash: "1d19bc237d8de1598a629f2aea7e8e97" + } + Frame { + msec: 1488 + hash: "1d19bc237d8de1598a629f2aea7e8e97" + } + Frame { + msec: 1504 + hash: "1d19bc237d8de1598a629f2aea7e8e97" + } + Frame { + msec: 1520 + hash: "1d19bc237d8de1598a629f2aea7e8e97" + } + Key { + type: 7 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 1536 + hash: "1d19bc237d8de1598a629f2aea7e8e97" + } + Frame { + msec: 1552 + hash: "1d19bc237d8de1598a629f2aea7e8e97" + } + Key { + type: 6 + key: 72 + modifiers: 0 + text: "68" + autorep: false + count: 1 + } + Frame { + msec: 1568 + hash: "df3025b2de2cf6cee2b918c6d13834c6" + } + Frame { + msec: 1584 + hash: "df3025b2de2cf6cee2b918c6d13834c6" + } + Frame { + msec: 1600 + hash: "df3025b2de2cf6cee2b918c6d13834c6" + } + Frame { + msec: 1616 + hash: "df3025b2de2cf6cee2b918c6d13834c6" + } + Frame { + msec: 1632 + hash: "df3025b2de2cf6cee2b918c6d13834c6" + } + Key { + type: 6 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Key { + type: 7 + key: 72 + modifiers: 0 + text: "68" + autorep: false + count: 1 + } + Frame { + msec: 1648 + hash: "b19baef8a5d8efd96d5ec9e729a9d42a" + } + Frame { + msec: 1664 + hash: "b19baef8a5d8efd96d5ec9e729a9d42a" + } + Frame { + msec: 1680 + hash: "b19baef8a5d8efd96d5ec9e729a9d42a" + } + Frame { + msec: 1696 + hash: "b19baef8a5d8efd96d5ec9e729a9d42a" + } + Frame { + msec: 1712 + hash: "b19baef8a5d8efd96d5ec9e729a9d42a" + } + Key { + type: 6 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 1728 + hash: "914e61f38d7f2b5a465037d6ef1ddaba" + } + Frame { + msec: 1744 + hash: "914e61f38d7f2b5a465037d6ef1ddaba" + } + Frame { + msec: 1760 + hash: "914e61f38d7f2b5a465037d6ef1ddaba" + } + Key { + type: 7 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 1776 + hash: "914e61f38d7f2b5a465037d6ef1ddaba" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 1792 + hash: "e816134a8fef0bbee8e94c0f9561750b" + } + Frame { + msec: 1808 + hash: "e816134a8fef0bbee8e94c0f9561750b" + } + Key { + type: 7 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 1824 + hash: "e816134a8fef0bbee8e94c0f9561750b" + } + Frame { + msec: 1840 + hash: "e816134a8fef0bbee8e94c0f9561750b" + } + Frame { + msec: 1856 + hash: "e816134a8fef0bbee8e94c0f9561750b" + } + Frame { + msec: 1872 + hash: "e816134a8fef0bbee8e94c0f9561750b" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 1888 + hash: "e816134a8fef0bbee8e94c0f9561750b" + } + Frame { + msec: 1904 + hash: "e816134a8fef0bbee8e94c0f9561750b" + } + Frame { + msec: 1920 + hash: "e816134a8fef0bbee8e94c0f9561750b" + } + Frame { + msec: 1936 + image: "wrap.2.png" + } + Frame { + msec: 1952 + hash: "e816134a8fef0bbee8e94c0f9561750b" + } + Key { + type: 6 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 1968 + hash: "9552729028c8e129e19c06ff35bb085b" + } + Frame { + msec: 1984 + hash: "9552729028c8e129e19c06ff35bb085b" + } + Frame { + msec: 2000 + hash: "9552729028c8e129e19c06ff35bb085b" + } + Frame { + msec: 2016 + hash: "9552729028c8e129e19c06ff35bb085b" + } + Frame { + msec: 2032 + hash: "9552729028c8e129e19c06ff35bb085b" + } + Frame { + msec: 2048 + hash: "9552729028c8e129e19c06ff35bb085b" + } + Key { + type: 6 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Frame { + msec: 2064 + hash: "2dbdfe3bd309b98af7ed8980725f3ee7" + } + Key { + type: 7 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 2080 + hash: "2dbdfe3bd309b98af7ed8980725f3ee7" + } + Frame { + msec: 2096 + hash: "2dbdfe3bd309b98af7ed8980725f3ee7" + } + Frame { + msec: 2112 + hash: "2dbdfe3bd309b98af7ed8980725f3ee7" + } + Key { + type: 7 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Frame { + msec: 2128 + hash: "2dbdfe3bd309b98af7ed8980725f3ee7" + } + Frame { + msec: 2144 + hash: "2dbdfe3bd309b98af7ed8980725f3ee7" + } + Frame { + msec: 2160 + hash: "2dbdfe3bd309b98af7ed8980725f3ee7" + } + Frame { + msec: 2176 + hash: "2dbdfe3bd309b98af7ed8980725f3ee7" + } + Frame { + msec: 2192 + hash: "2dbdfe3bd309b98af7ed8980725f3ee7" + } + Frame { + msec: 2208 + hash: "2dbdfe3bd309b98af7ed8980725f3ee7" + } + Key { + type: 6 + key: 88 + modifiers: 0 + text: "78" + autorep: false + count: 1 + } + Frame { + msec: 2224 + hash: "28748f90f61954b94377768788f1634d" + } + Frame { + msec: 2240 + hash: "28748f90f61954b94377768788f1634d" + } + Frame { + msec: 2256 + hash: "28748f90f61954b94377768788f1634d" + } + Frame { + msec: 2272 + hash: "28748f90f61954b94377768788f1634d" + } + Frame { + msec: 2288 + hash: "28748f90f61954b94377768788f1634d" + } + Key { + type: 6 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 2304 + hash: "2cf8ad2ba8ddcde4dd8549f034a77005" + } + Key { + type: 7 + key: 88 + modifiers: 0 + text: "78" + autorep: false + count: 1 + } + Frame { + msec: 2320 + hash: "2cf8ad2ba8ddcde4dd8549f034a77005" + } + Frame { + msec: 2336 + hash: "2cf8ad2ba8ddcde4dd8549f034a77005" + } + Frame { + msec: 2352 + hash: "2cf8ad2ba8ddcde4dd8549f034a77005" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 2368 + hash: "95b6ce7c01461847a3f7aff88aa8ad9d" + } + Frame { + msec: 2384 + hash: "95b6ce7c01461847a3f7aff88aa8ad9d" + } + Key { + type: 7 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 2400 + hash: "95b6ce7c01461847a3f7aff88aa8ad9d" + } + Frame { + msec: 2416 + hash: "95b6ce7c01461847a3f7aff88aa8ad9d" + } + Frame { + msec: 2432 + hash: "95b6ce7c01461847a3f7aff88aa8ad9d" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 2448 + hash: "95b6ce7c01461847a3f7aff88aa8ad9d" + } + Frame { + msec: 2464 + hash: "95b6ce7c01461847a3f7aff88aa8ad9d" + } + Frame { + msec: 2480 + hash: "95b6ce7c01461847a3f7aff88aa8ad9d" + } + Key { + type: 6 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Frame { + msec: 2496 + hash: "81872138f3cafb1cf06009df77af1461" + } + Frame { + msec: 2512 + hash: "81872138f3cafb1cf06009df77af1461" + } + Frame { + msec: 2528 + hash: "81872138f3cafb1cf06009df77af1461" + } + Frame { + msec: 2544 + hash: "81872138f3cafb1cf06009df77af1461" + } + Key { + type: 7 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Frame { + msec: 2560 + hash: "81872138f3cafb1cf06009df77af1461" + } + Frame { + msec: 2576 + hash: "81872138f3cafb1cf06009df77af1461" + } + Frame { + msec: 2592 + hash: "81872138f3cafb1cf06009df77af1461" + } + Frame { + msec: 2608 + hash: "81872138f3cafb1cf06009df77af1461" + } + Frame { + msec: 2624 + hash: "81872138f3cafb1cf06009df77af1461" + } + Frame { + msec: 2640 + hash: "81872138f3cafb1cf06009df77af1461" + } + Key { + type: 6 + key: 68 + modifiers: 0 + text: "64" + autorep: false + count: 1 + } + Frame { + msec: 2656 + hash: "dfa35c08894d7ed748b8846fa3ce8fac" + } + Frame { + msec: 2672 + hash: "dfa35c08894d7ed748b8846fa3ce8fac" + } + Frame { + msec: 2688 + hash: "dfa35c08894d7ed748b8846fa3ce8fac" + } + Frame { + msec: 2704 + hash: "dfa35c08894d7ed748b8846fa3ce8fac" + } + Key { + type: 7 + key: 68 + modifiers: 0 + text: "64" + autorep: false + count: 1 + } + Frame { + msec: 2720 + hash: "dfa35c08894d7ed748b8846fa3ce8fac" + } + Frame { + msec: 2736 + hash: "dfa35c08894d7ed748b8846fa3ce8fac" + } + Frame { + msec: 2752 + hash: "dfa35c08894d7ed748b8846fa3ce8fac" + } + Key { + type: 6 + key: 73 + modifiers: 0 + text: "69" + autorep: false + count: 1 + } + Frame { + msec: 2768 + hash: "9decac3d9243bebdc7699fcb77a31f21" + } + Frame { + msec: 2784 + hash: "9decac3d9243bebdc7699fcb77a31f21" + } + Frame { + msec: 2800 + hash: "9decac3d9243bebdc7699fcb77a31f21" + } + Frame { + msec: 2816 + hash: "9decac3d9243bebdc7699fcb77a31f21" + } + Frame { + msec: 2832 + hash: "9decac3d9243bebdc7699fcb77a31f21" + } + Key { + type: 6 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Key { + type: 7 + key: 73 + modifiers: 0 + text: "69" + autorep: false + count: 1 + } + Frame { + msec: 2848 + hash: "6a1bb7dd22f3e090008ba265c30f9c2d" + } + Frame { + msec: 2864 + hash: "6a1bb7dd22f3e090008ba265c30f9c2d" + } + Frame { + msec: 2880 + hash: "6a1bb7dd22f3e090008ba265c30f9c2d" + } + Frame { + msec: 2896 + image: "wrap.3.png" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 2912 + hash: "ee39b3014e140aff2f974f3b919f85f4" + } + Frame { + msec: 2928 + hash: "ee39b3014e140aff2f974f3b919f85f4" + } + Key { + type: 7 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 2944 + hash: "ee39b3014e140aff2f974f3b919f85f4" + } + Frame { + msec: 2960 + hash: "ee39b3014e140aff2f974f3b919f85f4" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 2976 + hash: "ee39b3014e140aff2f974f3b919f85f4" + } + Frame { + msec: 2992 + hash: "ee39b3014e140aff2f974f3b919f85f4" + } + Frame { + msec: 3008 + hash: "ee39b3014e140aff2f974f3b919f85f4" + } + Frame { + msec: 3024 + hash: "ee39b3014e140aff2f974f3b919f85f4" + } + Frame { + msec: 3040 + hash: "ee39b3014e140aff2f974f3b919f85f4" + } + Frame { + msec: 3056 + hash: "ee39b3014e140aff2f974f3b919f85f4" + } + Frame { + msec: 3072 + hash: "ee39b3014e140aff2f974f3b919f85f4" + } + Frame { + msec: 3088 + hash: "ee39b3014e140aff2f974f3b919f85f4" + } + Key { + type: 6 + key: 87 + modifiers: 0 + text: "77" + autorep: false + count: 1 + } + Frame { + msec: 3104 + hash: "d448179ec6bba91f3f70be821710a8c7" + } + Frame { + msec: 3120 + hash: "d448179ec6bba91f3f70be821710a8c7" + } + Frame { + msec: 3136 + hash: "d448179ec6bba91f3f70be821710a8c7" + } + Frame { + msec: 3152 + hash: "d448179ec6bba91f3f70be821710a8c7" + } + Frame { + msec: 3168 + hash: "d448179ec6bba91f3f70be821710a8c7" + } + Key { + type: 7 + key: 87 + modifiers: 0 + text: "77" + autorep: false + count: 1 + } + Frame { + msec: 3184 + hash: "d448179ec6bba91f3f70be821710a8c7" + } + Frame { + msec: 3200 + hash: "d448179ec6bba91f3f70be821710a8c7" + } + Frame { + msec: 3216 + hash: "d448179ec6bba91f3f70be821710a8c7" + } + Frame { + msec: 3232 + hash: "d448179ec6bba91f3f70be821710a8c7" + } + Frame { + msec: 3248 + hash: "d448179ec6bba91f3f70be821710a8c7" + } + Key { + type: 6 + key: 82 + modifiers: 0 + text: "72" + autorep: false + count: 1 + } + Frame { + msec: 3264 + hash: "e30b5aa9b5d08fba758fe781812f096d" + } + Frame { + msec: 3280 + hash: "e30b5aa9b5d08fba758fe781812f096d" + } + Frame { + msec: 3296 + hash: "e30b5aa9b5d08fba758fe781812f096d" + } + Key { + type: 7 + key: 82 + modifiers: 0 + text: "72" + autorep: false + count: 1 + } + Frame { + msec: 3312 + hash: "e30b5aa9b5d08fba758fe781812f096d" + } + Frame { + msec: 3328 + hash: "e30b5aa9b5d08fba758fe781812f096d" + } + Frame { + msec: 3344 + hash: "e30b5aa9b5d08fba758fe781812f096d" + } + Key { + type: 6 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 3360 + hash: "ba932735c5079ad6562050b6e332d2e7" + } + Frame { + msec: 3376 + hash: "ba932735c5079ad6562050b6e332d2e7" + } + Frame { + msec: 3392 + hash: "ba932735c5079ad6562050b6e332d2e7" + } + Frame { + msec: 3408 + hash: "ba932735c5079ad6562050b6e332d2e7" + } + Frame { + msec: 3424 + hash: "ba932735c5079ad6562050b6e332d2e7" + } + Key { + type: 7 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 3440 + hash: "ba932735c5079ad6562050b6e332d2e7" + } + Frame { + msec: 3456 + hash: "ba932735c5079ad6562050b6e332d2e7" + } + Frame { + msec: 3472 + hash: "ba932735c5079ad6562050b6e332d2e7" + } + Key { + type: 6 + key: 80 + modifiers: 0 + text: "70" + autorep: false + count: 1 + } + Frame { + msec: 3488 + hash: "01dacbcc21c541e0cbf272ee01292b7c" + } + Frame { + msec: 3504 + hash: "01dacbcc21c541e0cbf272ee01292b7c" + } + Frame { + msec: 3520 + hash: "01dacbcc21c541e0cbf272ee01292b7c" + } + Frame { + msec: 3536 + hash: "01dacbcc21c541e0cbf272ee01292b7c" + } + Key { + type: 7 + key: 80 + modifiers: 0 + text: "70" + autorep: false + count: 1 + } + Frame { + msec: 3552 + hash: "01dacbcc21c541e0cbf272ee01292b7c" + } + Frame { + msec: 3568 + hash: "01dacbcc21c541e0cbf272ee01292b7c" + } + Key { + type: 6 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 3584 + hash: "7b493045fb2b7373525ce570d86542d7" + } + Frame { + msec: 3600 + hash: "7b493045fb2b7373525ce570d86542d7" + } + Frame { + msec: 3616 + hash: "7b493045fb2b7373525ce570d86542d7" + } + Frame { + msec: 3632 + hash: "7b493045fb2b7373525ce570d86542d7" + } + Frame { + msec: 3648 + hash: "7b493045fb2b7373525ce570d86542d7" + } + Frame { + msec: 3664 + hash: "7b493045fb2b7373525ce570d86542d7" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 3680 + hash: "7c11ac5b8dfee4708b7b49c2a1a7db57" + } + Key { + type: 7 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 3696 + hash: "7c11ac5b8dfee4708b7b49c2a1a7db57" + } + Frame { + msec: 3712 + hash: "7c11ac5b8dfee4708b7b49c2a1a7db57" + } + Frame { + msec: 3728 + hash: "7c11ac5b8dfee4708b7b49c2a1a7db57" + } + Frame { + msec: 3744 + hash: "7c11ac5b8dfee4708b7b49c2a1a7db57" + } + Frame { + msec: 3760 + hash: "7c11ac5b8dfee4708b7b49c2a1a7db57" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 3776 + hash: "7c11ac5b8dfee4708b7b49c2a1a7db57" + } + Frame { + msec: 3792 + hash: "7c11ac5b8dfee4708b7b49c2a1a7db57" + } + Frame { + msec: 3808 + hash: "7c11ac5b8dfee4708b7b49c2a1a7db57" + } + Frame { + msec: 3824 + hash: "7c11ac5b8dfee4708b7b49c2a1a7db57" + } + Frame { + msec: 3840 + hash: "7c11ac5b8dfee4708b7b49c2a1a7db57" + } + Frame { + msec: 3856 + image: "wrap.4.png" + } + Frame { + msec: 3872 + hash: "7c11ac5b8dfee4708b7b49c2a1a7db57" + } + Frame { + msec: 3888 + hash: "7c11ac5b8dfee4708b7b49c2a1a7db57" + } + Frame { + msec: 3904 + hash: "7c11ac5b8dfee4708b7b49c2a1a7db57" + } + Key { + type: 6 + key: 67 + modifiers: 0 + text: "63" + autorep: false + count: 1 + } + Frame { + msec: 3920 + hash: "46a6db4f63965f019fc1966e2a6caf98" + } + Frame { + msec: 3936 + hash: "46a6db4f63965f019fc1966e2a6caf98" + } + Frame { + msec: 3952 + hash: "46a6db4f63965f019fc1966e2a6caf98" + } + Frame { + msec: 3968 + hash: "46a6db4f63965f019fc1966e2a6caf98" + } + Frame { + msec: 3984 + hash: "46a6db4f63965f019fc1966e2a6caf98" + } + Key { + type: 7 + key: 67 + modifiers: 0 + text: "63" + autorep: false + count: 1 + } + Frame { + msec: 4000 + hash: "46a6db4f63965f019fc1966e2a6caf98" + } + Frame { + msec: 4016 + hash: "46a6db4f63965f019fc1966e2a6caf98" + } + Key { + type: 6 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 4032 + hash: "abc8cf4650aa07a9a26ad04a082bc269" + } + Frame { + msec: 4048 + hash: "abc8cf4650aa07a9a26ad04a082bc269" + } + Frame { + msec: 4064 + hash: "abc8cf4650aa07a9a26ad04a082bc269" + } + Key { + type: 7 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 4080 + hash: "abc8cf4650aa07a9a26ad04a082bc269" + } + Key { + type: 6 + key: 82 + modifiers: 0 + text: "72" + autorep: false + count: 1 + } + Frame { + msec: 4096 + hash: "23ee54c88cd70b6c66137ce32702cf01" + } + Frame { + msec: 4112 + hash: "23ee54c88cd70b6c66137ce32702cf01" + } + Frame { + msec: 4128 + hash: "23ee54c88cd70b6c66137ce32702cf01" + } + Frame { + msec: 4144 + hash: "23ee54c88cd70b6c66137ce32702cf01" + } + Key { + type: 7 + key: 82 + modifiers: 0 + text: "72" + autorep: false + count: 1 + } + Frame { + msec: 4160 + hash: "23ee54c88cd70b6c66137ce32702cf01" + } + Frame { + msec: 4176 + hash: "23ee54c88cd70b6c66137ce32702cf01" + } + Frame { + msec: 4192 + hash: "23ee54c88cd70b6c66137ce32702cf01" + } + Key { + type: 6 + key: 82 + modifiers: 0 + text: "72" + autorep: false + count: 1 + } + Frame { + msec: 4208 + hash: "dc0899573a995421b57a6689d300a421" + } + Frame { + msec: 4224 + hash: "dc0899573a995421b57a6689d300a421" + } + Frame { + msec: 4240 + hash: "dc0899573a995421b57a6689d300a421" + } + Frame { + msec: 4256 + hash: "dc0899573a995421b57a6689d300a421" + } + Frame { + msec: 4272 + hash: "dc0899573a995421b57a6689d300a421" + } + Key { + type: 6 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Frame { + msec: 4288 + hash: "4d42c63a0324c1573818ebb081d8927f" + } + Key { + type: 7 + key: 82 + modifiers: 0 + text: "72" + autorep: false + count: 1 + } + Frame { + msec: 4304 + hash: "4d42c63a0324c1573818ebb081d8927f" + } + Frame { + msec: 4320 + hash: "4d42c63a0324c1573818ebb081d8927f" + } + Frame { + msec: 4336 + hash: "4d42c63a0324c1573818ebb081d8927f" + } + Key { + type: 7 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Frame { + msec: 4352 + hash: "4d42c63a0324c1573818ebb081d8927f" + } + Frame { + msec: 4368 + hash: "4d42c63a0324c1573818ebb081d8927f" + } + Frame { + msec: 4384 + hash: "4d42c63a0324c1573818ebb081d8927f" + } + Frame { + msec: 4400 + hash: "4d42c63a0324c1573818ebb081d8927f" + } + Frame { + msec: 4416 + hash: "4d42c63a0324c1573818ebb081d8927f" + } + Key { + type: 6 + key: 67 + modifiers: 0 + text: "63" + autorep: false + count: 1 + } + Frame { + msec: 4432 + hash: "9d2239e4b71da17a6f8f2ef979f4bf85" + } + Frame { + msec: 4448 + hash: "9d2239e4b71da17a6f8f2ef979f4bf85" + } + Frame { + msec: 4464 + hash: "9d2239e4b71da17a6f8f2ef979f4bf85" + } + Key { + type: 7 + key: 67 + modifiers: 0 + text: "63" + autorep: false + count: 1 + } + Frame { + msec: 4480 + hash: "9d2239e4b71da17a6f8f2ef979f4bf85" + } + Frame { + msec: 4496 + hash: "9d2239e4b71da17a6f8f2ef979f4bf85" + } + Frame { + msec: 4512 + hash: "9d2239e4b71da17a6f8f2ef979f4bf85" + } + Frame { + msec: 4528 + hash: "9d2239e4b71da17a6f8f2ef979f4bf85" + } + Frame { + msec: 4544 + hash: "9d2239e4b71da17a6f8f2ef979f4bf85" + } + Key { + type: 6 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 4560 + hash: "289059d77547c9ec548b33d8bbe9fca9" + } + Frame { + msec: 4576 + hash: "289059d77547c9ec548b33d8bbe9fca9" + } + Frame { + msec: 4592 + hash: "289059d77547c9ec548b33d8bbe9fca9" + } + Frame { + msec: 4608 + hash: "289059d77547c9ec548b33d8bbe9fca9" + } + Key { + type: 7 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 4624 + hash: "289059d77547c9ec548b33d8bbe9fca9" + } + Frame { + msec: 4640 + hash: "289059d77547c9ec548b33d8bbe9fca9" + } + Frame { + msec: 4656 + hash: "289059d77547c9ec548b33d8bbe9fca9" + } + Frame { + msec: 4672 + hash: "289059d77547c9ec548b33d8bbe9fca9" + } + Key { + type: 6 + key: 76 + modifiers: 0 + text: "6c" + autorep: false + count: 1 + } + Frame { + msec: 4688 + hash: "4b60bfb67c5007b4054241e581ce92ac" + } + Frame { + msec: 4704 + hash: "4b60bfb67c5007b4054241e581ce92ac" + } + Frame { + msec: 4720 + hash: "4b60bfb67c5007b4054241e581ce92ac" + } + Frame { + msec: 4736 + hash: "4b60bfb67c5007b4054241e581ce92ac" + } + Key { + type: 7 + key: 76 + modifiers: 0 + text: "6c" + autorep: false + count: 1 + } + Frame { + msec: 4752 + hash: "4b60bfb67c5007b4054241e581ce92ac" + } + Frame { + msec: 4768 + hash: "4b60bfb67c5007b4054241e581ce92ac" + } + Frame { + msec: 4784 + hash: "4b60bfb67c5007b4054241e581ce92ac" + } + Key { + type: 6 + key: 89 + modifiers: 0 + text: "79" + autorep: false + count: 1 + } + Frame { + msec: 4800 + hash: "dbabce81e44f912d6a30ff4cc3289da8" + } + Frame { + msec: 4816 + image: "wrap.5.png" + } + Key { + type: 7 + key: 89 + modifiers: 0 + text: "79" + autorep: false + count: 1 + } + Frame { + msec: 4832 + hash: "dbabce81e44f912d6a30ff4cc3289da8" + } + Frame { + msec: 4848 + hash: "dbabce81e44f912d6a30ff4cc3289da8" + } + Frame { + msec: 4864 + hash: "dbabce81e44f912d6a30ff4cc3289da8" + } + Frame { + msec: 4880 + hash: "dbabce81e44f912d6a30ff4cc3289da8" + } + Key { + type: 6 + key: 46 + modifiers: 0 + text: "2e" + autorep: false + count: 1 + } + Frame { + msec: 4896 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 4912 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 4928 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 4944 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Key { + type: 7 + key: 46 + modifiers: 0 + text: "2e" + autorep: false + count: 1 + } + Frame { + msec: 4960 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 4976 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 4992 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5008 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5024 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5040 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5056 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5072 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5088 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5104 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5120 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5136 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5152 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5168 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5184 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5200 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5216 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5232 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5248 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5264 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5280 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5296 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5312 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5328 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5344 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5360 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5376 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5392 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5408 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5424 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5440 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5456 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5472 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5488 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5504 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5520 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5536 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5552 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5568 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5584 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5600 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5616 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5632 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5648 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5664 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5680 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5696 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5712 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5728 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5744 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5760 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5776 + image: "wrap.6.png" + } + Frame { + msec: 5792 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5808 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5824 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5840 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5856 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5872 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5888 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5904 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5920 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5936 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5952 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5968 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 5984 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6000 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6016 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6032 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6048 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6064 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6080 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6096 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6112 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6128 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6144 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6160 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6176 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6192 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6208 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6224 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6240 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6256 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6272 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6288 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6304 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6320 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6336 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6352 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6368 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6384 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6400 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6416 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6432 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6448 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6464 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6480 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6496 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6512 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6528 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6544 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6560 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6576 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6592 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6608 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6624 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6640 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6656 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6672 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6688 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6704 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6720 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6736 + image: "wrap.7.png" + } + Frame { + msec: 6752 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6768 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6784 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6800 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6816 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6832 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6848 + hash: "e9633d239e0a9ca008ed033565322c24" + } + Frame { + msec: 6864 + hash: "e9633d239e0a9ca008ed033565322c24" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.0.png new file mode 100644 index 00000000..be025e55 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.1.png new file mode 100644 index 00000000..1b2cd047 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.2.png new file mode 100644 index 00000000..2e56d47e Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.3.png new file mode 100644 index 00000000..8abdfc25 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.4.png new file mode 100644 index 00000000..58428cee Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.5.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.5.png new file mode 100644 index 00000000..3c23bd6b Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.5.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.6.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.6.png new file mode 100644 index 00000000..80b960c1 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.6.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.7.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.7.png new file mode 100644 index 00000000..72472771 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.7.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.8.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.8.png new file mode 100644 index 00000000..af5a996b Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.8.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.9.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.9.png new file mode 100644 index 00000000..b254164f Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.9.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.qml new file mode 100644 index 00000000..96307455 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/cursorDelegate.qml @@ -0,0 +1,1499 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "cursorDelegate.0.png" + } + Frame { + msec: 32 + hash: "2fd338490edda276f7ee16232bf244d1" + } + Frame { + msec: 48 + hash: "527a1c18503f580bcf926a70d9f30006" + } + Frame { + msec: 64 + hash: "8b911c3e4a0fccf1dbeca50931780a2d" + } + Frame { + msec: 80 + hash: "f631ad72bf36ccb0c5f3ff708f029b1b" + } + Frame { + msec: 96 + hash: "d4099e6a2c1ff77a71231351f5bc32ff" + } + Frame { + msec: 112 + hash: "0e531d158b1c14d6fc633e528846c336" + } + Frame { + msec: 128 + hash: "5721d3397b9e66da4ee47a7f19107566" + } + Frame { + msec: 144 + hash: "6647f5d3680f3523ec73b434d0c2f8da" + } + Frame { + msec: 160 + hash: "73fb40e680c30b1a5fe95de9913a0591" + } + Frame { + msec: 176 + hash: "c392c2599b29086a437afa292b06d63c" + } + Frame { + msec: 192 + hash: "bcedd42d52bab532831b47c6ee2a99ac" + } + Frame { + msec: 208 + hash: "089b150d5cc9315c6626edfc1bb66774" + } + Frame { + msec: 224 + hash: "f6e83fdb13e4f00ba5004b081e2379ee" + } + Frame { + msec: 240 + hash: "ca8336d47c002df3702a46be2b974ba7" + } + Frame { + msec: 256 + hash: "f0d82431f1e35f76fd718af1d742cd13" + } + Frame { + msec: 272 + hash: "78dc119673be7902ab25d508db771f04" + } + Frame { + msec: 288 + hash: "2839bc67b7ac43353b976c2c7bc3b6c3" + } + Frame { + msec: 304 + hash: "c1f9743c0505b6ca197c4bd0bbbd7bd3" + } + Frame { + msec: 320 + hash: "2d714b10ce1e3e7dd1efb58ed4b62f90" + } + Frame { + msec: 336 + hash: "c4f94bab5475eacfc757338ffd6d4a59" + } + Key { + type: 6 + key: 16777249 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 352 + hash: "c5caa8a08f09203c005e1cd6d80e8ccc" + } + Frame { + msec: 368 + hash: "c96896be1a311c0cedc1c7ec1bd9e13e" + } + Frame { + msec: 384 + hash: "d3d6dc1d8ff93e373583e3cbdca88b81" + } + Frame { + msec: 400 + hash: "2a456146359c54c52f9e7a6cebcfa454" + } + Frame { + msec: 416 + hash: "d127788c702c2ed037c709ffc331840e" + } + Frame { + msec: 432 + hash: "8a5987a736b092e12198d969544d632c" + } + Key { + type: 6 + key: 16777248 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 448 + hash: "e8471c605f6a8cc187d879510ed7ebe7" + } + Frame { + msec: 464 + hash: "6959b4f72422636ae59989c9def06d03" + } + Frame { + msec: 480 + hash: "87d666ee3bcf7a606e2aecb4954cfb28" + } + Frame { + msec: 496 + hash: "87d666ee3bcf7a606e2aecb4954cfb28" + } + Key { + type: 6 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 512 + hash: "45a1fa0c871592f872574fdcd3fb586c" + } + Frame { + msec: 528 + hash: "45a1fa0c871592f872574fdcd3fb586c" + } + Frame { + msec: 544 + hash: "45a1fa0c871592f872574fdcd3fb586c" + } + Frame { + msec: 560 + hash: "45a1fa0c871592f872574fdcd3fb586c" + } + Frame { + msec: 576 + hash: "8567bf3fb7adb990501070fac62fda31" + } + Frame { + msec: 592 + hash: "824b9fef000cfad45c86d180eb13c584" + } + Frame { + msec: 608 + hash: "cb8989a5839bf284f0e8b3eb1bf68667" + } + Frame { + msec: 624 + hash: "f23e6394ed3c2fc32c690095ccfc1a7f" + } + Key { + type: 7 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 640 + hash: "d32d30ebd0c292e66314f6b6005701b9" + } + Frame { + msec: 656 + hash: "4ebda51f84f73eb6891f9c71ffba4b92" + } + Frame { + msec: 672 + hash: "9a97e8cdb84e96f08f2af468d146fb45" + } + Key { + type: 6 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 688 + hash: "9cd5a0e60b7f679faba3dad78eac1ac3" + } + Frame { + msec: 704 + hash: "2e18ff4ebead28620901d4a9ad050ffe" + } + Frame { + msec: 720 + hash: "57a6a1bbfe4c4577e4334b63b977ca13" + } + Frame { + msec: 736 + hash: "5f5806c2b30465845ed2bc36f1c60e14" + } + Frame { + msec: 752 + hash: "10125c338dffa13dfd0bbff5fc33d757" + } + Frame { + msec: 768 + hash: "b6c83fdee9081a1773a441cffb843c11" + } + Frame { + msec: 784 + hash: "c26f3ac7cd2065b98434e3fb4bc7c4a7" + } + Key { + type: 7 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 800 + hash: "6cb47a37677280ef63b060767c669878" + } + Frame { + msec: 816 + hash: "7f27c84cd7ae3f255b0df6029e13c48d" + } + Frame { + msec: 832 + hash: "fec675b07b3f569014e9f35563761d49" + } + Frame { + msec: 848 + hash: "cfd2439d79ad66232107022317fd5a4c" + } + Frame { + msec: 864 + hash: "cec5331c1f6023335942e572992aa172" + } + Frame { + msec: 880 + hash: "549d4736558332a64c5fc3462be71500" + } + Frame { + msec: 896 + hash: "1d01fe566f850fe2297fd8ed6b1efa8d" + } + Frame { + msec: 912 + hash: "cd1b61c7acd7067f9722c1a673b9a3ea" + } + Frame { + msec: 928 + hash: "cb4fed177ff3df7212413450d4b73549" + } + Frame { + msec: 944 + hash: "720d0e5c3e377e2c53d251e02577d6f6" + } + Frame { + msec: 960 + hash: "1ab118400896a46a8d179b762343522f" + } + Frame { + msec: 976 + image: "cursorDelegate.1.png" + } + Frame { + msec: 992 + hash: "6cf8502f84b57001bf14fc4bab24911b" + } + Frame { + msec: 1008 + hash: "5aa693852436f664da87d4360da0f477" + } + Frame { + msec: 1024 + hash: "5aa693852436f664da87d4360da0f477" + } + Key { + type: 7 + key: 16777249 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1040 + hash: "6cf8502f84b57001bf14fc4bab24911b" + } + Frame { + msec: 1056 + hash: "17499b49e462181383fde57dce81aef9" + } + Frame { + msec: 1072 + hash: "1ab118400896a46a8d179b762343522f" + } + Frame { + msec: 1088 + hash: "720d0e5c3e377e2c53d251e02577d6f6" + } + Frame { + msec: 1104 + hash: "cb4fed177ff3df7212413450d4b73549" + } + Frame { + msec: 1120 + hash: "cd1b61c7acd7067f9722c1a673b9a3ea" + } + Frame { + msec: 1136 + hash: "1d01fe566f850fe2297fd8ed6b1efa8d" + } + Frame { + msec: 1152 + hash: "549d4736558332a64c5fc3462be71500" + } + Frame { + msec: 1168 + hash: "cec5331c1f6023335942e572992aa172" + } + Key { + type: 6 + key: 16777234 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1184 + hash: "a8af14ffccbd892f17c0235d62d10cd8" + } + Frame { + msec: 1200 + hash: "81fbaaf1af513b2dc978ef0e358bbc6f" + } + Frame { + msec: 1216 + hash: "204cfba6a668ba25ed37f12bfcdd97eb" + } + Frame { + msec: 1232 + hash: "fa6c8f7f8a8730d412168002511b82e6" + } + Frame { + msec: 1248 + hash: "0d491b55d03f5d5bb6cfce63bc98deae" + } + Frame { + msec: 1264 + hash: "0e4d3edabdf6e0faa366abcc3b0ef521" + } + Frame { + msec: 1280 + hash: "13f397452e74ef834662363b09b000b9" + } + Key { + type: 7 + key: 16777234 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1296 + hash: "bb064cac4cb117b4d28e26d04dd59d7c" + } + Frame { + msec: 1312 + hash: "dfab74915a3f1e82c558ba8fb26d81fc" + } + Frame { + msec: 1328 + hash: "7593cfb3073aa9d638c093e0f4c9857d" + } + Frame { + msec: 1344 + hash: "fe4a725dcc97b7f320225e02dc88d34a" + } + Frame { + msec: 1360 + hash: "67794fa0162684b2097164d6cd666f16" + } + Frame { + msec: 1376 + hash: "747cfcd428eb59ca99749de261e561d4" + } + Frame { + msec: 1392 + hash: "293fd7523f25e42d2acab401482a9af9" + } + Frame { + msec: 1408 + hash: "2644c937db0488c14f833a9e9f7d9cf6" + } + Frame { + msec: 1424 + hash: "d80500f7cce8d887d0c523060e4217af" + } + Frame { + msec: 1440 + hash: "96265a45f0f25d9c0cd1168789b50952" + } + Frame { + msec: 1456 + hash: "e862d11944ea38939faa5b24fa9183bf" + } + Frame { + msec: 1472 + hash: "946c778fcc8ee4942a30d4654e103fec" + } + Frame { + msec: 1488 + hash: "946c778fcc8ee4942a30d4654e103fec" + } + Frame { + msec: 1504 + hash: "946c778fcc8ee4942a30d4654e103fec" + } + Frame { + msec: 1520 + hash: "946c778fcc8ee4942a30d4654e103fec" + } + Frame { + msec: 1536 + hash: "946c778fcc8ee4942a30d4654e103fec" + } + Frame { + msec: 1552 + hash: "946c778fcc8ee4942a30d4654e103fec" + } + Frame { + msec: 1568 + hash: "99e0e3d965bea36001298815d12b4d4c" + } + Frame { + msec: 1584 + hash: "c552ace3096eca31d0fc256d2bd153e0" + } + Frame { + msec: 1600 + hash: "203858ff0fc145ac60942c2b8e67ca20" + } + Frame { + msec: 1616 + hash: "11ea7696ec3aa9a394cabd723bcada9e" + } + Frame { + msec: 1632 + hash: "e0e24c0527e015d0bb05206771024d04" + } + Frame { + msec: 1648 + hash: "995ccae48c4f0fc2ab40e793d074e78b" + } + Key { + type: 6 + key: 16777249 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1664 + hash: "cff7bee4ba1e8eb4c46e13f12f6059e1" + } + Frame { + msec: 1680 + hash: "e43bd84ba7bdc4ea0370c79bfa7667bd" + } + Frame { + msec: 1696 + hash: "b7dd97abf895eaea20836833f959f0c6" + } + Frame { + msec: 1712 + hash: "b724e9874f0df5ed4ad9bdedbc4c45c9" + } + Frame { + msec: 1728 + hash: "69d9d28793e65aa9a1829d07cc035e4d" + } + Frame { + msec: 1744 + hash: "689fc2cf5feb1084fceda93eab9b7aac" + } + Frame { + msec: 1760 + hash: "2bcc0f2fb8cccf7904c982cd60d3fefb" + } + Frame { + msec: 1776 + hash: "d55a868304da7e9af57cd775f2c283c1" + } + Key { + type: 6 + key: 16777234 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1792 + hash: "b2591af5120258c99e84f31311396675" + } + Frame { + msec: 1808 + hash: "4f9908bdbad583a6a956a21d6ab05505" + } + Frame { + msec: 1824 + hash: "dd1c43a94dcabae975f0dba67c2742da" + } + Frame { + msec: 1840 + hash: "f9b8c8987bad613fe23fcf9d5fe995b8" + } + Frame { + msec: 1856 + hash: "9bd4431207a85e0effefb9cf36a2651b" + } + Frame { + msec: 1872 + hash: "cd7c4c097231797649f2d24a729e3587" + } + Frame { + msec: 1888 + hash: "f2ac503f2aab55df922f90a6b9baeb0f" + } + Frame { + msec: 1904 + hash: "f356c05f9445c2fb260a29a58431269c" + } + Key { + type: 7 + key: 16777234 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1920 + hash: "5580f8c543d67378b0f54117070f69bd" + } + Frame { + msec: 1936 + image: "cursorDelegate.2.png" + } + Frame { + msec: 1952 + hash: "634c5597e64c34b039c70f614f0100e1" + } + Frame { + msec: 1968 + hash: "7f0bde32846ae8172cfd02f38d34dc48" + } + Frame { + msec: 1984 + hash: "bc9092f889ffd6a6682ed9754c6697a2" + } + Frame { + msec: 2000 + hash: "3ef935e3a4a0d409af7dd38f2433cdfe" + } + Frame { + msec: 2016 + hash: "2a044024b38499e801810a19d313e01f" + } + Frame { + msec: 2032 + hash: "3ef935e3a4a0d409af7dd38f2433cdfe" + } + Frame { + msec: 2048 + hash: "bc9092f889ffd6a6682ed9754c6697a2" + } + Frame { + msec: 2064 + hash: "7f0bde32846ae8172cfd02f38d34dc48" + } + Frame { + msec: 2080 + hash: "634c5597e64c34b039c70f614f0100e1" + } + Frame { + msec: 2096 + hash: "80f3bf6ea745da047da936578b87ee00" + } + Frame { + msec: 2112 + hash: "5580f8c543d67378b0f54117070f69bd" + } + Frame { + msec: 2128 + hash: "f356c05f9445c2fb260a29a58431269c" + } + Frame { + msec: 2144 + hash: "f2ac503f2aab55df922f90a6b9baeb0f" + } + Frame { + msec: 2160 + hash: "cd7c4c097231797649f2d24a729e3587" + } + Frame { + msec: 2176 + hash: "9bd4431207a85e0effefb9cf36a2651b" + } + Frame { + msec: 2192 + hash: "f9b8c8987bad613fe23fcf9d5fe995b8" + } + Frame { + msec: 2208 + hash: "dd1c43a94dcabae975f0dba67c2742da" + } + Frame { + msec: 2224 + hash: "4f9908bdbad583a6a956a21d6ab05505" + } + Key { + type: 7 + key: 16777248 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2240 + hash: "b2591af5120258c99e84f31311396675" + } + Frame { + msec: 2256 + hash: "5c40e466b5af2e4b67dbb4ea96b24146" + } + Frame { + msec: 2272 + hash: "899a30ca4014231c8e9f15be4e0c3ee6" + } + Frame { + msec: 2288 + hash: "a44bbb13a336fdd4aedaf4c5c6ee399a" + } + Frame { + msec: 2304 + hash: "3b1b3e228ccbd61f9dfb896391da0b5b" + } + Frame { + msec: 2320 + hash: "22f5ec3d2eda574d1976604b82307924" + } + Frame { + msec: 2336 + hash: "9e63d1a15c954d2960eecf54e5eeb172" + } + Frame { + msec: 2352 + hash: "64ce03b10500b5a98b5c826362d8140e" + } + Key { + type: 6 + key: 16777234 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2368 + hash: "c96896be1a311c0cedc1c7ec1bd9e13e" + } + Frame { + msec: 2384 + hash: "d3d6dc1d8ff93e373583e3cbdca88b81" + } + Frame { + msec: 2400 + hash: "2a456146359c54c52f9e7a6cebcfa454" + } + Frame { + msec: 2416 + hash: "d127788c702c2ed037c709ffc331840e" + } + Frame { + msec: 2432 + hash: "8a5987a736b092e12198d969544d632c" + } + Frame { + msec: 2448 + hash: "e8471c605f6a8cc187d879510ed7ebe7" + } + Frame { + msec: 2464 + hash: "6959b4f72422636ae59989c9def06d03" + } + Frame { + msec: 2480 + hash: "87d666ee3bcf7a606e2aecb4954cfb28" + } + Key { + type: 7 + key: 16777234 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2496 + hash: "87d666ee3bcf7a606e2aecb4954cfb28" + } + Frame { + msec: 2512 + hash: "87d666ee3bcf7a606e2aecb4954cfb28" + } + Frame { + msec: 2528 + hash: "87d666ee3bcf7a606e2aecb4954cfb28" + } + Frame { + msec: 2544 + hash: "87d666ee3bcf7a606e2aecb4954cfb28" + } + Frame { + msec: 2560 + hash: "87d666ee3bcf7a606e2aecb4954cfb28" + } + Frame { + msec: 2576 + hash: "aa52467f87fbd766baa5137ddf18e0f6" + } + Frame { + msec: 2592 + hash: "bc9549a04b9bc898feda61b7fce45b3f" + } + Frame { + msec: 2608 + hash: "606e69ad9b6e3a82e08ae4bbabb34680" + } + Frame { + msec: 2624 + hash: "257ed9eae13221c5d47103043ef4ad5c" + } + Frame { + msec: 2640 + hash: "f5b44d257447499e0268e9a8730d88e7" + } + Frame { + msec: 2656 + hash: "8f03a92b2b0b04ee0ac45e7631df78ce" + } + Frame { + msec: 2672 + hash: "054e88b3d80940006b24fdf233a70682" + } + Frame { + msec: 2688 + hash: "20896fbba7e1970957ff20d33541730c" + } + Frame { + msec: 2704 + hash: "238fca62069b7c6e1b6919afca518dbe" + } + Frame { + msec: 2720 + hash: "764e14ba052d8340d6d674d6f417643d" + } + Frame { + msec: 2736 + hash: "278fb36637ff60d1949da9e9b887726f" + } + Frame { + msec: 2752 + hash: "f51251c5ec7b0071248d3fa5db1c12fd" + } + Frame { + msec: 2768 + hash: "785d38e036e7dd809037de3885067455" + } + Frame { + msec: 2784 + hash: "4291bb6217f363aab48812359626de36" + } + Frame { + msec: 2800 + hash: "e139ad6787f1c4a1b89d4030703076e5" + } + Frame { + msec: 2816 + hash: "4c23976fb1b3b583153cbd72f2db10f4" + } + Frame { + msec: 2832 + hash: "5e0a3d848a749ecd4f9a572f10664f4b" + } + Frame { + msec: 2848 + hash: "1acc382cfe2f5872982440e8a85eb57b" + } + Key { + type: 6 + key: 16777236 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2864 + hash: "eba94c6ae3dc4eb26c8d074137c7aa0f" + } + Frame { + msec: 2880 + hash: "7c75307fbb765bd69b888d500247b595" + } + Frame { + msec: 2896 + image: "cursorDelegate.3.png" + } + Frame { + msec: 2912 + hash: "da73d23a925d93194aeb64d1522adc02" + } + Frame { + msec: 2928 + hash: "d661872854338121d867b35d9e44ae6d" + } + Frame { + msec: 2944 + hash: "969b5cf20c7c4e18723a8b8a70ea68ec" + } + Frame { + msec: 2960 + hash: "c7318ea4b4a4ac49308bef41d3bc264d" + } + Frame { + msec: 2976 + hash: "dd6bd11cc0bc877dbd70c55d4f5bab29" + } + Key { + type: 7 + key: 16777236 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2992 + hash: "21905ed4264a52c9b404149abedabe33" + } + Frame { + msec: 3008 + hash: "e952374e5967619679af711157b561cd" + } + Frame { + msec: 3024 + hash: "e952374e5967619679af711157b561cd" + } + Frame { + msec: 3040 + hash: "21905ed4264a52c9b404149abedabe33" + } + Frame { + msec: 3056 + hash: "dd6bd11cc0bc877dbd70c55d4f5bab29" + } + Frame { + msec: 3072 + hash: "c7318ea4b4a4ac49308bef41d3bc264d" + } + Frame { + msec: 3088 + hash: "969b5cf20c7c4e18723a8b8a70ea68ec" + } + Frame { + msec: 3104 + hash: "d661872854338121d867b35d9e44ae6d" + } + Frame { + msec: 3120 + hash: "da73d23a925d93194aeb64d1522adc02" + } + Frame { + msec: 3136 + hash: "2c0261e2223d7212e047dd4af6246a8f" + } + Frame { + msec: 3152 + hash: "7c75307fbb765bd69b888d500247b595" + } + Frame { + msec: 3168 + hash: "eba94c6ae3dc4eb26c8d074137c7aa0f" + } + Frame { + msec: 3184 + hash: "e6eaa9959334f24ef3cf68d44d7340f1" + } + Frame { + msec: 3200 + hash: "3adb8604d872bc8ff5498841c6da71b5" + } + Frame { + msec: 3216 + hash: "e602eeaac3ce53033154297e73802c02" + } + Key { + type: 6 + key: 16777236 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3232 + hash: "85afa80a1c333674cfbfcc38cedc798d" + } + Frame { + msec: 3248 + hash: "72679887fb26b7eb2553d6e554e26679" + } + Frame { + msec: 3264 + hash: "d25f21361d9cea41b17277f1ffecac62" + } + Frame { + msec: 3280 + hash: "24db38727e1a58d515119181ea41e209" + } + Frame { + msec: 3296 + hash: "e7ddd84f438fd2d463a3b9552dad345a" + } + Frame { + msec: 3312 + hash: "621e406f5b9204eb5d82c4f66fdf6a61" + } + Frame { + msec: 3328 + hash: "2a8befe073dda8589197cf05eeeaaf59" + } + Key { + type: 7 + key: 16777236 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3344 + hash: "104f0e21a041236f48dab6fe2c1c5aa1" + } + Frame { + msec: 3360 + hash: "0f8f74614b0b7295bb9df8fa0b1f6877" + } + Frame { + msec: 3376 + hash: "3a3cc6cfd3200e06a2816f2746edf699" + } + Frame { + msec: 3392 + hash: "83032d1da6907ebe1ab9fddf314d0bc1" + } + Frame { + msec: 3408 + hash: "b93878281f21c85c211908086f2899e7" + } + Frame { + msec: 3424 + hash: "a554a6ecd96f37f114f1fd616e0aeab2" + } + Frame { + msec: 3440 + hash: "8943d47912a4206e61836d99cca835da" + } + Frame { + msec: 3456 + hash: "4d06d264f71d75421c9a6d5a87d6a9ba" + } + Frame { + msec: 3472 + hash: "87d666ee3bcf7a606e2aecb4954cfb28" + } + Frame { + msec: 3488 + hash: "87d666ee3bcf7a606e2aecb4954cfb28" + } + Frame { + msec: 3504 + hash: "87d666ee3bcf7a606e2aecb4954cfb28" + } + Frame { + msec: 3520 + hash: "87d666ee3bcf7a606e2aecb4954cfb28" + } + Frame { + msec: 3536 + hash: "87d666ee3bcf7a606e2aecb4954cfb28" + } + Frame { + msec: 3552 + hash: "87d666ee3bcf7a606e2aecb4954cfb28" + } + Frame { + msec: 3568 + hash: "ca17401d638025fde8aad18b9a358029" + } + Frame { + msec: 3584 + hash: "3542537f0b0e1375d81c7f0365bbdf1d" + } + Frame { + msec: 3600 + hash: "235b68812a3cb48fc09bd8319aef40f1" + } + Frame { + msec: 3616 + hash: "3aa88f646534068d13e9c4f23af52019" + } + Frame { + msec: 3632 + hash: "8f037bdef4940fdb1936900ad5aee36e" + } + Frame { + msec: 3648 + hash: "18e8239c50ca62a5bd96d983ab5ff46d" + } + Frame { + msec: 3664 + hash: "d62f6887bdad9decb48ebaf63a6330a3" + } + Frame { + msec: 3680 + hash: "0af7997ec1a755a761fc1ab47ef30137" + } + Frame { + msec: 3696 + hash: "b3a384f93ef5f36466f0a638182b66cb" + } + Frame { + msec: 3712 + hash: "fceb3ee105028e29dca001197c63e524" + } + Frame { + msec: 3728 + hash: "5c16dc7aee02eefa95d0c6211f81ba48" + } + Key { + type: 6 + key: 16777234 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3744 + hash: "e4c3193ad0885084becbeaaaa899fff4" + } + Frame { + msec: 3760 + hash: "84afa9118845126960309537e529ea74" + } + Frame { + msec: 3776 + hash: "6e18f95c4252aff3ee5447a08153ee53" + } + Frame { + msec: 3792 + hash: "59facabe2430703113665d0153402472" + } + Frame { + msec: 3808 + hash: "316bce2e605a4df04d41a4f7620086bd" + } + Frame { + msec: 3824 + hash: "7dcba8f0dd9fd67518f0502d904624fd" + } + Frame { + msec: 3840 + hash: "cb9166d113c5c7495916f6b7f850407c" + } + Key { + type: 7 + key: 16777234 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3856 + image: "cursorDelegate.4.png" + } + Frame { + msec: 3872 + hash: "7cc78c7ab5820a698b62c452dfc0d1db" + } + Frame { + msec: 3888 + hash: "5f068715dc1244895e6e09afd6e846a9" + } + Frame { + msec: 3904 + hash: "c279e7293539593bfc8250d37f78791c" + } + Frame { + msec: 3920 + hash: "d01ff855befa456a213d4f78f22fe46c" + } + Frame { + msec: 3936 + hash: "16e20d2e663e64daa1920b165604f342" + } + Frame { + msec: 3952 + hash: "2feebd6865e71afd30c73e342fb2cab1" + } + Frame { + msec: 3968 + hash: "8c417cb9ef300c895323060ceb860bd9" + } + Frame { + msec: 3984 + hash: "05903a78cad8d331349f93a1cea75d7d" + } + Frame { + msec: 4000 + hash: "e142bb264ab7877a9b40596d497ea2c1" + } + Frame { + msec: 4016 + hash: "717e5e965b9ff188fd9200927968d359" + } + Frame { + msec: 4032 + hash: "e142bb264ab7877a9b40596d497ea2c1" + } + Frame { + msec: 4048 + hash: "05903a78cad8d331349f93a1cea75d7d" + } + Frame { + msec: 4064 + hash: "8c417cb9ef300c895323060ceb860bd9" + } + Key { + type: 7 + key: 16777249 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 4080 + hash: "2feebd6865e71afd30c73e342fb2cab1" + } + Frame { + msec: 4096 + hash: "16e20d2e663e64daa1920b165604f342" + } + Frame { + msec: 4112 + hash: "d01ff855befa456a213d4f78f22fe46c" + } + Frame { + msec: 4128 + hash: "c279e7293539593bfc8250d37f78791c" + } + Frame { + msec: 4144 + hash: "5f068715dc1244895e6e09afd6e846a9" + } + Frame { + msec: 4160 + hash: "7cc78c7ab5820a698b62c452dfc0d1db" + } + Frame { + msec: 4176 + hash: "194b8b8843cf8a7d90ec910ee4021d9c" + } + Frame { + msec: 4192 + hash: "cb9166d113c5c7495916f6b7f850407c" + } + Frame { + msec: 4208 + hash: "7dcba8f0dd9fd67518f0502d904624fd" + } + Frame { + msec: 4224 + hash: "316bce2e605a4df04d41a4f7620086bd" + } + Frame { + msec: 4240 + hash: "59facabe2430703113665d0153402472" + } + Frame { + msec: 4256 + hash: "6e18f95c4252aff3ee5447a08153ee53" + } + Frame { + msec: 4272 + hash: "84afa9118845126960309537e529ea74" + } + Frame { + msec: 4288 + hash: "e4c3193ad0885084becbeaaaa899fff4" + } + Frame { + msec: 4304 + hash: "6a7b8f8ae1959681afc7e76c242ddf63" + } + Frame { + msec: 4320 + hash: "94457c4fd09b63fe9df738af422a3716" + } + Frame { + msec: 4336 + hash: "29189dea05961b2ed7d525b17bc99513" + } + Frame { + msec: 4352 + hash: "11fc3e52587bbedf0016c829d2d849d1" + } + Frame { + msec: 4368 + hash: "57178e2a3d404d4301ee89a6202ad7cc" + } + Frame { + msec: 4384 + hash: "151778e9dd76fbf6d9e98b86469ec01e" + } + Frame { + msec: 4400 + hash: "bfab5d3f368c06f2ef5e22b7e16090ad" + } + Frame { + msec: 4416 + hash: "ef29b8ff8fcf221368056aa249f706a1" + } + Frame { + msec: 4432 + hash: "cd14458426f94efbbc729112e6a481c5" + } + Frame { + msec: 4448 + hash: "cbafbb1c359a0c0e7182c4449d04b052" + } + Frame { + msec: 4464 + hash: "b56e3f531bb6b3f2c62a6972910038b3" + } + Frame { + msec: 4480 + hash: "87d666ee3bcf7a606e2aecb4954cfb28" + } + Frame { + msec: 4496 + hash: "87d666ee3bcf7a606e2aecb4954cfb28" + } + Frame { + msec: 4512 + hash: "87d666ee3bcf7a606e2aecb4954cfb28" + } + Frame { + msec: 4528 + hash: "87d666ee3bcf7a606e2aecb4954cfb28" + } + Frame { + msec: 4544 + hash: "87d666ee3bcf7a606e2aecb4954cfb28" + } + Frame { + msec: 4560 + hash: "87d666ee3bcf7a606e2aecb4954cfb28" + } + Frame { + msec: 4576 + hash: "3d6db6e3ee77ee75341ce16dc4a56c59" + } + Frame { + msec: 4592 + hash: "ff43ccdb14ae4d12ffead2eb261a5056" + } + Frame { + msec: 4608 + hash: "fb73ac1e61834f2f0263e53a3c00a857" + } + Frame { + msec: 4624 + hash: "6bd66d118ff27b0cea7944ea22c727c9" + } + Frame { + msec: 4640 + hash: "0b474aa5492386c319bf72280dae7896" + } + Frame { + msec: 4656 + hash: "81952cf37f0965a603bf06a05ef610fa" + } + Frame { + msec: 4672 + hash: "ad7606f147498c755284d111a1af7710" + } + Frame { + msec: 4688 + hash: "144abb4208f9cc4f823e0d4abb3207d8" + } + Frame { + msec: 4704 + hash: "0b4f3fafaf262f16e887938eda9624a3" + } + Frame { + msec: 4720 + hash: "e729d3fde3db0f72b1080c7dc2eded1a" + } + Frame { + msec: 4736 + hash: "36ffc8e16ebcb9c4499c4ff037b8b293" + } + Frame { + msec: 4752 + hash: "c49853a23d2e8b966836888acce19ecc" + } + Frame { + msec: 4768 + hash: "3873af5aa871bdb1d4f538333b11cf33" + } + Frame { + msec: 4784 + hash: "6d02efe848b27b3e221a8332099fb83f" + } + Frame { + msec: 4800 + hash: "2f08f365916d892f0789e93b674cb41b" + } + Frame { + msec: 4816 + image: "cursorDelegate.5.png" + } + Frame { + msec: 4832 + hash: "3adb8604d872bc8ff5498841c6da71b5" + } + Frame { + msec: 4848 + hash: "e6eaa9959334f24ef3cf68d44d7340f1" + } + Frame { + msec: 4864 + hash: "eba94c6ae3dc4eb26c8d074137c7aa0f" + } + Frame { + msec: 4880 + hash: "7c75307fbb765bd69b888d500247b595" + } + Frame { + msec: 4896 + hash: "2c0261e2223d7212e047dd4af6246a8f" + } + Frame { + msec: 4912 + hash: "da73d23a925d93194aeb64d1522adc02" + } + Frame { + msec: 4928 + hash: "d661872854338121d867b35d9e44ae6d" + } + Frame { + msec: 4944 + hash: "969b5cf20c7c4e18723a8b8a70ea68ec" + } + Frame { + msec: 4960 + hash: "c7318ea4b4a4ac49308bef41d3bc264d" + } + Frame { + msec: 4976 + hash: "dd6bd11cc0bc877dbd70c55d4f5bab29" + } + Frame { + msec: 4992 + hash: "21905ed4264a52c9b404149abedabe33" + } + Frame { + msec: 5008 + hash: "e952374e5967619679af711157b561cd" + } + Frame { + msec: 5024 + hash: "e952374e5967619679af711157b561cd" + } + Frame { + msec: 5040 + hash: "21905ed4264a52c9b404149abedabe33" + } + Frame { + msec: 5056 + hash: "dd6bd11cc0bc877dbd70c55d4f5bab29" + } + Frame { + msec: 5072 + hash: "c7318ea4b4a4ac49308bef41d3bc264d" + } + Frame { + msec: 5088 + hash: "969b5cf20c7c4e18723a8b8a70ea68ec" + } + Frame { + msec: 5104 + hash: "d661872854338121d867b35d9e44ae6d" + } + Frame { + msec: 5120 + hash: "da73d23a925d93194aeb64d1522adc02" + } + Frame { + msec: 5136 + hash: "2c0261e2223d7212e047dd4af6246a8f" + } + Frame { + msec: 5152 + hash: "7c75307fbb765bd69b888d500247b595" + } + Frame { + msec: 5168 + hash: "eba94c6ae3dc4eb26c8d074137c7aa0f" + } + Frame { + msec: 5184 + hash: "e6eaa9959334f24ef3cf68d44d7340f1" + } + Frame { + msec: 5200 + hash: "3adb8604d872bc8ff5498841c6da71b5" + } + Frame { + msec: 5216 + hash: "e602eeaac3ce53033154297e73802c02" + } + Frame { + msec: 5232 + hash: "2f08f365916d892f0789e93b674cb41b" + } + Frame { + msec: 5248 + hash: "6d02efe848b27b3e221a8332099fb83f" + } + Frame { + msec: 5264 + hash: "3873af5aa871bdb1d4f538333b11cf33" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/linkActivated.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/linkActivated.0.png new file mode 100644 index 00000000..7d0d0aee Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/linkActivated.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/linkActivated.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/linkActivated.1.png new file mode 100644 index 00000000..7d612bf2 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/linkActivated.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/linkActivated.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/linkActivated.qml new file mode 100644 index 00000000..8c7e3808 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/linkActivated.qml @@ -0,0 +1,191 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "linkActivated.0.png" + } + Frame { + msec: 32 + hash: "53d97d0966197ea41364511dea13752f" + } + Frame { + msec: 48 + hash: "53d97d0966197ea41364511dea13752f" + } + Frame { + msec: 64 + hash: "53d97d0966197ea41364511dea13752f" + } + Frame { + msec: 80 + hash: "53d97d0966197ea41364511dea13752f" + } + Frame { + msec: 96 + hash: "53d97d0966197ea41364511dea13752f" + } + Frame { + msec: 112 + hash: "53d97d0966197ea41364511dea13752f" + } + Frame { + msec: 128 + hash: "53d97d0966197ea41364511dea13752f" + } + Frame { + msec: 144 + hash: "53d97d0966197ea41364511dea13752f" + } + Frame { + msec: 160 + hash: "53d97d0966197ea41364511dea13752f" + } + Frame { + msec: 176 + hash: "53d97d0966197ea41364511dea13752f" + } + Frame { + msec: 192 + hash: "53d97d0966197ea41364511dea13752f" + } + Frame { + msec: 208 + hash: "53d97d0966197ea41364511dea13752f" + } + Frame { + msec: 224 + hash: "53d97d0966197ea41364511dea13752f" + } + Frame { + msec: 240 + hash: "53d97d0966197ea41364511dea13752f" + } + Frame { + msec: 256 + hash: "53d97d0966197ea41364511dea13752f" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 21; y: 13 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 272 + hash: "9482227cbc77e9083218c1452e8644d8" + } + Frame { + msec: 288 + hash: "9482227cbc77e9083218c1452e8644d8" + } + Frame { + msec: 304 + hash: "9482227cbc77e9083218c1452e8644d8" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 22; y: 11 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 320 + hash: "9482227cbc77e9083218c1452e8644d8" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 23; y: 10 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 23; y: 10 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 336 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } + Frame { + msec: 352 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } + Frame { + msec: 368 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } + Frame { + msec: 384 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } + Frame { + msec: 400 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } + Frame { + msec: 416 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } + Frame { + msec: 432 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } + Frame { + msec: 448 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } + Frame { + msec: 464 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } + Frame { + msec: 480 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } + Frame { + msec: 496 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } + Frame { + msec: 512 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } + Frame { + msec: 528 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } + Frame { + msec: 544 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } + Frame { + msec: 560 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } + Frame { + msec: 576 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } + Frame { + msec: 592 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } + Frame { + msec: 608 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.0.png new file mode 100644 index 00000000..59fc0fc4 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.1.png new file mode 100644 index 00000000..2747b508 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.2.png new file mode 100644 index 00000000..74efe73b Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.3.png new file mode 100644 index 00000000..02f6e17b Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.4.png new file mode 100644 index 00000000..59fc0fc4 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.qml new file mode 100644 index 00000000..a4ba005c --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/qt-669.qml @@ -0,0 +1,1371 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "qt-669.0.png" + } + Frame { + msec: 32 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 48 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 64 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 80 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 96 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 112 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 128 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 144 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 160 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 176 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 192 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 208 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 224 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 240 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 256 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 272 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 288 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 304 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 320 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 336 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 352 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 368 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 384 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 400 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 416 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 432 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 448 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 464 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 480 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 496 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 512 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 528 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 544 + hash: "53f9d63bacad27fd73c2f84b82599dbc" + } + Frame { + msec: 560 + hash: "53f9d63bacad27fd73c2f84b82599dbc" + } + Frame { + msec: 576 + hash: "53f9d63bacad27fd73c2f84b82599dbc" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 592 + hash: "53f9d63bacad27fd73c2f84b82599dbc" + } + Frame { + msec: 608 + hash: "53f9d63bacad27fd73c2f84b82599dbc" + } + Frame { + msec: 624 + hash: "53f9d63bacad27fd73c2f84b82599dbc" + } + Frame { + msec: 640 + hash: "53f9d63bacad27fd73c2f84b82599dbc" + } + Frame { + msec: 656 + hash: "53f9d63bacad27fd73c2f84b82599dbc" + } + Frame { + msec: 672 + hash: "53f9d63bacad27fd73c2f84b82599dbc" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 688 + hash: "b069c174a1b9589ed3137cd01f870b17" + } + Frame { + msec: 704 + hash: "b069c174a1b9589ed3137cd01f870b17" + } + Frame { + msec: 720 + hash: "b069c174a1b9589ed3137cd01f870b17" + } + Frame { + msec: 736 + hash: "b069c174a1b9589ed3137cd01f870b17" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 752 + hash: "b069c174a1b9589ed3137cd01f870b17" + } + Frame { + msec: 768 + hash: "b069c174a1b9589ed3137cd01f870b17" + } + Frame { + msec: 784 + hash: "b069c174a1b9589ed3137cd01f870b17" + } + Frame { + msec: 800 + hash: "b069c174a1b9589ed3137cd01f870b17" + } + Frame { + msec: 816 + hash: "b069c174a1b9589ed3137cd01f870b17" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 832 + hash: "fa22742b8778a3b63ce7d6699dbf7482" + } + Frame { + msec: 848 + hash: "fa22742b8778a3b63ce7d6699dbf7482" + } + Frame { + msec: 864 + hash: "fa22742b8778a3b63ce7d6699dbf7482" + } + Frame { + msec: 880 + hash: "fa22742b8778a3b63ce7d6699dbf7482" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 896 + hash: "fa22742b8778a3b63ce7d6699dbf7482" + } + Frame { + msec: 912 + hash: "fa22742b8778a3b63ce7d6699dbf7482" + } + Frame { + msec: 928 + hash: "fa22742b8778a3b63ce7d6699dbf7482" + } + Frame { + msec: 944 + hash: "fa22742b8778a3b63ce7d6699dbf7482" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 960 + hash: "3624b85c9362dfeff911cd5426f11ada" + } + Frame { + msec: 976 + image: "qt-669.1.png" + } + Frame { + msec: 992 + hash: "3624b85c9362dfeff911cd5426f11ada" + } + Frame { + msec: 1008 + hash: "3624b85c9362dfeff911cd5426f11ada" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1024 + hash: "3624b85c9362dfeff911cd5426f11ada" + } + Frame { + msec: 1040 + hash: "3624b85c9362dfeff911cd5426f11ada" + } + Frame { + msec: 1056 + hash: "3624b85c9362dfeff911cd5426f11ada" + } + Frame { + msec: 1072 + hash: "3624b85c9362dfeff911cd5426f11ada" + } + Frame { + msec: 1088 + hash: "3624b85c9362dfeff911cd5426f11ada" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1104 + hash: "c8b5e39f4930399527236905cdbcb546" + } + Frame { + msec: 1120 + hash: "c8b5e39f4930399527236905cdbcb546" + } + Frame { + msec: 1136 + hash: "c8b5e39f4930399527236905cdbcb546" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1152 + hash: "c8b5e39f4930399527236905cdbcb546" + } + Frame { + msec: 1168 + hash: "c8b5e39f4930399527236905cdbcb546" + } + Frame { + msec: 1184 + hash: "c8b5e39f4930399527236905cdbcb546" + } + Frame { + msec: 1200 + hash: "c8b5e39f4930399527236905cdbcb546" + } + Frame { + msec: 1216 + hash: "c8b5e39f4930399527236905cdbcb546" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1232 + hash: "b80db720c6371aeaf99f4787fec2c5a3" + } + Frame { + msec: 1248 + hash: "b80db720c6371aeaf99f4787fec2c5a3" + } + Frame { + msec: 1264 + hash: "b80db720c6371aeaf99f4787fec2c5a3" + } + Frame { + msec: 1280 + hash: "b80db720c6371aeaf99f4787fec2c5a3" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1296 + hash: "b80db720c6371aeaf99f4787fec2c5a3" + } + Frame { + msec: 1312 + hash: "b80db720c6371aeaf99f4787fec2c5a3" + } + Frame { + msec: 1328 + hash: "b80db720c6371aeaf99f4787fec2c5a3" + } + Frame { + msec: 1344 + hash: "b80db720c6371aeaf99f4787fec2c5a3" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1360 + hash: "6f08f7b6337d5ebb305579bb71ba31d8" + } + Frame { + msec: 1376 + hash: "6f08f7b6337d5ebb305579bb71ba31d8" + } + Frame { + msec: 1392 + hash: "6f08f7b6337d5ebb305579bb71ba31d8" + } + Frame { + msec: 1408 + hash: "6f08f7b6337d5ebb305579bb71ba31d8" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1424 + hash: "6f08f7b6337d5ebb305579bb71ba31d8" + } + Frame { + msec: 1440 + hash: "6f08f7b6337d5ebb305579bb71ba31d8" + } + Frame { + msec: 1456 + hash: "6f08f7b6337d5ebb305579bb71ba31d8" + } + Frame { + msec: 1472 + hash: "6f08f7b6337d5ebb305579bb71ba31d8" + } + Frame { + msec: 1488 + hash: "6f08f7b6337d5ebb305579bb71ba31d8" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1504 + hash: "da047993eb77afffee6b8f0f210ca2d6" + } + Frame { + msec: 1520 + hash: "da047993eb77afffee6b8f0f210ca2d6" + } + Frame { + msec: 1536 + hash: "da047993eb77afffee6b8f0f210ca2d6" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1552 + hash: "da047993eb77afffee6b8f0f210ca2d6" + } + Frame { + msec: 1568 + hash: "da047993eb77afffee6b8f0f210ca2d6" + } + Frame { + msec: 1584 + hash: "da047993eb77afffee6b8f0f210ca2d6" + } + Frame { + msec: 1600 + hash: "da047993eb77afffee6b8f0f210ca2d6" + } + Frame { + msec: 1616 + hash: "da047993eb77afffee6b8f0f210ca2d6" + } + Frame { + msec: 1632 + hash: "da047993eb77afffee6b8f0f210ca2d6" + } + Frame { + msec: 1648 + hash: "da047993eb77afffee6b8f0f210ca2d6" + } + Frame { + msec: 1664 + hash: "da047993eb77afffee6b8f0f210ca2d6" + } + Frame { + msec: 1680 + hash: "da047993eb77afffee6b8f0f210ca2d6" + } + Frame { + msec: 1696 + hash: "da047993eb77afffee6b8f0f210ca2d6" + } + Frame { + msec: 1712 + hash: "da047993eb77afffee6b8f0f210ca2d6" + } + Frame { + msec: 1728 + hash: "da047993eb77afffee6b8f0f210ca2d6" + } + Frame { + msec: 1744 + hash: "da047993eb77afffee6b8f0f210ca2d6" + } + Frame { + msec: 1760 + hash: "da047993eb77afffee6b8f0f210ca2d6" + } + Frame { + msec: 1776 + hash: "da047993eb77afffee6b8f0f210ca2d6" + } + Frame { + msec: 1792 + hash: "da047993eb77afffee6b8f0f210ca2d6" + } + Frame { + msec: 1808 + hash: "da047993eb77afffee6b8f0f210ca2d6" + } + Frame { + msec: 1824 + hash: "da047993eb77afffee6b8f0f210ca2d6" + } + Frame { + msec: 1840 + hash: "da047993eb77afffee6b8f0f210ca2d6" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1856 + hash: "6f08f7b6337d5ebb305579bb71ba31d8" + } + Frame { + msec: 1872 + hash: "6f08f7b6337d5ebb305579bb71ba31d8" + } + Frame { + msec: 1888 + hash: "6f08f7b6337d5ebb305579bb71ba31d8" + } + Frame { + msec: 1904 + hash: "6f08f7b6337d5ebb305579bb71ba31d8" + } + Frame { + msec: 1920 + hash: "6f08f7b6337d5ebb305579bb71ba31d8" + } + Frame { + msec: 1936 + image: "qt-669.2.png" + } + Frame { + msec: 1952 + hash: "6f08f7b6337d5ebb305579bb71ba31d8" + } + Frame { + msec: 1968 + hash: "6f08f7b6337d5ebb305579bb71ba31d8" + } + Frame { + msec: 1984 + hash: "6f08f7b6337d5ebb305579bb71ba31d8" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2000 + hash: "6f08f7b6337d5ebb305579bb71ba31d8" + } + Frame { + msec: 2016 + hash: "6f08f7b6337d5ebb305579bb71ba31d8" + } + Frame { + msec: 2032 + hash: "6f08f7b6337d5ebb305579bb71ba31d8" + } + Frame { + msec: 2048 + hash: "6f08f7b6337d5ebb305579bb71ba31d8" + } + Frame { + msec: 2064 + hash: "6f08f7b6337d5ebb305579bb71ba31d8" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2080 + hash: "b80db720c6371aeaf99f4787fec2c5a3" + } + Frame { + msec: 2096 + hash: "b80db720c6371aeaf99f4787fec2c5a3" + } + Frame { + msec: 2112 + hash: "b80db720c6371aeaf99f4787fec2c5a3" + } + Frame { + msec: 2128 + hash: "b80db720c6371aeaf99f4787fec2c5a3" + } + Frame { + msec: 2144 + hash: "b80db720c6371aeaf99f4787fec2c5a3" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2160 + hash: "b80db720c6371aeaf99f4787fec2c5a3" + } + Frame { + msec: 2176 + hash: "b80db720c6371aeaf99f4787fec2c5a3" + } + Frame { + msec: 2192 + hash: "b80db720c6371aeaf99f4787fec2c5a3" + } + Frame { + msec: 2208 + hash: "b80db720c6371aeaf99f4787fec2c5a3" + } + Frame { + msec: 2224 + hash: "b80db720c6371aeaf99f4787fec2c5a3" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2240 + hash: "c8b5e39f4930399527236905cdbcb546" + } + Frame { + msec: 2256 + hash: "c8b5e39f4930399527236905cdbcb546" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2272 + hash: "c8b5e39f4930399527236905cdbcb546" + } + Frame { + msec: 2288 + hash: "c8b5e39f4930399527236905cdbcb546" + } + Frame { + msec: 2304 + hash: "c8b5e39f4930399527236905cdbcb546" + } + Frame { + msec: 2320 + hash: "c8b5e39f4930399527236905cdbcb546" + } + Frame { + msec: 2336 + hash: "c8b5e39f4930399527236905cdbcb546" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2352 + hash: "3624b85c9362dfeff911cd5426f11ada" + } + Frame { + msec: 2368 + hash: "3624b85c9362dfeff911cd5426f11ada" + } + Frame { + msec: 2384 + hash: "3624b85c9362dfeff911cd5426f11ada" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2400 + hash: "3624b85c9362dfeff911cd5426f11ada" + } + Frame { + msec: 2416 + hash: "3624b85c9362dfeff911cd5426f11ada" + } + Frame { + msec: 2432 + hash: "3624b85c9362dfeff911cd5426f11ada" + } + Frame { + msec: 2448 + hash: "3624b85c9362dfeff911cd5426f11ada" + } + Frame { + msec: 2464 + hash: "3624b85c9362dfeff911cd5426f11ada" + } + Frame { + msec: 2480 + hash: "3624b85c9362dfeff911cd5426f11ada" + } + Frame { + msec: 2496 + hash: "3624b85c9362dfeff911cd5426f11ada" + } + Frame { + msec: 2512 + hash: "3624b85c9362dfeff911cd5426f11ada" + } + Frame { + msec: 2528 + hash: "3624b85c9362dfeff911cd5426f11ada" + } + Frame { + msec: 2544 + hash: "3624b85c9362dfeff911cd5426f11ada" + } + Frame { + msec: 2560 + hash: "3624b85c9362dfeff911cd5426f11ada" + } + Frame { + msec: 2576 + hash: "3624b85c9362dfeff911cd5426f11ada" + } + Frame { + msec: 2592 + hash: "3624b85c9362dfeff911cd5426f11ada" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2608 + hash: "fa22742b8778a3b63ce7d6699dbf7482" + } + Frame { + msec: 2624 + hash: "fa22742b8778a3b63ce7d6699dbf7482" + } + Frame { + msec: 2640 + hash: "fa22742b8778a3b63ce7d6699dbf7482" + } + Frame { + msec: 2656 + hash: "fa22742b8778a3b63ce7d6699dbf7482" + } + Frame { + msec: 2672 + hash: "fa22742b8778a3b63ce7d6699dbf7482" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2688 + hash: "fa22742b8778a3b63ce7d6699dbf7482" + } + Frame { + msec: 2704 + hash: "fa22742b8778a3b63ce7d6699dbf7482" + } + Frame { + msec: 2720 + hash: "fa22742b8778a3b63ce7d6699dbf7482" + } + Frame { + msec: 2736 + hash: "fa22742b8778a3b63ce7d6699dbf7482" + } + Frame { + msec: 2752 + hash: "fa22742b8778a3b63ce7d6699dbf7482" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2768 + hash: "b069c174a1b9589ed3137cd01f870b17" + } + Frame { + msec: 2784 + hash: "b069c174a1b9589ed3137cd01f870b17" + } + Frame { + msec: 2800 + hash: "b069c174a1b9589ed3137cd01f870b17" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2816 + hash: "b069c174a1b9589ed3137cd01f870b17" + } + Frame { + msec: 2832 + hash: "b069c174a1b9589ed3137cd01f870b17" + } + Frame { + msec: 2848 + hash: "b069c174a1b9589ed3137cd01f870b17" + } + Frame { + msec: 2864 + hash: "b069c174a1b9589ed3137cd01f870b17" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2880 + hash: "53f9d63bacad27fd73c2f84b82599dbc" + } + Frame { + msec: 2896 + image: "qt-669.3.png" + } + Frame { + msec: 2912 + hash: "53f9d63bacad27fd73c2f84b82599dbc" + } + Frame { + msec: 2928 + hash: "53f9d63bacad27fd73c2f84b82599dbc" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2944 + hash: "53f9d63bacad27fd73c2f84b82599dbc" + } + Frame { + msec: 2960 + hash: "53f9d63bacad27fd73c2f84b82599dbc" + } + Frame { + msec: 2976 + hash: "53f9d63bacad27fd73c2f84b82599dbc" + } + Frame { + msec: 2992 + hash: "53f9d63bacad27fd73c2f84b82599dbc" + } + Frame { + msec: 3008 + hash: "53f9d63bacad27fd73c2f84b82599dbc" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3024 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3040 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3056 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3072 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3088 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3104 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3120 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3136 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3152 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3168 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3184 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3200 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3216 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3232 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3248 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3264 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3280 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3296 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3312 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3328 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3344 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3360 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3376 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3392 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3408 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3424 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3440 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3456 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3472 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3488 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3504 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3520 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3536 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3552 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3568 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3584 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3600 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3616 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3632 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3648 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3664 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3680 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Frame { + msec: 3696 + hash: "9294b20b7160322e1f2eecaee6ebf856" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3712 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 3728 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 3744 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 3760 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 3776 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 3792 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3808 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 3824 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 3840 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 3856 + image: "qt-669.4.png" + } + Frame { + msec: 3872 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 3888 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 3904 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 3920 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 3936 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 3952 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 3968 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 3984 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 4000 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 4016 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 4032 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 4048 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 4064 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 4080 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 4096 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 4112 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 4128 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 4144 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 4160 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 4176 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 4192 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 4208 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 4224 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 4240 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 4256 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 4272 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 4288 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } + Frame { + msec: 4304 + hash: "80122e3e0d124c01b2769c1c88aa4a13" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.0.png new file mode 100644 index 00000000..a1c3c390 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.1.png new file mode 100644 index 00000000..bfc91f51 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.10.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.10.png new file mode 100644 index 00000000..56f6ecea Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.10.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.11.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.11.png new file mode 100644 index 00000000..56f6ecea Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.11.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.12.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.12.png new file mode 100644 index 00000000..56f6ecea Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.12.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.2.png new file mode 100644 index 00000000..f1829fa1 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.3.png new file mode 100644 index 00000000..b7f41db0 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.4.png new file mode 100644 index 00000000..9e58c3a5 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.5.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.5.png new file mode 100644 index 00000000..8dbcc417 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.5.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.6.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.6.png new file mode 100644 index 00000000..302974b0 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.6.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.7.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.7.png new file mode 100644 index 00000000..f8bc3b46 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.7.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.8.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.8.png new file mode 100644 index 00000000..b435da67 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.8.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.9.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.9.png new file mode 100644 index 00000000..e156cd5e Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.9.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.qml new file mode 100644 index 00000000..a03948cd --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/usingMultilineEdit.qml @@ -0,0 +1,4687 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "usingMultilineEdit.0.png" + } + Frame { + msec: 32 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 48 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 64 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 80 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 96 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 112 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 128 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 144 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 160 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 176 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 192 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 208 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 224 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 240 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 256 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 272 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 288 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 304 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 320 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 118; y: 70 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 336 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 352 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 368 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 384 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 400 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 118; y: 70 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 416 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 432 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 448 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 464 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 480 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 496 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 512 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 528 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 544 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 560 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 576 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 592 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 608 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 624 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Frame { + msec: 640 + hash: "b59ca5ccc1bd1d1192cc109d66a31d0b" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 117; y: 102 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 656 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 672 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 117; y: 102 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 688 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 704 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 720 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 736 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 752 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 768 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 784 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 800 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 816 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 832 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 848 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 864 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 880 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 896 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 912 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 928 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 944 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 960 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 976 + image: "usingMultilineEdit.1.png" + } + Frame { + msec: 992 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 1008 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 1024 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 1040 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 1056 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 1072 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 1088 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 1104 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 1120 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 1136 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 1152 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 1168 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 1184 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 1200 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 1216 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 1232 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 1248 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 1264 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 1280 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Frame { + msec: 1296 + hash: "2414ab7436ed58a29eaf3ef15b5ced79" + } + Key { + type: 6 + key: 44 + modifiers: 0 + text: "2c" + autorep: false + count: 1 + } + Frame { + msec: 1312 + hash: "91757521cdb0617645a2a6cb831f51f3" + } + Frame { + msec: 1328 + hash: "91757521cdb0617645a2a6cb831f51f3" + } + Frame { + msec: 1344 + hash: "91757521cdb0617645a2a6cb831f51f3" + } + Frame { + msec: 1360 + hash: "91757521cdb0617645a2a6cb831f51f3" + } + Frame { + msec: 1376 + hash: "91757521cdb0617645a2a6cb831f51f3" + } + Key { + type: 7 + key: 44 + modifiers: 0 + text: "2c" + autorep: false + count: 1 + } + Frame { + msec: 1392 + hash: "91757521cdb0617645a2a6cb831f51f3" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 1408 + hash: "a7e2d2f2668dcb902d3ab0e413d9b639" + } + Frame { + msec: 1424 + hash: "a7e2d2f2668dcb902d3ab0e413d9b639" + } + Frame { + msec: 1440 + hash: "a7e2d2f2668dcb902d3ab0e413d9b639" + } + Frame { + msec: 1456 + hash: "a7e2d2f2668dcb902d3ab0e413d9b639" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 1472 + hash: "a7e2d2f2668dcb902d3ab0e413d9b639" + } + Frame { + msec: 1488 + hash: "a7e2d2f2668dcb902d3ab0e413d9b639" + } + Frame { + msec: 1504 + hash: "a7e2d2f2668dcb902d3ab0e413d9b639" + } + Frame { + msec: 1520 + hash: "a7e2d2f2668dcb902d3ab0e413d9b639" + } + Frame { + msec: 1536 + hash: "a7e2d2f2668dcb902d3ab0e413d9b639" + } + Frame { + msec: 1552 + hash: "a7e2d2f2668dcb902d3ab0e413d9b639" + } + Key { + type: 6 + key: 68 + modifiers: 0 + text: "64" + autorep: false + count: 1 + } + Frame { + msec: 1568 + hash: "1602f7c814daec9612795d1e109b8f14" + } + Frame { + msec: 1584 + hash: "1602f7c814daec9612795d1e109b8f14" + } + Frame { + msec: 1600 + hash: "1602f7c814daec9612795d1e109b8f14" + } + Key { + type: 7 + key: 68 + modifiers: 0 + text: "64" + autorep: false + count: 1 + } + Frame { + msec: 1616 + hash: "1602f7c814daec9612795d1e109b8f14" + } + Key { + type: 6 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 1632 + hash: "84e1e7c90b2134d037146d8a7cd4c413" + } + Frame { + msec: 1648 + hash: "84e1e7c90b2134d037146d8a7cd4c413" + } + Frame { + msec: 1664 + hash: "84e1e7c90b2134d037146d8a7cd4c413" + } + Frame { + msec: 1680 + hash: "84e1e7c90b2134d037146d8a7cd4c413" + } + Frame { + msec: 1696 + hash: "84e1e7c90b2134d037146d8a7cd4c413" + } + Key { + type: 7 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 1712 + hash: "84e1e7c90b2134d037146d8a7cd4c413" + } + Frame { + msec: 1728 + hash: "84e1e7c90b2134d037146d8a7cd4c413" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 1744 + hash: "87109c5f296e5b56aaecc09a2decae4d" + } + Frame { + msec: 1760 + hash: "87109c5f296e5b56aaecc09a2decae4d" + } + Frame { + msec: 1776 + hash: "87109c5f296e5b56aaecc09a2decae4d" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 1792 + hash: "87109c5f296e5b56aaecc09a2decae4d" + } + Frame { + msec: 1808 + hash: "87109c5f296e5b56aaecc09a2decae4d" + } + Frame { + msec: 1824 + hash: "87109c5f296e5b56aaecc09a2decae4d" + } + Key { + type: 6 + key: 89 + modifiers: 0 + text: "79" + autorep: false + count: 1 + } + Frame { + msec: 1840 + hash: "29f766ca17ac45522ca2079cce9a1015" + } + Frame { + msec: 1856 + hash: "29f766ca17ac45522ca2079cce9a1015" + } + Frame { + msec: 1872 + hash: "29f766ca17ac45522ca2079cce9a1015" + } + Frame { + msec: 1888 + hash: "29f766ca17ac45522ca2079cce9a1015" + } + Frame { + msec: 1904 + hash: "29f766ca17ac45522ca2079cce9a1015" + } + Key { + type: 7 + key: 89 + modifiers: 0 + text: "79" + autorep: false + count: 1 + } + Key { + type: 6 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 1920 + hash: "be6de699f29278ee3a39c3d8ed90f808" + } + Frame { + msec: 1936 + image: "usingMultilineEdit.2.png" + } + Frame { + msec: 1952 + hash: "be6de699f29278ee3a39c3d8ed90f808" + } + Frame { + msec: 1968 + hash: "be6de699f29278ee3a39c3d8ed90f808" + } + Key { + type: 6 + key: 85 + modifiers: 0 + text: "75" + autorep: false + count: 1 + } + Frame { + msec: 1984 + hash: "ef413406c3e7aa03ced4e06661dfafcc" + } + Frame { + msec: 2000 + hash: "ef413406c3e7aa03ced4e06661dfafcc" + } + Key { + type: 7 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 2016 + hash: "ef413406c3e7aa03ced4e06661dfafcc" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 2032 + hash: "d29b729a45533ef77af530ab2f125bd1" + } + Frame { + msec: 2048 + hash: "d29b729a45533ef77af530ab2f125bd1" + } + Key { + type: 7 + key: 85 + modifiers: 0 + text: "75" + autorep: false + count: 1 + } + Frame { + msec: 2064 + hash: "d29b729a45533ef77af530ab2f125bd1" + } + Frame { + msec: 2080 + hash: "d29b729a45533ef77af530ab2f125bd1" + } + Frame { + msec: 2096 + hash: "d29b729a45533ef77af530ab2f125bd1" + } + Frame { + msec: 2112 + hash: "d29b729a45533ef77af530ab2f125bd1" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 2128 + hash: "d29b729a45533ef77af530ab2f125bd1" + } + Frame { + msec: 2144 + hash: "d29b729a45533ef77af530ab2f125bd1" + } + Key { + type: 6 + key: 87 + modifiers: 0 + text: "77" + autorep: false + count: 1 + } + Frame { + msec: 2160 + hash: "3b2069cbaa6640664dbe1b80f3cf0670" + } + Frame { + msec: 2176 + hash: "3b2069cbaa6640664dbe1b80f3cf0670" + } + Frame { + msec: 2192 + hash: "3b2069cbaa6640664dbe1b80f3cf0670" + } + Frame { + msec: 2208 + hash: "3b2069cbaa6640664dbe1b80f3cf0670" + } + Frame { + msec: 2224 + hash: "3b2069cbaa6640664dbe1b80f3cf0670" + } + Frame { + msec: 2240 + hash: "3b2069cbaa6640664dbe1b80f3cf0670" + } + Key { + type: 7 + key: 87 + modifiers: 0 + text: "77" + autorep: false + count: 1 + } + Key { + type: 6 + key: 82 + modifiers: 0 + text: "72" + autorep: false + count: 1 + } + Frame { + msec: 2256 + hash: "6ef4fd1a5d53c16670163384ef4c8f06" + } + Frame { + msec: 2272 + hash: "6ef4fd1a5d53c16670163384ef4c8f06" + } + Frame { + msec: 2288 + hash: "6ef4fd1a5d53c16670163384ef4c8f06" + } + Frame { + msec: 2304 + hash: "6ef4fd1a5d53c16670163384ef4c8f06" + } + Frame { + msec: 2320 + hash: "6ef4fd1a5d53c16670163384ef4c8f06" + } + Key { + type: 7 + key: 82 + modifiers: 0 + text: "72" + autorep: false + count: 1 + } + Frame { + msec: 2336 + hash: "6ef4fd1a5d53c16670163384ef4c8f06" + } + Frame { + msec: 2352 + hash: "6ef4fd1a5d53c16670163384ef4c8f06" + } + Key { + type: 6 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 2368 + hash: "c656f82ce3471c70d5f8050c5bd904e6" + } + Frame { + msec: 2384 + hash: "c656f82ce3471c70d5f8050c5bd904e6" + } + Frame { + msec: 2400 + hash: "c656f82ce3471c70d5f8050c5bd904e6" + } + Frame { + msec: 2416 + hash: "c656f82ce3471c70d5f8050c5bd904e6" + } + Key { + type: 7 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 2432 + hash: "c656f82ce3471c70d5f8050c5bd904e6" + } + Key { + type: 6 + key: 80 + modifiers: 0 + text: "70" + autorep: false + count: 1 + } + Frame { + msec: 2448 + hash: "991d345c4a62087543afa032e8d4bd2f" + } + Frame { + msec: 2464 + hash: "991d345c4a62087543afa032e8d4bd2f" + } + Frame { + msec: 2480 + hash: "991d345c4a62087543afa032e8d4bd2f" + } + Frame { + msec: 2496 + hash: "991d345c4a62087543afa032e8d4bd2f" + } + Frame { + msec: 2512 + hash: "991d345c4a62087543afa032e8d4bd2f" + } + Frame { + msec: 2528 + hash: "991d345c4a62087543afa032e8d4bd2f" + } + Key { + type: 7 + key: 80 + modifiers: 0 + text: "70" + autorep: false + count: 1 + } + Frame { + msec: 2544 + hash: "991d345c4a62087543afa032e8d4bd2f" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 2560 + hash: "9b55130d7cb0922aaeed3a5aad103f98" + } + Frame { + msec: 2576 + hash: "9b55130d7cb0922aaeed3a5aad103f98" + } + Frame { + msec: 2592 + hash: "9b55130d7cb0922aaeed3a5aad103f98" + } + Frame { + msec: 2608 + hash: "9b55130d7cb0922aaeed3a5aad103f98" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 2624 + hash: "9b55130d7cb0922aaeed3a5aad103f98" + } + Frame { + msec: 2640 + hash: "9b55130d7cb0922aaeed3a5aad103f98" + } + Frame { + msec: 2656 + hash: "9b55130d7cb0922aaeed3a5aad103f98" + } + Frame { + msec: 2672 + hash: "9b55130d7cb0922aaeed3a5aad103f98" + } + Frame { + msec: 2688 + hash: "9b55130d7cb0922aaeed3a5aad103f98" + } + Key { + type: 6 + key: 76 + modifiers: 0 + text: "6c" + autorep: false + count: 1 + } + Frame { + msec: 2704 + hash: "9b323c8f49dc890af8849a0de8a7db4d" + } + Frame { + msec: 2720 + hash: "9b323c8f49dc890af8849a0de8a7db4d" + } + Frame { + msec: 2736 + hash: "9b323c8f49dc890af8849a0de8a7db4d" + } + Frame { + msec: 2752 + hash: "9b323c8f49dc890af8849a0de8a7db4d" + } + Frame { + msec: 2768 + hash: "9b323c8f49dc890af8849a0de8a7db4d" + } + Frame { + msec: 2784 + hash: "9b323c8f49dc890af8849a0de8a7db4d" + } + Key { + type: 6 + key: 73 + modifiers: 0 + text: "69" + autorep: false + count: 1 + } + Frame { + msec: 2800 + hash: "c3c761352c46bd89c400c6638180fa9a" + } + Key { + type: 7 + key: 76 + modifiers: 0 + text: "6c" + autorep: false + count: 1 + } + Frame { + msec: 2816 + hash: "c3c761352c46bd89c400c6638180fa9a" + } + Frame { + msec: 2832 + hash: "c3c761352c46bd89c400c6638180fa9a" + } + Frame { + msec: 2848 + hash: "c3c761352c46bd89c400c6638180fa9a" + } + Frame { + msec: 2864 + hash: "c3c761352c46bd89c400c6638180fa9a" + } + Key { + type: 7 + key: 73 + modifiers: 0 + text: "69" + autorep: false + count: 1 + } + Frame { + msec: 2880 + hash: "c3c761352c46bd89c400c6638180fa9a" + } + Frame { + msec: 2896 + image: "usingMultilineEdit.3.png" + } + Frame { + msec: 2912 + hash: "c3c761352c46bd89c400c6638180fa9a" + } + Frame { + msec: 2928 + hash: "c3c761352c46bd89c400c6638180fa9a" + } + Key { + type: 6 + key: 75 + modifiers: 0 + text: "6b" + autorep: false + count: 1 + } + Frame { + msec: 2944 + hash: "93af025fc4cf949167efac7ed3bc5258" + } + Frame { + msec: 2960 + hash: "93af025fc4cf949167efac7ed3bc5258" + } + Frame { + msec: 2976 + hash: "93af025fc4cf949167efac7ed3bc5258" + } + Key { + type: 7 + key: 75 + modifiers: 0 + text: "6b" + autorep: false + count: 1 + } + Key { + type: 6 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Frame { + msec: 2992 + hash: "41fe34c5246a438886e85fdc30513a08" + } + Frame { + msec: 3008 + hash: "41fe34c5246a438886e85fdc30513a08" + } + Frame { + msec: 3024 + hash: "41fe34c5246a438886e85fdc30513a08" + } + Frame { + msec: 3040 + hash: "41fe34c5246a438886e85fdc30513a08" + } + Key { + type: 7 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Frame { + msec: 3056 + hash: "41fe34c5246a438886e85fdc30513a08" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 3072 + hash: "db7bd05984a1ca713382f109780b8e5d" + } + Frame { + msec: 3088 + hash: "db7bd05984a1ca713382f109780b8e5d" + } + Frame { + msec: 3104 + hash: "db7bd05984a1ca713382f109780b8e5d" + } + Key { + type: 6 + key: 16777248 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3120 + hash: "db7bd05984a1ca713382f109780b8e5d" + } + Key { + type: 7 + key: 32 + modifiers: 33554432 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 3136 + hash: "db7bd05984a1ca713382f109780b8e5d" + } + Frame { + msec: 3152 + hash: "db7bd05984a1ca713382f109780b8e5d" + } + Key { + type: 6 + key: 73 + modifiers: 33554432 + text: "49" + autorep: false + count: 1 + } + Frame { + msec: 3168 + hash: "85bed6c44d017fb45591ee821a6e8c82" + } + Frame { + msec: 3184 + hash: "85bed6c44d017fb45591ee821a6e8c82" + } + Frame { + msec: 3200 + hash: "85bed6c44d017fb45591ee821a6e8c82" + } + Frame { + msec: 3216 + hash: "85bed6c44d017fb45591ee821a6e8c82" + } + Key { + type: 7 + key: 73 + modifiers: 33554432 + text: "49" + autorep: false + count: 1 + } + Frame { + msec: 3232 + hash: "85bed6c44d017fb45591ee821a6e8c82" + } + Key { + type: 7 + key: 16777248 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 3248 + hash: "70e09c15e0db15327b278c20508cd77e" + } + Frame { + msec: 3264 + hash: "70e09c15e0db15327b278c20508cd77e" + } + Frame { + msec: 3280 + hash: "70e09c15e0db15327b278c20508cd77e" + } + Frame { + msec: 3296 + hash: "70e09c15e0db15327b278c20508cd77e" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 3312 + hash: "70e09c15e0db15327b278c20508cd77e" + } + Key { + type: 6 + key: 87 + modifiers: 0 + text: "77" + autorep: false + count: 1 + } + Frame { + msec: 3328 + hash: "7bdf47aad57a3e53683819927a9ba6f7" + } + Frame { + msec: 3344 + hash: "7bdf47aad57a3e53683819927a9ba6f7" + } + Frame { + msec: 3360 + hash: "7bdf47aad57a3e53683819927a9ba6f7" + } + Frame { + msec: 3376 + hash: "7bdf47aad57a3e53683819927a9ba6f7" + } + Frame { + msec: 3392 + hash: "7bdf47aad57a3e53683819927a9ba6f7" + } + Key { + type: 7 + key: 87 + modifiers: 0 + text: "77" + autorep: false + count: 1 + } + Frame { + msec: 3408 + hash: "7bdf47aad57a3e53683819927a9ba6f7" + } + Key { + type: 6 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 3424 + hash: "cd302294ea4a6015f4093e3ce0640a15" + } + Frame { + msec: 3440 + hash: "cd302294ea4a6015f4093e3ce0640a15" + } + Frame { + msec: 3456 + hash: "cd302294ea4a6015f4093e3ce0640a15" + } + Frame { + msec: 3472 + hash: "cd302294ea4a6015f4093e3ce0640a15" + } + Frame { + msec: 3488 + hash: "cd302294ea4a6015f4093e3ce0640a15" + } + Key { + type: 7 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Key { + type: 6 + key: 78 + modifiers: 0 + text: "6e" + autorep: false + count: 1 + } + Frame { + msec: 3504 + hash: "6679b8bffbcf389e1a56e9e494c9041c" + } + Frame { + msec: 3520 + hash: "6679b8bffbcf389e1a56e9e494c9041c" + } + Frame { + msec: 3536 + hash: "6679b8bffbcf389e1a56e9e494c9041c" + } + Frame { + msec: 3552 + hash: "6679b8bffbcf389e1a56e9e494c9041c" + } + Frame { + msec: 3568 + hash: "6679b8bffbcf389e1a56e9e494c9041c" + } + Frame { + msec: 3584 + hash: "6679b8bffbcf389e1a56e9e494c9041c" + } + Key { + type: 7 + key: 78 + modifiers: 0 + text: "6e" + autorep: false + count: 1 + } + Frame { + msec: 3600 + hash: "6679b8bffbcf389e1a56e9e494c9041c" + } + Key { + type: 6 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 3616 + hash: "6cf8306437867645e5459cd4c9733ef7" + } + Frame { + msec: 3632 + hash: "6cf8306437867645e5459cd4c9733ef7" + } + Frame { + msec: 3648 + hash: "6cf8306437867645e5459cd4c9733ef7" + } + Frame { + msec: 3664 + hash: "6cf8306437867645e5459cd4c9733ef7" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 3680 + hash: "31c0880fb6b8995881f0983685c51c81" + } + Key { + type: 7 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 3696 + hash: "31c0880fb6b8995881f0983685c51c81" + } + Frame { + msec: 3712 + hash: "31c0880fb6b8995881f0983685c51c81" + } + Frame { + msec: 3728 + hash: "31c0880fb6b8995881f0983685c51c81" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 3744 + hash: "31c0880fb6b8995881f0983685c51c81" + } + Frame { + msec: 3760 + hash: "31c0880fb6b8995881f0983685c51c81" + } + Frame { + msec: 3776 + hash: "31c0880fb6b8995881f0983685c51c81" + } + Frame { + msec: 3792 + hash: "31c0880fb6b8995881f0983685c51c81" + } + Frame { + msec: 3808 + hash: "31c0880fb6b8995881f0983685c51c81" + } + Frame { + msec: 3824 + hash: "31c0880fb6b8995881f0983685c51c81" + } + Frame { + msec: 3840 + hash: "31c0880fb6b8995881f0983685c51c81" + } + Frame { + msec: 3856 + image: "usingMultilineEdit.4.png" + } + Frame { + msec: 3872 + hash: "31c0880fb6b8995881f0983685c51c81" + } + Frame { + msec: 3888 + hash: "31c0880fb6b8995881f0983685c51c81" + } + Frame { + msec: 3904 + hash: "31c0880fb6b8995881f0983685c51c81" + } + Frame { + msec: 3920 + hash: "31c0880fb6b8995881f0983685c51c81" + } + Frame { + msec: 3936 + hash: "31c0880fb6b8995881f0983685c51c81" + } + Frame { + msec: 3952 + hash: "31c0880fb6b8995881f0983685c51c81" + } + Frame { + msec: 3968 + hash: "31c0880fb6b8995881f0983685c51c81" + } + Key { + type: 6 + key: 89 + modifiers: 0 + text: "79" + autorep: false + count: 1 + } + Frame { + msec: 3984 + hash: "34c2a53d8852e17ab2b7990eb6156343" + } + Frame { + msec: 4000 + hash: "34c2a53d8852e17ab2b7990eb6156343" + } + Frame { + msec: 4016 + hash: "34c2a53d8852e17ab2b7990eb6156343" + } + Frame { + msec: 4032 + hash: "34c2a53d8852e17ab2b7990eb6156343" + } + Frame { + msec: 4048 + hash: "34c2a53d8852e17ab2b7990eb6156343" + } + Key { + type: 6 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 4064 + hash: "75a0e73d34f90ca26b4c7e94a7a6ecd2" + } + Key { + type: 7 + key: 89 + modifiers: 0 + text: "79" + autorep: false + count: 1 + } + Frame { + msec: 4080 + hash: "75a0e73d34f90ca26b4c7e94a7a6ecd2" + } + Frame { + msec: 4096 + hash: "75a0e73d34f90ca26b4c7e94a7a6ecd2" + } + Frame { + msec: 4112 + hash: "75a0e73d34f90ca26b4c7e94a7a6ecd2" + } + Frame { + msec: 4128 + hash: "75a0e73d34f90ca26b4c7e94a7a6ecd2" + } + Key { + type: 6 + key: 85 + modifiers: 0 + text: "75" + autorep: false + count: 1 + } + Frame { + msec: 4144 + hash: "296a65279cec34eb93083f3938bf9b16" + } + Frame { + msec: 4160 + hash: "296a65279cec34eb93083f3938bf9b16" + } + Key { + type: 7 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 4176 + hash: "296a65279cec34eb93083f3938bf9b16" + } + Frame { + msec: 4192 + hash: "296a65279cec34eb93083f3938bf9b16" + } + Frame { + msec: 4208 + hash: "296a65279cec34eb93083f3938bf9b16" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 4224 + hash: "902a4133742f9a99195a059f7f6b91df" + } + Frame { + msec: 4240 + hash: "902a4133742f9a99195a059f7f6b91df" + } + Key { + type: 7 + key: 85 + modifiers: 0 + text: "75" + autorep: false + count: 1 + } + Frame { + msec: 4256 + hash: "902a4133742f9a99195a059f7f6b91df" + } + Frame { + msec: 4272 + hash: "902a4133742f9a99195a059f7f6b91df" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 4288 + hash: "902a4133742f9a99195a059f7f6b91df" + } + Frame { + msec: 4304 + hash: "902a4133742f9a99195a059f7f6b91df" + } + Frame { + msec: 4320 + hash: "902a4133742f9a99195a059f7f6b91df" + } + Frame { + msec: 4336 + hash: "902a4133742f9a99195a059f7f6b91df" + } + Frame { + msec: 4352 + hash: "902a4133742f9a99195a059f7f6b91df" + } + Frame { + msec: 4368 + hash: "902a4133742f9a99195a059f7f6b91df" + } + Key { + type: 6 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 4384 + hash: "7e92966a300a81511c5fcb9e447b9029" + } + Frame { + msec: 4400 + hash: "7e92966a300a81511c5fcb9e447b9029" + } + Frame { + msec: 4416 + hash: "7e92966a300a81511c5fcb9e447b9029" + } + Frame { + msec: 4432 + hash: "7e92966a300a81511c5fcb9e447b9029" + } + Frame { + msec: 4448 + hash: "7e92966a300a81511c5fcb9e447b9029" + } + Key { + type: 7 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 4464 + hash: "7e92966a300a81511c5fcb9e447b9029" + } + Key { + type: 6 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 4480 + hash: "d22869235a5e4689db64d97f0b5af6c0" + } + Frame { + msec: 4496 + hash: "d22869235a5e4689db64d97f0b5af6c0" + } + Frame { + msec: 4512 + hash: "d22869235a5e4689db64d97f0b5af6c0" + } + Frame { + msec: 4528 + hash: "d22869235a5e4689db64d97f0b5af6c0" + } + Frame { + msec: 4544 + hash: "d22869235a5e4689db64d97f0b5af6c0" + } + Key { + type: 7 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 4560 + hash: "d22869235a5e4689db64d97f0b5af6c0" + } + Frame { + msec: 4576 + hash: "d22869235a5e4689db64d97f0b5af6c0" + } + Frame { + msec: 4592 + hash: "d22869235a5e4689db64d97f0b5af6c0" + } + Key { + type: 6 + key: 16777248 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 4608 + hash: "d22869235a5e4689db64d97f0b5af6c0" + } + Frame { + msec: 4624 + hash: "d22869235a5e4689db64d97f0b5af6c0" + } + Frame { + msec: 4640 + hash: "d22869235a5e4689db64d97f0b5af6c0" + } + Frame { + msec: 4656 + hash: "d22869235a5e4689db64d97f0b5af6c0" + } + Frame { + msec: 4672 + hash: "d22869235a5e4689db64d97f0b5af6c0" + } + Frame { + msec: 4688 + hash: "d22869235a5e4689db64d97f0b5af6c0" + } + Frame { + msec: 4704 + hash: "d22869235a5e4689db64d97f0b5af6c0" + } + Frame { + msec: 4720 + hash: "d22869235a5e4689db64d97f0b5af6c0" + } + Frame { + msec: 4736 + hash: "d22869235a5e4689db64d97f0b5af6c0" + } + Frame { + msec: 4752 + hash: "d22869235a5e4689db64d97f0b5af6c0" + } + Frame { + msec: 4768 + hash: "d22869235a5e4689db64d97f0b5af6c0" + } + Frame { + msec: 4784 + hash: "d22869235a5e4689db64d97f0b5af6c0" + } + Frame { + msec: 4800 + hash: "d22869235a5e4689db64d97f0b5af6c0" + } + Frame { + msec: 4816 + image: "usingMultilineEdit.5.png" + } + Frame { + msec: 4832 + hash: "d22869235a5e4689db64d97f0b5af6c0" + } + Key { + type: 6 + key: 63 + modifiers: 33554432 + text: "3f" + autorep: false + count: 1 + } + Frame { + msec: 4848 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 4864 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 4880 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 4896 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 4912 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 4928 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 4944 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Key { + type: 7 + key: 63 + modifiers: 33554432 + text: "3f" + autorep: false + count: 1 + } + Frame { + msec: 4960 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 4976 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 4992 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5008 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Key { + type: 7 + key: 16777248 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 5024 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5040 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5056 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5072 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5088 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5104 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5120 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5136 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5152 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5168 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5184 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5200 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5216 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5232 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5248 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5264 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5280 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5296 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5312 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5328 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5344 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5360 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5376 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5392 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5408 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5424 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5440 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5456 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5472 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5488 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5504 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5520 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5536 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5552 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5568 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5584 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5600 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5616 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5632 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5648 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5664 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5680 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5696 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5712 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5728 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5744 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Frame { + msec: 5760 + hash: "8153431eabfb3a6916aa37319d9fd379" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 48; y: 19 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5776 + image: "usingMultilineEdit.6.png" + } + Frame { + msec: 5792 + hash: "0fba30df8b6cac2f911fbd2b7c48fca6" + } + Frame { + msec: 5808 + hash: "0fba30df8b6cac2f911fbd2b7c48fca6" + } + Frame { + msec: 5824 + hash: "0fba30df8b6cac2f911fbd2b7c48fca6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 49; y: 21 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 50; y: 22 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5840 + hash: "0fba30df8b6cac2f911fbd2b7c48fca6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 50; y: 23 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 51; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5856 + hash: "4b0c9ae119bd6c9f6331cbefc53afa3d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 53; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 54; y: 33 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5872 + hash: "4b0c9ae119bd6c9f6331cbefc53afa3d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 55; y: 36 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 56; y: 41 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5888 + hash: "e6b3b80f052fec9f67b02a7f36676b5d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 56; y: 44 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 57; y: 48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5904 + hash: "37d1ee8e1c914d499dd7920576dadcae" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 58; y: 52 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 59; y: 58 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5920 + hash: "37d1ee8e1c914d499dd7920576dadcae" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 59; y: 64 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 61; y: 69 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5936 + hash: "34f7bd61afb22009181d79841bc59fa1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 62; y: 75 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 64; y: 80 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5952 + hash: "23ea9471d132daab6193b0809c8bd98e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 64; y: 86 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 66; y: 90 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5968 + hash: "e35d1c5a15474388727942b41fdcec0f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 67; y: 97 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5984 + hash: "e35d1c5a15474388727942b41fdcec0f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 67; y: 101 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 67; y: 105 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6000 + hash: "e35d1c5a15474388727942b41fdcec0f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 69; y: 108 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 69; y: 111 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6016 + hash: "e35d1c5a15474388727942b41fdcec0f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 69; y: 114 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 69; y: 116 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6032 + hash: "e35d1c5a15474388727942b41fdcec0f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 119 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 122 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6048 + hash: "e35d1c5a15474388727942b41fdcec0f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 124 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 128 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6064 + hash: "e35d1c5a15474388727942b41fdcec0f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 130 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 132 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6080 + hash: "e35d1c5a15474388727942b41fdcec0f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 134 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 137 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6096 + hash: "e35d1c5a15474388727942b41fdcec0f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 138 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 140 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6112 + hash: "e35d1c5a15474388727942b41fdcec0f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 141 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 144 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6128 + hash: "e35d1c5a15474388727942b41fdcec0f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 69; y: 145 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 69; y: 148 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6144 + hash: "e35d1c5a15474388727942b41fdcec0f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 69; y: 149 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 69; y: 151 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6160 + hash: "e35d1c5a15474388727942b41fdcec0f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 69; y: 153 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 68; y: 154 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6176 + hash: "e35d1c5a15474388727942b41fdcec0f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 68; y: 155 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6192 + hash: "e35d1c5a15474388727942b41fdcec0f" + } + Frame { + msec: 6208 + hash: "e35d1c5a15474388727942b41fdcec0f" + } + Frame { + msec: 6224 + hash: "e35d1c5a15474388727942b41fdcec0f" + } + Frame { + msec: 6240 + hash: "e35d1c5a15474388727942b41fdcec0f" + } + Frame { + msec: 6256 + hash: "e35d1c5a15474388727942b41fdcec0f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 68; y: 154 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6272 + hash: "e35d1c5a15474388727942b41fdcec0f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 68; y: 152 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 68; y: 149 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6288 + hash: "e35d1c5a15474388727942b41fdcec0f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 68; y: 145 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 66; y: 139 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6304 + hash: "e35d1c5a15474388727942b41fdcec0f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 66; y: 126 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 64; y: 117 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6320 + hash: "e35d1c5a15474388727942b41fdcec0f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 64; y: 108 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 63; y: 98 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6336 + hash: "e35d1c5a15474388727942b41fdcec0f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 61; y: 88 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 61; y: 80 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6352 + hash: "e35d1c5a15474388727942b41fdcec0f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 59; y: 72 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 59; y: 64 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6368 + hash: "e35d1c5a15474388727942b41fdcec0f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 59; y: 58 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 57; y: 51 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6384 + hash: "1b24d0c17446cfadc351127f842ac5fd" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 57; y: 37 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6400 + hash: "1b24d0c17446cfadc351127f842ac5fd" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 55; y: 30 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 54; y: 23 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6416 + hash: "f0b06fefc9e18b836ffe081215efe584" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 54; y: 16 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 52; y: 6 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6432 + hash: "9ed30cb00df82cce04e8c8b76d056013" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 50; y: -2 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 50; y: -9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6448 + hash: "4d37a34962e019f47201da6baddebca8" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 48; y: -23 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6464 + hash: "cd83055403901b1a7a99dfda3798ca7e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 47; y: -31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 47; y: -38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6480 + hash: "0fba30df8b6cac2f911fbd2b7c48fca6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 47; y: -45 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 45; y: -48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6496 + hash: "71cdc5a9144234556630430361779ff7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 45; y: -48 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 45; y: -48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6512 + hash: "71cdc5a9144234556630430361779ff7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 45; y: -48 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6528 + hash: "71cdc5a9144234556630430361779ff7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -48 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6544 + hash: "71cdc5a9144234556630430361779ff7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -48 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6560 + hash: "71cdc5a9144234556630430361779ff7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -48 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6576 + hash: "71cdc5a9144234556630430361779ff7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -48 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6592 + hash: "71cdc5a9144234556630430361779ff7" + } + Frame { + msec: 6608 + hash: "71cdc5a9144234556630430361779ff7" + } + Frame { + msec: 6624 + hash: "71cdc5a9144234556630430361779ff7" + } + Frame { + msec: 6640 + hash: "71cdc5a9144234556630430361779ff7" + } + Frame { + msec: 6656 + hash: "71cdc5a9144234556630430361779ff7" + } + Frame { + msec: 6672 + hash: "71cdc5a9144234556630430361779ff7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -47 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -46 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6688 + hash: "71cdc5a9144234556630430361779ff7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -45 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 44; y: -42 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6704 + hash: "71cdc5a9144234556630430361779ff7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 44; y: -39 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 45; y: -36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6720 + hash: "71cdc5a9144234556630430361779ff7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 45; y: -33 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 46; y: -28 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6736 + image: "usingMultilineEdit.7.png" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 47; y: -25 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 47; y: -21 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6752 + hash: "71cdc5a9144234556630430361779ff7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 48; y: -18 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 49; y: -14 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6768 + hash: "71cdc5a9144234556630430361779ff7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 49; y: -10 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 50; y: -8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6784 + hash: "71cdc5a9144234556630430361779ff7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 50; y: -6 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 51; y: -3 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6800 + hash: "71cdc5a9144234556630430361779ff7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 51; y: -1 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 52; y: 0 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6816 + hash: "71cdc5a9144234556630430361779ff7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 52; y: 2 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 52; y: 3 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6832 + hash: "71cdc5a9144234556630430361779ff7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 53; y: 5 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 54; y: 7 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6848 + hash: "0fba30df8b6cac2f911fbd2b7c48fca6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 54; y: 8 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 55; y: 10 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6864 + hash: "0fba30df8b6cac2f911fbd2b7c48fca6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 55; y: 11 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 55; y: 12 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6880 + hash: "0fba30df8b6cac2f911fbd2b7c48fca6" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 55; y: 12 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6896 + hash: "0fba30df8b6cac2f911fbd2b7c48fca6" + } + Frame { + msec: 6912 + hash: "0fba30df8b6cac2f911fbd2b7c48fca6" + } + Frame { + msec: 6928 + hash: "0fba30df8b6cac2f911fbd2b7c48fca6" + } + Frame { + msec: 6944 + hash: "0fba30df8b6cac2f911fbd2b7c48fca6" + } + Frame { + msec: 6960 + hash: "0fba30df8b6cac2f911fbd2b7c48fca6" + } + Frame { + msec: 6976 + hash: "0fba30df8b6cac2f911fbd2b7c48fca6" + } + Frame { + msec: 6992 + hash: "0fba30df8b6cac2f911fbd2b7c48fca6" + } + Frame { + msec: 7008 + hash: "0fba30df8b6cac2f911fbd2b7c48fca6" + } + Frame { + msec: 7024 + hash: "0fba30df8b6cac2f911fbd2b7c48fca6" + } + Frame { + msec: 7040 + hash: "0fba30df8b6cac2f911fbd2b7c48fca6" + } + Frame { + msec: 7056 + hash: "0fba30df8b6cac2f911fbd2b7c48fca6" + } + Frame { + msec: 7072 + hash: "0fba30df8b6cac2f911fbd2b7c48fca6" + } + Frame { + msec: 7088 + hash: "0fba30df8b6cac2f911fbd2b7c48fca6" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 59; y: 44 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7104 + hash: "df53c57d83cf38d96893f379d8a0c1a7" + } + Frame { + msec: 7120 + hash: "df53c57d83cf38d96893f379d8a0c1a7" + } + Frame { + msec: 7136 + hash: "df53c57d83cf38d96893f379d8a0c1a7" + } + Frame { + msec: 7152 + hash: "df53c57d83cf38d96893f379d8a0c1a7" + } + Frame { + msec: 7168 + hash: "df53c57d83cf38d96893f379d8a0c1a7" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 59; y: 44 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7184 + hash: "df53c57d83cf38d96893f379d8a0c1a7" + } + Frame { + msec: 7200 + hash: "df53c57d83cf38d96893f379d8a0c1a7" + } + Frame { + msec: 7216 + hash: "df53c57d83cf38d96893f379d8a0c1a7" + } + Frame { + msec: 7232 + hash: "df53c57d83cf38d96893f379d8a0c1a7" + } + Frame { + msec: 7248 + hash: "df53c57d83cf38d96893f379d8a0c1a7" + } + Frame { + msec: 7264 + hash: "df53c57d83cf38d96893f379d8a0c1a7" + } + Frame { + msec: 7280 + hash: "df53c57d83cf38d96893f379d8a0c1a7" + } + Frame { + msec: 7296 + hash: "df53c57d83cf38d96893f379d8a0c1a7" + } + Frame { + msec: 7312 + hash: "df53c57d83cf38d96893f379d8a0c1a7" + } + Frame { + msec: 7328 + hash: "df53c57d83cf38d96893f379d8a0c1a7" + } + Frame { + msec: 7344 + hash: "df53c57d83cf38d96893f379d8a0c1a7" + } + Frame { + msec: 7360 + hash: "df53c57d83cf38d96893f379d8a0c1a7" + } + Frame { + msec: 7376 + hash: "df53c57d83cf38d96893f379d8a0c1a7" + } + Frame { + msec: 7392 + hash: "df53c57d83cf38d96893f379d8a0c1a7" + } + Frame { + msec: 7408 + hash: "df53c57d83cf38d96893f379d8a0c1a7" + } + Frame { + msec: 7424 + hash: "df53c57d83cf38d96893f379d8a0c1a7" + } + Frame { + msec: 7440 + hash: "df53c57d83cf38d96893f379d8a0c1a7" + } + Frame { + msec: 7456 + hash: "df53c57d83cf38d96893f379d8a0c1a7" + } + Frame { + msec: 7472 + hash: "df53c57d83cf38d96893f379d8a0c1a7" + } + Frame { + msec: 7488 + hash: "df53c57d83cf38d96893f379d8a0c1a7" + } + Frame { + msec: 7504 + hash: "df53c57d83cf38d96893f379d8a0c1a7" + } + Frame { + msec: 7520 + hash: "df53c57d83cf38d96893f379d8a0c1a7" + } + Frame { + msec: 7536 + hash: "df53c57d83cf38d96893f379d8a0c1a7" + } + Frame { + msec: 7552 + hash: "df53c57d83cf38d96893f379d8a0c1a7" + } + Frame { + msec: 7568 + hash: "df53c57d83cf38d96893f379d8a0c1a7" + } + Key { + type: 6 + key: 16777237 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 7584 + hash: "bdc721eb51436b121826d4163cbf596f" + } + Frame { + msec: 7600 + hash: "bdc721eb51436b121826d4163cbf596f" + } + Frame { + msec: 7616 + hash: "bdc721eb51436b121826d4163cbf596f" + } + Key { + type: 7 + key: 16777237 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 7632 + hash: "bdc721eb51436b121826d4163cbf596f" + } + Frame { + msec: 7648 + hash: "bdc721eb51436b121826d4163cbf596f" + } + Frame { + msec: 7664 + hash: "bdc721eb51436b121826d4163cbf596f" + } + Frame { + msec: 7680 + hash: "bdc721eb51436b121826d4163cbf596f" + } + Frame { + msec: 7696 + image: "usingMultilineEdit.8.png" + } + Frame { + msec: 7712 + hash: "bdc721eb51436b121826d4163cbf596f" + } + Key { + type: 6 + key: 16777237 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 7728 + hash: "7d378c1c1e54d2d13b602f1cf1a56a2f" + } + Frame { + msec: 7744 + hash: "7d378c1c1e54d2d13b602f1cf1a56a2f" + } + Frame { + msec: 7760 + hash: "7d378c1c1e54d2d13b602f1cf1a56a2f" + } + Frame { + msec: 7776 + hash: "7d378c1c1e54d2d13b602f1cf1a56a2f" + } + Frame { + msec: 7792 + hash: "7d378c1c1e54d2d13b602f1cf1a56a2f" + } + Frame { + msec: 7808 + hash: "7d378c1c1e54d2d13b602f1cf1a56a2f" + } + Frame { + msec: 7824 + hash: "7d378c1c1e54d2d13b602f1cf1a56a2f" + } + Frame { + msec: 7840 + hash: "7d378c1c1e54d2d13b602f1cf1a56a2f" + } + Frame { + msec: 7856 + hash: "7d378c1c1e54d2d13b602f1cf1a56a2f" + } + Frame { + msec: 7872 + hash: "7d378c1c1e54d2d13b602f1cf1a56a2f" + } + Frame { + msec: 7888 + hash: "7d378c1c1e54d2d13b602f1cf1a56a2f" + } + Frame { + msec: 7904 + hash: "7d378c1c1e54d2d13b602f1cf1a56a2f" + } + Frame { + msec: 7920 + hash: "7d378c1c1e54d2d13b602f1cf1a56a2f" + } + Frame { + msec: 7936 + hash: "7d378c1c1e54d2d13b602f1cf1a56a2f" + } + Frame { + msec: 7952 + hash: "7d378c1c1e54d2d13b602f1cf1a56a2f" + } + Key { + type: 7 + key: 16777237 + modifiers: 0 + text: "" + autorep: true + count: 1 + } + Key { + type: 6 + key: 16777237 + modifiers: 0 + text: "" + autorep: true + count: 1 + } + Frame { + msec: 7968 + hash: "bc028efd0fc3d999269d047fe4d64e27" + } + Frame { + msec: 7984 + hash: "bc028efd0fc3d999269d047fe4d64e27" + } + Key { + type: 7 + key: 16777237 + modifiers: 0 + text: "" + autorep: true + count: 1 + } + Key { + type: 6 + key: 16777237 + modifiers: 0 + text: "" + autorep: true + count: 1 + } + Frame { + msec: 8000 + hash: "b18fe0d9cfed62d53e152e3f294dc8b3" + } + Frame { + msec: 8016 + hash: "b18fe0d9cfed62d53e152e3f294dc8b3" + } + Key { + type: 7 + key: 16777237 + modifiers: 0 + text: "" + autorep: true + count: 1 + } + Key { + type: 6 + key: 16777237 + modifiers: 0 + text: "" + autorep: true + count: 1 + } + Frame { + msec: 8032 + hash: "eca1a9d5eed543b913d1d2b19cef3286" + } + Frame { + msec: 8048 + hash: "eca1a9d5eed543b913d1d2b19cef3286" + } + Key { + type: 7 + key: 16777237 + modifiers: 0 + text: "" + autorep: true + count: 1 + } + Key { + type: 6 + key: 16777237 + modifiers: 0 + text: "" + autorep: true + count: 1 + } + Frame { + msec: 8064 + hash: "01f1ac2c199086a701a784a3a47fdb71" + } + Frame { + msec: 8080 + hash: "01f1ac2c199086a701a784a3a47fdb71" + } + Key { + type: 6 + key: 16777248 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Key { + type: 7 + key: 16777237 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 8096 + hash: "01f1ac2c199086a701a784a3a47fdb71" + } + Frame { + msec: 8112 + hash: "01f1ac2c199086a701a784a3a47fdb71" + } + Frame { + msec: 8128 + hash: "01f1ac2c199086a701a784a3a47fdb71" + } + Frame { + msec: 8144 + hash: "01f1ac2c199086a701a784a3a47fdb71" + } + Frame { + msec: 8160 + hash: "01f1ac2c199086a701a784a3a47fdb71" + } + Frame { + msec: 8176 + hash: "01f1ac2c199086a701a784a3a47fdb71" + } + Frame { + msec: 8192 + hash: "01f1ac2c199086a701a784a3a47fdb71" + } + Key { + type: 6 + key: 16777235 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 8208 + hash: "c8254066bc7b4bae0934425226d59a2b" + } + Frame { + msec: 8224 + hash: "c8254066bc7b4bae0934425226d59a2b" + } + Frame { + msec: 8240 + hash: "c8254066bc7b4bae0934425226d59a2b" + } + Frame { + msec: 8256 + hash: "c8254066bc7b4bae0934425226d59a2b" + } + Key { + type: 7 + key: 16777235 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 8272 + hash: "c8254066bc7b4bae0934425226d59a2b" + } + Frame { + msec: 8288 + hash: "c8254066bc7b4bae0934425226d59a2b" + } + Frame { + msec: 8304 + hash: "c8254066bc7b4bae0934425226d59a2b" + } + Frame { + msec: 8320 + hash: "c8254066bc7b4bae0934425226d59a2b" + } + Key { + type: 6 + key: 16777235 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 8336 + hash: "7bd48f4441ba1971bf49cb5b9e174935" + } + Frame { + msec: 8352 + hash: "7bd48f4441ba1971bf49cb5b9e174935" + } + Frame { + msec: 8368 + hash: "7bd48f4441ba1971bf49cb5b9e174935" + } + Frame { + msec: 8384 + hash: "7bd48f4441ba1971bf49cb5b9e174935" + } + Key { + type: 7 + key: 16777235 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 8400 + hash: "7bd48f4441ba1971bf49cb5b9e174935" + } + Frame { + msec: 8416 + hash: "7bd48f4441ba1971bf49cb5b9e174935" + } + Frame { + msec: 8432 + hash: "7bd48f4441ba1971bf49cb5b9e174935" + } + Frame { + msec: 8448 + hash: "7bd48f4441ba1971bf49cb5b9e174935" + } + Frame { + msec: 8464 + hash: "7bd48f4441ba1971bf49cb5b9e174935" + } + Key { + type: 6 + key: 16777235 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 8480 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 8496 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 8512 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 8528 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Key { + type: 7 + key: 16777235 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 8544 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 8560 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 8576 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 8592 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 8608 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 8624 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 8640 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 8656 + image: "usingMultilineEdit.9.png" + } + Key { + type: 7 + key: 16777248 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 8672 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 8688 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 8704 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 8720 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 8736 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 8752 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 8768 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 8784 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 8800 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 8816 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 8832 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 8848 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 8864 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 8880 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 8896 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 8912 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 8928 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 8944 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 8960 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 8976 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 8992 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 9008 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 9024 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 9040 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 9056 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 9072 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 9088 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 9104 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 9120 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 9136 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 9152 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 9168 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 9184 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 9200 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 70; y: 73 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9216 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 9232 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 74 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9248 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 75 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 76 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9264 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 77 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 78 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9280 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 70; y: 78 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9296 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 9312 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 9328 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 9344 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 9360 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 9376 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 9392 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 9408 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 9424 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Frame { + msec: 9440 + hash: "edf44121a60ee9d975954863c2ed848c" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 71; y: 94 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9456 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 9472 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 9488 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 9504 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 9520 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 9536 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 71; y: 94 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9552 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 9568 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 9584 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 9600 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 9616 + image: "usingMultilineEdit.10.png" + } + Frame { + msec: 9632 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 9648 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 9664 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Key { + type: 6 + key: 16777248 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 9680 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 9696 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 9712 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 9728 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 9744 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 9760 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 9776 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 9792 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 9808 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 9824 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 9840 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 9856 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 9872 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 9888 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 9904 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 9920 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 9936 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 9952 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 9968 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 9984 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10000 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10016 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10032 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10048 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10064 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10080 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10096 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Key { + type: 6 + key: 16777237 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 10112 + hash: "956f4f8cfca76cfee9babea29b0715ea" + } + Frame { + msec: 10128 + hash: "956f4f8cfca76cfee9babea29b0715ea" + } + Frame { + msec: 10144 + hash: "956f4f8cfca76cfee9babea29b0715ea" + } + Frame { + msec: 10160 + hash: "956f4f8cfca76cfee9babea29b0715ea" + } + Frame { + msec: 10176 + hash: "956f4f8cfca76cfee9babea29b0715ea" + } + Frame { + msec: 10192 + hash: "956f4f8cfca76cfee9babea29b0715ea" + } + Frame { + msec: 10208 + hash: "956f4f8cfca76cfee9babea29b0715ea" + } + Frame { + msec: 10224 + hash: "956f4f8cfca76cfee9babea29b0715ea" + } + Key { + type: 7 + key: 16777237 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 10240 + hash: "956f4f8cfca76cfee9babea29b0715ea" + } + Frame { + msec: 10256 + hash: "956f4f8cfca76cfee9babea29b0715ea" + } + Frame { + msec: 10272 + hash: "956f4f8cfca76cfee9babea29b0715ea" + } + Frame { + msec: 10288 + hash: "956f4f8cfca76cfee9babea29b0715ea" + } + Frame { + msec: 10304 + hash: "956f4f8cfca76cfee9babea29b0715ea" + } + Frame { + msec: 10320 + hash: "956f4f8cfca76cfee9babea29b0715ea" + } + Frame { + msec: 10336 + hash: "956f4f8cfca76cfee9babea29b0715ea" + } + Frame { + msec: 10352 + hash: "956f4f8cfca76cfee9babea29b0715ea" + } + Key { + type: 6 + key: 16777235 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 10368 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10384 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10400 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10416 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10432 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10448 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Key { + type: 7 + key: 16777235 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 10464 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10480 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10496 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10512 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10528 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10544 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10560 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10576 + image: "usingMultilineEdit.11.png" + } + Frame { + msec: 10592 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10608 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10624 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10640 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Key { + type: 7 + key: 16777248 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 10656 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10672 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10688 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10704 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10720 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10736 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10752 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10768 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10784 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10800 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10816 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10832 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10848 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10864 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10880 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10896 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10912 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10928 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10944 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10960 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10976 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 10992 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11008 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11024 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11040 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11056 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11072 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11088 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11104 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11120 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11136 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11152 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11168 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11184 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11200 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11216 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11232 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11248 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11264 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11280 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11296 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11312 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11328 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11344 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11360 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11376 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11392 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11408 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11424 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11440 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11456 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11472 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11488 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11504 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11520 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11536 + image: "usingMultilineEdit.12.png" + } + Frame { + msec: 11552 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11568 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11584 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11600 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } + Frame { + msec: 11616 + hash: "b58ab2c31823e7b0be144fba3e77368a" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.0.png new file mode 100644 index 00000000..da3b9711 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.1.png new file mode 100644 index 00000000..8ea07878 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.2.png new file mode 100644 index 00000000..33328db5 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.3.png new file mode 100644 index 00000000..222ba535 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.4.png new file mode 100644 index 00000000..970e73d4 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.5.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.5.png new file mode 100644 index 00000000..4dc64a12 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.5.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.6.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.6.png new file mode 100644 index 00000000..99d451c4 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.6.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.7.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.7.png new file mode 100644 index 00000000..d624a719 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.7.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.qml new file mode 100644 index 00000000..13834f03 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data-X11/wrap.qml @@ -0,0 +1,2467 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "wrap.0.png" + } + Key { + type: 6 + key: 84 + modifiers: 33554432 + text: "54" + autorep: false + count: 1 + } + Frame { + msec: 32 + hash: "ca07773bf0df96be1f23d13c4d6e2bfd" + } + Key { + type: 7 + key: 16777248 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 48 + hash: "ca07773bf0df96be1f23d13c4d6e2bfd" + } + Frame { + msec: 64 + hash: "ca07773bf0df96be1f23d13c4d6e2bfd" + } + Key { + type: 7 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 80 + hash: "ca07773bf0df96be1f23d13c4d6e2bfd" + } + Frame { + msec: 96 + hash: "ca07773bf0df96be1f23d13c4d6e2bfd" + } + Key { + type: 6 + key: 72 + modifiers: 0 + text: "68" + autorep: false + count: 1 + } + Frame { + msec: 112 + hash: "fc223de2e1f35db08d9689bc41f02304" + } + Frame { + msec: 128 + hash: "fc223de2e1f35db08d9689bc41f02304" + } + Frame { + msec: 144 + hash: "fc223de2e1f35db08d9689bc41f02304" + } + Key { + type: 6 + key: 73 + modifiers: 0 + text: "69" + autorep: false + count: 1 + } + Frame { + msec: 160 + hash: "dc208fb5236b0a2a54bf9aaf7a9d60cd" + } + Frame { + msec: 176 + hash: "dc208fb5236b0a2a54bf9aaf7a9d60cd" + } + Frame { + msec: 192 + hash: "dc208fb5236b0a2a54bf9aaf7a9d60cd" + } + Key { + type: 7 + key: 72 + modifiers: 0 + text: "68" + autorep: false + count: 1 + } + Frame { + msec: 208 + hash: "dc208fb5236b0a2a54bf9aaf7a9d60cd" + } + Frame { + msec: 224 + hash: "dc208fb5236b0a2a54bf9aaf7a9d60cd" + } + Key { + type: 6 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 240 + hash: "c017468afd522089b5c9f42dd61be1b4" + } + Key { + type: 7 + key: 73 + modifiers: 0 + text: "69" + autorep: false + count: 1 + } + Frame { + msec: 256 + hash: "c017468afd522089b5c9f42dd61be1b4" + } + Frame { + msec: 272 + hash: "c017468afd522089b5c9f42dd61be1b4" + } + Frame { + msec: 288 + hash: "c017468afd522089b5c9f42dd61be1b4" + } + Frame { + msec: 304 + hash: "c017468afd522089b5c9f42dd61be1b4" + } + Key { + type: 7 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 320 + hash: "c017468afd522089b5c9f42dd61be1b4" + } + Frame { + msec: 336 + hash: "c017468afd522089b5c9f42dd61be1b4" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 352 + hash: "84b1f1bf26af0da07006bb102d22693f" + } + Frame { + msec: 368 + hash: "84b1f1bf26af0da07006bb102d22693f" + } + Frame { + msec: 384 + hash: "84b1f1bf26af0da07006bb102d22693f" + } + Frame { + msec: 400 + hash: "84b1f1bf26af0da07006bb102d22693f" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 416 + hash: "84b1f1bf26af0da07006bb102d22693f" + } + Frame { + msec: 432 + hash: "84b1f1bf26af0da07006bb102d22693f" + } + Frame { + msec: 448 + hash: "84b1f1bf26af0da07006bb102d22693f" + } + Frame { + msec: 464 + hash: "84b1f1bf26af0da07006bb102d22693f" + } + Key { + type: 6 + key: 73 + modifiers: 0 + text: "69" + autorep: false + count: 1 + } + Frame { + msec: 480 + hash: "a16f5aa01bd07de4ef7f868b7b6116f7" + } + Frame { + msec: 496 + hash: "a16f5aa01bd07de4ef7f868b7b6116f7" + } + Frame { + msec: 512 + hash: "a16f5aa01bd07de4ef7f868b7b6116f7" + } + Frame { + msec: 528 + hash: "a16f5aa01bd07de4ef7f868b7b6116f7" + } + Key { + type: 6 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Key { + type: 7 + key: 73 + modifiers: 0 + text: "69" + autorep: false + count: 1 + } + Frame { + msec: 544 + hash: "e25e16d0d7b223b243d466630b901f68" + } + Frame { + msec: 560 + hash: "e25e16d0d7b223b243d466630b901f68" + } + Frame { + msec: 576 + hash: "e25e16d0d7b223b243d466630b901f68" + } + Frame { + msec: 592 + hash: "e25e16d0d7b223b243d466630b901f68" + } + Frame { + msec: 608 + hash: "e25e16d0d7b223b243d466630b901f68" + } + Key { + type: 7 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 624 + hash: "a53520edb9c117aa53abc42fce3505be" + } + Frame { + msec: 640 + hash: "a53520edb9c117aa53abc42fce3505be" + } + Frame { + msec: 656 + hash: "a53520edb9c117aa53abc42fce3505be" + } + Frame { + msec: 672 + hash: "a53520edb9c117aa53abc42fce3505be" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 688 + hash: "a53520edb9c117aa53abc42fce3505be" + } + Frame { + msec: 704 + hash: "a53520edb9c117aa53abc42fce3505be" + } + Key { + type: 6 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 720 + hash: "a7ef30038b24e8bf946bdd38aaac6430" + } + Frame { + msec: 736 + hash: "a7ef30038b24e8bf946bdd38aaac6430" + } + Frame { + msec: 752 + hash: "a7ef30038b24e8bf946bdd38aaac6430" + } + Frame { + msec: 768 + hash: "a7ef30038b24e8bf946bdd38aaac6430" + } + Frame { + msec: 784 + hash: "a7ef30038b24e8bf946bdd38aaac6430" + } + Key { + type: 7 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 800 + hash: "a7ef30038b24e8bf946bdd38aaac6430" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 816 + hash: "026b29fc03bd22e15ff725d34dee91eb" + } + Frame { + msec: 832 + hash: "026b29fc03bd22e15ff725d34dee91eb" + } + Frame { + msec: 848 + hash: "026b29fc03bd22e15ff725d34dee91eb" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 864 + hash: "026b29fc03bd22e15ff725d34dee91eb" + } + Frame { + msec: 880 + hash: "026b29fc03bd22e15ff725d34dee91eb" + } + Frame { + msec: 896 + hash: "026b29fc03bd22e15ff725d34dee91eb" + } + Key { + type: 6 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 912 + hash: "2b1cef34dff32e36e3c44f2ffb2be66e" + } + Frame { + msec: 928 + hash: "2b1cef34dff32e36e3c44f2ffb2be66e" + } + Frame { + msec: 944 + hash: "2b1cef34dff32e36e3c44f2ffb2be66e" + } + Frame { + msec: 960 + hash: "2b1cef34dff32e36e3c44f2ffb2be66e" + } + Frame { + msec: 976 + image: "wrap.1.png" + } + Frame { + msec: 992 + hash: "2b1cef34dff32e36e3c44f2ffb2be66e" + } + Key { + type: 6 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Key { + type: 7 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 1008 + hash: "f619bc4148876effc459127009d4cc3a" + } + Frame { + msec: 1024 + hash: "f619bc4148876effc459127009d4cc3a" + } + Frame { + msec: 1040 + hash: "f619bc4148876effc459127009d4cc3a" + } + Frame { + msec: 1056 + hash: "f619bc4148876effc459127009d4cc3a" + } + Frame { + msec: 1072 + hash: "f619bc4148876effc459127009d4cc3a" + } + Key { + type: 7 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Frame { + msec: 1088 + hash: "f619bc4148876effc459127009d4cc3a" + } + Frame { + msec: 1104 + hash: "f619bc4148876effc459127009d4cc3a" + } + Frame { + msec: 1120 + hash: "f619bc4148876effc459127009d4cc3a" + } + Frame { + msec: 1136 + hash: "f619bc4148876effc459127009d4cc3a" + } + Frame { + msec: 1152 + hash: "f619bc4148876effc459127009d4cc3a" + } + Frame { + msec: 1168 + hash: "f619bc4148876effc459127009d4cc3a" + } + Frame { + msec: 1184 + hash: "f619bc4148876effc459127009d4cc3a" + } + Key { + type: 6 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 1200 + hash: "c7fbee3129141e8493b7bc4f85fdc2d0" + } + Frame { + msec: 1216 + hash: "c7fbee3129141e8493b7bc4f85fdc2d0" + } + Frame { + msec: 1232 + hash: "c7fbee3129141e8493b7bc4f85fdc2d0" + } + Frame { + msec: 1248 + hash: "c7fbee3129141e8493b7bc4f85fdc2d0" + } + Frame { + msec: 1264 + hash: "c7fbee3129141e8493b7bc4f85fdc2d0" + } + Key { + type: 7 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Key { + type: 6 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 1280 + hash: "f2a45d80148ee1b5f1cd8cb6ddd0c5ed" + } + Frame { + msec: 1296 + hash: "f2a45d80148ee1b5f1cd8cb6ddd0c5ed" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 1312 + hash: "147efa341e4dc39cdd555c2c81e5c603" + } + Frame { + msec: 1328 + hash: "147efa341e4dc39cdd555c2c81e5c603" + } + Frame { + msec: 1344 + hash: "147efa341e4dc39cdd555c2c81e5c603" + } + Key { + type: 7 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 1360 + hash: "147efa341e4dc39cdd555c2c81e5c603" + } + Frame { + msec: 1376 + hash: "147efa341e4dc39cdd555c2c81e5c603" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 1392 + hash: "147efa341e4dc39cdd555c2c81e5c603" + } + Frame { + msec: 1408 + hash: "147efa341e4dc39cdd555c2c81e5c603" + } + Frame { + msec: 1424 + hash: "147efa341e4dc39cdd555c2c81e5c603" + } + Frame { + msec: 1440 + hash: "147efa341e4dc39cdd555c2c81e5c603" + } + Key { + type: 6 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 1456 + hash: "d5b19a6d767a08f488cc8fc5c427a2dd" + } + Frame { + msec: 1472 + hash: "d5b19a6d767a08f488cc8fc5c427a2dd" + } + Frame { + msec: 1488 + hash: "d5b19a6d767a08f488cc8fc5c427a2dd" + } + Frame { + msec: 1504 + hash: "d5b19a6d767a08f488cc8fc5c427a2dd" + } + Frame { + msec: 1520 + hash: "d5b19a6d767a08f488cc8fc5c427a2dd" + } + Key { + type: 7 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 1536 + hash: "d5b19a6d767a08f488cc8fc5c427a2dd" + } + Frame { + msec: 1552 + hash: "d5b19a6d767a08f488cc8fc5c427a2dd" + } + Key { + type: 6 + key: 72 + modifiers: 0 + text: "68" + autorep: false + count: 1 + } + Frame { + msec: 1568 + hash: "bf6265ca859f700fb07f8b992255787d" + } + Frame { + msec: 1584 + hash: "bf6265ca859f700fb07f8b992255787d" + } + Frame { + msec: 1600 + hash: "bf6265ca859f700fb07f8b992255787d" + } + Frame { + msec: 1616 + hash: "bf6265ca859f700fb07f8b992255787d" + } + Frame { + msec: 1632 + hash: "bf6265ca859f700fb07f8b992255787d" + } + Key { + type: 6 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Key { + type: 7 + key: 72 + modifiers: 0 + text: "68" + autorep: false + count: 1 + } + Frame { + msec: 1648 + hash: "329e4cd26283eb08188d96b2b0325733" + } + Frame { + msec: 1664 + hash: "329e4cd26283eb08188d96b2b0325733" + } + Frame { + msec: 1680 + hash: "329e4cd26283eb08188d96b2b0325733" + } + Frame { + msec: 1696 + hash: "329e4cd26283eb08188d96b2b0325733" + } + Frame { + msec: 1712 + hash: "329e4cd26283eb08188d96b2b0325733" + } + Key { + type: 6 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 1728 + hash: "7b5ac2afafbbaf1e13c70a11461820ad" + } + Frame { + msec: 1744 + hash: "7b5ac2afafbbaf1e13c70a11461820ad" + } + Frame { + msec: 1760 + hash: "7b5ac2afafbbaf1e13c70a11461820ad" + } + Key { + type: 7 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 1776 + hash: "7b5ac2afafbbaf1e13c70a11461820ad" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 1792 + hash: "bcfa1aa48767f70541a70cb5f85792ba" + } + Frame { + msec: 1808 + hash: "bcfa1aa48767f70541a70cb5f85792ba" + } + Key { + type: 7 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 1824 + hash: "bcfa1aa48767f70541a70cb5f85792ba" + } + Frame { + msec: 1840 + hash: "bcfa1aa48767f70541a70cb5f85792ba" + } + Frame { + msec: 1856 + hash: "bcfa1aa48767f70541a70cb5f85792ba" + } + Frame { + msec: 1872 + hash: "bcfa1aa48767f70541a70cb5f85792ba" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 1888 + hash: "bcfa1aa48767f70541a70cb5f85792ba" + } + Frame { + msec: 1904 + hash: "bcfa1aa48767f70541a70cb5f85792ba" + } + Frame { + msec: 1920 + hash: "bcfa1aa48767f70541a70cb5f85792ba" + } + Frame { + msec: 1936 + image: "wrap.2.png" + } + Frame { + msec: 1952 + hash: "bcfa1aa48767f70541a70cb5f85792ba" + } + Key { + type: 6 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 1968 + hash: "e89f7cf38b3b596298d6c649a1207469" + } + Frame { + msec: 1984 + hash: "e89f7cf38b3b596298d6c649a1207469" + } + Frame { + msec: 2000 + hash: "e89f7cf38b3b596298d6c649a1207469" + } + Frame { + msec: 2016 + hash: "e89f7cf38b3b596298d6c649a1207469" + } + Frame { + msec: 2032 + hash: "e89f7cf38b3b596298d6c649a1207469" + } + Frame { + msec: 2048 + hash: "e89f7cf38b3b596298d6c649a1207469" + } + Key { + type: 6 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Frame { + msec: 2064 + hash: "18e71331b42a115f7f9d5c09e235b944" + } + Key { + type: 7 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 2080 + hash: "18e71331b42a115f7f9d5c09e235b944" + } + Frame { + msec: 2096 + hash: "18e71331b42a115f7f9d5c09e235b944" + } + Frame { + msec: 2112 + hash: "18e71331b42a115f7f9d5c09e235b944" + } + Key { + type: 7 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Frame { + msec: 2128 + hash: "18e71331b42a115f7f9d5c09e235b944" + } + Frame { + msec: 2144 + hash: "18e71331b42a115f7f9d5c09e235b944" + } + Frame { + msec: 2160 + hash: "18e71331b42a115f7f9d5c09e235b944" + } + Frame { + msec: 2176 + hash: "18e71331b42a115f7f9d5c09e235b944" + } + Frame { + msec: 2192 + hash: "18e71331b42a115f7f9d5c09e235b944" + } + Frame { + msec: 2208 + hash: "18e71331b42a115f7f9d5c09e235b944" + } + Key { + type: 6 + key: 88 + modifiers: 0 + text: "78" + autorep: false + count: 1 + } + Frame { + msec: 2224 + hash: "3630abd7cc6ab303d08f30dea7b1eec1" + } + Frame { + msec: 2240 + hash: "3630abd7cc6ab303d08f30dea7b1eec1" + } + Frame { + msec: 2256 + hash: "3630abd7cc6ab303d08f30dea7b1eec1" + } + Frame { + msec: 2272 + hash: "3630abd7cc6ab303d08f30dea7b1eec1" + } + Frame { + msec: 2288 + hash: "3630abd7cc6ab303d08f30dea7b1eec1" + } + Key { + type: 6 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 2304 + hash: "83e7b8c680cda95ec0a669b8030a3efd" + } + Key { + type: 7 + key: 88 + modifiers: 0 + text: "78" + autorep: false + count: 1 + } + Frame { + msec: 2320 + hash: "83e7b8c680cda95ec0a669b8030a3efd" + } + Frame { + msec: 2336 + hash: "83e7b8c680cda95ec0a669b8030a3efd" + } + Frame { + msec: 2352 + hash: "83e7b8c680cda95ec0a669b8030a3efd" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 2368 + hash: "cc826833607ae754e633d21ca67a6b5a" + } + Frame { + msec: 2384 + hash: "cc826833607ae754e633d21ca67a6b5a" + } + Key { + type: 7 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 2400 + hash: "cc826833607ae754e633d21ca67a6b5a" + } + Frame { + msec: 2416 + hash: "cc826833607ae754e633d21ca67a6b5a" + } + Frame { + msec: 2432 + hash: "cc826833607ae754e633d21ca67a6b5a" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 2448 + hash: "cc826833607ae754e633d21ca67a6b5a" + } + Frame { + msec: 2464 + hash: "cc826833607ae754e633d21ca67a6b5a" + } + Frame { + msec: 2480 + hash: "cc826833607ae754e633d21ca67a6b5a" + } + Key { + type: 6 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Frame { + msec: 2496 + hash: "2b4c812fac4e84909cc8fc70d8966a27" + } + Frame { + msec: 2512 + hash: "2b4c812fac4e84909cc8fc70d8966a27" + } + Frame { + msec: 2528 + hash: "2b4c812fac4e84909cc8fc70d8966a27" + } + Frame { + msec: 2544 + hash: "2b4c812fac4e84909cc8fc70d8966a27" + } + Key { + type: 7 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Frame { + msec: 2560 + hash: "2b4c812fac4e84909cc8fc70d8966a27" + } + Frame { + msec: 2576 + hash: "2b4c812fac4e84909cc8fc70d8966a27" + } + Frame { + msec: 2592 + hash: "2b4c812fac4e84909cc8fc70d8966a27" + } + Frame { + msec: 2608 + hash: "2b4c812fac4e84909cc8fc70d8966a27" + } + Frame { + msec: 2624 + hash: "2b4c812fac4e84909cc8fc70d8966a27" + } + Frame { + msec: 2640 + hash: "2b4c812fac4e84909cc8fc70d8966a27" + } + Key { + type: 6 + key: 68 + modifiers: 0 + text: "64" + autorep: false + count: 1 + } + Frame { + msec: 2656 + hash: "c1aabf4b43cbae0d7654ba78fc870fdd" + } + Frame { + msec: 2672 + hash: "c1aabf4b43cbae0d7654ba78fc870fdd" + } + Frame { + msec: 2688 + hash: "c1aabf4b43cbae0d7654ba78fc870fdd" + } + Frame { + msec: 2704 + hash: "c1aabf4b43cbae0d7654ba78fc870fdd" + } + Key { + type: 7 + key: 68 + modifiers: 0 + text: "64" + autorep: false + count: 1 + } + Frame { + msec: 2720 + hash: "c1aabf4b43cbae0d7654ba78fc870fdd" + } + Frame { + msec: 2736 + hash: "c1aabf4b43cbae0d7654ba78fc870fdd" + } + Frame { + msec: 2752 + hash: "c1aabf4b43cbae0d7654ba78fc870fdd" + } + Key { + type: 6 + key: 73 + modifiers: 0 + text: "69" + autorep: false + count: 1 + } + Frame { + msec: 2768 + hash: "a707dd726c777a661e4f12d27a75cf63" + } + Frame { + msec: 2784 + hash: "a707dd726c777a661e4f12d27a75cf63" + } + Frame { + msec: 2800 + hash: "a707dd726c777a661e4f12d27a75cf63" + } + Frame { + msec: 2816 + hash: "a707dd726c777a661e4f12d27a75cf63" + } + Frame { + msec: 2832 + hash: "a707dd726c777a661e4f12d27a75cf63" + } + Key { + type: 6 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Key { + type: 7 + key: 73 + modifiers: 0 + text: "69" + autorep: false + count: 1 + } + Frame { + msec: 2848 + hash: "bdaa69c1074f9820901ce31ea24383ca" + } + Frame { + msec: 2864 + hash: "bdaa69c1074f9820901ce31ea24383ca" + } + Frame { + msec: 2880 + hash: "bdaa69c1074f9820901ce31ea24383ca" + } + Frame { + msec: 2896 + image: "wrap.3.png" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 2912 + hash: "f703f87031be4f9d7409fb145343c02b" + } + Frame { + msec: 2928 + hash: "f703f87031be4f9d7409fb145343c02b" + } + Key { + type: 7 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 2944 + hash: "f703f87031be4f9d7409fb145343c02b" + } + Frame { + msec: 2960 + hash: "f703f87031be4f9d7409fb145343c02b" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 2976 + hash: "f703f87031be4f9d7409fb145343c02b" + } + Frame { + msec: 2992 + hash: "f703f87031be4f9d7409fb145343c02b" + } + Frame { + msec: 3008 + hash: "f703f87031be4f9d7409fb145343c02b" + } + Frame { + msec: 3024 + hash: "f703f87031be4f9d7409fb145343c02b" + } + Frame { + msec: 3040 + hash: "f703f87031be4f9d7409fb145343c02b" + } + Frame { + msec: 3056 + hash: "f703f87031be4f9d7409fb145343c02b" + } + Frame { + msec: 3072 + hash: "f703f87031be4f9d7409fb145343c02b" + } + Frame { + msec: 3088 + hash: "f703f87031be4f9d7409fb145343c02b" + } + Key { + type: 6 + key: 87 + modifiers: 0 + text: "77" + autorep: false + count: 1 + } + Frame { + msec: 3104 + hash: "cb2660df955b757b00661a1acb5f22d2" + } + Frame { + msec: 3120 + hash: "cb2660df955b757b00661a1acb5f22d2" + } + Frame { + msec: 3136 + hash: "cb2660df955b757b00661a1acb5f22d2" + } + Frame { + msec: 3152 + hash: "cb2660df955b757b00661a1acb5f22d2" + } + Frame { + msec: 3168 + hash: "cb2660df955b757b00661a1acb5f22d2" + } + Key { + type: 7 + key: 87 + modifiers: 0 + text: "77" + autorep: false + count: 1 + } + Frame { + msec: 3184 + hash: "cb2660df955b757b00661a1acb5f22d2" + } + Frame { + msec: 3200 + hash: "cb2660df955b757b00661a1acb5f22d2" + } + Frame { + msec: 3216 + hash: "cb2660df955b757b00661a1acb5f22d2" + } + Frame { + msec: 3232 + hash: "cb2660df955b757b00661a1acb5f22d2" + } + Frame { + msec: 3248 + hash: "cb2660df955b757b00661a1acb5f22d2" + } + Key { + type: 6 + key: 82 + modifiers: 0 + text: "72" + autorep: false + count: 1 + } + Frame { + msec: 3264 + hash: "8ea510d25195956fa42eabfe3bb9f230" + } + Frame { + msec: 3280 + hash: "8ea510d25195956fa42eabfe3bb9f230" + } + Frame { + msec: 3296 + hash: "8ea510d25195956fa42eabfe3bb9f230" + } + Key { + type: 7 + key: 82 + modifiers: 0 + text: "72" + autorep: false + count: 1 + } + Frame { + msec: 3312 + hash: "8ea510d25195956fa42eabfe3bb9f230" + } + Frame { + msec: 3328 + hash: "8ea510d25195956fa42eabfe3bb9f230" + } + Frame { + msec: 3344 + hash: "8ea510d25195956fa42eabfe3bb9f230" + } + Key { + type: 6 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 3360 + hash: "26b58aef7b1f50a5d261718e8266a3fb" + } + Frame { + msec: 3376 + hash: "26b58aef7b1f50a5d261718e8266a3fb" + } + Frame { + msec: 3392 + hash: "26b58aef7b1f50a5d261718e8266a3fb" + } + Frame { + msec: 3408 + hash: "26b58aef7b1f50a5d261718e8266a3fb" + } + Frame { + msec: 3424 + hash: "26b58aef7b1f50a5d261718e8266a3fb" + } + Key { + type: 7 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 3440 + hash: "26b58aef7b1f50a5d261718e8266a3fb" + } + Frame { + msec: 3456 + hash: "26b58aef7b1f50a5d261718e8266a3fb" + } + Frame { + msec: 3472 + hash: "26b58aef7b1f50a5d261718e8266a3fb" + } + Key { + type: 6 + key: 80 + modifiers: 0 + text: "70" + autorep: false + count: 1 + } + Frame { + msec: 3488 + hash: "012854de1c9d1a772994d02f52bdcd7c" + } + Frame { + msec: 3504 + hash: "012854de1c9d1a772994d02f52bdcd7c" + } + Frame { + msec: 3520 + hash: "012854de1c9d1a772994d02f52bdcd7c" + } + Frame { + msec: 3536 + hash: "012854de1c9d1a772994d02f52bdcd7c" + } + Key { + type: 7 + key: 80 + modifiers: 0 + text: "70" + autorep: false + count: 1 + } + Frame { + msec: 3552 + hash: "012854de1c9d1a772994d02f52bdcd7c" + } + Frame { + msec: 3568 + hash: "012854de1c9d1a772994d02f52bdcd7c" + } + Key { + type: 6 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 3584 + hash: "660a31e1c0d573f4155cfa8fe2323413" + } + Frame { + msec: 3600 + hash: "660a31e1c0d573f4155cfa8fe2323413" + } + Frame { + msec: 3616 + hash: "660a31e1c0d573f4155cfa8fe2323413" + } + Frame { + msec: 3632 + hash: "660a31e1c0d573f4155cfa8fe2323413" + } + Frame { + msec: 3648 + hash: "660a31e1c0d573f4155cfa8fe2323413" + } + Frame { + msec: 3664 + hash: "660a31e1c0d573f4155cfa8fe2323413" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 3680 + hash: "bea00f5e628e40b679eb8829c16c6260" + } + Key { + type: 7 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 3696 + hash: "bea00f5e628e40b679eb8829c16c6260" + } + Frame { + msec: 3712 + hash: "bea00f5e628e40b679eb8829c16c6260" + } + Frame { + msec: 3728 + hash: "bea00f5e628e40b679eb8829c16c6260" + } + Frame { + msec: 3744 + hash: "bea00f5e628e40b679eb8829c16c6260" + } + Frame { + msec: 3760 + hash: "bea00f5e628e40b679eb8829c16c6260" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 3776 + hash: "bea00f5e628e40b679eb8829c16c6260" + } + Frame { + msec: 3792 + hash: "bea00f5e628e40b679eb8829c16c6260" + } + Frame { + msec: 3808 + hash: "bea00f5e628e40b679eb8829c16c6260" + } + Frame { + msec: 3824 + hash: "bea00f5e628e40b679eb8829c16c6260" + } + Frame { + msec: 3840 + hash: "bea00f5e628e40b679eb8829c16c6260" + } + Frame { + msec: 3856 + image: "wrap.4.png" + } + Frame { + msec: 3872 + hash: "bea00f5e628e40b679eb8829c16c6260" + } + Frame { + msec: 3888 + hash: "bea00f5e628e40b679eb8829c16c6260" + } + Frame { + msec: 3904 + hash: "bea00f5e628e40b679eb8829c16c6260" + } + Key { + type: 6 + key: 67 + modifiers: 0 + text: "63" + autorep: false + count: 1 + } + Frame { + msec: 3920 + hash: "c5c60cd10a1106161cde5f51dbdec5ad" + } + Frame { + msec: 3936 + hash: "c5c60cd10a1106161cde5f51dbdec5ad" + } + Frame { + msec: 3952 + hash: "c5c60cd10a1106161cde5f51dbdec5ad" + } + Frame { + msec: 3968 + hash: "c5c60cd10a1106161cde5f51dbdec5ad" + } + Frame { + msec: 3984 + hash: "c5c60cd10a1106161cde5f51dbdec5ad" + } + Key { + type: 7 + key: 67 + modifiers: 0 + text: "63" + autorep: false + count: 1 + } + Frame { + msec: 4000 + hash: "c5c60cd10a1106161cde5f51dbdec5ad" + } + Frame { + msec: 4016 + hash: "c5c60cd10a1106161cde5f51dbdec5ad" + } + Key { + type: 6 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 4032 + hash: "41c26e6a4c911f9ecd082c4d3366806b" + } + Frame { + msec: 4048 + hash: "41c26e6a4c911f9ecd082c4d3366806b" + } + Frame { + msec: 4064 + hash: "41c26e6a4c911f9ecd082c4d3366806b" + } + Key { + type: 7 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 4080 + hash: "41c26e6a4c911f9ecd082c4d3366806b" + } + Key { + type: 6 + key: 82 + modifiers: 0 + text: "72" + autorep: false + count: 1 + } + Frame { + msec: 4096 + hash: "e212938ce981ed4e8d7a993468bc9377" + } + Frame { + msec: 4112 + hash: "e212938ce981ed4e8d7a993468bc9377" + } + Frame { + msec: 4128 + hash: "e212938ce981ed4e8d7a993468bc9377" + } + Frame { + msec: 4144 + hash: "e212938ce981ed4e8d7a993468bc9377" + } + Key { + type: 7 + key: 82 + modifiers: 0 + text: "72" + autorep: false + count: 1 + } + Frame { + msec: 4160 + hash: "e212938ce981ed4e8d7a993468bc9377" + } + Frame { + msec: 4176 + hash: "e212938ce981ed4e8d7a993468bc9377" + } + Frame { + msec: 4192 + hash: "e212938ce981ed4e8d7a993468bc9377" + } + Key { + type: 6 + key: 82 + modifiers: 0 + text: "72" + autorep: false + count: 1 + } + Frame { + msec: 4208 + hash: "55df0528a97d77d0a4b513aeedd34440" + } + Frame { + msec: 4224 + hash: "55df0528a97d77d0a4b513aeedd34440" + } + Frame { + msec: 4240 + hash: "55df0528a97d77d0a4b513aeedd34440" + } + Frame { + msec: 4256 + hash: "55df0528a97d77d0a4b513aeedd34440" + } + Frame { + msec: 4272 + hash: "55df0528a97d77d0a4b513aeedd34440" + } + Key { + type: 6 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Frame { + msec: 4288 + hash: "2165091c97a891560bf3afab879e6dbc" + } + Key { + type: 7 + key: 82 + modifiers: 0 + text: "72" + autorep: false + count: 1 + } + Frame { + msec: 4304 + hash: "2165091c97a891560bf3afab879e6dbc" + } + Frame { + msec: 4320 + hash: "2165091c97a891560bf3afab879e6dbc" + } + Frame { + msec: 4336 + hash: "2165091c97a891560bf3afab879e6dbc" + } + Key { + type: 7 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Frame { + msec: 4352 + hash: "2165091c97a891560bf3afab879e6dbc" + } + Frame { + msec: 4368 + hash: "2165091c97a891560bf3afab879e6dbc" + } + Frame { + msec: 4384 + hash: "2165091c97a891560bf3afab879e6dbc" + } + Frame { + msec: 4400 + hash: "2165091c97a891560bf3afab879e6dbc" + } + Frame { + msec: 4416 + hash: "2165091c97a891560bf3afab879e6dbc" + } + Key { + type: 6 + key: 67 + modifiers: 0 + text: "63" + autorep: false + count: 1 + } + Frame { + msec: 4432 + hash: "a3d7968e13768c4ec538fe9ba7edf142" + } + Frame { + msec: 4448 + hash: "a3d7968e13768c4ec538fe9ba7edf142" + } + Frame { + msec: 4464 + hash: "a3d7968e13768c4ec538fe9ba7edf142" + } + Key { + type: 7 + key: 67 + modifiers: 0 + text: "63" + autorep: false + count: 1 + } + Frame { + msec: 4480 + hash: "a3d7968e13768c4ec538fe9ba7edf142" + } + Frame { + msec: 4496 + hash: "a3d7968e13768c4ec538fe9ba7edf142" + } + Frame { + msec: 4512 + hash: "a3d7968e13768c4ec538fe9ba7edf142" + } + Frame { + msec: 4528 + hash: "a3d7968e13768c4ec538fe9ba7edf142" + } + Frame { + msec: 4544 + hash: "a3d7968e13768c4ec538fe9ba7edf142" + } + Key { + type: 6 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 4560 + hash: "3b18ada8637d4024acfe88718765f71c" + } + Frame { + msec: 4576 + hash: "3b18ada8637d4024acfe88718765f71c" + } + Frame { + msec: 4592 + hash: "3b18ada8637d4024acfe88718765f71c" + } + Frame { + msec: 4608 + hash: "3b18ada8637d4024acfe88718765f71c" + } + Key { + type: 7 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 4624 + hash: "3b18ada8637d4024acfe88718765f71c" + } + Frame { + msec: 4640 + hash: "3b18ada8637d4024acfe88718765f71c" + } + Frame { + msec: 4656 + hash: "3b18ada8637d4024acfe88718765f71c" + } + Frame { + msec: 4672 + hash: "3b18ada8637d4024acfe88718765f71c" + } + Key { + type: 6 + key: 76 + modifiers: 0 + text: "6c" + autorep: false + count: 1 + } + Frame { + msec: 4688 + hash: "c419775870b0c5e41b5156c840e6a298" + } + Frame { + msec: 4704 + hash: "c419775870b0c5e41b5156c840e6a298" + } + Frame { + msec: 4720 + hash: "c419775870b0c5e41b5156c840e6a298" + } + Frame { + msec: 4736 + hash: "c419775870b0c5e41b5156c840e6a298" + } + Key { + type: 7 + key: 76 + modifiers: 0 + text: "6c" + autorep: false + count: 1 + } + Frame { + msec: 4752 + hash: "c419775870b0c5e41b5156c840e6a298" + } + Frame { + msec: 4768 + hash: "c419775870b0c5e41b5156c840e6a298" + } + Frame { + msec: 4784 + hash: "c419775870b0c5e41b5156c840e6a298" + } + Key { + type: 6 + key: 89 + modifiers: 0 + text: "79" + autorep: false + count: 1 + } + Frame { + msec: 4800 + hash: "81a744f02650728c7557a27c94056e64" + } + Frame { + msec: 4816 + image: "wrap.5.png" + } + Key { + type: 7 + key: 89 + modifiers: 0 + text: "79" + autorep: false + count: 1 + } + Frame { + msec: 4832 + hash: "81a744f02650728c7557a27c94056e64" + } + Frame { + msec: 4848 + hash: "81a744f02650728c7557a27c94056e64" + } + Frame { + msec: 4864 + hash: "81a744f02650728c7557a27c94056e64" + } + Frame { + msec: 4880 + hash: "81a744f02650728c7557a27c94056e64" + } + Key { + type: 6 + key: 46 + modifiers: 0 + text: "2e" + autorep: false + count: 1 + } + Frame { + msec: 4896 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 4912 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 4928 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 4944 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Key { + type: 7 + key: 46 + modifiers: 0 + text: "2e" + autorep: false + count: 1 + } + Frame { + msec: 4960 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 4976 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 4992 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5008 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5024 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5040 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5056 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5072 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5088 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5104 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5120 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5136 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5152 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5168 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5184 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5200 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5216 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5232 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5248 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5264 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5280 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5296 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5312 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5328 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5344 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5360 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5376 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5392 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5408 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5424 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5440 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5456 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5472 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5488 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5504 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5520 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5536 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5552 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5568 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5584 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5600 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5616 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5632 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5648 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5664 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5680 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5696 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5712 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5728 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5744 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5760 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5776 + image: "wrap.6.png" + } + Frame { + msec: 5792 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5808 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5824 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5840 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5856 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5872 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5888 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5904 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5920 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5936 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5952 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5968 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 5984 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6000 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6016 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6032 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6048 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6064 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6080 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6096 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6112 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6128 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6144 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6160 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6176 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6192 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6208 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6224 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6240 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6256 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6272 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6288 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6304 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6320 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6336 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6352 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6368 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6384 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6400 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6416 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6432 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6448 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6464 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6480 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6496 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6512 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6528 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6544 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6560 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6576 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6592 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6608 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6624 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6640 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6656 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6672 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6688 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6704 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6720 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6736 + image: "wrap.7.png" + } + Frame { + msec: 6752 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6768 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6784 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6800 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6816 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6832 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6848 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } + Frame { + msec: 6864 + hash: "ed1520bf20159e60c6a75bbf07f3a6ee" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.0.png new file mode 100644 index 00000000..b24344c3 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.1.png new file mode 100644 index 00000000..5e29359b Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.2.png new file mode 100644 index 00000000..0ffee647 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.3.png new file mode 100644 index 00000000..6c56e9c3 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.4.png new file mode 100644 index 00000000..276170d3 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.5.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.5.png new file mode 100644 index 00000000..3d8709fd Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.5.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.6.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.6.png new file mode 100644 index 00000000..80b960c1 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.6.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.7.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.7.png new file mode 100644 index 00000000..72472771 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.7.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.8.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.8.png new file mode 100644 index 00000000..af5a996b Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.8.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.9.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.9.png new file mode 100644 index 00000000..b254164f Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.9.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.qml new file mode 100644 index 00000000..38190433 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/cursorDelegate.qml @@ -0,0 +1,1499 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + hash: "6e8324bf913d9df21a59ab4337257c15" + } + Frame { + msec: 32 + hash: "4e068995d68e8939e6560e35b685e839" + } + Frame { + msec: 48 + hash: "761b09bce25b3b240093d16ad02268d7" + } + Frame { + msec: 64 + hash: "1ecb6d7d08d4e4e14db28e24a60eccc4" + } + Frame { + msec: 80 + hash: "642417a56b3d6b8b35f5aec1bf0a9d2c" + } + Frame { + msec: 96 + hash: "2e24870a44d3fc6c6d5c920bab29d417" + } + Frame { + msec: 112 + hash: "9a59d0672f2a752943561af89fd71d7f" + } + Frame { + msec: 128 + hash: "c359dd36910678a30f935a13c8680ee4" + } + Frame { + msec: 144 + hash: "245f1e127549e9b28c7574ffb143fcde" + } + Frame { + msec: 160 + hash: "8df3d3dbce673311d88c055e8dffaeb5" + } + Frame { + msec: 176 + hash: "590fdeaddb3df033a1908a8a95fcd17a" + } + Frame { + msec: 192 + hash: "a158891c8d2ee3899463412a3363e48c" + } + Frame { + msec: 208 + hash: "e9ec2c82f46b36fbd0285ce6795c7cf9" + } + Frame { + msec: 224 + hash: "0a02598af770dfe1d332f10c9482e770" + } + Frame { + msec: 240 + hash: "8765475468bccbd0df897a533241f3c5" + } + Frame { + msec: 256 + hash: "4cd9deed66bfdfadde8f8bf34f0e5513" + } + Frame { + msec: 272 + hash: "139bf5a1811beb2438df4ecfa3bbaac7" + } + Frame { + msec: 288 + hash: "9d51555afd71a7035e67a543846dcf7f" + } + Frame { + msec: 304 + hash: "de187b58fc8dfaad2d62e9463691b0c0" + } + Frame { + msec: 320 + hash: "9f88ac6d71246b06ca7ce9d8d983c91b" + } + Frame { + msec: 336 + hash: "a43c12a7d6597d171112dc43085a439e" + } + Key { + type: 6 + key: 16777249 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 352 + hash: "ad38f32755f669837ec2243e355ebc85" + } + Frame { + msec: 368 + hash: "d87bd14345c785cc7e78a5c5462b90ec" + } + Frame { + msec: 384 + hash: "77850031e012246dd967ac689e353eb3" + } + Frame { + msec: 400 + hash: "f1bd048cd9167a8f162d1c39aca4f7c1" + } + Frame { + msec: 416 + hash: "0fa030c5da23f23a0665a535e23b84a2" + } + Frame { + msec: 432 + hash: "af3a5f1982459164dfec26746172b0eb" + } + Key { + type: 6 + key: 16777248 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 448 + hash: "0de90659472b63dd41a5602197ff502e" + } + Frame { + msec: 464 + hash: "81e40abf91017614a52e03bb2474549f" + } + Frame { + msec: 480 + hash: "7bae45481596788afde8866a3c97edd7" + } + Frame { + msec: 496 + hash: "7bae45481596788afde8866a3c97edd7" + } + Key { + type: 6 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 512 + hash: "0416581d32ab84680dfc26b6f546d2c5" + } + Frame { + msec: 528 + hash: "0416581d32ab84680dfc26b6f546d2c5" + } + Frame { + msec: 544 + hash: "0416581d32ab84680dfc26b6f546d2c5" + } + Frame { + msec: 560 + hash: "0416581d32ab84680dfc26b6f546d2c5" + } + Frame { + msec: 576 + hash: "ac98b973e6d12193829139661d3e5847" + } + Frame { + msec: 592 + hash: "366907376adae4d88d42d1b9e7533ec0" + } + Frame { + msec: 608 + hash: "5f486d0a21c74f2ba50afcafa8c15453" + } + Frame { + msec: 624 + hash: "a3bf6dde525e528745272a8e43fc895c" + } + Key { + type: 7 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 640 + hash: "4ffb297d2a98a3d13b848af569b1b5b5" + } + Frame { + msec: 656 + hash: "3679a17658e417bf08fc86d4bef0d4e9" + } + Frame { + msec: 672 + hash: "5c6a25284ffd13350425e792fd143421" + } + Key { + type: 6 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 688 + hash: "09a2c1032d0206e20340ae4267525f98" + } + Frame { + msec: 704 + hash: "0036070d9a7ee854b3612858af46ab59" + } + Frame { + msec: 720 + hash: "8774509eaa5fc29385da89214ef77589" + } + Frame { + msec: 736 + hash: "6d4f8ebf046148e5079f498396c119b4" + } + Frame { + msec: 752 + hash: "4c7d5d2f77116c96357b0791348af058" + } + Frame { + msec: 768 + hash: "398c927a3525d5b90a5dd7a05ba9467b" + } + Frame { + msec: 784 + hash: "d84b45f6acb8cbd399d4ed6bf80ce132" + } + Key { + type: 7 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 800 + hash: "40c597d9e04e8e0daf62f58b9e7973b3" + } + Frame { + msec: 816 + hash: "2c7fdd47e29d924e3e008a6840e0e6be" + } + Frame { + msec: 832 + hash: "2b3229bb1aa220499114f274cf643ce9" + } + Frame { + msec: 848 + hash: "e55446874c1a343ce3607d679d69d1d4" + } + Frame { + msec: 864 + hash: "6824708eb176a9cf92f241d4054800dd" + } + Frame { + msec: 880 + hash: "d386230dd416740625eb4f677ef4531b" + } + Frame { + msec: 896 + hash: "9b2fbddab890dbe43e84e85bf320e6c1" + } + Frame { + msec: 912 + hash: "1d1065aca7eb47f0096bc2c8c4320880" + } + Frame { + msec: 928 + hash: "d97ba6e2bfc021fe993afdb5b28316ba" + } + Frame { + msec: 944 + hash: "3a3a2f340bf1ccb14eab0562d7ecfe87" + } + Frame { + msec: 960 + image: "cursorDelegate.0.png" + } + Frame { + msec: 976 + hash: "ea4f4c1de5bfb1be43ab0188afb7189c" + } + Frame { + msec: 992 + hash: "399ca2d4411d3fb226c94bd32a17d0cd" + } + Frame { + msec: 1008 + hash: "ca78503396613536c8e4076884354cb1" + } + Frame { + msec: 1024 + hash: "ca78503396613536c8e4076884354cb1" + } + Key { + type: 7 + key: 16777249 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1040 + hash: "399ca2d4411d3fb226c94bd32a17d0cd" + } + Frame { + msec: 1056 + hash: "ea4f4c1de5bfb1be43ab0188afb7189c" + } + Frame { + msec: 1072 + hash: "d23d7492b85e4f30994ecd64e8273ff6" + } + Frame { + msec: 1088 + hash: "3a3a2f340bf1ccb14eab0562d7ecfe87" + } + Frame { + msec: 1104 + hash: "d97ba6e2bfc021fe993afdb5b28316ba" + } + Frame { + msec: 1120 + hash: "1d1065aca7eb47f0096bc2c8c4320880" + } + Frame { + msec: 1136 + hash: "9b2fbddab890dbe43e84e85bf320e6c1" + } + Frame { + msec: 1152 + hash: "d386230dd416740625eb4f677ef4531b" + } + Frame { + msec: 1168 + hash: "6824708eb176a9cf92f241d4054800dd" + } + Key { + type: 6 + key: 16777234 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1184 + hash: "e8e14dbba33578a36d9c69214333c537" + } + Frame { + msec: 1200 + hash: "95c6e967f6f445748945c51943cf532f" + } + Frame { + msec: 1216 + hash: "d145d4cbd0e3a98686b3bac1c5c17093" + } + Frame { + msec: 1232 + hash: "09348a4108a585dd23c3a252a5c596f6" + } + Frame { + msec: 1248 + hash: "55126f2c879771e1aa5ced51b54c827a" + } + Frame { + msec: 1264 + hash: "ebb36a4c2fcb85107033ec2731fc5743" + } + Frame { + msec: 1280 + hash: "0581a4432d4b3d0c1555a31e772c2575" + } + Key { + type: 7 + key: 16777234 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1296 + hash: "b4030774f06935f1b43fc8f1a69e53a5" + } + Frame { + msec: 1312 + hash: "655e1739c130888ff83a3b69bb0ab7e3" + } + Frame { + msec: 1328 + hash: "99fc97c572e7c8949693b32910e6eefb" + } + Frame { + msec: 1344 + hash: "e9c8bb13c2549047c05d671daa378496" + } + Frame { + msec: 1360 + hash: "cb344e0d39b5b07ca7d094bf30ce9f53" + } + Frame { + msec: 1376 + hash: "15ba6e62c693f2bf74bdf86668139985" + } + Frame { + msec: 1392 + hash: "48133ec73eb9723059eb6e6af3139f2b" + } + Frame { + msec: 1408 + hash: "0b19e777a04f03774f2d5f5398bdb10f" + } + Frame { + msec: 1424 + hash: "fc41d9a9aedf9274a68b33603ed6ccd0" + } + Frame { + msec: 1440 + hash: "fa6e65f0c835b12dc10463711bd73350" + } + Frame { + msec: 1456 + hash: "25a02c3388e52df550a0332efde90fcd" + } + Frame { + msec: 1472 + hash: "2390443be82acf291856be59fa18fc26" + } + Frame { + msec: 1488 + hash: "2390443be82acf291856be59fa18fc26" + } + Frame { + msec: 1504 + hash: "2390443be82acf291856be59fa18fc26" + } + Frame { + msec: 1520 + hash: "2390443be82acf291856be59fa18fc26" + } + Frame { + msec: 1536 + hash: "2390443be82acf291856be59fa18fc26" + } + Frame { + msec: 1552 + hash: "2390443be82acf291856be59fa18fc26" + } + Frame { + msec: 1568 + hash: "284cd356d551a048d4a000b90217ac72" + } + Frame { + msec: 1584 + hash: "94fb20c3767e09d1b4254ee6122cf24e" + } + Frame { + msec: 1600 + hash: "bfac920384425ce9f34505b44eceb523" + } + Frame { + msec: 1616 + hash: "4a2d434efcb9a57f2013dc6b366e0e4e" + } + Frame { + msec: 1632 + hash: "d0fbe98dc34c4bb0d1ceb7e4678cc1d5" + } + Frame { + msec: 1648 + hash: "28ab147983a71e93e5610f53e14bd113" + } + Key { + type: 6 + key: 16777249 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1664 + hash: "2e6ee60fe9ff07fa4558134e6b1d6da8" + } + Frame { + msec: 1680 + hash: "f181e578e865981d7a2073080b381ec1" + } + Frame { + msec: 1696 + hash: "d7c0558ea16829b52ea6d09814c301b9" + } + Frame { + msec: 1712 + hash: "c9304cb66c04566cf4374b46ab85e6e7" + } + Frame { + msec: 1728 + hash: "024dde64822afc9eea63974851fe57e1" + } + Frame { + msec: 1744 + hash: "8e4520e95a8acc8f1d4b710c4a14898f" + } + Frame { + msec: 1760 + hash: "6b271c3f1d9d49bbd80a8ee33f3fc09c" + } + Frame { + msec: 1776 + hash: "eb76a46632856bf07b005cad2ba2f6ab" + } + Key { + type: 6 + key: 16777234 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1792 + hash: "a29bd83f6b4e877f3c7b89c82dfcab54" + } + Frame { + msec: 1808 + hash: "dca39b6b6fff5e4a6309e4c0e42811c0" + } + Frame { + msec: 1824 + hash: "88ad3f9f638a97bed98f00ec7d78dfe4" + } + Frame { + msec: 1840 + hash: "5697a705f36283213bbe4b5848baa764" + } + Frame { + msec: 1856 + hash: "8850842afae3060a91d612f7b869fd48" + } + Frame { + msec: 1872 + hash: "4f08dbd1cab0bfcc8b9f232d46cf42db" + } + Frame { + msec: 1888 + hash: "f7df5b96d0983a918e3c81aa7bee3950" + } + Frame { + msec: 1904 + hash: "b28681bcb414d428588acda377fef838" + } + Key { + type: 7 + key: 16777234 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1920 + image: "cursorDelegate.1.png" + } + Frame { + msec: 1936 + hash: "5c154b54776ed555563d3e5196a8aedd" + } + Frame { + msec: 1952 + hash: "ee64c0452b325880de3a4fea599c18cc" + } + Frame { + msec: 1968 + hash: "0776e1557b2d32db1c7c43331c532331" + } + Frame { + msec: 1984 + hash: "24b68da9a63bbf00ffffeca649f771fa" + } + Frame { + msec: 2000 + hash: "00d49d91b51f5bd428c07e9be65f551a" + } + Frame { + msec: 2016 + hash: "874d4b599cb92cd9160960e3b3af74e0" + } + Frame { + msec: 2032 + hash: "00d49d91b51f5bd428c07e9be65f551a" + } + Frame { + msec: 2048 + hash: "24b68da9a63bbf00ffffeca649f771fa" + } + Frame { + msec: 2064 + hash: "0776e1557b2d32db1c7c43331c532331" + } + Frame { + msec: 2080 + hash: "ee64c0452b325880de3a4fea599c18cc" + } + Frame { + msec: 2096 + hash: "5c154b54776ed555563d3e5196a8aedd" + } + Frame { + msec: 2112 + hash: "a5f90da82b51bc866648304a20a1dcd3" + } + Frame { + msec: 2128 + hash: "b28681bcb414d428588acda377fef838" + } + Frame { + msec: 2144 + hash: "f7df5b96d0983a918e3c81aa7bee3950" + } + Frame { + msec: 2160 + hash: "4f08dbd1cab0bfcc8b9f232d46cf42db" + } + Frame { + msec: 2176 + hash: "8850842afae3060a91d612f7b869fd48" + } + Frame { + msec: 2192 + hash: "5697a705f36283213bbe4b5848baa764" + } + Frame { + msec: 2208 + hash: "88ad3f9f638a97bed98f00ec7d78dfe4" + } + Frame { + msec: 2224 + hash: "dca39b6b6fff5e4a6309e4c0e42811c0" + } + Key { + type: 7 + key: 16777248 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2240 + hash: "a29bd83f6b4e877f3c7b89c82dfcab54" + } + Frame { + msec: 2256 + hash: "7defd2ecefeb86b457a2ee76d97424ee" + } + Frame { + msec: 2272 + hash: "ccf6d45e8822d72482d9b585909b612b" + } + Frame { + msec: 2288 + hash: "996dddf091394513adda1b1f00bf0c68" + } + Frame { + msec: 2304 + hash: "3cf94e90eddb4b0815762b89f58f8325" + } + Frame { + msec: 2320 + hash: "ab9f876450526b37774c6c4a5794c7b1" + } + Frame { + msec: 2336 + hash: "9109880e9201e92eb17ae87a3648dca7" + } + Frame { + msec: 2352 + hash: "0e759f2f279057c1f4d1147be5b41214" + } + Key { + type: 6 + key: 16777234 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2368 + hash: "d87bd14345c785cc7e78a5c5462b90ec" + } + Frame { + msec: 2384 + hash: "77850031e012246dd967ac689e353eb3" + } + Frame { + msec: 2400 + hash: "f1bd048cd9167a8f162d1c39aca4f7c1" + } + Frame { + msec: 2416 + hash: "0fa030c5da23f23a0665a535e23b84a2" + } + Frame { + msec: 2432 + hash: "af3a5f1982459164dfec26746172b0eb" + } + Frame { + msec: 2448 + hash: "0de90659472b63dd41a5602197ff502e" + } + Frame { + msec: 2464 + hash: "81e40abf91017614a52e03bb2474549f" + } + Frame { + msec: 2480 + hash: "7bae45481596788afde8866a3c97edd7" + } + Key { + type: 7 + key: 16777234 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2496 + hash: "7bae45481596788afde8866a3c97edd7" + } + Frame { + msec: 2512 + hash: "7bae45481596788afde8866a3c97edd7" + } + Frame { + msec: 2528 + hash: "7bae45481596788afde8866a3c97edd7" + } + Frame { + msec: 2544 + hash: "7bae45481596788afde8866a3c97edd7" + } + Frame { + msec: 2560 + hash: "7bae45481596788afde8866a3c97edd7" + } + Frame { + msec: 2576 + hash: "e26dbfb26415b21198add56d5de02cb2" + } + Frame { + msec: 2592 + hash: "fa2877a963417789b82170b32e0af7a0" + } + Frame { + msec: 2608 + hash: "860b39f92c412a7d946f882d8f99d837" + } + Frame { + msec: 2624 + hash: "d7b8c52aef183965a97d82a18b03ed94" + } + Frame { + msec: 2640 + hash: "b1ce9cf0ebd8e1e783e5bd43bbd72072" + } + Frame { + msec: 2656 + hash: "d214b419ec5b4cff8f877bdeb1b9ef96" + } + Frame { + msec: 2672 + hash: "95e7057104508b3919d722d4befde7b7" + } + Frame { + msec: 2688 + hash: "270489ec5da5bf9a93fa4e52f47a71f5" + } + Frame { + msec: 2704 + hash: "46646e396ab0c1c20427dadd71d45ba9" + } + Frame { + msec: 2720 + hash: "65e2fd167565f876310d56fa9203c118" + } + Frame { + msec: 2736 + hash: "aff0da79bd9bd8c285139d7737a1316f" + } + Frame { + msec: 2752 + hash: "bf264fe7d774a597a3ff0965d912fa90" + } + Frame { + msec: 2768 + hash: "f00358343437f6e058848c7237601632" + } + Frame { + msec: 2784 + hash: "88c9e1d58397a81ed23931c7fdae1e7d" + } + Frame { + msec: 2800 + hash: "44d46b459f6bb89510e52b0d999fd499" + } + Frame { + msec: 2816 + hash: "0c196a24c9ca7143d382688db678d855" + } + Frame { + msec: 2832 + hash: "9df6d3d3b9981cb907ab89e65b743e97" + } + Frame { + msec: 2848 + hash: "501a644d6cde64ad041b086e00fd3950" + } + Key { + type: 6 + key: 16777236 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2864 + hash: "83f297406b1c6311da3a216024836d15" + } + Frame { + msec: 2880 + image: "cursorDelegate.2.png" + } + Frame { + msec: 2896 + hash: "93f79f8717948bde8ee55c668af2d397" + } + Frame { + msec: 2912 + hash: "881b5c2ccd0bbdaea4d61abbec600fc5" + } + Frame { + msec: 2928 + hash: "be72fe7c27901db62f2dbd9a757e4838" + } + Frame { + msec: 2944 + hash: "c83c973fb1253ccab333fb1e604155b8" + } + Frame { + msec: 2960 + hash: "dd6072d204812c23e24db1e7a81c6f57" + } + Frame { + msec: 2976 + hash: "fb342743dc5ab9ade2b8a48a2a11dc8f" + } + Key { + type: 7 + key: 16777236 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2992 + hash: "fc8ede705bfe8f339fe47041c502b0d6" + } + Frame { + msec: 3008 + hash: "00fa0306d3fdc7e384cfc0660a3a355d" + } + Frame { + msec: 3024 + hash: "00fa0306d3fdc7e384cfc0660a3a355d" + } + Frame { + msec: 3040 + hash: "fc8ede705bfe8f339fe47041c502b0d6" + } + Frame { + msec: 3056 + hash: "fb342743dc5ab9ade2b8a48a2a11dc8f" + } + Frame { + msec: 3072 + hash: "dd6072d204812c23e24db1e7a81c6f57" + } + Frame { + msec: 3088 + hash: "c83c973fb1253ccab333fb1e604155b8" + } + Frame { + msec: 3104 + hash: "be72fe7c27901db62f2dbd9a757e4838" + } + Frame { + msec: 3120 + hash: "881b5c2ccd0bbdaea4d61abbec600fc5" + } + Frame { + msec: 3136 + hash: "93f79f8717948bde8ee55c668af2d397" + } + Frame { + msec: 3152 + hash: "1bb236db749ef514c00d0a3dd698d24f" + } + Frame { + msec: 3168 + hash: "83f297406b1c6311da3a216024836d15" + } + Frame { + msec: 3184 + hash: "3d284b4000d2849ed4af2f7c1b859492" + } + Frame { + msec: 3200 + hash: "de315e6836334fd0a2da855f5be4ff30" + } + Frame { + msec: 3216 + hash: "5ca117709284f4a1cbd64cdba4079340" + } + Key { + type: 6 + key: 16777236 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3232 + hash: "308a4220f5c74fd56bd218cd695b9822" + } + Frame { + msec: 3248 + hash: "4ac4e09e987f2ba9661ed52fb1bdf236" + } + Frame { + msec: 3264 + hash: "9ffd39a8a540ec88ff2b20a16ef083ee" + } + Frame { + msec: 3280 + hash: "4a36ed8e68811954fef171d5734ccbaf" + } + Frame { + msec: 3296 + hash: "714a6231aca70cfa8e83ea71b7ae90dc" + } + Frame { + msec: 3312 + hash: "1fa9e35449ee87c972e3189ad0651a68" + } + Frame { + msec: 3328 + hash: "d602008fada2f4edb6ad00fe759f9db9" + } + Key { + type: 7 + key: 16777236 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3344 + hash: "bf16cc38f109e761b5ac2b0c63a1a2fe" + } + Frame { + msec: 3360 + hash: "30f26041533455ed92c4984f55e3c6ff" + } + Frame { + msec: 3376 + hash: "5838d666902bc693de505522dad13254" + } + Frame { + msec: 3392 + hash: "6c8ada09b627050e4340da6e8ddd646e" + } + Frame { + msec: 3408 + hash: "b33cd5bbb90d435dd7ea3ab67bef88ee" + } + Frame { + msec: 3424 + hash: "692d4029938c01044b4210958dd1ee7e" + } + Frame { + msec: 3440 + hash: "7e2e55555ee2c7e172e61ddb6365355d" + } + Frame { + msec: 3456 + hash: "87ca0584879b25336a1023ac3252fc9a" + } + Frame { + msec: 3472 + hash: "7bae45481596788afde8866a3c97edd7" + } + Frame { + msec: 3488 + hash: "7bae45481596788afde8866a3c97edd7" + } + Frame { + msec: 3504 + hash: "7bae45481596788afde8866a3c97edd7" + } + Frame { + msec: 3520 + hash: "7bae45481596788afde8866a3c97edd7" + } + Frame { + msec: 3536 + hash: "7bae45481596788afde8866a3c97edd7" + } + Frame { + msec: 3552 + hash: "7bae45481596788afde8866a3c97edd7" + } + Frame { + msec: 3568 + hash: "8c6052eb4cf03d7742a73874d9f15285" + } + Frame { + msec: 3584 + hash: "8a1b63c42867f87a1cf4b47944b3860a" + } + Frame { + msec: 3600 + hash: "90712efd7c17b0ad33d2c2c02e9eaa97" + } + Frame { + msec: 3616 + hash: "8099972420ffd03e2bfc3ea45918a543" + } + Frame { + msec: 3632 + hash: "2b78b1179a34319c287a6659406e23c3" + } + Frame { + msec: 3648 + hash: "ad9458ab4d6376c87350a2356c280f94" + } + Frame { + msec: 3664 + hash: "a74bc230e310a2826b2fed962db22f7a" + } + Frame { + msec: 3680 + hash: "bd72e8f4757050c41673a6f0d38f2285" + } + Frame { + msec: 3696 + hash: "379bad4fa4b605cb6a16434bdb031e2b" + } + Frame { + msec: 3712 + hash: "e144a8e9586f29f9b2f042b47e7739ae" + } + Frame { + msec: 3728 + hash: "bd74c9e79bc1a88dd6a17a3aed21e368" + } + Key { + type: 6 + key: 16777234 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3744 + hash: "144724168f42372e10ec6c39662a5ed8" + } + Frame { + msec: 3760 + hash: "d8859888802e7b54e2d2a44cf252eb54" + } + Frame { + msec: 3776 + hash: "20561e2faf7e8fe1d6337248e6cd5e94" + } + Frame { + msec: 3792 + hash: "184cff262d1004ce702c117a6b5b9699" + } + Frame { + msec: 3808 + hash: "61b156acacefa6e4f4ddd8adaca90d08" + } + Frame { + msec: 3824 + hash: "0906852b1e62a936694a22d6ffa4f5dd" + } + Frame { + msec: 3840 + image: "cursorDelegate.3.png" + } + Key { + type: 7 + key: 16777234 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3856 + hash: "cc0fb2ae2dd1ccad94c453bc4c4b6d32" + } + Frame { + msec: 3872 + hash: "6a6baee5ca76d331c47fca4d0f7168e5" + } + Frame { + msec: 3888 + hash: "32032d7ce55af41c97ac5bf33aca40bb" + } + Frame { + msec: 3904 + hash: "a8781226e5e494324a34e120aa446cd1" + } + Frame { + msec: 3920 + hash: "0dd5df088fcc0228a97ffe715c95e2b6" + } + Frame { + msec: 3936 + hash: "774b161fe9645bc69b89e580b3e41f71" + } + Frame { + msec: 3952 + hash: "5756d7ffd8ff656db54f4329ea909553" + } + Frame { + msec: 3968 + hash: "2b4a5c97ff4d8792a7706bb78385ec35" + } + Frame { + msec: 3984 + hash: "f9765e4def564b64861402e1a873b169" + } + Frame { + msec: 4000 + hash: "287b07ef6288dcea13fffd2b95aafd54" + } + Frame { + msec: 4016 + hash: "7abcb9d6cf223c1655f6265f780a321a" + } + Frame { + msec: 4032 + hash: "287b07ef6288dcea13fffd2b95aafd54" + } + Frame { + msec: 4048 + hash: "f9765e4def564b64861402e1a873b169" + } + Frame { + msec: 4064 + hash: "2b4a5c97ff4d8792a7706bb78385ec35" + } + Key { + type: 7 + key: 16777249 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 4080 + hash: "5756d7ffd8ff656db54f4329ea909553" + } + Frame { + msec: 4096 + hash: "774b161fe9645bc69b89e580b3e41f71" + } + Frame { + msec: 4112 + hash: "0dd5df088fcc0228a97ffe715c95e2b6" + } + Frame { + msec: 4128 + hash: "a8781226e5e494324a34e120aa446cd1" + } + Frame { + msec: 4144 + hash: "32032d7ce55af41c97ac5bf33aca40bb" + } + Frame { + msec: 4160 + hash: "6a6baee5ca76d331c47fca4d0f7168e5" + } + Frame { + msec: 4176 + hash: "cc0fb2ae2dd1ccad94c453bc4c4b6d32" + } + Frame { + msec: 4192 + hash: "2d1b406be294727a278ba6bbc97be62a" + } + Frame { + msec: 4208 + hash: "0906852b1e62a936694a22d6ffa4f5dd" + } + Frame { + msec: 4224 + hash: "61b156acacefa6e4f4ddd8adaca90d08" + } + Frame { + msec: 4240 + hash: "184cff262d1004ce702c117a6b5b9699" + } + Frame { + msec: 4256 + hash: "20561e2faf7e8fe1d6337248e6cd5e94" + } + Frame { + msec: 4272 + hash: "d8859888802e7b54e2d2a44cf252eb54" + } + Frame { + msec: 4288 + hash: "144724168f42372e10ec6c39662a5ed8" + } + Frame { + msec: 4304 + hash: "d2da36fbf73289f545133bd608af66a2" + } + Frame { + msec: 4320 + hash: "b1d7da6b42a31bba91148ab37b111945" + } + Frame { + msec: 4336 + hash: "6f226a3b20d95e17df69e2c4e5aff3d1" + } + Frame { + msec: 4352 + hash: "1109da0f043a9418661fc05e53fe3b45" + } + Frame { + msec: 4368 + hash: "f3e901db9efd1d9fadf1cb6858040d51" + } + Frame { + msec: 4384 + hash: "c8e50c0e924b11a3f1943abb9a4008a4" + } + Frame { + msec: 4400 + hash: "431226a27488ed1dba237de3d43f94c5" + } + Frame { + msec: 4416 + hash: "420d316430c84f10d7cd24d29b918149" + } + Frame { + msec: 4432 + hash: "ccbd4d1e4865ebd9b0fe923e6ab05e5c" + } + Frame { + msec: 4448 + hash: "231bff73758a1c6f7c7c0365159ba3e6" + } + Frame { + msec: 4464 + hash: "d1ac7ceda7303bbf3392d33f47037ed6" + } + Frame { + msec: 4480 + hash: "7bae45481596788afde8866a3c97edd7" + } + Frame { + msec: 4496 + hash: "7bae45481596788afde8866a3c97edd7" + } + Frame { + msec: 4512 + hash: "7bae45481596788afde8866a3c97edd7" + } + Frame { + msec: 4528 + hash: "7bae45481596788afde8866a3c97edd7" + } + Frame { + msec: 4544 + hash: "7bae45481596788afde8866a3c97edd7" + } + Frame { + msec: 4560 + hash: "7bae45481596788afde8866a3c97edd7" + } + Frame { + msec: 4576 + hash: "a2ad07326fafcb3012cdb869f39af466" + } + Frame { + msec: 4592 + hash: "8622eb25a6da44926b5161bce213a483" + } + Frame { + msec: 4608 + hash: "fe563aa9dae9655871f82a779063cdbd" + } + Frame { + msec: 4624 + hash: "775cd79b012f79b773449a0ad8457149" + } + Frame { + msec: 4640 + hash: "01e9fab344a148a0877a7332d561be5a" + } + Frame { + msec: 4656 + hash: "935566d139599a30197850774fb059ba" + } + Frame { + msec: 4672 + hash: "4aae1ac532624417decddd978f516b6e" + } + Frame { + msec: 4688 + hash: "34dc78df6e9941988712c1f8f79c3db0" + } + Frame { + msec: 4704 + hash: "23a96c11d5917c44bd48239ed2b5777f" + } + Frame { + msec: 4720 + hash: "f8f13e097eae3152db3ccebff1343fe0" + } + Frame { + msec: 4736 + hash: "02f8fca7c4ab80ecf425e4b39e966b86" + } + Frame { + msec: 4752 + hash: "c3356367750e797ff81bc4102f948134" + } + Frame { + msec: 4768 + hash: "7b5de3772b8bcb4b10f3d265d5603afb" + } + Frame { + msec: 4784 + hash: "ed3c741639232377f61867fd353ce58a" + } + Frame { + msec: 4800 + image: "cursorDelegate.4.png" + } + Frame { + msec: 4816 + hash: "5ca117709284f4a1cbd64cdba4079340" + } + Frame { + msec: 4832 + hash: "de315e6836334fd0a2da855f5be4ff30" + } + Frame { + msec: 4848 + hash: "3d284b4000d2849ed4af2f7c1b859492" + } + Frame { + msec: 4864 + hash: "83f297406b1c6311da3a216024836d15" + } + Frame { + msec: 4880 + hash: "1bb236db749ef514c00d0a3dd698d24f" + } + Frame { + msec: 4896 + hash: "93f79f8717948bde8ee55c668af2d397" + } + Frame { + msec: 4912 + hash: "881b5c2ccd0bbdaea4d61abbec600fc5" + } + Frame { + msec: 4928 + hash: "be72fe7c27901db62f2dbd9a757e4838" + } + Frame { + msec: 4944 + hash: "c83c973fb1253ccab333fb1e604155b8" + } + Frame { + msec: 4960 + hash: "dd6072d204812c23e24db1e7a81c6f57" + } + Frame { + msec: 4976 + hash: "fb342743dc5ab9ade2b8a48a2a11dc8f" + } + Frame { + msec: 4992 + hash: "fc8ede705bfe8f339fe47041c502b0d6" + } + Frame { + msec: 5008 + hash: "00fa0306d3fdc7e384cfc0660a3a355d" + } + Frame { + msec: 5024 + hash: "00fa0306d3fdc7e384cfc0660a3a355d" + } + Frame { + msec: 5040 + hash: "fc8ede705bfe8f339fe47041c502b0d6" + } + Frame { + msec: 5056 + hash: "fb342743dc5ab9ade2b8a48a2a11dc8f" + } + Frame { + msec: 5072 + hash: "dd6072d204812c23e24db1e7a81c6f57" + } + Frame { + msec: 5088 + hash: "c83c973fb1253ccab333fb1e604155b8" + } + Frame { + msec: 5104 + hash: "be72fe7c27901db62f2dbd9a757e4838" + } + Frame { + msec: 5120 + hash: "881b5c2ccd0bbdaea4d61abbec600fc5" + } + Frame { + msec: 5136 + hash: "93f79f8717948bde8ee55c668af2d397" + } + Frame { + msec: 5152 + hash: "1bb236db749ef514c00d0a3dd698d24f" + } + Frame { + msec: 5168 + hash: "83f297406b1c6311da3a216024836d15" + } + Frame { + msec: 5184 + hash: "3d284b4000d2849ed4af2f7c1b859492" + } + Frame { + msec: 5200 + hash: "de315e6836334fd0a2da855f5be4ff30" + } + Frame { + msec: 5216 + hash: "5ca117709284f4a1cbd64cdba4079340" + } + Frame { + msec: 5232 + hash: "4f0d49aff27a1c83287d38e760c10f16" + } + Frame { + msec: 5248 + hash: "ed3c741639232377f61867fd353ce58a" + } + Frame { + msec: 5264 + hash: "7b5de3772b8bcb4b10f3d265d5603afb" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.0.png new file mode 100644 index 00000000..431bed84 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.1.png new file mode 100644 index 00000000..d8d6bac2 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.2.png new file mode 100644 index 00000000..27e02e5c Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.3.png new file mode 100644 index 00000000..00549b39 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.4.png new file mode 100644 index 00000000..5c2a8854 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.5.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.5.png new file mode 100644 index 00000000..5c2a8854 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.5.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.6.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.6.png new file mode 100644 index 00000000..fd7f0104 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.6.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.qml new file mode 100644 index 00000000..dff54520 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/flickableEdit.qml @@ -0,0 +1,3551 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "flickableEdit.0.png" + } + Frame { + msec: 32 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 48 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 64 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 80 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 96 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 112 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 128 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 144 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 160 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 176 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 192 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 208 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 224 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 240 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 256 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 272 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 288 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 304 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 320 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 336 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 352 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 368 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 384 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 400 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 416 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 432 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 448 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 464 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 480 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 496 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 512 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 528 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 544 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 560 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 576 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 592 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 608 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 624 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 640 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 656 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 672 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 688 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 704 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 720 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 736 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 752 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 768 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 784 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 800 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 816 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 832 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 848 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 864 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 880 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 896 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 29; y: 12 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 912 + hash: "1a426d2b8854412a3c91f927588f63ce" + } + Frame { + msec: 928 + hash: "1a426d2b8854412a3c91f927588f63ce" + } + Frame { + msec: 944 + hash: "1a426d2b8854412a3c91f927588f63ce" + } + Frame { + msec: 960 + hash: "1a426d2b8854412a3c91f927588f63ce" + } + Frame { + msec: 976 + image: "flickableEdit.1.png" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 30; y: 12 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 32; y: 12 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 992 + hash: "1a426d2b8854412a3c91f927588f63ce" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 33; y: 12 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 34; y: 12 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1008 + hash: "1a426d2b8854412a3c91f927588f63ce" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 36; y: 12 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 39; y: 12 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1024 + hash: "4626e25f67dfd0fe3846322455762b3b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 41; y: 11 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 44; y: 11 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1040 + hash: "4626e25f67dfd0fe3846322455762b3b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 47; y: 11 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 50; y: 11 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1056 + hash: "e506425ea4a8eb6d94442ac0bccd0911" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 53; y: 11 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 56; y: 10 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1072 + hash: "3c45be5d00748154f9abce8d525b5791" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 58; y: 10 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 61; y: 10 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1088 + hash: "3e33ff0dfd478bad91472fa2bb4908a0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 64; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 66; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1104 + hash: "3e33ff0dfd478bad91472fa2bb4908a0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 69; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 71; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1120 + hash: "e8e7e98f3d7dbcdb4040ae81ef656e02" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 73; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 75; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1136 + hash: "e8e7e98f3d7dbcdb4040ae81ef656e02" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 78; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 80; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1152 + hash: "309c25ff85a361dfebd6464984fd9d79" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 83; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 85; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1168 + hash: "4b4fc7d9263af761222bb23f41021731" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 87; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 90; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1184 + hash: "4b4fc7d9263af761222bb23f41021731" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 93; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 96; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1200 + hash: "bd00eeda31cfc8d59a2c9677e771dadb" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 99; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 103; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1216 + hash: "adce307d674b8425fa39b69958d6acc5" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 106; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 111; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1232 + hash: "36e04d9124f32a21784f3017cc26ee71" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 114; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 116; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1248 + hash: "36e04d9124f32a21784f3017cc26ee71" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 119; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 122; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1264 + hash: "c6548ac358dd0eb4fa07ed305039d4e2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 124; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 126; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1280 + hash: "a0c4b8e21b0b04edaf7b32b2ab40edb2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 128; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 130; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1296 + hash: "a0c4b8e21b0b04edaf7b32b2ab40edb2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 132; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 134; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1312 + hash: "d32fb36408859c35dacc5787374b6ae4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 136; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 137; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1328 + hash: "d32fb36408859c35dacc5787374b6ae4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 139; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 141; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1344 + hash: "d32fb36408859c35dacc5787374b6ae4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 143; y: 8 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 144; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1360 + hash: "90f44df899138e894b1a7e42657b8331" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 146; y: 8 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 147; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1376 + hash: "90f44df899138e894b1a7e42657b8331" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 148; y: 8 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 149; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1392 + hash: "8ec6bb08aac10a622df934421f64beb4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 150; y: 8 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 151; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1408 + hash: "d4e52b7ca07033e4f2124607454fd81b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 152; y: 8 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 154; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1424 + hash: "499d7c3d9cfb35db68f6eece23130e6b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 155; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1440 + hash: "499d7c3d9cfb35db68f6eece23130e6b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 157; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1456 + hash: "3ea13a21a5bbe336408c76ab17ff4268" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 158; y: 8 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 160; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1472 + hash: "3ea13a21a5bbe336408c76ab17ff4268" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 161; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1488 + hash: "3ea13a21a5bbe336408c76ab17ff4268" + } + Frame { + msec: 1504 + hash: "3ea13a21a5bbe336408c76ab17ff4268" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 162; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1520 + hash: "3ea13a21a5bbe336408c76ab17ff4268" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 164; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1536 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 165; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1552 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 167; y: 8 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 168; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1568 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 169; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1584 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1600 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 170; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1616 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1632 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1648 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1664 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1680 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1696 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1712 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1728 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1744 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1760 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1776 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1792 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1808 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1824 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1840 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 170; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1856 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1872 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1888 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1904 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 1920 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 1936 + image: "flickableEdit.2.png" + } + Frame { + msec: 1952 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 1968 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 1984 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2000 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2016 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2032 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2048 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2064 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2080 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2096 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2112 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2128 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2144 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2160 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2176 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2192 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2208 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2224 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2240 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2256 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2272 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2288 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2304 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2320 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2336 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2352 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2368 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2384 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2400 + hash: "4b8bc23e0153e6925c3e3a065fcc8dcd" + } + Frame { + msec: 2416 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2432 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2448 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2464 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2480 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2496 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2512 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2528 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2544 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2560 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2576 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2592 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2608 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2624 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2640 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2656 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2672 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2688 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Frame { + msec: 2704 + hash: "06bc360da9134471bf6e8e6ff36cbaa4" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 21; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2720 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Frame { + msec: 2736 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Frame { + msec: 2752 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Frame { + msec: 2768 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Frame { + msec: 2784 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Frame { + msec: 2800 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Frame { + msec: 2816 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Frame { + msec: 2832 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Frame { + msec: 2848 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Frame { + msec: 2864 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Frame { + msec: 2880 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Frame { + msec: 2896 + image: "flickableEdit.3.png" + } + Frame { + msec: 2912 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Frame { + msec: 2928 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 22; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2944 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Frame { + msec: 2960 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 23; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2976 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Frame { + msec: 2992 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 24; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3008 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 25; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3024 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 26; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3040 + hash: "9d2c8b1f0f7da6a4914a54cf76393861" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 27; y: 29 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 29; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3056 + hash: "e5daa45e1d798fdf2562dbb9a1a2c97b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 30; y: 29 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 31; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3072 + hash: "698b572adf95ddc235b781b126a1cc10" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 33; y: 29 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 35; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3088 + hash: "7a87fe9484b00f8c7039e3129fc24fb5" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 37; y: 29 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 40; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3104 + hash: "2f17e7980a28789d0f262e3682c2da27" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 42; y: 29 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 45; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3120 + hash: "0757f4c05233a25e6a8825b2c6052d8d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 49; y: 29 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 52; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3136 + hash: "799da712f376033efdbaf9a342e4bc3f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 55; y: 29 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 58; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3152 + hash: "bf7b2a29664fe4acf52d56c73cf079b1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 62; y: 29 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 66; y: 30 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3168 + hash: "7928b280e7a9ab89217c9abf3b709cd2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 69; y: 30 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 72; y: 30 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3184 + hash: "3102339f3e18640f6b508e88aafefb79" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 75; y: 30 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 78; y: 30 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3200 + hash: "98cddfbea5b96f9dd08c5a3655155d35" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 81; y: 30 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 84; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3216 + hash: "5604b2f85c3a90f8b29da3fec2f6c509" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 87; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 91; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3232 + hash: "5ca4055c8dded5d30c326d6d304da28d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 94; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 97; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3248 + hash: "b0afe256f8f89a77a5fa87c023cda469" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 101; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 104; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3264 + hash: "d7408be78c80e2b6e5848ee696a79ee0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 108; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 111; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3280 + hash: "f7e12621527fd52e21595cfbf804879c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 115; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 118; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3296 + hash: "6b8c9413ba1a791e42b06aaa711cdb4e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 122; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 127; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3312 + hash: "1c80e0f89033dedc66b236561042f4f6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 131; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 135; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3328 + hash: "6ec06d8844ff57e34af5316895250858" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 140; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 146; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3344 + hash: "f3c0159243555e919fd736866b00a5ab" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 151; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 157; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3360 + hash: "973ced5d6155240490acd6241610429d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 164; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 169; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3376 + hash: "0aee5feb94508f70c62cc3255c53bc8a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 175; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 182; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3392 + hash: "840cc661a50dd8bc1af8f6d53ccbece5" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 187; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 191; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3408 + hash: "34a470358ccfb7592cf47399ab6dbc19" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 195; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 198; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3424 + hash: "25c53ff3977ca8422c545c1608782833" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 202; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 205; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3440 + hash: "d4388550549d54e31640cda4672c3bfb" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 209; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 213; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3456 + hash: "8904c3b225a5e732fca4fc605d0fc12a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 216; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 219; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3472 + hash: "415a630fc6a963e99a0e13bf5e461849" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 223; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 226; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3488 + hash: "1526e90e0345e20a3455554c8f249de7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 229; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 233; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3504 + hash: "2b215748d63e505469d343919b245af9" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 235; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 238; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3520 + hash: "6821e559cb1e45b0cd731c90c3b16934" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 241; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 243; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3536 + hash: "334ddaa8c2cd0506528fe20a21991b03" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 245; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 247; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3552 + hash: "6e651889e91d3de96d9aaf91f4ed9a2c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 250; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 251; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3568 + hash: "0554f22d8079ef0213dc25f9f1b59055" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 252; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 253; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3584 + hash: "1eb0805e4c706af1c7cfa113d32edda1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 255; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 256; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3600 + hash: "482f30ca992e9f92241523a47125d9b4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 257; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 259; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3616 + hash: "6b2bec317fad51fe85bab6a00ced9655" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 261; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 262; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3632 + hash: "acc661684f507375518fc73fe081f61e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 263; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 265; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3648 + hash: "f77143d0d7a3cf8c0163bf950940ad07" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 266; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 267; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3664 + hash: "8d0407ae3f55305e1d9780deaa30c064" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 268; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3680 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 3696 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 3712 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 3728 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 3744 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 3760 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 3776 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 3792 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 3808 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 3824 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 3840 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 3856 + image: "flickableEdit.4.png" + } + Frame { + msec: 3872 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 3888 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 3904 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 3920 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 3936 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 3952 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 3968 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 3984 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4000 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4016 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4032 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4048 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4064 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4080 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4096 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4112 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4128 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4144 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4160 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4176 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4192 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4208 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4224 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4240 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4256 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4272 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4288 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4304 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4320 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4336 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4352 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4368 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4384 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4400 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4416 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4432 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4448 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4464 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4480 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4496 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4512 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4528 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4544 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4560 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4576 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4592 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4608 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4624 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4640 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4656 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4672 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4688 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4704 + hash: "c536946f28abb221cc38d6f438887e17" + } + Frame { + msec: 4720 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4736 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4752 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4768 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4784 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4800 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4816 + image: "flickableEdit.5.png" + } + Frame { + msec: 4832 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4848 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4864 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Frame { + msec: 4880 + hash: "91bd6701cbb1e836a01d1619e0421503" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 266; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4896 + hash: "e5a6693779ffb4e8a333756690a8f9e0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 264; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 262; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4912 + hash: "6acabe70146611091621ef5079cc97ec" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 259; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 256; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4928 + hash: "f75b5eaa04bfec866f088f665edb225e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 253; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 249; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4944 + hash: "1888acd9f3e48348c22e324d67ab2724" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 245; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 240; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4960 + hash: "cd24be347f20371f9d0796fa4a38ad0c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 235; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 231; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4976 + hash: "f39bc67a8e83340f8e89cf11c89fb27c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 227; y: 30 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 222; y: 30 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4992 + hash: "80d8019485231c061ba1cf81fd4c42ca" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 217; y: 30 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 213; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5008 + hash: "72893900dfd007ea25a7d75982be6320" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 207; y: 29 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 203; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5024 + hash: "f3d02c4d2f0b8b75b0b6159c0ba8f4db" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 199; y: 28 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 195; y: 28 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5040 + hash: "8ecdf1325bb2084bf6212216bd86b324" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 190; y: 27 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 186; y: 27 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5056 + hash: "be5c62268b337c9d7f69ab01b02c816d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 182; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 178; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5072 + hash: "a0eea6c818a1cb71809aff4613e9655d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 175; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 171; y: 25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5088 + hash: "27fcf1d4cd00dc7ac54fa92f9c7e2ac2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 168; y: 25 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 165; y: 24 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5104 + hash: "32f6bdc5e2f6ce34436a21dd8ee348dd" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 162; y: 24 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 159; y: 24 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5120 + hash: "4c11c9075429acd4acddc6ede4e5fe69" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 154; y: 23 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 151; y: 23 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5136 + hash: "8fdaf03e0b03698613092303945787d4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 148; y: 23 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 145; y: 22 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5152 + hash: "d9bc269f21d5eade8bb9555d05a86744" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 142; y: 22 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 138; y: 22 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5168 + hash: "f9dd0735682dba198febffcc85c9835a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 135; y: 21 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 131; y: 21 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5184 + hash: "a98869bb654e3b4c1f4d9d0e7e24197a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 128; y: 21 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 124; y: 20 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5200 + hash: "50ceb9d6d58129b71009079a0028e7c4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 121; y: 20 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 118; y: 20 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5216 + hash: "6b8c9413ba1a791e42b06aaa711cdb4e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 114; y: 20 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 111; y: 20 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5232 + hash: "f7e12621527fd52e21595cfbf804879c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 108; y: 20 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 105; y: 19 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5248 + hash: "d7408be78c80e2b6e5848ee696a79ee0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 103; y: 19 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 99; y: 19 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5264 + hash: "e648f25a978b9f14cf71d5f1d90edf15" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 96; y: 19 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 93; y: 19 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5280 + hash: "64ce73aa32f2c08f4cee9a35a103a1d0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 91; y: 19 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 88; y: 19 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5296 + hash: "1db1d100eb1f97a7c85ab8df3e558188" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 86; y: 18 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 84; y: 18 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5312 + hash: "5604b2f85c3a90f8b29da3fec2f6c509" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 81; y: 18 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 79; y: 17 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5328 + hash: "fb57c6295d512821945754020ea6a3ce" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 77; y: 17 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 75; y: 17 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5344 + hash: "14dfd5b78901c9f63e4f5d0889f77805" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 73; y: 17 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 72; y: 17 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5360 + hash: "cc105198e78269be1240785b791c8612" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 69; y: 17 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 67; y: 17 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5376 + hash: "1ef97830b4f1be66a4f443ee4573547b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 66; y: 17 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 64; y: 17 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5392 + hash: "0ef86edc381e75c39ba067404817edb8" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 63; y: 17 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 60; y: 17 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5408 + hash: "6a7605f59eb364fbc166aeea7b54695a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 59; y: 17 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 57; y: 17 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5424 + hash: "e86bb3698ad8b46e70237088ea056ab0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 55; y: 17 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 53; y: 17 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5440 + hash: "56db36cde05d74d6bf8eec0b21515b20" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 51; y: 17 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 49; y: 17 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5456 + hash: "05adc602e827635ca43c0cff2b5b857d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 47; y: 18 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 45; y: 18 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5472 + hash: "cbdcdf9b7e640a79e2269247bb4d6cc2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: 18 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 41; y: 19 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5488 + hash: "bc014e9feb5e69c4042385a6753d1884" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 38; y: 19 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 37; y: 19 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5504 + hash: "544e9ddbedae500955e6cec79eae709c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 35; y: 20 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 33; y: 20 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5520 + hash: "ec17a9dba3846c1919b67eaf3d234471" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 30; y: 20 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 28; y: 20 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5536 + hash: "8ab538f8baa170798c93e6eb4d5441f8" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 27; y: 20 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 26; y: 20 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5552 + hash: "1b1636fecff90e602b87dbf84a986d2a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 25; y: 20 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 24; y: 20 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5568 + hash: "27a84ee3fb8b306e22e50ba753828b7c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 23; y: 20 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5584 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 5600 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 23; y: 20 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5616 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 5632 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 5648 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 5664 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 5680 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 5696 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 5712 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 5728 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 5744 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 5760 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 5776 + image: "flickableEdit.6.png" + } + Frame { + msec: 5792 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 5808 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 5824 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 5840 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 5856 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 5872 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 5888 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 5904 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 5920 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 5936 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 5952 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 5968 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 5984 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 6000 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 6016 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 6032 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 6048 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 6064 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 6080 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 6096 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 6112 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 6128 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 6144 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 6160 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 6176 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 6192 + hash: "46af738f612bfe0fbf4f83eb847dacb7" + } + Frame { + msec: 6208 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 6224 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 6240 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 6256 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 6272 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 6288 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 6304 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 6320 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 6336 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 6352 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 6368 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 6384 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 6400 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 6416 + hash: "ee9cd90fbe594efb411315a97b702a40" + } + Frame { + msec: 6432 + hash: "ee9cd90fbe594efb411315a97b702a40" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/linkActivated.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/linkActivated.0.png new file mode 100644 index 00000000..7d0d0aee Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/linkActivated.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/linkActivated.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/linkActivated.1.png new file mode 100644 index 00000000..7d612bf2 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/linkActivated.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/linkActivated.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/linkActivated.qml new file mode 100644 index 00000000..8c7e3808 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/linkActivated.qml @@ -0,0 +1,191 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "linkActivated.0.png" + } + Frame { + msec: 32 + hash: "53d97d0966197ea41364511dea13752f" + } + Frame { + msec: 48 + hash: "53d97d0966197ea41364511dea13752f" + } + Frame { + msec: 64 + hash: "53d97d0966197ea41364511dea13752f" + } + Frame { + msec: 80 + hash: "53d97d0966197ea41364511dea13752f" + } + Frame { + msec: 96 + hash: "53d97d0966197ea41364511dea13752f" + } + Frame { + msec: 112 + hash: "53d97d0966197ea41364511dea13752f" + } + Frame { + msec: 128 + hash: "53d97d0966197ea41364511dea13752f" + } + Frame { + msec: 144 + hash: "53d97d0966197ea41364511dea13752f" + } + Frame { + msec: 160 + hash: "53d97d0966197ea41364511dea13752f" + } + Frame { + msec: 176 + hash: "53d97d0966197ea41364511dea13752f" + } + Frame { + msec: 192 + hash: "53d97d0966197ea41364511dea13752f" + } + Frame { + msec: 208 + hash: "53d97d0966197ea41364511dea13752f" + } + Frame { + msec: 224 + hash: "53d97d0966197ea41364511dea13752f" + } + Frame { + msec: 240 + hash: "53d97d0966197ea41364511dea13752f" + } + Frame { + msec: 256 + hash: "53d97d0966197ea41364511dea13752f" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 21; y: 13 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 272 + hash: "9482227cbc77e9083218c1452e8644d8" + } + Frame { + msec: 288 + hash: "9482227cbc77e9083218c1452e8644d8" + } + Frame { + msec: 304 + hash: "9482227cbc77e9083218c1452e8644d8" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 22; y: 11 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 320 + hash: "9482227cbc77e9083218c1452e8644d8" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 23; y: 10 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 23; y: 10 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 336 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } + Frame { + msec: 352 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } + Frame { + msec: 368 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } + Frame { + msec: 384 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } + Frame { + msec: 400 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } + Frame { + msec: 416 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } + Frame { + msec: 432 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } + Frame { + msec: 448 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } + Frame { + msec: 464 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } + Frame { + msec: 480 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } + Frame { + msec: 496 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } + Frame { + msec: 512 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } + Frame { + msec: 528 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } + Frame { + msec: 544 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } + Frame { + msec: 560 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } + Frame { + msec: 576 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } + Frame { + msec: 592 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } + Frame { + msec: 608 + hash: "29c47cec5d015e6cab0762c3db0fa714" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/qt-669.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/qt-669.0.png new file mode 100644 index 00000000..95a835aa Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/qt-669.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/qt-669.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/qt-669.1.png new file mode 100644 index 00000000..409192c6 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/qt-669.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/qt-669.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/qt-669.2.png new file mode 100644 index 00000000..cd2f1121 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/qt-669.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/qt-669.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/qt-669.3.png new file mode 100644 index 00000000..7191c1ef Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/qt-669.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/qt-669.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/qt-669.qml new file mode 100644 index 00000000..5926e045 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/qt-669.qml @@ -0,0 +1,1371 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 32 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 48 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 64 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 80 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 96 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 112 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 128 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 144 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 160 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 176 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 192 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 208 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 224 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 240 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 256 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 272 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 288 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 304 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 320 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 336 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 352 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 368 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 384 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 400 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 416 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 432 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 448 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 464 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 480 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 496 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 512 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 528 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 544 + hash: "394360c0bff5ee3ad206d2911838d64e" + } + Frame { + msec: 560 + hash: "394360c0bff5ee3ad206d2911838d64e" + } + Frame { + msec: 576 + hash: "394360c0bff5ee3ad206d2911838d64e" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 592 + hash: "394360c0bff5ee3ad206d2911838d64e" + } + Frame { + msec: 608 + hash: "394360c0bff5ee3ad206d2911838d64e" + } + Frame { + msec: 624 + hash: "394360c0bff5ee3ad206d2911838d64e" + } + Frame { + msec: 640 + hash: "394360c0bff5ee3ad206d2911838d64e" + } + Frame { + msec: 656 + hash: "394360c0bff5ee3ad206d2911838d64e" + } + Frame { + msec: 672 + hash: "394360c0bff5ee3ad206d2911838d64e" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 688 + hash: "3c455f51fea0926576077d55d6fbfbb2" + } + Frame { + msec: 704 + hash: "3c455f51fea0926576077d55d6fbfbb2" + } + Frame { + msec: 720 + hash: "3c455f51fea0926576077d55d6fbfbb2" + } + Frame { + msec: 736 + hash: "3c455f51fea0926576077d55d6fbfbb2" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 752 + hash: "3c455f51fea0926576077d55d6fbfbb2" + } + Frame { + msec: 768 + hash: "3c455f51fea0926576077d55d6fbfbb2" + } + Frame { + msec: 784 + hash: "3c455f51fea0926576077d55d6fbfbb2" + } + Frame { + msec: 800 + hash: "3c455f51fea0926576077d55d6fbfbb2" + } + Frame { + msec: 816 + hash: "3c455f51fea0926576077d55d6fbfbb2" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 832 + hash: "c87aaf72137c2b9e8c876879e7215072" + } + Frame { + msec: 848 + hash: "c87aaf72137c2b9e8c876879e7215072" + } + Frame { + msec: 864 + hash: "c87aaf72137c2b9e8c876879e7215072" + } + Frame { + msec: 880 + hash: "c87aaf72137c2b9e8c876879e7215072" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 896 + hash: "c87aaf72137c2b9e8c876879e7215072" + } + Frame { + msec: 912 + hash: "c87aaf72137c2b9e8c876879e7215072" + } + Frame { + msec: 928 + hash: "c87aaf72137c2b9e8c876879e7215072" + } + Frame { + msec: 944 + hash: "c87aaf72137c2b9e8c876879e7215072" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 960 + image: "qt-669.0.png" + } + Frame { + msec: 976 + hash: "2caf044acf7aaf0af6a03e7b8180fa16" + } + Frame { + msec: 992 + hash: "2caf044acf7aaf0af6a03e7b8180fa16" + } + Frame { + msec: 1008 + hash: "2caf044acf7aaf0af6a03e7b8180fa16" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1024 + hash: "2caf044acf7aaf0af6a03e7b8180fa16" + } + Frame { + msec: 1040 + hash: "2caf044acf7aaf0af6a03e7b8180fa16" + } + Frame { + msec: 1056 + hash: "2caf044acf7aaf0af6a03e7b8180fa16" + } + Frame { + msec: 1072 + hash: "2caf044acf7aaf0af6a03e7b8180fa16" + } + Frame { + msec: 1088 + hash: "2caf044acf7aaf0af6a03e7b8180fa16" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1104 + hash: "c899e9d181860f682ba7275fa36f82a1" + } + Frame { + msec: 1120 + hash: "c899e9d181860f682ba7275fa36f82a1" + } + Frame { + msec: 1136 + hash: "c899e9d181860f682ba7275fa36f82a1" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1152 + hash: "c899e9d181860f682ba7275fa36f82a1" + } + Frame { + msec: 1168 + hash: "c899e9d181860f682ba7275fa36f82a1" + } + Frame { + msec: 1184 + hash: "c899e9d181860f682ba7275fa36f82a1" + } + Frame { + msec: 1200 + hash: "c899e9d181860f682ba7275fa36f82a1" + } + Frame { + msec: 1216 + hash: "c899e9d181860f682ba7275fa36f82a1" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1232 + hash: "1313880b796ae7134f50fa8dafa4a974" + } + Frame { + msec: 1248 + hash: "1313880b796ae7134f50fa8dafa4a974" + } + Frame { + msec: 1264 + hash: "1313880b796ae7134f50fa8dafa4a974" + } + Frame { + msec: 1280 + hash: "1313880b796ae7134f50fa8dafa4a974" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1296 + hash: "1313880b796ae7134f50fa8dafa4a974" + } + Frame { + msec: 1312 + hash: "1313880b796ae7134f50fa8dafa4a974" + } + Frame { + msec: 1328 + hash: "1313880b796ae7134f50fa8dafa4a974" + } + Frame { + msec: 1344 + hash: "1313880b796ae7134f50fa8dafa4a974" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1360 + hash: "d85314199885fdf9cc8e666c3fb723fb" + } + Frame { + msec: 1376 + hash: "d85314199885fdf9cc8e666c3fb723fb" + } + Frame { + msec: 1392 + hash: "d85314199885fdf9cc8e666c3fb723fb" + } + Frame { + msec: 1408 + hash: "d85314199885fdf9cc8e666c3fb723fb" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1424 + hash: "d85314199885fdf9cc8e666c3fb723fb" + } + Frame { + msec: 1440 + hash: "d85314199885fdf9cc8e666c3fb723fb" + } + Frame { + msec: 1456 + hash: "d85314199885fdf9cc8e666c3fb723fb" + } + Frame { + msec: 1472 + hash: "d85314199885fdf9cc8e666c3fb723fb" + } + Frame { + msec: 1488 + hash: "d85314199885fdf9cc8e666c3fb723fb" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1504 + hash: "a3b98f215b2329e29d17b61eba0f9e45" + } + Frame { + msec: 1520 + hash: "a3b98f215b2329e29d17b61eba0f9e45" + } + Frame { + msec: 1536 + hash: "a3b98f215b2329e29d17b61eba0f9e45" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1552 + hash: "a3b98f215b2329e29d17b61eba0f9e45" + } + Frame { + msec: 1568 + hash: "a3b98f215b2329e29d17b61eba0f9e45" + } + Frame { + msec: 1584 + hash: "a3b98f215b2329e29d17b61eba0f9e45" + } + Frame { + msec: 1600 + hash: "a3b98f215b2329e29d17b61eba0f9e45" + } + Frame { + msec: 1616 + hash: "a3b98f215b2329e29d17b61eba0f9e45" + } + Frame { + msec: 1632 + hash: "a3b98f215b2329e29d17b61eba0f9e45" + } + Frame { + msec: 1648 + hash: "a3b98f215b2329e29d17b61eba0f9e45" + } + Frame { + msec: 1664 + hash: "a3b98f215b2329e29d17b61eba0f9e45" + } + Frame { + msec: 1680 + hash: "a3b98f215b2329e29d17b61eba0f9e45" + } + Frame { + msec: 1696 + hash: "a3b98f215b2329e29d17b61eba0f9e45" + } + Frame { + msec: 1712 + hash: "a3b98f215b2329e29d17b61eba0f9e45" + } + Frame { + msec: 1728 + hash: "a3b98f215b2329e29d17b61eba0f9e45" + } + Frame { + msec: 1744 + hash: "a3b98f215b2329e29d17b61eba0f9e45" + } + Frame { + msec: 1760 + hash: "a3b98f215b2329e29d17b61eba0f9e45" + } + Frame { + msec: 1776 + hash: "a3b98f215b2329e29d17b61eba0f9e45" + } + Frame { + msec: 1792 + hash: "a3b98f215b2329e29d17b61eba0f9e45" + } + Frame { + msec: 1808 + hash: "a3b98f215b2329e29d17b61eba0f9e45" + } + Frame { + msec: 1824 + hash: "a3b98f215b2329e29d17b61eba0f9e45" + } + Frame { + msec: 1840 + hash: "a3b98f215b2329e29d17b61eba0f9e45" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1856 + hash: "d85314199885fdf9cc8e666c3fb723fb" + } + Frame { + msec: 1872 + hash: "d85314199885fdf9cc8e666c3fb723fb" + } + Frame { + msec: 1888 + hash: "d85314199885fdf9cc8e666c3fb723fb" + } + Frame { + msec: 1904 + hash: "d85314199885fdf9cc8e666c3fb723fb" + } + Frame { + msec: 1920 + image: "qt-669.1.png" + } + Frame { + msec: 1936 + hash: "d85314199885fdf9cc8e666c3fb723fb" + } + Frame { + msec: 1952 + hash: "d85314199885fdf9cc8e666c3fb723fb" + } + Frame { + msec: 1968 + hash: "d85314199885fdf9cc8e666c3fb723fb" + } + Frame { + msec: 1984 + hash: "d85314199885fdf9cc8e666c3fb723fb" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2000 + hash: "d85314199885fdf9cc8e666c3fb723fb" + } + Frame { + msec: 2016 + hash: "d85314199885fdf9cc8e666c3fb723fb" + } + Frame { + msec: 2032 + hash: "d85314199885fdf9cc8e666c3fb723fb" + } + Frame { + msec: 2048 + hash: "d85314199885fdf9cc8e666c3fb723fb" + } + Frame { + msec: 2064 + hash: "d85314199885fdf9cc8e666c3fb723fb" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2080 + hash: "1313880b796ae7134f50fa8dafa4a974" + } + Frame { + msec: 2096 + hash: "1313880b796ae7134f50fa8dafa4a974" + } + Frame { + msec: 2112 + hash: "1313880b796ae7134f50fa8dafa4a974" + } + Frame { + msec: 2128 + hash: "1313880b796ae7134f50fa8dafa4a974" + } + Frame { + msec: 2144 + hash: "1313880b796ae7134f50fa8dafa4a974" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2160 + hash: "1313880b796ae7134f50fa8dafa4a974" + } + Frame { + msec: 2176 + hash: "1313880b796ae7134f50fa8dafa4a974" + } + Frame { + msec: 2192 + hash: "1313880b796ae7134f50fa8dafa4a974" + } + Frame { + msec: 2208 + hash: "1313880b796ae7134f50fa8dafa4a974" + } + Frame { + msec: 2224 + hash: "1313880b796ae7134f50fa8dafa4a974" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2240 + hash: "c899e9d181860f682ba7275fa36f82a1" + } + Frame { + msec: 2256 + hash: "c899e9d181860f682ba7275fa36f82a1" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2272 + hash: "c899e9d181860f682ba7275fa36f82a1" + } + Frame { + msec: 2288 + hash: "c899e9d181860f682ba7275fa36f82a1" + } + Frame { + msec: 2304 + hash: "c899e9d181860f682ba7275fa36f82a1" + } + Frame { + msec: 2320 + hash: "c899e9d181860f682ba7275fa36f82a1" + } + Frame { + msec: 2336 + hash: "c899e9d181860f682ba7275fa36f82a1" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2352 + hash: "2caf044acf7aaf0af6a03e7b8180fa16" + } + Frame { + msec: 2368 + hash: "2caf044acf7aaf0af6a03e7b8180fa16" + } + Frame { + msec: 2384 + hash: "2caf044acf7aaf0af6a03e7b8180fa16" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2400 + hash: "2caf044acf7aaf0af6a03e7b8180fa16" + } + Frame { + msec: 2416 + hash: "2caf044acf7aaf0af6a03e7b8180fa16" + } + Frame { + msec: 2432 + hash: "2caf044acf7aaf0af6a03e7b8180fa16" + } + Frame { + msec: 2448 + hash: "2caf044acf7aaf0af6a03e7b8180fa16" + } + Frame { + msec: 2464 + hash: "2caf044acf7aaf0af6a03e7b8180fa16" + } + Frame { + msec: 2480 + hash: "2caf044acf7aaf0af6a03e7b8180fa16" + } + Frame { + msec: 2496 + hash: "2caf044acf7aaf0af6a03e7b8180fa16" + } + Frame { + msec: 2512 + hash: "2caf044acf7aaf0af6a03e7b8180fa16" + } + Frame { + msec: 2528 + hash: "2caf044acf7aaf0af6a03e7b8180fa16" + } + Frame { + msec: 2544 + hash: "2caf044acf7aaf0af6a03e7b8180fa16" + } + Frame { + msec: 2560 + hash: "2caf044acf7aaf0af6a03e7b8180fa16" + } + Frame { + msec: 2576 + hash: "2caf044acf7aaf0af6a03e7b8180fa16" + } + Frame { + msec: 2592 + hash: "2caf044acf7aaf0af6a03e7b8180fa16" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2608 + hash: "c87aaf72137c2b9e8c876879e7215072" + } + Frame { + msec: 2624 + hash: "c87aaf72137c2b9e8c876879e7215072" + } + Frame { + msec: 2640 + hash: "c87aaf72137c2b9e8c876879e7215072" + } + Frame { + msec: 2656 + hash: "c87aaf72137c2b9e8c876879e7215072" + } + Frame { + msec: 2672 + hash: "c87aaf72137c2b9e8c876879e7215072" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2688 + hash: "c87aaf72137c2b9e8c876879e7215072" + } + Frame { + msec: 2704 + hash: "c87aaf72137c2b9e8c876879e7215072" + } + Frame { + msec: 2720 + hash: "c87aaf72137c2b9e8c876879e7215072" + } + Frame { + msec: 2736 + hash: "c87aaf72137c2b9e8c876879e7215072" + } + Frame { + msec: 2752 + hash: "c87aaf72137c2b9e8c876879e7215072" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2768 + hash: "3c455f51fea0926576077d55d6fbfbb2" + } + Frame { + msec: 2784 + hash: "3c455f51fea0926576077d55d6fbfbb2" + } + Frame { + msec: 2800 + hash: "3c455f51fea0926576077d55d6fbfbb2" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2816 + hash: "3c455f51fea0926576077d55d6fbfbb2" + } + Frame { + msec: 2832 + hash: "3c455f51fea0926576077d55d6fbfbb2" + } + Frame { + msec: 2848 + hash: "3c455f51fea0926576077d55d6fbfbb2" + } + Frame { + msec: 2864 + hash: "3c455f51fea0926576077d55d6fbfbb2" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2880 + image: "qt-669.2.png" + } + Frame { + msec: 2896 + hash: "394360c0bff5ee3ad206d2911838d64e" + } + Frame { + msec: 2912 + hash: "394360c0bff5ee3ad206d2911838d64e" + } + Frame { + msec: 2928 + hash: "394360c0bff5ee3ad206d2911838d64e" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2944 + hash: "394360c0bff5ee3ad206d2911838d64e" + } + Frame { + msec: 2960 + hash: "394360c0bff5ee3ad206d2911838d64e" + } + Frame { + msec: 2976 + hash: "394360c0bff5ee3ad206d2911838d64e" + } + Frame { + msec: 2992 + hash: "394360c0bff5ee3ad206d2911838d64e" + } + Frame { + msec: 3008 + hash: "394360c0bff5ee3ad206d2911838d64e" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3024 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3040 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3056 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3072 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3088 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3104 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3120 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3136 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3152 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3168 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3184 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3200 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3216 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3232 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3248 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3264 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3280 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3296 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3312 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3328 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3344 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3360 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3376 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3392 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3408 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3424 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3440 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3456 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3472 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3488 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3504 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3520 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3536 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3552 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3568 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3584 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3600 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3616 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3632 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3648 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3664 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3680 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Frame { + msec: 3696 + hash: "10573e4c9dab5bd6e46ec79949c098e5" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3712 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 3728 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 3744 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 3760 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 3776 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 3792 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3808 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 3824 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 3840 + image: "qt-669.3.png" + } + Frame { + msec: 3856 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 3872 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 3888 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 3904 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 3920 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 3936 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 3952 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 3968 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 3984 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 4000 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 4016 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 4032 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 4048 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 4064 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 4080 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 4096 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 4112 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 4128 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 4144 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 4160 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 4176 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 4192 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 4208 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 4224 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 4240 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 4256 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 4272 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 4288 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } + Frame { + msec: 4304 + hash: "4e0ce00bde70a96774a6477ef2305b7f" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.0.png new file mode 100644 index 00000000..e69860eb Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.1.png new file mode 100644 index 00000000..1db3c262 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.10.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.10.png new file mode 100644 index 00000000..9c72d52a Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.10.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.11.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.11.png new file mode 100644 index 00000000..9c72d52a Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.11.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.2.png new file mode 100644 index 00000000..fbef8052 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.3.png new file mode 100644 index 00000000..dc56c7e1 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.4.png new file mode 100644 index 00000000..04ea4964 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.5.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.5.png new file mode 100644 index 00000000..98bf7dee Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.5.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.6.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.6.png new file mode 100644 index 00000000..d95b8952 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.6.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.7.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.7.png new file mode 100644 index 00000000..99543443 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.7.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.8.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.8.png new file mode 100644 index 00000000..d49c2ff1 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.8.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.9.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.9.png new file mode 100644 index 00000000..9c72d52a Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.9.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.qml new file mode 100644 index 00000000..94891e5d --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/usingMultilineEdit.qml @@ -0,0 +1,4687 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 32 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 48 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 64 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 80 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 96 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 112 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 128 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 144 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 160 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 176 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 192 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 208 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 224 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 240 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 256 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 272 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 288 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 304 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 320 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 118; y: 70 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 336 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 352 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 368 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 384 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 400 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 118; y: 70 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 416 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 432 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 448 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 464 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 480 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 496 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 512 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 528 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 544 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 560 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 576 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 592 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 608 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 624 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Frame { + msec: 640 + hash: "a4edfba57a47b45f96fe1fa7a37c1720" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 117; y: 102 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 656 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 672 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 117; y: 102 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 688 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 704 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 720 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 736 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 752 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 768 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 784 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 800 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 816 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 832 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 848 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 864 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 880 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 896 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 912 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 928 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 944 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 960 + image: "usingMultilineEdit.0.png" + } + Frame { + msec: 976 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 992 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 1008 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 1024 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 1040 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 1056 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 1072 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 1088 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 1104 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 1120 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 1136 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 1152 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 1168 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 1184 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 1200 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 1216 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 1232 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 1248 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 1264 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 1280 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Frame { + msec: 1296 + hash: "bf9ad629e190df34f8bbb242e986083f" + } + Key { + type: 6 + key: 44 + modifiers: 0 + text: "2c" + autorep: false + count: 1 + } + Frame { + msec: 1312 + hash: "bf65dbbfc02ad1589093d965c83d5806" + } + Frame { + msec: 1328 + hash: "bf65dbbfc02ad1589093d965c83d5806" + } + Frame { + msec: 1344 + hash: "bf65dbbfc02ad1589093d965c83d5806" + } + Frame { + msec: 1360 + hash: "bf65dbbfc02ad1589093d965c83d5806" + } + Frame { + msec: 1376 + hash: "bf65dbbfc02ad1589093d965c83d5806" + } + Key { + type: 7 + key: 44 + modifiers: 0 + text: "2c" + autorep: false + count: 1 + } + Frame { + msec: 1392 + hash: "bf65dbbfc02ad1589093d965c83d5806" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 1408 + hash: "ef0640a754b76b5e28bff78376f1aaf3" + } + Frame { + msec: 1424 + hash: "ef0640a754b76b5e28bff78376f1aaf3" + } + Frame { + msec: 1440 + hash: "ef0640a754b76b5e28bff78376f1aaf3" + } + Frame { + msec: 1456 + hash: "ef0640a754b76b5e28bff78376f1aaf3" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 1472 + hash: "ef0640a754b76b5e28bff78376f1aaf3" + } + Frame { + msec: 1488 + hash: "ef0640a754b76b5e28bff78376f1aaf3" + } + Frame { + msec: 1504 + hash: "ef0640a754b76b5e28bff78376f1aaf3" + } + Frame { + msec: 1520 + hash: "ef0640a754b76b5e28bff78376f1aaf3" + } + Frame { + msec: 1536 + hash: "ef0640a754b76b5e28bff78376f1aaf3" + } + Frame { + msec: 1552 + hash: "ef0640a754b76b5e28bff78376f1aaf3" + } + Key { + type: 6 + key: 68 + modifiers: 0 + text: "64" + autorep: false + count: 1 + } + Frame { + msec: 1568 + hash: "b392b8d675e61166e9707f4a7f191c15" + } + Frame { + msec: 1584 + hash: "b392b8d675e61166e9707f4a7f191c15" + } + Frame { + msec: 1600 + hash: "b392b8d675e61166e9707f4a7f191c15" + } + Key { + type: 7 + key: 68 + modifiers: 0 + text: "64" + autorep: false + count: 1 + } + Frame { + msec: 1616 + hash: "b392b8d675e61166e9707f4a7f191c15" + } + Key { + type: 6 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 1632 + hash: "f7a9826581a72f37b1211f1006d93ae5" + } + Frame { + msec: 1648 + hash: "f7a9826581a72f37b1211f1006d93ae5" + } + Frame { + msec: 1664 + hash: "f7a9826581a72f37b1211f1006d93ae5" + } + Frame { + msec: 1680 + hash: "f7a9826581a72f37b1211f1006d93ae5" + } + Frame { + msec: 1696 + hash: "f7a9826581a72f37b1211f1006d93ae5" + } + Key { + type: 7 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 1712 + hash: "f7a9826581a72f37b1211f1006d93ae5" + } + Frame { + msec: 1728 + hash: "f7a9826581a72f37b1211f1006d93ae5" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 1744 + hash: "cea68eaed3000fe598917688b49525b7" + } + Frame { + msec: 1760 + hash: "cea68eaed3000fe598917688b49525b7" + } + Frame { + msec: 1776 + hash: "cea68eaed3000fe598917688b49525b7" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 1792 + hash: "cea68eaed3000fe598917688b49525b7" + } + Frame { + msec: 1808 + hash: "cea68eaed3000fe598917688b49525b7" + } + Frame { + msec: 1824 + hash: "cea68eaed3000fe598917688b49525b7" + } + Key { + type: 6 + key: 89 + modifiers: 0 + text: "79" + autorep: false + count: 1 + } + Frame { + msec: 1840 + hash: "968932500933300e0a0ca711067d6659" + } + Frame { + msec: 1856 + hash: "968932500933300e0a0ca711067d6659" + } + Frame { + msec: 1872 + hash: "968932500933300e0a0ca711067d6659" + } + Frame { + msec: 1888 + hash: "968932500933300e0a0ca711067d6659" + } + Frame { + msec: 1904 + hash: "968932500933300e0a0ca711067d6659" + } + Key { + type: 7 + key: 89 + modifiers: 0 + text: "79" + autorep: false + count: 1 + } + Key { + type: 6 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 1920 + image: "usingMultilineEdit.1.png" + } + Frame { + msec: 1936 + hash: "1d5b3f8dc6e0701c0c11a330e055ba5d" + } + Frame { + msec: 1952 + hash: "1d5b3f8dc6e0701c0c11a330e055ba5d" + } + Frame { + msec: 1968 + hash: "1d5b3f8dc6e0701c0c11a330e055ba5d" + } + Key { + type: 6 + key: 85 + modifiers: 0 + text: "75" + autorep: false + count: 1 + } + Frame { + msec: 1984 + hash: "067182091936c99dfa5c29b226bd4351" + } + Frame { + msec: 2000 + hash: "067182091936c99dfa5c29b226bd4351" + } + Key { + type: 7 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 2016 + hash: "067182091936c99dfa5c29b226bd4351" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 2032 + hash: "810e996b65424f80e229160860805492" + } + Frame { + msec: 2048 + hash: "810e996b65424f80e229160860805492" + } + Key { + type: 7 + key: 85 + modifiers: 0 + text: "75" + autorep: false + count: 1 + } + Frame { + msec: 2064 + hash: "810e996b65424f80e229160860805492" + } + Frame { + msec: 2080 + hash: "810e996b65424f80e229160860805492" + } + Frame { + msec: 2096 + hash: "810e996b65424f80e229160860805492" + } + Frame { + msec: 2112 + hash: "810e996b65424f80e229160860805492" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 2128 + hash: "810e996b65424f80e229160860805492" + } + Frame { + msec: 2144 + hash: "810e996b65424f80e229160860805492" + } + Key { + type: 6 + key: 87 + modifiers: 0 + text: "77" + autorep: false + count: 1 + } + Frame { + msec: 2160 + hash: "10aca130f139e44c0889d8d9c9bb8673" + } + Frame { + msec: 2176 + hash: "10aca130f139e44c0889d8d9c9bb8673" + } + Frame { + msec: 2192 + hash: "10aca130f139e44c0889d8d9c9bb8673" + } + Frame { + msec: 2208 + hash: "10aca130f139e44c0889d8d9c9bb8673" + } + Frame { + msec: 2224 + hash: "10aca130f139e44c0889d8d9c9bb8673" + } + Frame { + msec: 2240 + hash: "10aca130f139e44c0889d8d9c9bb8673" + } + Key { + type: 7 + key: 87 + modifiers: 0 + text: "77" + autorep: false + count: 1 + } + Key { + type: 6 + key: 82 + modifiers: 0 + text: "72" + autorep: false + count: 1 + } + Frame { + msec: 2256 + hash: "6785570c7f2cc9f3c6b0b07b8a94ecb2" + } + Frame { + msec: 2272 + hash: "6785570c7f2cc9f3c6b0b07b8a94ecb2" + } + Frame { + msec: 2288 + hash: "6785570c7f2cc9f3c6b0b07b8a94ecb2" + } + Frame { + msec: 2304 + hash: "6785570c7f2cc9f3c6b0b07b8a94ecb2" + } + Frame { + msec: 2320 + hash: "6785570c7f2cc9f3c6b0b07b8a94ecb2" + } + Key { + type: 7 + key: 82 + modifiers: 0 + text: "72" + autorep: false + count: 1 + } + Frame { + msec: 2336 + hash: "6785570c7f2cc9f3c6b0b07b8a94ecb2" + } + Frame { + msec: 2352 + hash: "6785570c7f2cc9f3c6b0b07b8a94ecb2" + } + Key { + type: 6 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 2368 + hash: "701c2738b7c064cd487bd0c6c0beb6b4" + } + Frame { + msec: 2384 + hash: "701c2738b7c064cd487bd0c6c0beb6b4" + } + Frame { + msec: 2400 + hash: "701c2738b7c064cd487bd0c6c0beb6b4" + } + Frame { + msec: 2416 + hash: "701c2738b7c064cd487bd0c6c0beb6b4" + } + Key { + type: 7 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 2432 + hash: "701c2738b7c064cd487bd0c6c0beb6b4" + } + Key { + type: 6 + key: 80 + modifiers: 0 + text: "70" + autorep: false + count: 1 + } + Frame { + msec: 2448 + hash: "35c0c51dd874faa28058251164836dcb" + } + Frame { + msec: 2464 + hash: "35c0c51dd874faa28058251164836dcb" + } + Frame { + msec: 2480 + hash: "35c0c51dd874faa28058251164836dcb" + } + Frame { + msec: 2496 + hash: "35c0c51dd874faa28058251164836dcb" + } + Frame { + msec: 2512 + hash: "35c0c51dd874faa28058251164836dcb" + } + Frame { + msec: 2528 + hash: "35c0c51dd874faa28058251164836dcb" + } + Key { + type: 7 + key: 80 + modifiers: 0 + text: "70" + autorep: false + count: 1 + } + Frame { + msec: 2544 + hash: "35c0c51dd874faa28058251164836dcb" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 2560 + hash: "12748fe9d3b72aff29449deeb2372d03" + } + Frame { + msec: 2576 + hash: "12748fe9d3b72aff29449deeb2372d03" + } + Frame { + msec: 2592 + hash: "12748fe9d3b72aff29449deeb2372d03" + } + Frame { + msec: 2608 + hash: "12748fe9d3b72aff29449deeb2372d03" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 2624 + hash: "12748fe9d3b72aff29449deeb2372d03" + } + Frame { + msec: 2640 + hash: "12748fe9d3b72aff29449deeb2372d03" + } + Frame { + msec: 2656 + hash: "12748fe9d3b72aff29449deeb2372d03" + } + Frame { + msec: 2672 + hash: "12748fe9d3b72aff29449deeb2372d03" + } + Frame { + msec: 2688 + hash: "12748fe9d3b72aff29449deeb2372d03" + } + Key { + type: 6 + key: 76 + modifiers: 0 + text: "6c" + autorep: false + count: 1 + } + Frame { + msec: 2704 + hash: "0d119074fb7e882ebe4dfbad9bfb401a" + } + Frame { + msec: 2720 + hash: "0d119074fb7e882ebe4dfbad9bfb401a" + } + Frame { + msec: 2736 + hash: "0d119074fb7e882ebe4dfbad9bfb401a" + } + Frame { + msec: 2752 + hash: "0d119074fb7e882ebe4dfbad9bfb401a" + } + Frame { + msec: 2768 + hash: "0d119074fb7e882ebe4dfbad9bfb401a" + } + Frame { + msec: 2784 + hash: "0d119074fb7e882ebe4dfbad9bfb401a" + } + Key { + type: 6 + key: 73 + modifiers: 0 + text: "69" + autorep: false + count: 1 + } + Frame { + msec: 2800 + hash: "3646bd6ea35fb8f0160a24a203b0f469" + } + Key { + type: 7 + key: 76 + modifiers: 0 + text: "6c" + autorep: false + count: 1 + } + Frame { + msec: 2816 + hash: "3646bd6ea35fb8f0160a24a203b0f469" + } + Frame { + msec: 2832 + hash: "3646bd6ea35fb8f0160a24a203b0f469" + } + Frame { + msec: 2848 + hash: "3646bd6ea35fb8f0160a24a203b0f469" + } + Frame { + msec: 2864 + hash: "3646bd6ea35fb8f0160a24a203b0f469" + } + Key { + type: 7 + key: 73 + modifiers: 0 + text: "69" + autorep: false + count: 1 + } + Frame { + msec: 2880 + image: "usingMultilineEdit.2.png" + } + Frame { + msec: 2896 + hash: "3646bd6ea35fb8f0160a24a203b0f469" + } + Frame { + msec: 2912 + hash: "3646bd6ea35fb8f0160a24a203b0f469" + } + Frame { + msec: 2928 + hash: "3646bd6ea35fb8f0160a24a203b0f469" + } + Key { + type: 6 + key: 75 + modifiers: 0 + text: "6b" + autorep: false + count: 1 + } + Frame { + msec: 2944 + hash: "d90cbfbec0e5a73781664eec63ba7081" + } + Frame { + msec: 2960 + hash: "d90cbfbec0e5a73781664eec63ba7081" + } + Frame { + msec: 2976 + hash: "d90cbfbec0e5a73781664eec63ba7081" + } + Key { + type: 7 + key: 75 + modifiers: 0 + text: "6b" + autorep: false + count: 1 + } + Key { + type: 6 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Frame { + msec: 2992 + hash: "8faa6d1174cf3e8ef10f6575276ed125" + } + Frame { + msec: 3008 + hash: "8faa6d1174cf3e8ef10f6575276ed125" + } + Frame { + msec: 3024 + hash: "8faa6d1174cf3e8ef10f6575276ed125" + } + Frame { + msec: 3040 + hash: "8faa6d1174cf3e8ef10f6575276ed125" + } + Key { + type: 7 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Frame { + msec: 3056 + hash: "8faa6d1174cf3e8ef10f6575276ed125" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 3072 + hash: "bac072bfe350abe83fbc941e56845939" + } + Frame { + msec: 3088 + hash: "bac072bfe350abe83fbc941e56845939" + } + Frame { + msec: 3104 + hash: "bac072bfe350abe83fbc941e56845939" + } + Key { + type: 6 + key: 16777248 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3120 + hash: "bac072bfe350abe83fbc941e56845939" + } + Key { + type: 7 + key: 32 + modifiers: 33554432 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 3136 + hash: "bac072bfe350abe83fbc941e56845939" + } + Frame { + msec: 3152 + hash: "bac072bfe350abe83fbc941e56845939" + } + Key { + type: 6 + key: 73 + modifiers: 33554432 + text: "49" + autorep: false + count: 1 + } + Frame { + msec: 3168 + hash: "386a85651164d0edbeb5cc2b7ee438c7" + } + Frame { + msec: 3184 + hash: "386a85651164d0edbeb5cc2b7ee438c7" + } + Frame { + msec: 3200 + hash: "386a85651164d0edbeb5cc2b7ee438c7" + } + Frame { + msec: 3216 + hash: "386a85651164d0edbeb5cc2b7ee438c7" + } + Key { + type: 7 + key: 73 + modifiers: 33554432 + text: "49" + autorep: false + count: 1 + } + Frame { + msec: 3232 + hash: "386a85651164d0edbeb5cc2b7ee438c7" + } + Key { + type: 7 + key: 16777248 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 3248 + hash: "982d48e7ef886a74791306f055ddc714" + } + Frame { + msec: 3264 + hash: "982d48e7ef886a74791306f055ddc714" + } + Frame { + msec: 3280 + hash: "982d48e7ef886a74791306f055ddc714" + } + Frame { + msec: 3296 + hash: "982d48e7ef886a74791306f055ddc714" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 3312 + hash: "982d48e7ef886a74791306f055ddc714" + } + Key { + type: 6 + key: 87 + modifiers: 0 + text: "77" + autorep: false + count: 1 + } + Frame { + msec: 3328 + hash: "38003a58f17d25d302c5e1b643b271b0" + } + Frame { + msec: 3344 + hash: "38003a58f17d25d302c5e1b643b271b0" + } + Frame { + msec: 3360 + hash: "38003a58f17d25d302c5e1b643b271b0" + } + Frame { + msec: 3376 + hash: "38003a58f17d25d302c5e1b643b271b0" + } + Frame { + msec: 3392 + hash: "38003a58f17d25d302c5e1b643b271b0" + } + Key { + type: 7 + key: 87 + modifiers: 0 + text: "77" + autorep: false + count: 1 + } + Frame { + msec: 3408 + hash: "38003a58f17d25d302c5e1b643b271b0" + } + Key { + type: 6 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 3424 + hash: "18d37190d139a1567d91882fdac411d6" + } + Frame { + msec: 3440 + hash: "18d37190d139a1567d91882fdac411d6" + } + Frame { + msec: 3456 + hash: "18d37190d139a1567d91882fdac411d6" + } + Frame { + msec: 3472 + hash: "18d37190d139a1567d91882fdac411d6" + } + Frame { + msec: 3488 + hash: "18d37190d139a1567d91882fdac411d6" + } + Key { + type: 7 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Key { + type: 6 + key: 78 + modifiers: 0 + text: "6e" + autorep: false + count: 1 + } + Frame { + msec: 3504 + hash: "279aa32aaeebea7f8078e8a750d0514b" + } + Frame { + msec: 3520 + hash: "279aa32aaeebea7f8078e8a750d0514b" + } + Frame { + msec: 3536 + hash: "279aa32aaeebea7f8078e8a750d0514b" + } + Frame { + msec: 3552 + hash: "279aa32aaeebea7f8078e8a750d0514b" + } + Frame { + msec: 3568 + hash: "279aa32aaeebea7f8078e8a750d0514b" + } + Frame { + msec: 3584 + hash: "279aa32aaeebea7f8078e8a750d0514b" + } + Key { + type: 7 + key: 78 + modifiers: 0 + text: "6e" + autorep: false + count: 1 + } + Frame { + msec: 3600 + hash: "279aa32aaeebea7f8078e8a750d0514b" + } + Key { + type: 6 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 3616 + hash: "626123df4dc8fc1321d0262871ffbe3e" + } + Frame { + msec: 3632 + hash: "626123df4dc8fc1321d0262871ffbe3e" + } + Frame { + msec: 3648 + hash: "626123df4dc8fc1321d0262871ffbe3e" + } + Frame { + msec: 3664 + hash: "626123df4dc8fc1321d0262871ffbe3e" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 3680 + hash: "00972f42fed66eb94832506b436b203d" + } + Key { + type: 7 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 3696 + hash: "00972f42fed66eb94832506b436b203d" + } + Frame { + msec: 3712 + hash: "00972f42fed66eb94832506b436b203d" + } + Frame { + msec: 3728 + hash: "00972f42fed66eb94832506b436b203d" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 3744 + hash: "00972f42fed66eb94832506b436b203d" + } + Frame { + msec: 3760 + hash: "00972f42fed66eb94832506b436b203d" + } + Frame { + msec: 3776 + hash: "00972f42fed66eb94832506b436b203d" + } + Frame { + msec: 3792 + hash: "00972f42fed66eb94832506b436b203d" + } + Frame { + msec: 3808 + hash: "00972f42fed66eb94832506b436b203d" + } + Frame { + msec: 3824 + hash: "00972f42fed66eb94832506b436b203d" + } + Frame { + msec: 3840 + image: "usingMultilineEdit.3.png" + } + Frame { + msec: 3856 + hash: "00972f42fed66eb94832506b436b203d" + } + Frame { + msec: 3872 + hash: "00972f42fed66eb94832506b436b203d" + } + Frame { + msec: 3888 + hash: "00972f42fed66eb94832506b436b203d" + } + Frame { + msec: 3904 + hash: "00972f42fed66eb94832506b436b203d" + } + Frame { + msec: 3920 + hash: "00972f42fed66eb94832506b436b203d" + } + Frame { + msec: 3936 + hash: "00972f42fed66eb94832506b436b203d" + } + Frame { + msec: 3952 + hash: "00972f42fed66eb94832506b436b203d" + } + Frame { + msec: 3968 + hash: "00972f42fed66eb94832506b436b203d" + } + Key { + type: 6 + key: 89 + modifiers: 0 + text: "79" + autorep: false + count: 1 + } + Frame { + msec: 3984 + hash: "72d952ff90862b93ccec046f61d85360" + } + Frame { + msec: 4000 + hash: "72d952ff90862b93ccec046f61d85360" + } + Frame { + msec: 4016 + hash: "72d952ff90862b93ccec046f61d85360" + } + Frame { + msec: 4032 + hash: "72d952ff90862b93ccec046f61d85360" + } + Frame { + msec: 4048 + hash: "72d952ff90862b93ccec046f61d85360" + } + Key { + type: 6 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 4064 + hash: "abd2bd3a1fdf5dbdd5bfdcc84bad136c" + } + Key { + type: 7 + key: 89 + modifiers: 0 + text: "79" + autorep: false + count: 1 + } + Frame { + msec: 4080 + hash: "abd2bd3a1fdf5dbdd5bfdcc84bad136c" + } + Frame { + msec: 4096 + hash: "abd2bd3a1fdf5dbdd5bfdcc84bad136c" + } + Frame { + msec: 4112 + hash: "abd2bd3a1fdf5dbdd5bfdcc84bad136c" + } + Frame { + msec: 4128 + hash: "abd2bd3a1fdf5dbdd5bfdcc84bad136c" + } + Key { + type: 6 + key: 85 + modifiers: 0 + text: "75" + autorep: false + count: 1 + } + Frame { + msec: 4144 + hash: "f091e9b3d660c3664960f3fe6f624a1d" + } + Frame { + msec: 4160 + hash: "f091e9b3d660c3664960f3fe6f624a1d" + } + Key { + type: 7 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 4176 + hash: "f091e9b3d660c3664960f3fe6f624a1d" + } + Frame { + msec: 4192 + hash: "f091e9b3d660c3664960f3fe6f624a1d" + } + Frame { + msec: 4208 + hash: "f091e9b3d660c3664960f3fe6f624a1d" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 4224 + hash: "bc9ae8ea7f8a7f1089263a20b4a5e826" + } + Frame { + msec: 4240 + hash: "bc9ae8ea7f8a7f1089263a20b4a5e826" + } + Key { + type: 7 + key: 85 + modifiers: 0 + text: "75" + autorep: false + count: 1 + } + Frame { + msec: 4256 + hash: "bc9ae8ea7f8a7f1089263a20b4a5e826" + } + Frame { + msec: 4272 + hash: "bc9ae8ea7f8a7f1089263a20b4a5e826" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 4288 + hash: "bc9ae8ea7f8a7f1089263a20b4a5e826" + } + Frame { + msec: 4304 + hash: "bc9ae8ea7f8a7f1089263a20b4a5e826" + } + Frame { + msec: 4320 + hash: "bc9ae8ea7f8a7f1089263a20b4a5e826" + } + Frame { + msec: 4336 + hash: "bc9ae8ea7f8a7f1089263a20b4a5e826" + } + Frame { + msec: 4352 + hash: "bc9ae8ea7f8a7f1089263a20b4a5e826" + } + Frame { + msec: 4368 + hash: "bc9ae8ea7f8a7f1089263a20b4a5e826" + } + Key { + type: 6 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 4384 + hash: "f96b7c209a5e558543157cf5aa4ce69e" + } + Frame { + msec: 4400 + hash: "f96b7c209a5e558543157cf5aa4ce69e" + } + Frame { + msec: 4416 + hash: "f96b7c209a5e558543157cf5aa4ce69e" + } + Frame { + msec: 4432 + hash: "f96b7c209a5e558543157cf5aa4ce69e" + } + Frame { + msec: 4448 + hash: "f96b7c209a5e558543157cf5aa4ce69e" + } + Key { + type: 7 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 4464 + hash: "f96b7c209a5e558543157cf5aa4ce69e" + } + Key { + type: 6 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 4480 + hash: "67facce41bc51af385bd8102a7e1285e" + } + Frame { + msec: 4496 + hash: "67facce41bc51af385bd8102a7e1285e" + } + Frame { + msec: 4512 + hash: "67facce41bc51af385bd8102a7e1285e" + } + Frame { + msec: 4528 + hash: "67facce41bc51af385bd8102a7e1285e" + } + Frame { + msec: 4544 + hash: "67facce41bc51af385bd8102a7e1285e" + } + Key { + type: 7 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 4560 + hash: "67facce41bc51af385bd8102a7e1285e" + } + Frame { + msec: 4576 + hash: "67facce41bc51af385bd8102a7e1285e" + } + Frame { + msec: 4592 + hash: "67facce41bc51af385bd8102a7e1285e" + } + Key { + type: 6 + key: 16777248 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 4608 + hash: "67facce41bc51af385bd8102a7e1285e" + } + Frame { + msec: 4624 + hash: "67facce41bc51af385bd8102a7e1285e" + } + Frame { + msec: 4640 + hash: "67facce41bc51af385bd8102a7e1285e" + } + Frame { + msec: 4656 + hash: "67facce41bc51af385bd8102a7e1285e" + } + Frame { + msec: 4672 + hash: "67facce41bc51af385bd8102a7e1285e" + } + Frame { + msec: 4688 + hash: "67facce41bc51af385bd8102a7e1285e" + } + Frame { + msec: 4704 + hash: "67facce41bc51af385bd8102a7e1285e" + } + Frame { + msec: 4720 + hash: "67facce41bc51af385bd8102a7e1285e" + } + Frame { + msec: 4736 + hash: "67facce41bc51af385bd8102a7e1285e" + } + Frame { + msec: 4752 + hash: "67facce41bc51af385bd8102a7e1285e" + } + Frame { + msec: 4768 + hash: "67facce41bc51af385bd8102a7e1285e" + } + Frame { + msec: 4784 + hash: "67facce41bc51af385bd8102a7e1285e" + } + Frame { + msec: 4800 + image: "usingMultilineEdit.4.png" + } + Frame { + msec: 4816 + hash: "67facce41bc51af385bd8102a7e1285e" + } + Frame { + msec: 4832 + hash: "67facce41bc51af385bd8102a7e1285e" + } + Key { + type: 6 + key: 63 + modifiers: 33554432 + text: "3f" + autorep: false + count: 1 + } + Frame { + msec: 4848 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 4864 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 4880 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 4896 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 4912 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 4928 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 4944 + hash: "a616e994d83964ff75d95b702f355937" + } + Key { + type: 7 + key: 63 + modifiers: 33554432 + text: "3f" + autorep: false + count: 1 + } + Frame { + msec: 4960 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 4976 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 4992 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5008 + hash: "a616e994d83964ff75d95b702f355937" + } + Key { + type: 7 + key: 16777248 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 5024 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5040 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5056 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5072 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5088 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5104 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5120 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5136 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5152 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5168 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5184 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5200 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5216 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5232 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5248 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5264 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5280 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5296 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5312 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5328 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5344 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5360 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5376 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5392 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5408 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5424 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5440 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5456 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5472 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5488 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5504 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5520 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5536 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5552 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5568 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5584 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5600 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5616 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5632 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5648 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5664 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5680 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5696 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5712 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5728 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5744 + hash: "a616e994d83964ff75d95b702f355937" + } + Frame { + msec: 5760 + image: "usingMultilineEdit.5.png" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 48; y: 19 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5776 + hash: "e9532a9023548cf5dfca3fdaeb3467e7" + } + Frame { + msec: 5792 + hash: "e9532a9023548cf5dfca3fdaeb3467e7" + } + Frame { + msec: 5808 + hash: "e9532a9023548cf5dfca3fdaeb3467e7" + } + Frame { + msec: 5824 + hash: "e9532a9023548cf5dfca3fdaeb3467e7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 49; y: 21 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 50; y: 22 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5840 + hash: "e9532a9023548cf5dfca3fdaeb3467e7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 50; y: 23 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 51; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5856 + hash: "3ee2836c3a2ff4c71d82dd261941883b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 53; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 54; y: 33 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5872 + hash: "3ee2836c3a2ff4c71d82dd261941883b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 55; y: 36 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 56; y: 41 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5888 + hash: "3ee2836c3a2ff4c71d82dd261941883b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 56; y: 44 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 57; y: 48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5904 + hash: "4e620c1b847274f691e80a384eac5320" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 58; y: 52 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 59; y: 58 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5920 + hash: "1a246aa1be0878c38da2eaac6befb738" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 59; y: 64 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 61; y: 69 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5936 + hash: "7d6d4a33aacd1d2f530834af31069793" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 62; y: 75 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 64; y: 80 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5952 + hash: "eba517141a4dc94025801fabc8c5e813" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 64; y: 86 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 66; y: 90 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5968 + hash: "a0f4a1f253c763054ca7d9727d517e5c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 67; y: 97 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5984 + hash: "a0f4a1f253c763054ca7d9727d517e5c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 67; y: 101 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 67; y: 105 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6000 + hash: "a0f4a1f253c763054ca7d9727d517e5c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 69; y: 108 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 69; y: 111 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6016 + hash: "a0f4a1f253c763054ca7d9727d517e5c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 69; y: 114 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 69; y: 116 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6032 + hash: "a0f4a1f253c763054ca7d9727d517e5c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 119 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 122 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6048 + hash: "a0f4a1f253c763054ca7d9727d517e5c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 124 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 128 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6064 + hash: "a0f4a1f253c763054ca7d9727d517e5c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 130 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 132 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6080 + hash: "a0f4a1f253c763054ca7d9727d517e5c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 134 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 137 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6096 + hash: "a0f4a1f253c763054ca7d9727d517e5c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 138 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 140 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6112 + hash: "a0f4a1f253c763054ca7d9727d517e5c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 141 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 144 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6128 + hash: "a0f4a1f253c763054ca7d9727d517e5c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 69; y: 145 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 69; y: 148 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6144 + hash: "a0f4a1f253c763054ca7d9727d517e5c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 69; y: 149 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 69; y: 151 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6160 + hash: "a0f4a1f253c763054ca7d9727d517e5c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 69; y: 153 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 68; y: 154 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6176 + hash: "a0f4a1f253c763054ca7d9727d517e5c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 68; y: 155 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6192 + hash: "a0f4a1f253c763054ca7d9727d517e5c" + } + Frame { + msec: 6208 + hash: "a0f4a1f253c763054ca7d9727d517e5c" + } + Frame { + msec: 6224 + hash: "a0f4a1f253c763054ca7d9727d517e5c" + } + Frame { + msec: 6240 + hash: "a0f4a1f253c763054ca7d9727d517e5c" + } + Frame { + msec: 6256 + hash: "a0f4a1f253c763054ca7d9727d517e5c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 68; y: 154 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6272 + hash: "a0f4a1f253c763054ca7d9727d517e5c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 68; y: 152 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 68; y: 149 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6288 + hash: "a0f4a1f253c763054ca7d9727d517e5c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 68; y: 145 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 66; y: 139 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6304 + hash: "a0f4a1f253c763054ca7d9727d517e5c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 66; y: 126 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 64; y: 117 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6320 + hash: "a0f4a1f253c763054ca7d9727d517e5c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 64; y: 108 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 63; y: 98 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6336 + hash: "a0f4a1f253c763054ca7d9727d517e5c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 61; y: 88 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 61; y: 80 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6352 + hash: "a0f4a1f253c763054ca7d9727d517e5c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 59; y: 72 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 59; y: 64 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6368 + hash: "a0f4a1f253c763054ca7d9727d517e5c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 59; y: 58 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 57; y: 51 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6384 + hash: "b6589493e0225846be0af57024e25d98" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 57; y: 37 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6400 + hash: "b6589493e0225846be0af57024e25d98" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 55; y: 30 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 54; y: 23 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6416 + hash: "d8a1bee2a0e57944d8268a2ce7e6c3c1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 54; y: 16 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 52; y: 6 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6432 + hash: "a609d3c9cb375240e66dd316af27543c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 50; y: -2 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 50; y: -9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6448 + hash: "0d376060ba0f9843ed814a8d8150d047" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 48; y: -23 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6464 + hash: "9ad787bf41f0ab66beffff056a115c23" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 47; y: -31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 47; y: -38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6480 + hash: "bc4cd74678c08403bb16b74630d0fd18" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 47; y: -45 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 45; y: -48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6496 + hash: "bc4cd74678c08403bb16b74630d0fd18" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 45; y: -48 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 45; y: -48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6512 + hash: "bc4cd74678c08403bb16b74630d0fd18" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 45; y: -48 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6528 + hash: "bc4cd74678c08403bb16b74630d0fd18" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -48 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6544 + hash: "bc4cd74678c08403bb16b74630d0fd18" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -48 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6560 + hash: "bc4cd74678c08403bb16b74630d0fd18" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -48 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6576 + hash: "bc4cd74678c08403bb16b74630d0fd18" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -48 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6592 + hash: "bc4cd74678c08403bb16b74630d0fd18" + } + Frame { + msec: 6608 + hash: "bc4cd74678c08403bb16b74630d0fd18" + } + Frame { + msec: 6624 + hash: "bc4cd74678c08403bb16b74630d0fd18" + } + Frame { + msec: 6640 + hash: "bc4cd74678c08403bb16b74630d0fd18" + } + Frame { + msec: 6656 + hash: "bc4cd74678c08403bb16b74630d0fd18" + } + Frame { + msec: 6672 + hash: "bc4cd74678c08403bb16b74630d0fd18" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -47 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -46 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6688 + hash: "bc4cd74678c08403bb16b74630d0fd18" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: -45 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 44; y: -42 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6704 + hash: "bc4cd74678c08403bb16b74630d0fd18" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 44; y: -39 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 45; y: -36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6720 + image: "usingMultilineEdit.6.png" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 45; y: -33 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 46; y: -28 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6736 + hash: "bc4cd74678c08403bb16b74630d0fd18" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 47; y: -25 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 47; y: -21 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6752 + hash: "bc4cd74678c08403bb16b74630d0fd18" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 48; y: -18 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 49; y: -14 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6768 + hash: "bc4cd74678c08403bb16b74630d0fd18" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 49; y: -10 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 50; y: -8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6784 + hash: "bc4cd74678c08403bb16b74630d0fd18" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 50; y: -6 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 51; y: -3 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6800 + hash: "bc4cd74678c08403bb16b74630d0fd18" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 51; y: -1 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 52; y: 0 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6816 + hash: "bc4cd74678c08403bb16b74630d0fd18" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 52; y: 2 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 52; y: 3 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6832 + hash: "bc4cd74678c08403bb16b74630d0fd18" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 53; y: 5 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 54; y: 7 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6848 + hash: "0e728de352bc8658bb3e2900a56bfad9" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 54; y: 8 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 55; y: 10 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6864 + hash: "0e728de352bc8658bb3e2900a56bfad9" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 55; y: 11 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 55; y: 12 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6880 + hash: "0e728de352bc8658bb3e2900a56bfad9" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 55; y: 12 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6896 + hash: "0e728de352bc8658bb3e2900a56bfad9" + } + Frame { + msec: 6912 + hash: "0e728de352bc8658bb3e2900a56bfad9" + } + Frame { + msec: 6928 + hash: "0e728de352bc8658bb3e2900a56bfad9" + } + Frame { + msec: 6944 + hash: "0e728de352bc8658bb3e2900a56bfad9" + } + Frame { + msec: 6960 + hash: "0e728de352bc8658bb3e2900a56bfad9" + } + Frame { + msec: 6976 + hash: "0e728de352bc8658bb3e2900a56bfad9" + } + Frame { + msec: 6992 + hash: "0e728de352bc8658bb3e2900a56bfad9" + } + Frame { + msec: 7008 + hash: "0e728de352bc8658bb3e2900a56bfad9" + } + Frame { + msec: 7024 + hash: "0e728de352bc8658bb3e2900a56bfad9" + } + Frame { + msec: 7040 + hash: "0e728de352bc8658bb3e2900a56bfad9" + } + Frame { + msec: 7056 + hash: "0e728de352bc8658bb3e2900a56bfad9" + } + Frame { + msec: 7072 + hash: "0e728de352bc8658bb3e2900a56bfad9" + } + Frame { + msec: 7088 + hash: "0e728de352bc8658bb3e2900a56bfad9" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 59; y: 44 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7104 + hash: "c9b766ef3743159fdd7a01d3eeaa357b" + } + Frame { + msec: 7120 + hash: "c9b766ef3743159fdd7a01d3eeaa357b" + } + Frame { + msec: 7136 + hash: "c9b766ef3743159fdd7a01d3eeaa357b" + } + Frame { + msec: 7152 + hash: "c9b766ef3743159fdd7a01d3eeaa357b" + } + Frame { + msec: 7168 + hash: "c9b766ef3743159fdd7a01d3eeaa357b" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 59; y: 44 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7184 + hash: "c9b766ef3743159fdd7a01d3eeaa357b" + } + Frame { + msec: 7200 + hash: "c9b766ef3743159fdd7a01d3eeaa357b" + } + Frame { + msec: 7216 + hash: "c9b766ef3743159fdd7a01d3eeaa357b" + } + Frame { + msec: 7232 + hash: "c9b766ef3743159fdd7a01d3eeaa357b" + } + Frame { + msec: 7248 + hash: "c9b766ef3743159fdd7a01d3eeaa357b" + } + Frame { + msec: 7264 + hash: "c9b766ef3743159fdd7a01d3eeaa357b" + } + Frame { + msec: 7280 + hash: "c9b766ef3743159fdd7a01d3eeaa357b" + } + Frame { + msec: 7296 + hash: "c9b766ef3743159fdd7a01d3eeaa357b" + } + Frame { + msec: 7312 + hash: "c9b766ef3743159fdd7a01d3eeaa357b" + } + Frame { + msec: 7328 + hash: "c9b766ef3743159fdd7a01d3eeaa357b" + } + Frame { + msec: 7344 + hash: "c9b766ef3743159fdd7a01d3eeaa357b" + } + Frame { + msec: 7360 + hash: "c9b766ef3743159fdd7a01d3eeaa357b" + } + Frame { + msec: 7376 + hash: "c9b766ef3743159fdd7a01d3eeaa357b" + } + Frame { + msec: 7392 + hash: "c9b766ef3743159fdd7a01d3eeaa357b" + } + Frame { + msec: 7408 + hash: "c9b766ef3743159fdd7a01d3eeaa357b" + } + Frame { + msec: 7424 + hash: "c9b766ef3743159fdd7a01d3eeaa357b" + } + Frame { + msec: 7440 + hash: "c9b766ef3743159fdd7a01d3eeaa357b" + } + Frame { + msec: 7456 + hash: "c9b766ef3743159fdd7a01d3eeaa357b" + } + Frame { + msec: 7472 + hash: "c9b766ef3743159fdd7a01d3eeaa357b" + } + Frame { + msec: 7488 + hash: "c9b766ef3743159fdd7a01d3eeaa357b" + } + Frame { + msec: 7504 + hash: "c9b766ef3743159fdd7a01d3eeaa357b" + } + Frame { + msec: 7520 + hash: "c9b766ef3743159fdd7a01d3eeaa357b" + } + Frame { + msec: 7536 + hash: "c9b766ef3743159fdd7a01d3eeaa357b" + } + Frame { + msec: 7552 + hash: "c9b766ef3743159fdd7a01d3eeaa357b" + } + Frame { + msec: 7568 + hash: "c9b766ef3743159fdd7a01d3eeaa357b" + } + Key { + type: 6 + key: 16777237 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 7584 + hash: "f8d7e167379a5109b1744727b3bb5050" + } + Frame { + msec: 7600 + hash: "f8d7e167379a5109b1744727b3bb5050" + } + Frame { + msec: 7616 + hash: "f8d7e167379a5109b1744727b3bb5050" + } + Key { + type: 7 + key: 16777237 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 7632 + hash: "f8d7e167379a5109b1744727b3bb5050" + } + Frame { + msec: 7648 + hash: "f8d7e167379a5109b1744727b3bb5050" + } + Frame { + msec: 7664 + hash: "f8d7e167379a5109b1744727b3bb5050" + } + Frame { + msec: 7680 + image: "usingMultilineEdit.7.png" + } + Frame { + msec: 7696 + hash: "f8d7e167379a5109b1744727b3bb5050" + } + Frame { + msec: 7712 + hash: "f8d7e167379a5109b1744727b3bb5050" + } + Key { + type: 6 + key: 16777237 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 7728 + hash: "d1f43fa2f710725527736ac3439577df" + } + Frame { + msec: 7744 + hash: "d1f43fa2f710725527736ac3439577df" + } + Frame { + msec: 7760 + hash: "d1f43fa2f710725527736ac3439577df" + } + Frame { + msec: 7776 + hash: "d1f43fa2f710725527736ac3439577df" + } + Frame { + msec: 7792 + hash: "d1f43fa2f710725527736ac3439577df" + } + Frame { + msec: 7808 + hash: "d1f43fa2f710725527736ac3439577df" + } + Frame { + msec: 7824 + hash: "d1f43fa2f710725527736ac3439577df" + } + Frame { + msec: 7840 + hash: "d1f43fa2f710725527736ac3439577df" + } + Frame { + msec: 7856 + hash: "d1f43fa2f710725527736ac3439577df" + } + Frame { + msec: 7872 + hash: "d1f43fa2f710725527736ac3439577df" + } + Frame { + msec: 7888 + hash: "d1f43fa2f710725527736ac3439577df" + } + Frame { + msec: 7904 + hash: "d1f43fa2f710725527736ac3439577df" + } + Frame { + msec: 7920 + hash: "d1f43fa2f710725527736ac3439577df" + } + Frame { + msec: 7936 + hash: "d1f43fa2f710725527736ac3439577df" + } + Frame { + msec: 7952 + hash: "d1f43fa2f710725527736ac3439577df" + } + Key { + type: 7 + key: 16777237 + modifiers: 0 + text: "" + autorep: true + count: 1 + } + Key { + type: 6 + key: 16777237 + modifiers: 0 + text: "" + autorep: true + count: 1 + } + Frame { + msec: 7968 + hash: "1553d42725394fa4d4c9b97dc12a78b9" + } + Frame { + msec: 7984 + hash: "1553d42725394fa4d4c9b97dc12a78b9" + } + Key { + type: 7 + key: 16777237 + modifiers: 0 + text: "" + autorep: true + count: 1 + } + Key { + type: 6 + key: 16777237 + modifiers: 0 + text: "" + autorep: true + count: 1 + } + Frame { + msec: 8000 + hash: "a62df700f3209668a813e765a79e7859" + } + Frame { + msec: 8016 + hash: "a62df700f3209668a813e765a79e7859" + } + Key { + type: 7 + key: 16777237 + modifiers: 0 + text: "" + autorep: true + count: 1 + } + Key { + type: 6 + key: 16777237 + modifiers: 0 + text: "" + autorep: true + count: 1 + } + Frame { + msec: 8032 + hash: "e8928770969b82523e828e3036bbe106" + } + Frame { + msec: 8048 + hash: "e8928770969b82523e828e3036bbe106" + } + Key { + type: 7 + key: 16777237 + modifiers: 0 + text: "" + autorep: true + count: 1 + } + Key { + type: 6 + key: 16777237 + modifiers: 0 + text: "" + autorep: true + count: 1 + } + Frame { + msec: 8064 + hash: "ba0c406580cc0fa02a6b26367a290ec9" + } + Frame { + msec: 8080 + hash: "ba0c406580cc0fa02a6b26367a290ec9" + } + Key { + type: 6 + key: 16777248 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Key { + type: 7 + key: 16777237 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 8096 + hash: "ba0c406580cc0fa02a6b26367a290ec9" + } + Frame { + msec: 8112 + hash: "ba0c406580cc0fa02a6b26367a290ec9" + } + Frame { + msec: 8128 + hash: "ba0c406580cc0fa02a6b26367a290ec9" + } + Frame { + msec: 8144 + hash: "ba0c406580cc0fa02a6b26367a290ec9" + } + Frame { + msec: 8160 + hash: "ba0c406580cc0fa02a6b26367a290ec9" + } + Frame { + msec: 8176 + hash: "ba0c406580cc0fa02a6b26367a290ec9" + } + Frame { + msec: 8192 + hash: "ba0c406580cc0fa02a6b26367a290ec9" + } + Key { + type: 6 + key: 16777235 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 8208 + hash: "479b5ba3f5b3d38b5e9aba6b5204da03" + } + Frame { + msec: 8224 + hash: "479b5ba3f5b3d38b5e9aba6b5204da03" + } + Frame { + msec: 8240 + hash: "479b5ba3f5b3d38b5e9aba6b5204da03" + } + Frame { + msec: 8256 + hash: "479b5ba3f5b3d38b5e9aba6b5204da03" + } + Key { + type: 7 + key: 16777235 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 8272 + hash: "479b5ba3f5b3d38b5e9aba6b5204da03" + } + Frame { + msec: 8288 + hash: "479b5ba3f5b3d38b5e9aba6b5204da03" + } + Frame { + msec: 8304 + hash: "479b5ba3f5b3d38b5e9aba6b5204da03" + } + Frame { + msec: 8320 + hash: "479b5ba3f5b3d38b5e9aba6b5204da03" + } + Key { + type: 6 + key: 16777235 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 8336 + hash: "978ed05f4ea2cc7ddb06807a25883335" + } + Frame { + msec: 8352 + hash: "978ed05f4ea2cc7ddb06807a25883335" + } + Frame { + msec: 8368 + hash: "978ed05f4ea2cc7ddb06807a25883335" + } + Frame { + msec: 8384 + hash: "978ed05f4ea2cc7ddb06807a25883335" + } + Key { + type: 7 + key: 16777235 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 8400 + hash: "978ed05f4ea2cc7ddb06807a25883335" + } + Frame { + msec: 8416 + hash: "978ed05f4ea2cc7ddb06807a25883335" + } + Frame { + msec: 8432 + hash: "978ed05f4ea2cc7ddb06807a25883335" + } + Frame { + msec: 8448 + hash: "978ed05f4ea2cc7ddb06807a25883335" + } + Frame { + msec: 8464 + hash: "978ed05f4ea2cc7ddb06807a25883335" + } + Key { + type: 6 + key: 16777235 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 8480 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 8496 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 8512 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 8528 + hash: "b65c439a091d3293352de410d28aaca1" + } + Key { + type: 7 + key: 16777235 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 8544 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 8560 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 8576 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 8592 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 8608 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 8624 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 8640 + image: "usingMultilineEdit.8.png" + } + Frame { + msec: 8656 + hash: "b65c439a091d3293352de410d28aaca1" + } + Key { + type: 7 + key: 16777248 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 8672 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 8688 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 8704 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 8720 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 8736 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 8752 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 8768 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 8784 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 8800 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 8816 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 8832 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 8848 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 8864 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 8880 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 8896 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 8912 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 8928 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 8944 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 8960 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 8976 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 8992 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 9008 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 9024 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 9040 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 9056 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 9072 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 9088 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 9104 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 9120 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 9136 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 9152 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 9168 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 9184 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 9200 + hash: "b65c439a091d3293352de410d28aaca1" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 70; y: 73 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9216 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 9232 + hash: "b65c439a091d3293352de410d28aaca1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 74 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9248 + hash: "b65c439a091d3293352de410d28aaca1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 75 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 76 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9264 + hash: "b65c439a091d3293352de410d28aaca1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 77 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 78 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9280 + hash: "b65c439a091d3293352de410d28aaca1" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 70; y: 78 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9296 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 9312 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 9328 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 9344 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 9360 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 9376 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 9392 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 9408 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 9424 + hash: "b65c439a091d3293352de410d28aaca1" + } + Frame { + msec: 9440 + hash: "b65c439a091d3293352de410d28aaca1" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 71; y: 94 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9456 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 9472 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 9488 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 9504 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 9520 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 9536 + hash: "3d08eff16edf54f522a75df1734150df" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 71; y: 94 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9552 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 9568 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 9584 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 9600 + image: "usingMultilineEdit.9.png" + } + Frame { + msec: 9616 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 9632 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 9648 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 9664 + hash: "3d08eff16edf54f522a75df1734150df" + } + Key { + type: 6 + key: 16777248 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 9680 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 9696 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 9712 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 9728 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 9744 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 9760 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 9776 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 9792 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 9808 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 9824 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 9840 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 9856 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 9872 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 9888 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 9904 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 9920 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 9936 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 9952 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 9968 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 9984 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10000 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10016 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10032 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10048 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10064 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10080 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10096 + hash: "3d08eff16edf54f522a75df1734150df" + } + Key { + type: 6 + key: 16777237 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 10112 + hash: "8d9ca5bff73c2c93a0db5787ca7ef76b" + } + Frame { + msec: 10128 + hash: "8d9ca5bff73c2c93a0db5787ca7ef76b" + } + Frame { + msec: 10144 + hash: "8d9ca5bff73c2c93a0db5787ca7ef76b" + } + Frame { + msec: 10160 + hash: "8d9ca5bff73c2c93a0db5787ca7ef76b" + } + Frame { + msec: 10176 + hash: "8d9ca5bff73c2c93a0db5787ca7ef76b" + } + Frame { + msec: 10192 + hash: "8d9ca5bff73c2c93a0db5787ca7ef76b" + } + Frame { + msec: 10208 + hash: "8d9ca5bff73c2c93a0db5787ca7ef76b" + } + Frame { + msec: 10224 + hash: "8d9ca5bff73c2c93a0db5787ca7ef76b" + } + Key { + type: 7 + key: 16777237 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 10240 + hash: "8d9ca5bff73c2c93a0db5787ca7ef76b" + } + Frame { + msec: 10256 + hash: "8d9ca5bff73c2c93a0db5787ca7ef76b" + } + Frame { + msec: 10272 + hash: "8d9ca5bff73c2c93a0db5787ca7ef76b" + } + Frame { + msec: 10288 + hash: "8d9ca5bff73c2c93a0db5787ca7ef76b" + } + Frame { + msec: 10304 + hash: "8d9ca5bff73c2c93a0db5787ca7ef76b" + } + Frame { + msec: 10320 + hash: "8d9ca5bff73c2c93a0db5787ca7ef76b" + } + Frame { + msec: 10336 + hash: "8d9ca5bff73c2c93a0db5787ca7ef76b" + } + Frame { + msec: 10352 + hash: "8d9ca5bff73c2c93a0db5787ca7ef76b" + } + Key { + type: 6 + key: 16777235 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 10368 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10384 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10400 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10416 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10432 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10448 + hash: "3d08eff16edf54f522a75df1734150df" + } + Key { + type: 7 + key: 16777235 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 10464 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10480 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10496 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10512 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10528 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10544 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10560 + image: "usingMultilineEdit.10.png" + } + Frame { + msec: 10576 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10592 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10608 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10624 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10640 + hash: "3d08eff16edf54f522a75df1734150df" + } + Key { + type: 7 + key: 16777248 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 10656 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10672 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10688 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10704 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10720 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10736 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10752 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10768 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10784 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10800 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10816 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10832 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10848 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10864 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10880 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10896 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10912 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10928 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10944 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10960 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10976 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 10992 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11008 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11024 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11040 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11056 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11072 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11088 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11104 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11120 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11136 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11152 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11168 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11184 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11200 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11216 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11232 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11248 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11264 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11280 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11296 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11312 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11328 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11344 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11360 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11376 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11392 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11408 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11424 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11440 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11456 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11472 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11488 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11504 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11520 + image: "usingMultilineEdit.11.png" + } + Frame { + msec: 11536 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11552 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11568 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11584 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11600 + hash: "3d08eff16edf54f522a75df1734150df" + } + Frame { + msec: 11616 + hash: "3d08eff16edf54f522a75df1734150df" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/wrap.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/wrap.0.png new file mode 100644 index 00000000..ec65f494 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/wrap.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/wrap.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/wrap.1.png new file mode 100644 index 00000000..ec65f494 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/wrap.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/wrap.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/wrap.2.png new file mode 100644 index 00000000..ec65f494 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/wrap.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/wrap.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/wrap.3.png new file mode 100644 index 00000000..ec65f494 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/wrap.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/wrap.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/wrap.4.png new file mode 100644 index 00000000..ec65f494 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/wrap.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/wrap.5.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/wrap.5.png new file mode 100644 index 00000000..ec65f494 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/wrap.5.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/wrap.6.png b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/wrap.6.png new file mode 100644 index 00000000..ec65f494 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/wrap.6.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/wrap.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/wrap.qml new file mode 100644 index 00000000..2e755a4f --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/data/wrap.qml @@ -0,0 +1,2467 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 84 + modifiers: 33554432 + text: "54" + autorep: false + count: 1 + } + Frame { + msec: 32 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 16777248 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 48 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 64 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 80 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 96 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 72 + modifiers: 0 + text: "68" + autorep: false + count: 1 + } + Frame { + msec: 112 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 128 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 144 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 73 + modifiers: 0 + text: "69" + autorep: false + count: 1 + } + Frame { + msec: 160 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 176 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 192 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 72 + modifiers: 0 + text: "68" + autorep: false + count: 1 + } + Frame { + msec: 208 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 224 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 240 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 73 + modifiers: 0 + text: "69" + autorep: false + count: 1 + } + Frame { + msec: 256 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 272 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 288 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 304 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 320 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 336 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 352 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 368 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 384 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 400 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 416 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 432 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 448 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 464 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 73 + modifiers: 0 + text: "69" + autorep: false + count: 1 + } + Frame { + msec: 480 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 496 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 512 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 528 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Key { + type: 7 + key: 73 + modifiers: 0 + text: "69" + autorep: false + count: 1 + } + Frame { + msec: 544 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 560 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 576 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 592 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 608 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 624 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 640 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 656 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 672 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 688 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 704 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 720 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 736 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 752 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 768 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 784 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 800 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 816 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 832 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 848 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 864 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 880 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 896 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 912 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 928 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 944 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 960 + image: "wrap.0.png" + } + Frame { + msec: 976 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 992 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Key { + type: 7 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 1008 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1024 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1040 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1056 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1072 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Frame { + msec: 1088 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1104 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1120 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1136 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1152 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1168 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1184 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 1200 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1216 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1232 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1248 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1264 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Key { + type: 6 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 1280 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1296 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 1312 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1328 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1344 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 1360 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1376 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 1392 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1408 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1424 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1440 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 1456 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1472 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1488 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1504 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1520 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 1536 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1552 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 72 + modifiers: 0 + text: "68" + autorep: false + count: 1 + } + Frame { + msec: 1568 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1584 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1600 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1616 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1632 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Key { + type: 7 + key: 72 + modifiers: 0 + text: "68" + autorep: false + count: 1 + } + Frame { + msec: 1648 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1664 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1680 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1696 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1712 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 1728 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1744 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1760 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 1776 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 1792 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1808 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 1824 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1840 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1856 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1872 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 1888 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1904 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1920 + image: "wrap.1.png" + } + Frame { + msec: 1936 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1952 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 1968 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 1984 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2000 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2016 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2032 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2048 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Frame { + msec: 2064 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 2080 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2096 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2112 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Frame { + msec: 2128 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2144 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2160 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2176 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2192 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2208 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 88 + modifiers: 0 + text: "78" + autorep: false + count: 1 + } + Frame { + msec: 2224 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2240 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2256 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2272 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2288 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 2304 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 88 + modifiers: 0 + text: "78" + autorep: false + count: 1 + } + Frame { + msec: 2320 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2336 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2352 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 2368 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2384 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 2400 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2416 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2432 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 2448 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2464 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2480 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Frame { + msec: 2496 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2512 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2528 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2544 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Frame { + msec: 2560 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2576 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2592 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2608 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2624 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2640 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 68 + modifiers: 0 + text: "64" + autorep: false + count: 1 + } + Frame { + msec: 2656 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2672 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2688 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2704 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 68 + modifiers: 0 + text: "64" + autorep: false + count: 1 + } + Frame { + msec: 2720 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2736 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2752 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 73 + modifiers: 0 + text: "69" + autorep: false + count: 1 + } + Frame { + msec: 2768 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2784 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2800 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2816 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2832 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Key { + type: 7 + key: 73 + modifiers: 0 + text: "69" + autorep: false + count: 1 + } + Frame { + msec: 2848 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2864 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2880 + image: "wrap.2.png" + } + Frame { + msec: 2896 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 2912 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2928 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 2944 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2960 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 2976 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 2992 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3008 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3024 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3040 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3056 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3072 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3088 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 87 + modifiers: 0 + text: "77" + autorep: false + count: 1 + } + Frame { + msec: 3104 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3120 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3136 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3152 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3168 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 87 + modifiers: 0 + text: "77" + autorep: false + count: 1 + } + Frame { + msec: 3184 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3200 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3216 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3232 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3248 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 82 + modifiers: 0 + text: "72" + autorep: false + count: 1 + } + Frame { + msec: 3264 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3280 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3296 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 82 + modifiers: 0 + text: "72" + autorep: false + count: 1 + } + Frame { + msec: 3312 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3328 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3344 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 3360 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3376 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3392 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3408 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3424 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 3440 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3456 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3472 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 80 + modifiers: 0 + text: "70" + autorep: false + count: 1 + } + Frame { + msec: 3488 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3504 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3520 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3536 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 80 + modifiers: 0 + text: "70" + autorep: false + count: 1 + } + Frame { + msec: 3552 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3568 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 3584 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3600 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3616 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3632 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3648 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3664 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 3680 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 3696 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3712 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3728 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3744 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3760 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 3776 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3792 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3808 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3824 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3840 + image: "wrap.3.png" + } + Frame { + msec: 3856 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3872 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3888 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3904 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 67 + modifiers: 0 + text: "63" + autorep: false + count: 1 + } + Frame { + msec: 3920 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3936 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3952 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3968 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 3984 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 67 + modifiers: 0 + text: "63" + autorep: false + count: 1 + } + Frame { + msec: 4000 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4016 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 4032 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4048 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4064 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 4080 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 82 + modifiers: 0 + text: "72" + autorep: false + count: 1 + } + Frame { + msec: 4096 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4112 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4128 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4144 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 82 + modifiers: 0 + text: "72" + autorep: false + count: 1 + } + Frame { + msec: 4160 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4176 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4192 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 82 + modifiers: 0 + text: "72" + autorep: false + count: 1 + } + Frame { + msec: 4208 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4224 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4240 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4256 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4272 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Frame { + msec: 4288 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 82 + modifiers: 0 + text: "72" + autorep: false + count: 1 + } + Frame { + msec: 4304 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4320 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4336 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Frame { + msec: 4352 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4368 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4384 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4400 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4416 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 67 + modifiers: 0 + text: "63" + autorep: false + count: 1 + } + Frame { + msec: 4432 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4448 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4464 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 67 + modifiers: 0 + text: "63" + autorep: false + count: 1 + } + Frame { + msec: 4480 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4496 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4512 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4528 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4544 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 4560 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4576 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4592 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4608 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 84 + modifiers: 0 + text: "74" + autorep: false + count: 1 + } + Frame { + msec: 4624 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4640 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4656 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4672 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 76 + modifiers: 0 + text: "6c" + autorep: false + count: 1 + } + Frame { + msec: 4688 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4704 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4720 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4736 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 76 + modifiers: 0 + text: "6c" + autorep: false + count: 1 + } + Frame { + msec: 4752 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4768 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4784 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 89 + modifiers: 0 + text: "79" + autorep: false + count: 1 + } + Frame { + msec: 4800 + image: "wrap.4.png" + } + Frame { + msec: 4816 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 89 + modifiers: 0 + text: "79" + autorep: false + count: 1 + } + Frame { + msec: 4832 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4848 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4864 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4880 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 6 + key: 46 + modifiers: 0 + text: "2e" + autorep: false + count: 1 + } + Frame { + msec: 4896 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4912 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4928 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4944 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Key { + type: 7 + key: 46 + modifiers: 0 + text: "2e" + autorep: false + count: 1 + } + Frame { + msec: 4960 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4976 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 4992 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5008 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5024 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5040 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5056 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5072 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5088 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5104 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5120 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5136 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5152 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5168 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5184 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5200 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5216 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5232 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5248 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5264 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5280 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5296 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5312 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5328 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5344 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5360 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5376 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5392 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5408 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5424 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5440 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5456 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5472 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5488 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5504 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5520 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5536 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5552 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5568 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5584 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5600 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5616 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5632 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5648 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5664 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5680 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5696 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5712 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5728 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5744 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5760 + image: "wrap.5.png" + } + Frame { + msec: 5776 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5792 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5808 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5824 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5840 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5856 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5872 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5888 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5904 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5920 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5936 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5952 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5968 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 5984 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6000 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6016 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6032 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6048 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6064 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6080 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6096 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6112 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6128 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6144 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6160 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6176 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6192 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6208 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6224 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6240 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6256 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6272 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6288 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6304 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6320 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6336 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6352 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6368 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6384 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6400 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6416 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6432 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6448 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6464 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6480 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6496 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6512 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6528 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6544 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6560 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6576 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6592 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6608 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6624 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6640 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6656 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6672 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6688 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6704 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6720 + image: "wrap.6.png" + } + Frame { + msec: 6736 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6752 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6768 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6784 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6800 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6816 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6832 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6848 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } + Frame { + msec: 6864 + hash: "e165a0b90fdc1eef2c8244ad8545bd6f" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/flickableEdit.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/flickableEdit.qml new file mode 100644 index 00000000..6913fdd7 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/flickableEdit.qml @@ -0,0 +1,20 @@ +import QtQuick 1.0 + +Flickable { + width: 200 + height: 50 + contentWidth: 400 + + Column { + anchors.fill: parent + + TextEdit { + selectByMouse: true + text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + } + TextEdit { + selectByMouse: false + text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + } + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/justify.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/justify.qml new file mode 100644 index 00000000..4aeb58c3 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/justify.qml @@ -0,0 +1,22 @@ +import QtQuick 1.0 +import "../shared" 1.0 + +Rectangle { + width: 450 + height: 250 + + TestTextEdit { + anchors.fill: parent + anchors { leftMargin: 10; rightMargin: 10; topMargin:10; bottomMargin: 10 } + wrapMode: Text.Wrap + horizontalAlignment: Text.AlignJustify + + text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin a aliquet massa. Integer id velit a nibh imperdiet sagittis. Cras fringilla enim non nulla porta bibendum. Integer risus urna, hendrerit non interdum ut, dapibus id velit. Nullam fermentum viverra pellentesque. In molestie scelerisque lorem molestie ultrices. Curabitur dolor arcu, tristique in sodales in, varius sed diam. Quisque magna velit, tincidunt sed ullamcorper sit amet, ornare adipiscing ligula. In hac habitasse platea dictumst. Ut tincidunt urna vel mauris fermentum ornare quis a ligula. Suspendisse cursus volutpat sapien eget cursus." + + Rectangle { + anchors.fill: parent + color: "transparent" + border.color: "red" + } + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/linkActivated.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/linkActivated.qml new file mode 100644 index 00000000..177d4751 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/linkActivated.qml @@ -0,0 +1,15 @@ +import QtQuick 1.1 + +Rectangle{ + width: 100 + height: 100 + TextEdit{ + text: 'Click Me ' + onLinkActivated: txt.text=link; + } + Text{ + id: txt + y:50 + text: "unknown" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/qt-669.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/qt-669.qml new file mode 100644 index 00000000..5f802346 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/qt-669.qml @@ -0,0 +1,19 @@ +import QtQuick 1.0 +import "../shared" 1.0 + +Rectangle { + Component { id: testableCursor + //This shouldn't blink + Rectangle { + color:"black" + width:1 + } + } + width:300; + height:40; + TestTextEdit { + focus: true; + cursorDelegate: testableCursor + text: "Jackdaws love my big sphinx of Quartz" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/usingMultilineEdit.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/usingMultilineEdit.qml new file mode 100644 index 00000000..bf5e7a01 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/usingMultilineEdit.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 + +Rectangle{ + width: 280 + height: 140 + Column { + MultilineEdit { + text: 'I am the very model of a modern major general. I\'ve information vegetable, animal and mineral. I know the kings of england and I quote the fights historical - from Marathon to Waterloo in order categorical.'; + width: 182; height: 60; + } + Rectangle {height: 20; width: 20;}//Spacer + MultilineEdit {text: 'Hello world'} + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextedit/wrap.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/wrap.qml new file mode 100644 index 00000000..63400f1b --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextedit/wrap.qml @@ -0,0 +1,35 @@ +import QtQuick 1.0 +import "../shared" 1.0 + +Item { + height:400 + width: 200 + TestTextEdit { + width: 200 + height: 100 + wrapMode: TextEdit.WordWrap + focus: true + } + //With QTBUG-6273 only the bottom one would be wrapped + TestTextEdit { + width: 200 + height: 100 + wrapMode: TextEdit.WordWrap + text: "This is a test that text edit wraps correctly." + y:100 + } + TestTextEdit { + width: 150 + height: 100 + wrapMode: TextEdit.WrapAnywhere + text: "This is a test that text edit wraps correctly. thisisaverylongstringwithnospaces" + y:200 + } + TestTextEdit { + width: 150 + height: 100 + wrapMode: TextEdit.Wrap + text: "This is a test that text edit wraps correctly. thisisaverylongstringwithnospaces" + y:300 + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/LineEdit.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/LineEdit.qml new file mode 100644 index 00000000..6789eac2 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/LineEdit.qml @@ -0,0 +1,69 @@ +import QtQuick 1.0 +import "../shared" 1.0 + +Item { + id:lineedit + property alias text: textInp.text + + width: textInp.width + 11 + height: 13 + 11 + + Rectangle { + color: 'lightsteelblue' + anchors.fill: parent + } + clip: true + Component.onCompleted: textInp.cursorPosition = 0; + TestTextInput { + id:textInp + cursorDelegate: Item { + Rectangle { + visible: parent.parent.focus + color: "#009BCE" + height: 13 + width: 2 + y: 1 + } + } + property int leftMargin: 6 + property int rightMargin: 6 + x: leftMargin + y: 5 + //Below function implements all scrolling logic + onCursorPositionChanged: { + if(cursorRectangle.x < leftMargin - textInp.x){//Cursor went off the front + textInp.x = leftMargin - Math.max(0, cursorRectangle.x); + }else if(cursorRectangle.x > parent.width - leftMargin - rightMargin - textInp.x){//Cusor went off the end + textInp.x = leftMargin - Math.max(0, cursorRectangle.x - (parent.width - leftMargin - rightMargin)); + } + } + + autoScroll: false //It is preferable to implement your own scrolling + text:"" + horizontalAlignment: TextInput.AlignLeft + font.pixelSize:15 + selectionColor: 'steelblue' + } + MouseArea { + //Implements all line edit mouse handling + id: mainMouseArea + anchors.fill: parent; + function translateX(x){ + return x - textInp.x + } + onPressed: { + textInp.focus = true; + textInp.cursorPosition = textInp.positionAt(translateX(mouse.x)); + } + onPositionChanged: { + textInp.moveCursorSelection(textInp.positionAt(translateX(mouse.x))); + } + onReleased: { + } + onDoubleClicked: { + textInp.selectAll() + } + z: textInp.z + 1 + } + +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/cursorDelegate.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/cursorDelegate.qml new file mode 100644 index 00000000..f2a34b7c --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/cursorDelegate.qml @@ -0,0 +1,37 @@ +import QtQuick 1.0 +import "../shared" 1.0 + +Rectangle { + resources: [ + Component { id: cursorA + Item { id: cPage; + Behavior on x { NumberAnimation { } } + Behavior on y { NumberAnimation { } } + Behavior on height { NumberAnimation { duration: 200 } } + Rectangle { id: cRectangle; color: "black"; y: 1; width: 1; height: parent.height-2; + Rectangle { id:top; color: "black"; width: 3; height: 1; x: -1; y:0} + Rectangle { id:bottom; color: "black"; width: 3; height: 1; x: -1; anchors.bottom: parent.bottom;} + opacity: 1 + SequentialAnimation on opacity { running: cPage.parent.focus == true; loops: Animation.Infinite; + NumberAnimation { to: 1; duration: 500; easing.type: "InQuad"} + NumberAnimation { to: 0; duration: 500; easing.type: "OutQuad"} + } + } + width: 1; + } + } + ] + width: 400 + height: 200 + color: "white" + TestTextInput { id: mainText + text: "Hello World" + cursorDelegate: cursorA + focus: true + font.pixelSize: 28 + selectionColor: "lightsteelblue" + selectedTextColor: "deeppink" + color: "forestgreen" + anchors.centerIn: parent + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.0.png new file mode 100644 index 00000000..b65bc372 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.1.png new file mode 100644 index 00000000..ebaa0116 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.2.png new file mode 100644 index 00000000..57ee3706 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.3.png new file mode 100644 index 00000000..4b70b4a5 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.4.png new file mode 100644 index 00000000..18ae753c Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.5.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.5.png new file mode 100644 index 00000000..2b463f0d Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.5.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.6.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.6.png new file mode 100644 index 00000000..7331f89f Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.6.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.7.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.7.png new file mode 100644 index 00000000..968bdd2d Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.7.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.8.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.8.png new file mode 100644 index 00000000..9a3436a0 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.8.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.qml new file mode 100644 index 00000000..6b8ba9b1 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/cursorDelegate.qml @@ -0,0 +1,1551 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "cursorDelegate.0.png" + } + Frame { + msec: 32 + hash: "a7af287992f894f9cf76e834b922f5b3" + } + Frame { + msec: 48 + hash: "a7af287992f894f9cf76e834b922f5b3" + } + Frame { + msec: 64 + hash: "a7af287992f894f9cf76e834b922f5b3" + } + Frame { + msec: 80 + hash: "a7af287992f894f9cf76e834b922f5b3" + } + Frame { + msec: 96 + hash: "a7af287992f894f9cf76e834b922f5b3" + } + Frame { + msec: 112 + hash: "a7af287992f894f9cf76e834b922f5b3" + } + Frame { + msec: 128 + hash: "a7af287992f894f9cf76e834b922f5b3" + } + Frame { + msec: 144 + hash: "a7af287992f894f9cf76e834b922f5b3" + } + Frame { + msec: 160 + hash: "a7af287992f894f9cf76e834b922f5b3" + } + Frame { + msec: 176 + hash: "a7af287992f894f9cf76e834b922f5b3" + } + Frame { + msec: 192 + hash: "a7af287992f894f9cf76e834b922f5b3" + } + Frame { + msec: 208 + hash: "a7af287992f894f9cf76e834b922f5b3" + } + Frame { + msec: 224 + hash: "a7af287992f894f9cf76e834b922f5b3" + } + Frame { + msec: 240 + hash: "a7af287992f894f9cf76e834b922f5b3" + } + Frame { + msec: 256 + hash: "a7af287992f894f9cf76e834b922f5b3" + } + Frame { + msec: 272 + hash: "a7af287992f894f9cf76e834b922f5b3" + } + Frame { + msec: 288 + hash: "a7af287992f894f9cf76e834b922f5b3" + } + Frame { + msec: 304 + hash: "a7af287992f894f9cf76e834b922f5b3" + } + Frame { + msec: 320 + hash: "a7af287992f894f9cf76e834b922f5b3" + } + Frame { + msec: 336 + hash: "a7af287992f894f9cf76e834b922f5b3" + } + Frame { + msec: 352 + hash: "a7af287992f894f9cf76e834b922f5b3" + } + Frame { + msec: 368 + hash: "a7af287992f894f9cf76e834b922f5b3" + } + Frame { + msec: 384 + hash: "a7af287992f894f9cf76e834b922f5b3" + } + Frame { + msec: 400 + hash: "a7af287992f894f9cf76e834b922f5b3" + } + Frame { + msec: 416 + hash: "a7af287992f894f9cf76e834b922f5b3" + } + Frame { + msec: 432 + hash: "a7af287992f894f9cf76e834b922f5b3" + } + Frame { + msec: 448 + hash: "a7af287992f894f9cf76e834b922f5b3" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 464 + hash: "74b6ebfbe8246f0b2b43f88d9f6028d1" + } + Frame { + msec: 480 + hash: "74b6ebfbe8246f0b2b43f88d9f6028d1" + } + Frame { + msec: 496 + hash: "74b6ebfbe8246f0b2b43f88d9f6028d1" + } + Frame { + msec: 512 + hash: "74b6ebfbe8246f0b2b43f88d9f6028d1" + } + Frame { + msec: 528 + hash: "0f0e9ced5d2f9f20a2b5f1b5bde0be62" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 544 + hash: "bec7fff73d6d869d2d15b3ea35fa0605" + } + Frame { + msec: 560 + hash: "e3afffc91ed0a78a0022421e6d1bd0d2" + } + Frame { + msec: 576 + hash: "45f44411121d335ed7a844803313e566" + } + Frame { + msec: 592 + hash: "b951279da53fe76ab62ca9837ecbd7a6" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 608 + hash: "b5678202f08099b09ce88cef5eeea20a" + } + Frame { + msec: 624 + hash: "93f6663d083a2bd3b4079241f3fc0159" + } + Frame { + msec: 640 + hash: "8c802943d3030214cb7af7fd1db1c813" + } + Frame { + msec: 656 + hash: "01396c0332523ba2a8971a99c6962516" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 672 + hash: "fc5dd253219d1a8aca7fcf31be0e7d69" + } + Frame { + msec: 688 + hash: "545071a58d8db4f73e1cb6981e9ec62e" + } + Frame { + msec: 704 + hash: "13bc1aa8ce4fc3d9ba9a6c3046e14c92" + } + Frame { + msec: 720 + hash: "ba7d13545fb7384dcb3edd32979c9442" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 736 + hash: "8f9e1abd8eb2d072907b910630e93c9a" + } + Frame { + msec: 752 + hash: "003d0e4a01909aa51cb1967738383ede" + } + Frame { + msec: 768 + hash: "223cce18cef44b3945d0a1d45554c5c1" + } + Frame { + msec: 784 + hash: "fcd7f862bdce75d7e6df574ff0146ca6" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 800 + hash: "21f5e3696987222106b00f0efe3bb165" + } + Frame { + msec: 816 + hash: "6380ce26303da8180dff8fcc88caaf1d" + } + Frame { + msec: 832 + hash: "52bfa995405a3d6523d97b2c36428d89" + } + Frame { + msec: 848 + hash: "7169d69c2adb50bf80c075e30eb8e965" + } + Frame { + msec: 864 + hash: "f5ad55885a4fc2b47a5420e9e0d7c59c" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 880 + hash: "831081f829df0a226c75389bc457a768" + } + Frame { + msec: 896 + hash: "2306a9c9cb570bc922f120f2f63e26e4" + } + Frame { + msec: 912 + hash: "23d6728fe34436e53a449e26962c3ad5" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 928 + hash: "db2de48337701cbb36a14e32f1846683" + } + Frame { + msec: 944 + hash: "04bb83a694d293fd4ba956fc79db79e7" + } + Frame { + msec: 960 + hash: "7a1a71b2d7e42934163990d5c011c464" + } + Frame { + msec: 976 + image: "cursorDelegate.1.png" + } + Frame { + msec: 992 + hash: "af99069cdddfa9d099fbe25ba586e138" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1008 + hash: "af99069cdddfa9d099fbe25ba586e138" + } + Frame { + msec: 1024 + hash: "af99069cdddfa9d099fbe25ba586e138" + } + Frame { + msec: 1040 + hash: "af99069cdddfa9d099fbe25ba586e138" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1056 + hash: "af99069cdddfa9d099fbe25ba586e138" + } + Frame { + msec: 1072 + hash: "20f1db4245d1689e980371d7b1bcb903" + } + Frame { + msec: 1088 + hash: "6a3629223845d352ba02e3ad8569f698" + } + Frame { + msec: 1104 + hash: "ee3dd4535fcf24249c41ebebb5f4fca6" + } + Frame { + msec: 1120 + hash: "7bf5df6a807da0c8d316420ced34e267" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1136 + hash: "4f5ce98428d5fba11a6322f88cab14c3" + } + Frame { + msec: 1152 + hash: "14406e8d0e120a0f30864fa8793f2e8d" + } + Frame { + msec: 1168 + hash: "6e891d584ce4f636708cee1111193878" + } + Frame { + msec: 1184 + hash: "cd6bbc72108cfffd043a31d0d3655851" + } + Frame { + msec: 1200 + hash: "d4069e606ab2b10c90e6f567be462c10" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1216 + hash: "de8e00d6116b1aa900478a41c7ac78f1" + } + Frame { + msec: 1232 + hash: "5a0c4e31eb9ecb2ffc9380d474861846" + } + Frame { + msec: 1248 + hash: "bbacdb359c6206b50a859169b106ec92" + } + Frame { + msec: 1264 + hash: "c4f4ed5a4842f1bbdda67a27d74fd5f4" + } + Frame { + msec: 1280 + hash: "4deb6d0a83b14abef80f2bfa0491cbd0" + } + Frame { + msec: 1296 + hash: "9caca7068ce5b289d70c39667e87a57f" + } + Key { + type: 6 + key: 16777249 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1312 + hash: "e3ca7a8a860efc3811b8befe0a97d7f1" + } + Key { + type: 6 + key: 16777248 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1328 + hash: "ddb3dcb40f412c087d0ae21b5a8e47aa" + } + Frame { + msec: 1344 + hash: "325d8356c3e14467c54d03d096a3c1a5" + } + Frame { + msec: 1360 + hash: "83f4c541b94180863e538e6c0a0e1ae0" + } + Frame { + msec: 1376 + hash: "16623dc34067800f3c7d6aabe1076927" + } + Key { + type: 6 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1392 + hash: "e7319b080b621c5d176d6913cd9a8f7e" + } + Frame { + msec: 1408 + hash: "353a200418b2cc0fbe925329224e658a" + } + Frame { + msec: 1424 + hash: "98fd3f1fc108de1d78f07587f9e94ec4" + } + Frame { + msec: 1440 + hash: "f75fbda5a1403f7b1dd8e9d05e30ebeb" + } + Frame { + msec: 1456 + hash: "c2742ff9a04bbae6c6de13f08d514913" + } + Frame { + msec: 1472 + hash: "a73b65c18ba10e6b6d310fc325d7ccb2" + } + Frame { + msec: 1488 + hash: "bbe72b26a6f3f518a3c8b6cd9e8dbfd1" + } + Key { + type: 7 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1504 + hash: "679205439a359f3ffb05f631a1979596" + } + Frame { + msec: 1520 + hash: "7ada5f6a58a6a7f9a3b4199a412fccfd" + } + Frame { + msec: 1536 + hash: "66749c0e5b97cec02f4908a709201604" + } + Frame { + msec: 1552 + hash: "373bfac053f5cfeceabe2979f3e6f444" + } + Frame { + msec: 1568 + hash: "c7ab2bcdcd1b7fd25ac775c4dd382635" + } + Frame { + msec: 1584 + hash: "3116b1a0cf1724bdae2cb71b9e15c73e" + } + Frame { + msec: 1600 + hash: "9bdc4513c30bf2d1eca61317cc22ebaa" + } + Frame { + msec: 1616 + hash: "bbecf871ff569ac1020272c1ccc9aa14" + } + Frame { + msec: 1632 + hash: "beef5a84dcc7794cf0aabfc8b7f811bc" + } + Frame { + msec: 1648 + hash: "2db7161f3591ef0b3f1e3cb2aa357c8b" + } + Frame { + msec: 1664 + hash: "b8b5ffef5e52a8ae94ddb5ec3328fa0e" + } + Frame { + msec: 1680 + hash: "b65c4657ffb97a59455f2c3e23e3eb51" + } + Key { + type: 6 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1696 + hash: "9702981b8eb5f035f2f4da6708ad1a92" + } + Frame { + msec: 1712 + hash: "a6f46dd869daf69c5a5a3c887ae35a05" + } + Frame { + msec: 1728 + hash: "902c0f174b16b1b0d419c13220937e06" + } + Frame { + msec: 1744 + hash: "97a5ea7449a1f313d0d5e818edc29bf6" + } + Frame { + msec: 1760 + hash: "d5b69638452ea2260861c17991fc8bef" + } + Frame { + msec: 1776 + hash: "5fa21c53d65b078d1b30830d99a0fbaf" + } + Frame { + msec: 1792 + hash: "668de1d2fa5780f5088637d919db0a0d" + } + Key { + type: 7 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1808 + hash: "1989592754c28456aa917562fa3620bd" + } + Frame { + msec: 1824 + hash: "89cd0ef7c366bbcee8e4404e9a2285a7" + } + Frame { + msec: 1840 + hash: "d062d4b132ee3086a00220d47e8907fc" + } + Frame { + msec: 1856 + hash: "198bd9fc763c70fb84bdae122f0bdd8b" + } + Key { + type: 7 + key: 16777248 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1872 + hash: "304f7f6cef5b09c09db1284b8095e9a2" + } + Key { + type: 6 + key: 16777248 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1888 + hash: "565003fef7b9810ffe95c3bbeeda5bbc" + } + Frame { + msec: 1904 + hash: "2fa85a19ba2bb7d04264a246c4982eb4" + } + Frame { + msec: 1920 + hash: "7be44eca358924dc11c5123e406f1c99" + } + Frame { + msec: 1936 + image: "cursorDelegate.2.png" + } + Frame { + msec: 1952 + hash: "a08502b3fbb425c7b1cad93e4bc5701e" + } + Frame { + msec: 1968 + hash: "fba3a88b7fe6f7583daf07db78f3598c" + } + Frame { + msec: 1984 + hash: "509d75aa56bcdb6718c18b56e138ef3c" + } + Frame { + msec: 2000 + hash: "509d75aa56bcdb6718c18b56e138ef3c" + } + Frame { + msec: 2016 + hash: "509d75aa56bcdb6718c18b56e138ef3c" + } + Frame { + msec: 2032 + hash: "509d75aa56bcdb6718c18b56e138ef3c" + } + Key { + type: 7 + key: 16777249 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2048 + hash: "509d75aa56bcdb6718c18b56e138ef3c" + } + Key { + type: 7 + key: 16777248 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2064 + hash: "fba3a88b7fe6f7583daf07db78f3598c" + } + Frame { + msec: 2080 + hash: "a08502b3fbb425c7b1cad93e4bc5701e" + } + Frame { + msec: 2096 + hash: "86ad5a9e06d19ea79e0fc9f7f36cdb0f" + } + Frame { + msec: 2112 + hash: "7be44eca358924dc11c5123e406f1c99" + } + Frame { + msec: 2128 + hash: "2fa85a19ba2bb7d04264a246c4982eb4" + } + Frame { + msec: 2144 + hash: "565003fef7b9810ffe95c3bbeeda5bbc" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2160 + hash: "39c81c6efdbc32b6e0378810404bef2c" + } + Frame { + msec: 2176 + hash: "756f36cf41c2bae3a8a8716701e55e37" + } + Frame { + msec: 2192 + hash: "fb09d44a5a5b5b795d562512e9547301" + } + Frame { + msec: 2208 + hash: "183538d04cf009f100a1e49a3229c143" + } + Frame { + msec: 2224 + hash: "2ec91bfdb0f106a526f6bde3eb0ed7ce" + } + Frame { + msec: 2240 + hash: "f34175acc261ad79bc9d2083af04ae10" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2256 + hash: "39a59b2e9e0bee87d3ba50e1408bea1c" + } + Frame { + msec: 2272 + hash: "db61ba19d56b69d148aeb182de596713" + } + Frame { + msec: 2288 + hash: "e0b07106a5adc1603788444d48b9c3db" + } + Frame { + msec: 2304 + hash: "1dd5625fb6a0ddbaa3919a1702695e9c" + } + Frame { + msec: 2320 + hash: "d7d39e8f717bab17aaf8a12e4f9e0dfc" + } + Frame { + msec: 2336 + hash: "d7a226b40a049dee56755af9206246b4" + } + Frame { + msec: 2352 + hash: "37d2d2830f6ae6bf0c8fb29c5d4f521a" + } + Key { + type: 6 + key: 16777249 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Key { + type: 6 + key: 16777248 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2368 + hash: "21008b3a5179e25f9b132a4c05b8b8c4" + } + Frame { + msec: 2384 + hash: "a6f05fb5206a456bea790ba7ba31868c" + } + Frame { + msec: 2400 + hash: "754e2fca1b3ed5ee9875aafb1a0c62d3" + } + Frame { + msec: 2416 + hash: "75d1ae9c60573f9e27cd7c2d1706cbfc" + } + Frame { + msec: 2432 + hash: "c78608cde907bc09760d858795b43bbf" + } + Key { + type: 6 + key: 16777234 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2448 + hash: "348438b012690f63956e6a865c4173c5" + } + Frame { + msec: 2464 + hash: "b0c970656fdb5af48efc4bf0e1879f36" + } + Frame { + msec: 2480 + hash: "7291a68c8e790f58e2440dfbe896c36d" + } + Frame { + msec: 2496 + hash: "9bcbf9f7b35987c3acbd80031a688279" + } + Frame { + msec: 2512 + hash: "48a00bd3f844e863338898bd28d845a4" + } + Key { + type: 7 + key: 16777234 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2528 + hash: "dc5f63ee9e8d50f744f7b375a52e32c3" + } + Frame { + msec: 2544 + hash: "f52d2f475a335a75fad0a0f84e812809" + } + Frame { + msec: 2560 + hash: "bc54cefc8f0b84fc2432b0fb01203b9c" + } + Frame { + msec: 2576 + hash: "e6f14d1181a0db90d2c2891fd6e82883" + } + Frame { + msec: 2592 + hash: "1edc2fff7b3d76bbe2615810a5d15d41" + } + Key { + type: 6 + key: 16777234 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2608 + hash: "5bc156937a29989a3a39761b58958fbd" + } + Frame { + msec: 2624 + hash: "071d45235a669e870356efc60ba8016c" + } + Frame { + msec: 2640 + hash: "1d588fb1f8321e4b437f924077fa7d60" + } + Key { + type: 7 + key: 16777234 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2656 + hash: "ca9aff6590dda45a66cdca601dccaf59" + } + Frame { + msec: 2672 + hash: "2553146fff0d367cc6fa2d11f0a5c83a" + } + Frame { + msec: 2688 + hash: "05bd919cd91ff449027b188d9a24b61f" + } + Frame { + msec: 2704 + hash: "35d6ce9ecef79d006d6416c3b0d75e79" + } + Frame { + msec: 2720 + hash: "1459a2410a971e344d4dacccff1eb7da" + } + Key { + type: 6 + key: 16777234 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2736 + hash: "bd04cc87db0138b57bf0feeafa7630f5" + } + Frame { + msec: 2752 + hash: "81521187d5d88b62f4f7578ea4ee5f68" + } + Frame { + msec: 2768 + hash: "f2f8d1e8232787da1e36d7e8a27b6d93" + } + Frame { + msec: 2784 + hash: "a5dbd1f572419ca4a4b91629e522867f" + } + Key { + type: 7 + key: 16777234 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2800 + hash: "23ab256301d7190f56c4f0af7f57bcc2" + } + Frame { + msec: 2816 + hash: "3a106a01b1cf6b53b5f8721415538f15" + } + Frame { + msec: 2832 + hash: "881f4de48cf79636f5cb292f4cacf842" + } + Frame { + msec: 2848 + hash: "4abe8abf4f29a31220c03af143ef9978" + } + Frame { + msec: 2864 + hash: "50db0e06ceb12795d3e11b2c4a04df9c" + } + Frame { + msec: 2880 + hash: "39f759d5b58ffdaa79d438f932a72582" + } + Frame { + msec: 2896 + image: "cursorDelegate.3.png" + } + Frame { + msec: 2912 + hash: "0cf83e3a000b8ae6a21ef64e5470430f" + } + Frame { + msec: 2928 + hash: "07116cd7cf46fc692542ac57c3e30aea" + } + Frame { + msec: 2944 + hash: "bd92a36fad90de909b5a29a6fead2160" + } + Frame { + msec: 2960 + hash: "95c4d0cc52903dc70c9118e26cd58b7b" + } + Frame { + msec: 2976 + hash: "cb6ca047657a99dbbb037c1c45b40866" + } + Frame { + msec: 2992 + hash: "cb6ca047657a99dbbb037c1c45b40866" + } + Frame { + msec: 3008 + hash: "cb6ca047657a99dbbb037c1c45b40866" + } + Frame { + msec: 3024 + hash: "cb6ca047657a99dbbb037c1c45b40866" + } + Frame { + msec: 3040 + hash: "cb6ca047657a99dbbb037c1c45b40866" + } + Frame { + msec: 3056 + hash: "cb6ca047657a99dbbb037c1c45b40866" + } + Frame { + msec: 3072 + hash: "95c4d0cc52903dc70c9118e26cd58b7b" + } + Key { + type: 6 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3088 + hash: "f9e0bd08b722c16493a8886a19920dda" + } + Frame { + msec: 3104 + hash: "0636b7c5cc215882c60b50f62133c715" + } + Frame { + msec: 3120 + hash: "150b5a2f2e916b7023764c481c768492" + } + Frame { + msec: 3136 + hash: "14bc879f562ace9d2d1a3f3980a72e1f" + } + Frame { + msec: 3152 + hash: "2bdc09121f13e95e15e331ac90fbbe5e" + } + Key { + type: 7 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3168 + hash: "b701aa41aff9df45cc4b35d23789ad46" + } + Frame { + msec: 3184 + hash: "ad77330d51b1251576905a45fdbdf576" + } + Frame { + msec: 3200 + hash: "4ab6780997a5a598d2da7fbbc19877b7" + } + Frame { + msec: 3216 + hash: "43b324d0e4882147d316a5dc16eff4a5" + } + Frame { + msec: 3232 + hash: "4379bfd0da6fedac77e2111d9fdc5ecb" + } + Frame { + msec: 3248 + hash: "ca35937be71e1f982cedd33bdd09d127" + } + Key { + type: 6 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3264 + hash: "f6bac38774fa8a09084c045e34fd1732" + } + Frame { + msec: 3280 + hash: "6d8b58612860febb13800958cab3aecd" + } + Frame { + msec: 3296 + hash: "7f921d2293cf547de3b5573dbf98d5bb" + } + Frame { + msec: 3312 + hash: "18771337bbe826b5a34bd9705c79f56a" + } + Frame { + msec: 3328 + hash: "3dd49406c4b39980908d8869dc3c060a" + } + Frame { + msec: 3344 + hash: "8cae649565b5655d606f216334a0b5b5" + } + Frame { + msec: 3360 + hash: "27c59b474d706ce79b5d075713c1ea88" + } + Key { + type: 7 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3376 + hash: "6d70d654998bbc0a2431ca7c4a58cd3c" + } + Frame { + msec: 3392 + hash: "bf55fffd1727c0d076e05e274dcebb0d" + } + Frame { + msec: 3408 + hash: "d5b0696cbe2969723bb2fe740deeb81f" + } + Frame { + msec: 3424 + hash: "27968050a9cf7d57d016274709086be1" + } + Frame { + msec: 3440 + hash: "3bc037fd17d0d394b82ba19914f31b90" + } + Frame { + msec: 3456 + hash: "117d7ad2d2ae47f3a0c2a68928534b76" + } + Frame { + msec: 3472 + hash: "a538ce971f34a497c05258da2567a208" + } + Frame { + msec: 3488 + hash: "91e2e5cc6efcffc9e58646a008a57c9d" + } + Frame { + msec: 3504 + hash: "13db17cc3c6513014a95210a443e5842" + } + Key { + type: 7 + key: 16777249 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3520 + hash: "03325597bd4e7d7b6f7c84c848018872" + } + Frame { + msec: 3536 + hash: "e96dc6d611d23553b363a765195604f9" + } + Key { + type: 7 + key: 16777248 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3552 + hash: "942476dd6fb7a4f3d10c398503cb7b90" + } + Frame { + msec: 3568 + hash: "cbe34fd18b6355ae9be469a594b44192" + } + Frame { + msec: 3584 + hash: "3dce89f398d2c856bcd32da34867ebd8" + } + Frame { + msec: 3600 + hash: "c78608cde907bc09760d858795b43bbf" + } + Frame { + msec: 3616 + hash: "75d1ae9c60573f9e27cd7c2d1706cbfc" + } + Frame { + msec: 3632 + hash: "754e2fca1b3ed5ee9875aafb1a0c62d3" + } + Frame { + msec: 3648 + hash: "a6f05fb5206a456bea790ba7ba31868c" + } + Frame { + msec: 3664 + hash: "21008b3a5179e25f9b132a4c05b8b8c4" + } + Frame { + msec: 3680 + hash: "37d2d2830f6ae6bf0c8fb29c5d4f521a" + } + Frame { + msec: 3696 + hash: "d7a226b40a049dee56755af9206246b4" + } + Frame { + msec: 3712 + hash: "d7d39e8f717bab17aaf8a12e4f9e0dfc" + } + Frame { + msec: 3728 + hash: "1dd5625fb6a0ddbaa3919a1702695e9c" + } + Frame { + msec: 3744 + hash: "e0b07106a5adc1603788444d48b9c3db" + } + Frame { + msec: 3760 + hash: "db61ba19d56b69d148aeb182de596713" + } + Frame { + msec: 3776 + hash: "39a59b2e9e0bee87d3ba50e1408bea1c" + } + Frame { + msec: 3792 + hash: "f34175acc261ad79bc9d2083af04ae10" + } + Frame { + msec: 3808 + hash: "2ec91bfdb0f106a526f6bde3eb0ed7ce" + } + Frame { + msec: 3824 + hash: "183538d04cf009f100a1e49a3229c143" + } + Frame { + msec: 3840 + hash: "fb09d44a5a5b5b795d562512e9547301" + } + Frame { + msec: 3856 + image: "cursorDelegate.4.png" + } + Frame { + msec: 3872 + hash: "39c81c6efdbc32b6e0378810404bef2c" + } + Frame { + msec: 3888 + hash: "23d9a9a6a9d032c7e447407193ca51ef" + } + Frame { + msec: 3904 + hash: "bdd00cfe933985fe77626114902ce823" + } + Frame { + msec: 3920 + hash: "1d25c2753ccabdaaf47a669c28d9e2cb" + } + Frame { + msec: 3936 + hash: "20fde9bbe26ebede31fc8c21dec3fcc5" + } + Frame { + msec: 3952 + hash: "c9147c159aebb7aa51d4bac28f96cb57" + } + Frame { + msec: 3968 + hash: "68d331f508b43e756d6e30ba9b60f9aa" + } + Frame { + msec: 3984 + hash: "af99069cdddfa9d099fbe25ba586e138" + } + Frame { + msec: 4000 + hash: "af99069cdddfa9d099fbe25ba586e138" + } + Frame { + msec: 4016 + hash: "af99069cdddfa9d099fbe25ba586e138" + } + Frame { + msec: 4032 + hash: "af99069cdddfa9d099fbe25ba586e138" + } + Frame { + msec: 4048 + hash: "af99069cdddfa9d099fbe25ba586e138" + } + Frame { + msec: 4064 + hash: "68d331f508b43e756d6e30ba9b60f9aa" + } + Frame { + msec: 4080 + hash: "c9147c159aebb7aa51d4bac28f96cb57" + } + Frame { + msec: 4096 + hash: "20fde9bbe26ebede31fc8c21dec3fcc5" + } + Frame { + msec: 4112 + hash: "1d25c2753ccabdaaf47a669c28d9e2cb" + } + Frame { + msec: 4128 + hash: "bdd00cfe933985fe77626114902ce823" + } + Frame { + msec: 4144 + hash: "23d9a9a6a9d032c7e447407193ca51ef" + } + Frame { + msec: 4160 + hash: "39c81c6efdbc32b6e0378810404bef2c" + } + Frame { + msec: 4176 + hash: "756f36cf41c2bae3a8a8716701e55e37" + } + Frame { + msec: 4192 + hash: "fb09d44a5a5b5b795d562512e9547301" + } + Frame { + msec: 4208 + hash: "183538d04cf009f100a1e49a3229c143" + } + Frame { + msec: 4224 + hash: "2ec91bfdb0f106a526f6bde3eb0ed7ce" + } + Frame { + msec: 4240 + hash: "f34175acc261ad79bc9d2083af04ae10" + } + Frame { + msec: 4256 + hash: "39a59b2e9e0bee87d3ba50e1408bea1c" + } + Frame { + msec: 4272 + hash: "db61ba19d56b69d148aeb182de596713" + } + Frame { + msec: 4288 + hash: "e0b07106a5adc1603788444d48b9c3db" + } + Frame { + msec: 4304 + hash: "1dd5625fb6a0ddbaa3919a1702695e9c" + } + Frame { + msec: 4320 + hash: "d7d39e8f717bab17aaf8a12e4f9e0dfc" + } + Frame { + msec: 4336 + hash: "d7a226b40a049dee56755af9206246b4" + } + Frame { + msec: 4352 + hash: "37d2d2830f6ae6bf0c8fb29c5d4f521a" + } + Frame { + msec: 4368 + hash: "21008b3a5179e25f9b132a4c05b8b8c4" + } + Frame { + msec: 4384 + hash: "a6f05fb5206a456bea790ba7ba31868c" + } + Frame { + msec: 4400 + hash: "754e2fca1b3ed5ee9875aafb1a0c62d3" + } + Frame { + msec: 4416 + hash: "75d1ae9c60573f9e27cd7c2d1706cbfc" + } + Frame { + msec: 4432 + hash: "c78608cde907bc09760d858795b43bbf" + } + Frame { + msec: 4448 + hash: "3dce89f398d2c856bcd32da34867ebd8" + } + Frame { + msec: 4464 + hash: "cbe34fd18b6355ae9be469a594b44192" + } + Frame { + msec: 4480 + hash: "942476dd6fb7a4f3d10c398503cb7b90" + } + Frame { + msec: 4496 + hash: "e96dc6d611d23553b363a765195604f9" + } + Frame { + msec: 4512 + hash: "03325597bd4e7d7b6f7c84c848018872" + } + Frame { + msec: 4528 + hash: "13db17cc3c6513014a95210a443e5842" + } + Frame { + msec: 4544 + hash: "91e2e5cc6efcffc9e58646a008a57c9d" + } + Frame { + msec: 4560 + hash: "a538ce971f34a497c05258da2567a208" + } + Frame { + msec: 4576 + hash: "117d7ad2d2ae47f3a0c2a68928534b76" + } + Frame { + msec: 4592 + hash: "3bc037fd17d0d394b82ba19914f31b90" + } + Frame { + msec: 4608 + hash: "27968050a9cf7d57d016274709086be1" + } + Frame { + msec: 4624 + hash: "d5b0696cbe2969723bb2fe740deeb81f" + } + Frame { + msec: 4640 + hash: "bf55fffd1727c0d076e05e274dcebb0d" + } + Frame { + msec: 4656 + hash: "6d70d654998bbc0a2431ca7c4a58cd3c" + } + Frame { + msec: 4672 + hash: "27c59b474d706ce79b5d075713c1ea88" + } + Frame { + msec: 4688 + hash: "8cae649565b5655d606f216334a0b5b5" + } + Frame { + msec: 4704 + hash: "3dd49406c4b39980908d8869dc3c060a" + } + Frame { + msec: 4720 + hash: "18771337bbe826b5a34bd9705c79f56a" + } + Frame { + msec: 4736 + hash: "7f921d2293cf547de3b5573dbf98d5bb" + } + Frame { + msec: 4752 + hash: "6d8b58612860febb13800958cab3aecd" + } + Frame { + msec: 4768 + hash: "f6bac38774fa8a09084c045e34fd1732" + } + Frame { + msec: 4784 + hash: "ca35937be71e1f982cedd33bdd09d127" + } + Frame { + msec: 4800 + hash: "4379bfd0da6fedac77e2111d9fdc5ecb" + } + Frame { + msec: 4816 + image: "cursorDelegate.5.png" + } + Frame { + msec: 4832 + hash: "4ab6780997a5a598d2da7fbbc19877b7" + } + Frame { + msec: 4848 + hash: "ad77330d51b1251576905a45fdbdf576" + } + Frame { + msec: 4864 + hash: "b701aa41aff9df45cc4b35d23789ad46" + } + Frame { + msec: 4880 + hash: "2bdc09121f13e95e15e331ac90fbbe5e" + } + Frame { + msec: 4896 + hash: "14bc879f562ace9d2d1a3f3980a72e1f" + } + Frame { + msec: 4912 + hash: "150b5a2f2e916b7023764c481c768492" + } + Frame { + msec: 4928 + hash: "0636b7c5cc215882c60b50f62133c715" + } + Frame { + msec: 4944 + hash: "f9e0bd08b722c16493a8886a19920dda" + } + Frame { + msec: 4960 + hash: "f499f4b3017c88c63f0a2035ad527a0e" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.0.png new file mode 100644 index 00000000..57a1599c Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.1.png new file mode 100644 index 00000000..d327d5b7 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.2.png new file mode 100644 index 00000000..c1e3dce7 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.3.png new file mode 100644 index 00000000..5dad108c Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.qml new file mode 100644 index 00000000..6081aaf7 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/echoMode.qml @@ -0,0 +1,1043 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "echoMode.0.png" + } + Frame { + msec: 32 + hash: "0e7c7dc19aab217751411568b58830ef" + } + Key { + type: 6 + key: 16777248 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 48 + hash: "0e7c7dc19aab217751411568b58830ef" + } + Frame { + msec: 64 + hash: "0e7c7dc19aab217751411568b58830ef" + } + Frame { + msec: 80 + hash: "0e7c7dc19aab217751411568b58830ef" + } + Frame { + msec: 96 + hash: "0e7c7dc19aab217751411568b58830ef" + } + Frame { + msec: 112 + hash: "0e7c7dc19aab217751411568b58830ef" + } + Frame { + msec: 128 + hash: "0e7c7dc19aab217751411568b58830ef" + } + Frame { + msec: 144 + hash: "0e7c7dc19aab217751411568b58830ef" + } + Frame { + msec: 160 + hash: "0e7c7dc19aab217751411568b58830ef" + } + Frame { + msec: 176 + hash: "0e7c7dc19aab217751411568b58830ef" + } + Frame { + msec: 192 + hash: "0e7c7dc19aab217751411568b58830ef" + } + Frame { + msec: 208 + hash: "0e7c7dc19aab217751411568b58830ef" + } + Frame { + msec: 224 + hash: "0e7c7dc19aab217751411568b58830ef" + } + Frame { + msec: 240 + hash: "0e7c7dc19aab217751411568b58830ef" + } + Frame { + msec: 256 + hash: "0e7c7dc19aab217751411568b58830ef" + } + Frame { + msec: 272 + hash: "0e7c7dc19aab217751411568b58830ef" + } + Frame { + msec: 288 + hash: "0e7c7dc19aab217751411568b58830ef" + } + Frame { + msec: 304 + hash: "0e7c7dc19aab217751411568b58830ef" + } + Frame { + msec: 320 + hash: "0e7c7dc19aab217751411568b58830ef" + } + Frame { + msec: 336 + hash: "0e7c7dc19aab217751411568b58830ef" + } + Frame { + msec: 352 + hash: "0e7c7dc19aab217751411568b58830ef" + } + Key { + type: 6 + key: 74 + modifiers: 33554432 + text: "4a" + autorep: false + count: 1 + } + Frame { + msec: 368 + hash: "593867b082681c362d7dffda12615284" + } + Frame { + msec: 384 + hash: "593867b082681c362d7dffda12615284" + } + Frame { + msec: 400 + hash: "593867b082681c362d7dffda12615284" + } + Frame { + msec: 416 + hash: "593867b082681c362d7dffda12615284" + } + Frame { + msec: 432 + hash: "593867b082681c362d7dffda12615284" + } + Key { + type: 7 + key: 74 + modifiers: 33554432 + text: "4a" + autorep: false + count: 1 + } + Frame { + msec: 448 + hash: "593867b082681c362d7dffda12615284" + } + Frame { + msec: 464 + hash: "593867b082681c362d7dffda12615284" + } + Frame { + msec: 480 + hash: "593867b082681c362d7dffda12615284" + } + Frame { + msec: 496 + hash: "593867b082681c362d7dffda12615284" + } + Frame { + msec: 512 + hash: "593867b082681c362d7dffda12615284" + } + Frame { + msec: 528 + hash: "593867b082681c362d7dffda12615284" + } + Key { + type: 7 + key: 16777248 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 544 + hash: "593867b082681c362d7dffda12615284" + } + Frame { + msec: 560 + hash: "593867b082681c362d7dffda12615284" + } + Frame { + msec: 576 + hash: "593867b082681c362d7dffda12615284" + } + Frame { + msec: 592 + hash: "593867b082681c362d7dffda12615284" + } + Frame { + msec: 608 + hash: "593867b082681c362d7dffda12615284" + } + Frame { + msec: 624 + hash: "593867b082681c362d7dffda12615284" + } + Frame { + msec: 640 + hash: "593867b082681c362d7dffda12615284" + } + Frame { + msec: 656 + hash: "593867b082681c362d7dffda12615284" + } + Frame { + msec: 672 + hash: "593867b082681c362d7dffda12615284" + } + Frame { + msec: 688 + hash: "593867b082681c362d7dffda12615284" + } + Key { + type: 6 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 704 + hash: "8d4a4baca932c318fba437b05962a635" + } + Frame { + msec: 720 + hash: "8d4a4baca932c318fba437b05962a635" + } + Frame { + msec: 736 + hash: "8d4a4baca932c318fba437b05962a635" + } + Frame { + msec: 752 + hash: "8d4a4baca932c318fba437b05962a635" + } + Frame { + msec: 768 + hash: "8d4a4baca932c318fba437b05962a635" + } + Key { + type: 7 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 784 + hash: "8d4a4baca932c318fba437b05962a635" + } + Frame { + msec: 800 + hash: "8d4a4baca932c318fba437b05962a635" + } + Frame { + msec: 816 + hash: "8d4a4baca932c318fba437b05962a635" + } + Frame { + msec: 832 + hash: "8d4a4baca932c318fba437b05962a635" + } + Frame { + msec: 848 + hash: "8d4a4baca932c318fba437b05962a635" + } + Key { + type: 6 + key: 67 + modifiers: 0 + text: "63" + autorep: false + count: 1 + } + Frame { + msec: 864 + hash: "b2698dba3a5ebe80e26f273b32857506" + } + Frame { + msec: 880 + hash: "b2698dba3a5ebe80e26f273b32857506" + } + Frame { + msec: 896 + hash: "b2698dba3a5ebe80e26f273b32857506" + } + Key { + type: 7 + key: 67 + modifiers: 0 + text: "63" + autorep: false + count: 1 + } + Frame { + msec: 912 + hash: "b2698dba3a5ebe80e26f273b32857506" + } + Frame { + msec: 928 + hash: "b2698dba3a5ebe80e26f273b32857506" + } + Frame { + msec: 944 + hash: "b2698dba3a5ebe80e26f273b32857506" + } + Frame { + msec: 960 + hash: "b2698dba3a5ebe80e26f273b32857506" + } + Frame { + msec: 976 + image: "echoMode.1.png" + } + Key { + type: 6 + key: 75 + modifiers: 0 + text: "6b" + autorep: false + count: 1 + } + Frame { + msec: 992 + hash: "3ea06a90d633d5e9fe5a11cc4ed67764" + } + Frame { + msec: 1008 + hash: "3ea06a90d633d5e9fe5a11cc4ed67764" + } + Frame { + msec: 1024 + hash: "3ea06a90d633d5e9fe5a11cc4ed67764" + } + Frame { + msec: 1040 + hash: "3ea06a90d633d5e9fe5a11cc4ed67764" + } + Key { + type: 7 + key: 75 + modifiers: 0 + text: "6b" + autorep: false + count: 1 + } + Frame { + msec: 1056 + hash: "3ea06a90d633d5e9fe5a11cc4ed67764" + } + Frame { + msec: 1072 + hash: "3ea06a90d633d5e9fe5a11cc4ed67764" + } + Frame { + msec: 1088 + hash: "3ea06a90d633d5e9fe5a11cc4ed67764" + } + Frame { + msec: 1104 + hash: "3ea06a90d633d5e9fe5a11cc4ed67764" + } + Frame { + msec: 1120 + hash: "3ea06a90d633d5e9fe5a11cc4ed67764" + } + Frame { + msec: 1136 + hash: "3ea06a90d633d5e9fe5a11cc4ed67764" + } + Frame { + msec: 1152 + hash: "3ea06a90d633d5e9fe5a11cc4ed67764" + } + Frame { + msec: 1168 + hash: "3ea06a90d633d5e9fe5a11cc4ed67764" + } + Frame { + msec: 1184 + hash: "3ea06a90d633d5e9fe5a11cc4ed67764" + } + Frame { + msec: 1200 + hash: "3ea06a90d633d5e9fe5a11cc4ed67764" + } + Frame { + msec: 1216 + hash: "3ea06a90d633d5e9fe5a11cc4ed67764" + } + Frame { + msec: 1232 + hash: "3ea06a90d633d5e9fe5a11cc4ed67764" + } + Key { + type: 6 + key: 68 + modifiers: 0 + text: "64" + autorep: false + count: 1 + } + Frame { + msec: 1248 + hash: "a190bbf59ec807391077b9d1183f72b5" + } + Frame { + msec: 1264 + hash: "a190bbf59ec807391077b9d1183f72b5" + } + Frame { + msec: 1280 + hash: "a190bbf59ec807391077b9d1183f72b5" + } + Key { + type: 7 + key: 68 + modifiers: 0 + text: "64" + autorep: false + count: 1 + } + Frame { + msec: 1296 + hash: "a190bbf59ec807391077b9d1183f72b5" + } + Frame { + msec: 1312 + hash: "a190bbf59ec807391077b9d1183f72b5" + } + Frame { + msec: 1328 + hash: "a190bbf59ec807391077b9d1183f72b5" + } + Key { + type: 6 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 1344 + hash: "f171a98a3a726b517ad4b401a0720ba2" + } + Frame { + msec: 1360 + hash: "f171a98a3a726b517ad4b401a0720ba2" + } + Frame { + msec: 1376 + hash: "f171a98a3a726b517ad4b401a0720ba2" + } + Frame { + msec: 1392 + hash: "f171a98a3a726b517ad4b401a0720ba2" + } + Frame { + msec: 1408 + hash: "f171a98a3a726b517ad4b401a0720ba2" + } + Frame { + msec: 1424 + hash: "f171a98a3a726b517ad4b401a0720ba2" + } + Frame { + msec: 1440 + hash: "f171a98a3a726b517ad4b401a0720ba2" + } + Frame { + msec: 1456 + hash: "f171a98a3a726b517ad4b401a0720ba2" + } + Frame { + msec: 1472 + hash: "f171a98a3a726b517ad4b401a0720ba2" + } + Key { + type: 7 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 1488 + hash: "f171a98a3a726b517ad4b401a0720ba2" + } + Key { + type: 6 + key: 87 + modifiers: 0 + text: "77" + autorep: false + count: 1 + } + Frame { + msec: 1504 + hash: "e7199e4284be9dea34caff7bde0f6303" + } + Frame { + msec: 1520 + hash: "e7199e4284be9dea34caff7bde0f6303" + } + Frame { + msec: 1536 + hash: "e7199e4284be9dea34caff7bde0f6303" + } + Frame { + msec: 1552 + hash: "e7199e4284be9dea34caff7bde0f6303" + } + Key { + type: 7 + key: 87 + modifiers: 0 + text: "77" + autorep: false + count: 1 + } + Frame { + msec: 1568 + hash: "e7199e4284be9dea34caff7bde0f6303" + } + Frame { + msec: 1584 + hash: "e7199e4284be9dea34caff7bde0f6303" + } + Frame { + msec: 1600 + hash: "e7199e4284be9dea34caff7bde0f6303" + } + Frame { + msec: 1616 + hash: "e7199e4284be9dea34caff7bde0f6303" + } + Frame { + msec: 1632 + hash: "e7199e4284be9dea34caff7bde0f6303" + } + Frame { + msec: 1648 + hash: "e7199e4284be9dea34caff7bde0f6303" + } + Key { + type: 6 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 1664 + hash: "1d9d3c6435f2fa06bda16ef4a2ff238f" + } + Frame { + msec: 1680 + hash: "1d9d3c6435f2fa06bda16ef4a2ff238f" + } + Frame { + msec: 1696 + hash: "1d9d3c6435f2fa06bda16ef4a2ff238f" + } + Frame { + msec: 1712 + hash: "1d9d3c6435f2fa06bda16ef4a2ff238f" + } + Frame { + msec: 1728 + hash: "1d9d3c6435f2fa06bda16ef4a2ff238f" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 1744 + hash: "9d8cb02bbc4f39d38ccdf8e9bda0ed5c" + } + Key { + type: 7 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 1760 + hash: "9d8cb02bbc4f39d38ccdf8e9bda0ed5c" + } + Frame { + msec: 1776 + hash: "9d8cb02bbc4f39d38ccdf8e9bda0ed5c" + } + Frame { + msec: 1792 + hash: "9d8cb02bbc4f39d38ccdf8e9bda0ed5c" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 1808 + hash: "9d8cb02bbc4f39d38ccdf8e9bda0ed5c" + } + Frame { + msec: 1824 + hash: "9d8cb02bbc4f39d38ccdf8e9bda0ed5c" + } + Frame { + msec: 1840 + hash: "9d8cb02bbc4f39d38ccdf8e9bda0ed5c" + } + Frame { + msec: 1856 + hash: "9d8cb02bbc4f39d38ccdf8e9bda0ed5c" + } + Key { + type: 6 + key: 76 + modifiers: 0 + text: "6c" + autorep: false + count: 1 + } + Frame { + msec: 1872 + hash: "2af75935ad1d3be02c6481c094737575" + } + Frame { + msec: 1888 + hash: "2af75935ad1d3be02c6481c094737575" + } + Frame { + msec: 1904 + hash: "2af75935ad1d3be02c6481c094737575" + } + Frame { + msec: 1920 + hash: "2af75935ad1d3be02c6481c094737575" + } + Key { + type: 7 + key: 76 + modifiers: 0 + text: "6c" + autorep: false + count: 1 + } + Frame { + msec: 1936 + image: "echoMode.2.png" + } + Frame { + msec: 1952 + hash: "2af75935ad1d3be02c6481c094737575" + } + Frame { + msec: 1968 + hash: "2af75935ad1d3be02c6481c094737575" + } + Frame { + msec: 1984 + hash: "2af75935ad1d3be02c6481c094737575" + } + Frame { + msec: 2000 + hash: "2af75935ad1d3be02c6481c094737575" + } + Frame { + msec: 2016 + hash: "2af75935ad1d3be02c6481c094737575" + } + Key { + type: 6 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 2032 + hash: "c3512d6a7ead481aa6fec8ef8ee2f1d1" + } + Frame { + msec: 2048 + hash: "c3512d6a7ead481aa6fec8ef8ee2f1d1" + } + Key { + type: 7 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 2064 + hash: "c3512d6a7ead481aa6fec8ef8ee2f1d1" + } + Frame { + msec: 2080 + hash: "c3512d6a7ead481aa6fec8ef8ee2f1d1" + } + Key { + type: 6 + key: 86 + modifiers: 0 + text: "76" + autorep: false + count: 1 + } + Frame { + msec: 2096 + hash: "064e1fc885ab7f07dad1770361087bef" + } + Frame { + msec: 2112 + hash: "064e1fc885ab7f07dad1770361087bef" + } + Frame { + msec: 2128 + hash: "064e1fc885ab7f07dad1770361087bef" + } + Frame { + msec: 2144 + hash: "064e1fc885ab7f07dad1770361087bef" + } + Key { + type: 6 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Key { + type: 7 + key: 86 + modifiers: 0 + text: "76" + autorep: false + count: 1 + } + Frame { + msec: 2160 + hash: "9b764f6e9cc3d30446e1b32f7ab94f66" + } + Frame { + msec: 2176 + hash: "9b764f6e9cc3d30446e1b32f7ab94f66" + } + Frame { + msec: 2192 + hash: "9b764f6e9cc3d30446e1b32f7ab94f66" + } + Frame { + msec: 2208 + hash: "9b764f6e9cc3d30446e1b32f7ab94f66" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 2224 + hash: "18eff632e106f632aad481ab40f985d7" + } + Key { + type: 7 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Frame { + msec: 2240 + hash: "18eff632e106f632aad481ab40f985d7" + } + Frame { + msec: 2256 + hash: "18eff632e106f632aad481ab40f985d7" + } + Frame { + msec: 2272 + hash: "18eff632e106f632aad481ab40f985d7" + } + Frame { + msec: 2288 + hash: "18eff632e106f632aad481ab40f985d7" + } + Frame { + msec: 2304 + hash: "18eff632e106f632aad481ab40f985d7" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 2320 + hash: "18eff632e106f632aad481ab40f985d7" + } + Frame { + msec: 2336 + hash: "18eff632e106f632aad481ab40f985d7" + } + Key { + type: 6 + key: 77 + modifiers: 0 + text: "6d" + autorep: false + count: 1 + } + Frame { + msec: 2352 + hash: "eaabd4617081e3bc68a5b9099c63272a" + } + Frame { + msec: 2368 + hash: "eaabd4617081e3bc68a5b9099c63272a" + } + Frame { + msec: 2384 + hash: "eaabd4617081e3bc68a5b9099c63272a" + } + Frame { + msec: 2400 + hash: "eaabd4617081e3bc68a5b9099c63272a" + } + Frame { + msec: 2416 + hash: "eaabd4617081e3bc68a5b9099c63272a" + } + Frame { + msec: 2432 + hash: "eaabd4617081e3bc68a5b9099c63272a" + } + Key { + type: 7 + key: 77 + modifiers: 0 + text: "6d" + autorep: false + count: 1 + } + Frame { + msec: 2448 + hash: "eaabd4617081e3bc68a5b9099c63272a" + } + Frame { + msec: 2464 + hash: "eaabd4617081e3bc68a5b9099c63272a" + } + Frame { + msec: 2480 + hash: "eaabd4617081e3bc68a5b9099c63272a" + } + Frame { + msec: 2496 + hash: "eaabd4617081e3bc68a5b9099c63272a" + } + Key { + type: 6 + key: 89 + modifiers: 0 + text: "79" + autorep: false + count: 1 + } + Frame { + msec: 2512 + hash: "fec019ea87914d30b5bf4754ce8ba916" + } + Frame { + msec: 2528 + hash: "fec019ea87914d30b5bf4754ce8ba916" + } + Frame { + msec: 2544 + hash: "fec019ea87914d30b5bf4754ce8ba916" + } + Key { + type: 7 + key: 89 + modifiers: 0 + text: "79" + autorep: false + count: 1 + } + Frame { + msec: 2560 + hash: "fec019ea87914d30b5bf4754ce8ba916" + } + Frame { + msec: 2576 + hash: "fec019ea87914d30b5bf4754ce8ba916" + } + Frame { + msec: 2592 + hash: "fec019ea87914d30b5bf4754ce8ba916" + } + Frame { + msec: 2608 + hash: "fec019ea87914d30b5bf4754ce8ba916" + } + Frame { + msec: 2624 + hash: "fec019ea87914d30b5bf4754ce8ba916" + } + Frame { + msec: 2640 + hash: "fec019ea87914d30b5bf4754ce8ba916" + } + Frame { + msec: 2656 + hash: "fec019ea87914d30b5bf4754ce8ba916" + } + Frame { + msec: 2672 + hash: "fec019ea87914d30b5bf4754ce8ba916" + } + Frame { + msec: 2688 + hash: "fec019ea87914d30b5bf4754ce8ba916" + } + Frame { + msec: 2704 + hash: "fec019ea87914d30b5bf4754ce8ba916" + } + Frame { + msec: 2720 + hash: "fec019ea87914d30b5bf4754ce8ba916" + } + Frame { + msec: 2736 + hash: "fec019ea87914d30b5bf4754ce8ba916" + } + Frame { + msec: 2752 + hash: "fec019ea87914d30b5bf4754ce8ba916" + } + Frame { + msec: 2768 + hash: "fec019ea87914d30b5bf4754ce8ba916" + } + Frame { + msec: 2784 + hash: "fec019ea87914d30b5bf4754ce8ba916" + } + Frame { + msec: 2800 + hash: "fec019ea87914d30b5bf4754ce8ba916" + } + Frame { + msec: 2816 + hash: "fec019ea87914d30b5bf4754ce8ba916" + } + Frame { + msec: 2832 + hash: "fec019ea87914d30b5bf4754ce8ba916" + } + Frame { + msec: 2848 + hash: "fec019ea87914d30b5bf4754ce8ba916" + } + Frame { + msec: 2864 + hash: "fec019ea87914d30b5bf4754ce8ba916" + } + Frame { + msec: 2880 + hash: "fec019ea87914d30b5bf4754ce8ba916" + } + Frame { + msec: 2896 + image: "echoMode.3.png" + } + Frame { + msec: 2912 + hash: "fec019ea87914d30b5bf4754ce8ba916" + } + Frame { + msec: 2928 + hash: "fec019ea87914d30b5bf4754ce8ba916" + } + Frame { + msec: 2944 + hash: "fec019ea87914d30b5bf4754ce8ba916" + } + Frame { + msec: 2960 + hash: "fec019ea87914d30b5bf4754ce8ba916" + } + Frame { + msec: 2976 + hash: "fec019ea87914d30b5bf4754ce8ba916" + } + Frame { + msec: 2992 + hash: "fec019ea87914d30b5bf4754ce8ba916" + } + Frame { + msec: 3008 + hash: "fec019ea87914d30b5bf4754ce8ba916" + } + Frame { + msec: 3024 + hash: "fec019ea87914d30b5bf4754ce8ba916" + } + Frame { + msec: 3040 + hash: "fec019ea87914d30b5bf4754ce8ba916" + } + Frame { + msec: 3056 + hash: "fec019ea87914d30b5bf4754ce8ba916" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/hAlign.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/hAlign.0.png new file mode 100644 index 00000000..6a32f0d5 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/hAlign.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/hAlign.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/hAlign.qml new file mode 100644 index 00000000..fd64d642 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/hAlign.qml @@ -0,0 +1,107 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "hAlign.0.png" + } + Frame { + msec: 32 + hash: "043c40378d2707bd231a448cd242aa3c" + } + Frame { + msec: 48 + hash: "043c40378d2707bd231a448cd242aa3c" + } + Frame { + msec: 64 + hash: "043c40378d2707bd231a448cd242aa3c" + } + Frame { + msec: 80 + hash: "043c40378d2707bd231a448cd242aa3c" + } + Frame { + msec: 96 + hash: "043c40378d2707bd231a448cd242aa3c" + } + Frame { + msec: 112 + hash: "043c40378d2707bd231a448cd242aa3c" + } + Frame { + msec: 128 + hash: "043c40378d2707bd231a448cd242aa3c" + } + Frame { + msec: 144 + hash: "043c40378d2707bd231a448cd242aa3c" + } + Frame { + msec: 160 + hash: "043c40378d2707bd231a448cd242aa3c" + } + Frame { + msec: 176 + hash: "043c40378d2707bd231a448cd242aa3c" + } + Frame { + msec: 192 + hash: "043c40378d2707bd231a448cd242aa3c" + } + Frame { + msec: 208 + hash: "043c40378d2707bd231a448cd242aa3c" + } + Frame { + msec: 224 + hash: "043c40378d2707bd231a448cd242aa3c" + } + Frame { + msec: 240 + hash: "043c40378d2707bd231a448cd242aa3c" + } + Frame { + msec: 256 + hash: "043c40378d2707bd231a448cd242aa3c" + } + Frame { + msec: 272 + hash: "043c40378d2707bd231a448cd242aa3c" + } + Frame { + msec: 288 + hash: "043c40378d2707bd231a448cd242aa3c" + } + Frame { + msec: 304 + hash: "043c40378d2707bd231a448cd242aa3c" + } + Frame { + msec: 320 + hash: "043c40378d2707bd231a448cd242aa3c" + } + Frame { + msec: 336 + hash: "043c40378d2707bd231a448cd242aa3c" + } + Frame { + msec: 352 + hash: "043c40378d2707bd231a448cd242aa3c" + } + Frame { + msec: 368 + hash: "043c40378d2707bd231a448cd242aa3c" + } + Frame { + msec: 384 + hash: "043c40378d2707bd231a448cd242aa3c" + } + Frame { + msec: 400 + hash: "043c40378d2707bd231a448cd242aa3c" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.0.png new file mode 100644 index 00000000..6ca52b67 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.1.png new file mode 100644 index 00000000..31d6b2cb Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.10.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.10.png new file mode 100644 index 00000000..d89e2d87 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.10.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.11.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.11.png new file mode 100644 index 00000000..834516a9 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.11.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.2.png new file mode 100644 index 00000000..31d6b2cb Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.3.png new file mode 100644 index 00000000..31d6b2cb Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.4.png new file mode 100644 index 00000000..8147bda0 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.5.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.5.png new file mode 100644 index 00000000..c67e619b Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.5.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.6.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.6.png new file mode 100644 index 00000000..646855f1 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.6.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.7.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.7.png new file mode 100644 index 00000000..c1a9d5c9 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.7.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.8.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.8.png new file mode 100644 index 00000000..d6c92b76 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.8.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.9.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.9.png new file mode 100644 index 00000000..e798d3be Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.9.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.qml new file mode 100644 index 00000000..fc8a1156 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-MAC/usingLineEdit.qml @@ -0,0 +1,4335 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "usingLineEdit.0.png" + } + Frame { + msec: 32 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 48 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 64 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 80 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 96 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 112 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 128 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 144 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 160 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 176 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 192 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 208 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 224 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 240 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 256 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 272 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 288 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 304 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 320 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 336 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 352 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 368 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 384 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 400 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 416 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 432 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 448 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 464 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 480 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 496 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 512 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 528 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 544 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 560 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 576 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 592 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 608 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 624 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 640 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 656 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 672 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 688 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 704 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 720 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 736 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 752 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 768 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 784 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 800 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 816 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 832 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 848 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 864 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 880 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 896 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 912 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Frame { + msec: 928 + hash: "b2bcfe5c299742bf7da166e9ae1e1126" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 85; y: 11 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 944 + hash: "1e95a74868a748e11efdc6fbb500f6e8" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 85; y: 11 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 960 + hash: "1e95a74868a748e11efdc6fbb500f6e8" + } + Mouse { + type: 4 + button: 1 + buttons: 1 + x: 85; y: 11 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 976 + image: "usingLineEdit.1.png" + } + Frame { + msec: 992 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1008 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1024 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1040 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1056 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 85; y: 11 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1072 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1088 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1104 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1120 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1136 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1152 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1168 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1184 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1200 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1216 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1232 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1248 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1264 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1280 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1296 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1312 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1328 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1344 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1360 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Key { + type: 6 + key: 16777249 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1376 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1392 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1408 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1424 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1440 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1456 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1472 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1488 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1504 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1520 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1536 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1552 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1568 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1584 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1600 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1616 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1632 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1648 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1664 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1680 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1696 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1712 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1728 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1744 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1760 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1776 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1792 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1808 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1824 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1840 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1856 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1872 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1888 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1904 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1920 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1936 + image: "usingLineEdit.2.png" + } + Frame { + msec: 1952 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1968 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 1984 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Key { + type: 6 + key: 67 + modifiers: 67108864 + text: "03" + autorep: false + count: 1 + } + Frame { + msec: 2000 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2016 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2032 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2048 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2064 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2080 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2096 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2112 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Key { + type: 7 + key: 16777249 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Key { + type: 7 + key: 67 + modifiers: 0 + text: "63" + autorep: false + count: 1 + } + Frame { + msec: 2128 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2144 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2160 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2176 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2192 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2208 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2224 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2240 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2256 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2272 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2288 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2304 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2320 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2336 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2352 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2368 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2384 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2400 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2416 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2432 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2448 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2464 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2480 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Key { + type: 6 + key: 16777233 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2496 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2512 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2528 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2544 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2560 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2576 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Key { + type: 7 + key: 16777233 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2592 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2608 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2624 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2640 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2656 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2672 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2688 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2704 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2720 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2736 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2752 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2768 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2784 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Key { + type: 6 + key: 16777249 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2800 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2816 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2832 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2848 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2864 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2880 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2896 + image: "usingLineEdit.3.png" + } + Frame { + msec: 2912 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2928 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2944 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2960 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2976 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 2992 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 3008 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 3024 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 3040 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 3056 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 3072 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 3088 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 3104 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 3120 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 3136 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 3152 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 3168 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 3184 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 3200 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Frame { + msec: 3216 + hash: "c346bd1c6a8c04dff75bc14882a4d964" + } + Key { + type: 6 + key: 86 + modifiers: 67108864 + text: "16" + autorep: false + count: 1 + } + Frame { + msec: 3232 + hash: "4e24e7e6a205160479b0d23057a50b37" + } + Frame { + msec: 3248 + hash: "4e24e7e6a205160479b0d23057a50b37" + } + Frame { + msec: 3264 + hash: "4e24e7e6a205160479b0d23057a50b37" + } + Frame { + msec: 3280 + hash: "4e24e7e6a205160479b0d23057a50b37" + } + Frame { + msec: 3296 + hash: "4e24e7e6a205160479b0d23057a50b37" + } + Frame { + msec: 3312 + hash: "4e24e7e6a205160479b0d23057a50b37" + } + Frame { + msec: 3328 + hash: "4e24e7e6a205160479b0d23057a50b37" + } + Key { + type: 7 + key: 86 + modifiers: 67108864 + text: "16" + autorep: false + count: 1 + } + Frame { + msec: 3344 + hash: "4e24e7e6a205160479b0d23057a50b37" + } + Frame { + msec: 3360 + hash: "4e24e7e6a205160479b0d23057a50b37" + } + Frame { + msec: 3376 + hash: "4e24e7e6a205160479b0d23057a50b37" + } + Frame { + msec: 3392 + hash: "4e24e7e6a205160479b0d23057a50b37" + } + Frame { + msec: 3408 + hash: "4e24e7e6a205160479b0d23057a50b37" + } + Frame { + msec: 3424 + hash: "4e24e7e6a205160479b0d23057a50b37" + } + Frame { + msec: 3440 + hash: "4e24e7e6a205160479b0d23057a50b37" + } + Frame { + msec: 3456 + hash: "4e24e7e6a205160479b0d23057a50b37" + } + Frame { + msec: 3472 + hash: "4e24e7e6a205160479b0d23057a50b37" + } + Frame { + msec: 3488 + hash: "4e24e7e6a205160479b0d23057a50b37" + } + Frame { + msec: 3504 + hash: "4e24e7e6a205160479b0d23057a50b37" + } + Frame { + msec: 3520 + hash: "4e24e7e6a205160479b0d23057a50b37" + } + Frame { + msec: 3536 + hash: "4e24e7e6a205160479b0d23057a50b37" + } + Frame { + msec: 3552 + hash: "4e24e7e6a205160479b0d23057a50b37" + } + Key { + type: 6 + key: 86 + modifiers: 67108864 + text: "16" + autorep: false + count: 1 + } + Frame { + msec: 3568 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 3584 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 3600 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 3616 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 3632 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 3648 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 3664 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 3680 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Key { + type: 7 + key: 86 + modifiers: 67108864 + text: "16" + autorep: false + count: 1 + } + Frame { + msec: 3696 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 3712 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 3728 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 3744 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 3760 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 3776 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 3792 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 3808 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 3824 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 3840 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 3856 + image: "usingLineEdit.4.png" + } + Frame { + msec: 3872 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 3888 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 3904 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 3920 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 3936 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 3952 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 3968 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 3984 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4000 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4016 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4032 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4048 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4064 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4080 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4096 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4112 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4128 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4144 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4160 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4176 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4192 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Key { + type: 7 + key: 16777249 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 4208 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4224 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4240 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4256 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4272 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4288 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4304 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4320 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4336 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4352 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4368 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4384 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4400 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4416 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4432 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4448 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4464 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4480 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4496 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4512 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4528 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4544 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4560 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4576 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4592 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4608 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4624 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4640 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4656 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4672 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4688 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Frame { + msec: 4704 + hash: "c6354c09a2bdf6ff23cae30640abdd65" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 69; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4720 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 4736 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 4752 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 4768 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 4784 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 4800 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 69; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4816 + image: "usingLineEdit.5.png" + } + Frame { + msec: 4832 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 4848 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 4864 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 4880 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 4896 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 4912 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 4928 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 4944 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 4960 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 4976 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 4992 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 5008 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 5024 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 5040 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 5056 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 5072 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 5088 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 5104 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 5120 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 5136 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 5152 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 5168 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 5184 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 5200 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 5216 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 5232 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 5248 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 5264 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 5280 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 5296 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 5312 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 5328 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 5344 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Frame { + msec: 5360 + hash: "b7e9475cc88b099f9e17b67f4d0c8ed0" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 5376 + hash: "5435254889b22b00b043f0d748021369" + } + Frame { + msec: 5392 + hash: "5435254889b22b00b043f0d748021369" + } + Frame { + msec: 5408 + hash: "5435254889b22b00b043f0d748021369" + } + Frame { + msec: 5424 + hash: "5435254889b22b00b043f0d748021369" + } + Frame { + msec: 5440 + hash: "5435254889b22b00b043f0d748021369" + } + Frame { + msec: 5456 + hash: "5435254889b22b00b043f0d748021369" + } + Frame { + msec: 5472 + hash: "5435254889b22b00b043f0d748021369" + } + Frame { + msec: 5488 + hash: "5435254889b22b00b043f0d748021369" + } + Frame { + msec: 5504 + hash: "5435254889b22b00b043f0d748021369" + } + Frame { + msec: 5520 + hash: "5435254889b22b00b043f0d748021369" + } + Frame { + msec: 5536 + hash: "5435254889b22b00b043f0d748021369" + } + Frame { + msec: 5552 + hash: "5435254889b22b00b043f0d748021369" + } + Frame { + msec: 5568 + hash: "5435254889b22b00b043f0d748021369" + } + Frame { + msec: 5584 + hash: "5435254889b22b00b043f0d748021369" + } + Frame { + msec: 5600 + hash: "5435254889b22b00b043f0d748021369" + } + Frame { + msec: 5616 + hash: "5435254889b22b00b043f0d748021369" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 5632 + hash: "94fa3848acc33accfb607ce31029f06d" + } + Frame { + msec: 5648 + hash: "94fa3848acc33accfb607ce31029f06d" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 5664 + hash: "1ea423dd8084001f2357f1613a77daa4" + } + Frame { + msec: 5680 + hash: "1ea423dd8084001f2357f1613a77daa4" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 5696 + hash: "b0f808e85cc5721473da7cd84b1987dc" + } + Frame { + msec: 5712 + hash: "b0f808e85cc5721473da7cd84b1987dc" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 5728 + hash: "0667aaf2eb49c2375b831301fefb0035" + } + Frame { + msec: 5744 + hash: "0667aaf2eb49c2375b831301fefb0035" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 5760 + hash: "7680aca6b9feccc7e73efa79c1473ce8" + } + Frame { + msec: 5776 + image: "usingLineEdit.6.png" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 5792 + hash: "fbbc99bf6a697d60ef348148c0a48bc2" + } + Frame { + msec: 5808 + hash: "fbbc99bf6a697d60ef348148c0a48bc2" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 5824 + hash: "9550d8fab2512470dd9dde62f3494450" + } + Frame { + msec: 5840 + hash: "9550d8fab2512470dd9dde62f3494450" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 5856 + hash: "9550d8fab2512470dd9dde62f3494450" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 5872 + hash: "ab79f5095d60f5cef526a074ef6d4e96" + } + Frame { + msec: 5888 + hash: "ab79f5095d60f5cef526a074ef6d4e96" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 5904 + hash: "4e6ef470ed2c2a2418a4838c6e4ae64b" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 5920 + hash: "4e6ef470ed2c2a2418a4838c6e4ae64b" + } + Frame { + msec: 5936 + hash: "4e6ef470ed2c2a2418a4838c6e4ae64b" + } + Frame { + msec: 5952 + hash: "4e6ef470ed2c2a2418a4838c6e4ae64b" + } + Frame { + msec: 5968 + hash: "4e6ef470ed2c2a2418a4838c6e4ae64b" + } + Frame { + msec: 5984 + hash: "4e6ef470ed2c2a2418a4838c6e4ae64b" + } + Frame { + msec: 6000 + hash: "4e6ef470ed2c2a2418a4838c6e4ae64b" + } + Frame { + msec: 6016 + hash: "4e6ef470ed2c2a2418a4838c6e4ae64b" + } + Frame { + msec: 6032 + hash: "4e6ef470ed2c2a2418a4838c6e4ae64b" + } + Frame { + msec: 6048 + hash: "4e6ef470ed2c2a2418a4838c6e4ae64b" + } + Key { + type: 6 + key: 16777249 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 6064 + hash: "4e6ef470ed2c2a2418a4838c6e4ae64b" + } + Frame { + msec: 6080 + hash: "4e6ef470ed2c2a2418a4838c6e4ae64b" + } + Frame { + msec: 6096 + hash: "4e6ef470ed2c2a2418a4838c6e4ae64b" + } + Frame { + msec: 6112 + hash: "4e6ef470ed2c2a2418a4838c6e4ae64b" + } + Frame { + msec: 6128 + hash: "4e6ef470ed2c2a2418a4838c6e4ae64b" + } + Frame { + msec: 6144 + hash: "4e6ef470ed2c2a2418a4838c6e4ae64b" + } + Key { + type: 6 + key: 16777234 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 6160 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6176 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6192 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6208 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6224 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6240 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6256 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6272 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6288 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6304 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6320 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6336 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6352 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6368 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6384 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6400 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Key { + type: 7 + key: 16777234 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Key { + type: 6 + key: 16777234 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 6416 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6432 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Key { + type: 7 + key: 16777234 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Key { + type: 6 + key: 16777234 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 6448 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6464 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Key { + type: 7 + key: 16777234 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Key { + type: 6 + key: 16777234 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Key { + type: 7 + key: 16777234 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 6480 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6496 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6512 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6528 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6544 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6560 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6576 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6592 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6608 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6624 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6640 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6656 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6672 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6688 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6704 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6720 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6736 + image: "usingLineEdit.7.png" + } + Frame { + msec: 6752 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6768 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6784 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Key { + type: 6 + key: 16777234 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 6800 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Key { + type: 7 + key: 16777234 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 6816 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6832 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6848 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6864 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6880 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6896 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6912 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6928 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Frame { + msec: 6944 + hash: "ed2a8fae3e94e2f90232d172246d3783" + } + Key { + type: 6 + key: 16777236 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 6960 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 6976 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 6992 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7008 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Key { + type: 7 + key: 16777236 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 7024 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7040 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7056 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7072 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7088 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Key { + type: 6 + key: 16777236 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 7104 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7120 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7136 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7152 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Key { + type: 7 + key: 16777236 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 7168 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7184 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7200 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7216 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7232 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7248 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7264 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Key { + type: 6 + key: 16777236 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 7280 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7296 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7312 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7328 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7344 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Key { + type: 7 + key: 16777236 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 7360 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7376 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7392 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7408 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7424 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7440 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7456 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7472 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7488 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7504 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7520 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Key { + type: 7 + key: 16777249 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 7536 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7552 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7568 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7584 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7600 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7616 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7632 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7648 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7664 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7680 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7696 + image: "usingLineEdit.8.png" + } + Frame { + msec: 7712 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7728 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7744 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7760 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7776 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7792 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7808 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7824 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7840 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7856 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7872 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7888 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7904 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7920 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7936 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7952 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7968 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 7984 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 8000 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 8016 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 8032 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 8048 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 8064 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 8080 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 8096 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 8112 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 8128 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 8144 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 8160 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 8176 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 8192 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 8208 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 8224 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 8240 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 8256 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 8272 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 8288 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 8304 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 8320 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 8336 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 8352 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 8368 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 8384 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 8400 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 8416 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 8432 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 8448 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 8464 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 8480 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Frame { + msec: 8496 + hash: "f1c4f46ee86ce1eb24fcd72106da0248" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 61; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8512 + hash: "e779fc73a3ca131452f62e889d5c96ea" + } + Frame { + msec: 8528 + hash: "e779fc73a3ca131452f62e889d5c96ea" + } + Frame { + msec: 8544 + hash: "e779fc73a3ca131452f62e889d5c96ea" + } + Frame { + msec: 8560 + hash: "e779fc73a3ca131452f62e889d5c96ea" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 60; y: 38 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 58; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8576 + hash: "e779fc73a3ca131452f62e889d5c96ea" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 46; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8592 + hash: "400b446983d944bac62889fb47e8d405" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 41; y: 38 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 40; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8608 + hash: "400b446983d944bac62889fb47e8d405" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 32; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8624 + hash: "769278730ba7e2a31333496a0c99499f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 31; y: 38 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 30; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8640 + hash: "769278730ba7e2a31333496a0c99499f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 29; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8656 + image: "usingLineEdit.9.png" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 28; y: 38 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 27; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8672 + hash: "c193a6f52a967c97961df08ebffe50c1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 26; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8688 + hash: "c193a6f52a967c97961df08ebffe50c1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 25; y: 38 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 24; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8704 + hash: "c193a6f52a967c97961df08ebffe50c1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 23; y: 38 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 22; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8720 + hash: "c193a6f52a967c97961df08ebffe50c1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 20; y: 38 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 19; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8736 + hash: "ce0d865bf18c5c3ff93bda82f95e97c2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 18; y: 38 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8752 + hash: "ce0d865bf18c5c3ff93bda82f95e97c2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 16; y: 38 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 15; y: 37 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8768 + hash: "ce0d865bf18c5c3ff93bda82f95e97c2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 14; y: 37 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 13; y: 37 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8784 + hash: "ce0d865bf18c5c3ff93bda82f95e97c2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 12; y: 37 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 11; y: 37 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8800 + hash: "ce0d865bf18c5c3ff93bda82f95e97c2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 10; y: 37 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 8; y: 37 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8816 + hash: "af2a9c17451a89153e04418e056d9ea5" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 6; y: 37 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 5; y: 36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8832 + hash: "749a1ccf2050c809be5e3820d3b2fba9" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 3; y: 36 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 2; y: 36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8848 + hash: "74f183256682200a804baa620a6ce978" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 0; y: 36 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -1; y: 36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8864 + hash: "9d837fb68c47ac3659b93e9f77cea0af" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -2; y: 36 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -3; y: 36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8880 + hash: "2dc20ba694548e05c80383d0fcc429fc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -5; y: 36 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -6; y: 36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8896 + hash: "0f5b95fbbdd932c8dbfaffd0cdd44dec" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -7; y: 36 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -9; y: 36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8912 + hash: "dd9e9d86eacd44b19c6c9c64c2abf007" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -10; y: 36 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -11; y: 36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8928 + hash: "7c67140abcbe7b8a36a7324016377272" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -12; y: 36 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -13; y: 36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8944 + hash: "a085e2633649f0328f109bc4143eaccc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -14; y: 36 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -15; y: 36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8960 + hash: "a085e2633649f0328f109bc4143eaccc" + } + Frame { + msec: 8976 + hash: "a085e2633649f0328f109bc4143eaccc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -16; y: 36 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -17; y: 36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8992 + hash: "a085e2633649f0328f109bc4143eaccc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -18; y: 36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9008 + hash: "a085e2633649f0328f109bc4143eaccc" + } + Frame { + msec: 9024 + hash: "a085e2633649f0328f109bc4143eaccc" + } + Frame { + msec: 9040 + hash: "a085e2633649f0328f109bc4143eaccc" + } + Frame { + msec: 9056 + hash: "a085e2633649f0328f109bc4143eaccc" + } + Frame { + msec: 9072 + hash: "a085e2633649f0328f109bc4143eaccc" + } + Frame { + msec: 9088 + hash: "a085e2633649f0328f109bc4143eaccc" + } + Frame { + msec: 9104 + hash: "a085e2633649f0328f109bc4143eaccc" + } + Frame { + msec: 9120 + hash: "a085e2633649f0328f109bc4143eaccc" + } + Frame { + msec: 9136 + hash: "a085e2633649f0328f109bc4143eaccc" + } + Frame { + msec: 9152 + hash: "a085e2633649f0328f109bc4143eaccc" + } + Frame { + msec: 9168 + hash: "a085e2633649f0328f109bc4143eaccc" + } + Frame { + msec: 9184 + hash: "a085e2633649f0328f109bc4143eaccc" + } + Frame { + msec: 9200 + hash: "a085e2633649f0328f109bc4143eaccc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -17; y: 36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9216 + hash: "a085e2633649f0328f109bc4143eaccc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -16; y: 36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9232 + hash: "a085e2633649f0328f109bc4143eaccc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -14; y: 35 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -13; y: 35 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9248 + hash: "a085e2633649f0328f109bc4143eaccc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -11; y: 35 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -10; y: 34 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9264 + hash: "a085e2633649f0328f109bc4143eaccc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -8; y: 34 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -7; y: 34 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9280 + hash: "a085e2633649f0328f109bc4143eaccc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -6; y: 33 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -5; y: 33 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9296 + hash: "a085e2633649f0328f109bc4143eaccc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -3; y: 32 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -1; y: 32 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9312 + hash: "a085e2633649f0328f109bc4143eaccc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 1; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 3; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9328 + hash: "a085e2633649f0328f109bc4143eaccc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 4; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 6; y: 30 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9344 + hash: "a085e2633649f0328f109bc4143eaccc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 7; y: 30 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 8; y: 30 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9360 + hash: "a085e2633649f0328f109bc4143eaccc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 10; y: 30 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 11; y: 30 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9376 + hash: "fe89231a1ac7f48eee7cea14167b6616" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 12; y: 30 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 14; y: 30 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9392 + hash: "fe89231a1ac7f48eee7cea14167b6616" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 15; y: 30 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 30 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9408 + hash: "fe89231a1ac7f48eee7cea14167b6616" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 21; y: 30 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 24; y: 30 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9424 + hash: "e816757e030c8927d6721295f8685162" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 27; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 30; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9440 + hash: "48f3a7d217ff85ad6088e18c1b88d6d7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 33; y: 32 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 35; y: 32 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9456 + hash: "48f3a7d217ff85ad6088e18c1b88d6d7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 38; y: 32 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 39; y: 33 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9472 + hash: "6cb50f458ba606cc4204727a02e9191b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: 33 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 45; y: 33 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9488 + hash: "6cb50f458ba606cc4204727a02e9191b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 48; y: 33 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 50; y: 33 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9504 + hash: "936d1a2ceed861a48fb3dd0c54cb0982" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 51; y: 33 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 53; y: 33 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9520 + hash: "936d1a2ceed861a48fb3dd0c54cb0982" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 55; y: 33 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9536 + hash: "936d1a2ceed861a48fb3dd0c54cb0982" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 56; y: 33 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 58; y: 33 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9552 + hash: "9fb9dbff35b91d65e1e7ce569baede55" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 61; y: 33 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 64; y: 33 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9568 + hash: "9fb9dbff35b91d65e1e7ce569baede55" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 67; y: 33 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 33 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9584 + hash: "78038f8df4ef17a164172c5bce16527d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 73; y: 33 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 74; y: 34 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9600 + hash: "b390e534fe43678ff031ec9de32b50d0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 76; y: 34 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9616 + image: "usingLineEdit.10.png" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 77; y: 34 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 78; y: 34 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9632 + hash: "b390e534fe43678ff031ec9de32b50d0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 79; y: 34 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 80; y: 35 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9648 + hash: "b390e534fe43678ff031ec9de32b50d0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 81; y: 35 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 84; y: 35 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9664 + hash: "94fa3848acc33accfb607ce31029f06d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 85; y: 36 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 88; y: 36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9680 + hash: "b0f808e85cc5721473da7cd84b1987dc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 89; y: 37 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 91; y: 37 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9696 + hash: "7680aca6b9feccc7e73efa79c1473ce8" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 92; y: 37 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 94; y: 37 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9712 + hash: "ab79f5095d60f5cef526a074ef6d4e96" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 95; y: 37 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 96; y: 37 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9728 + hash: "35c718664fc8e817e26054c307f908f9" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 98; y: 38 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 100; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9744 + hash: "23267fdc8202daba400140e51f5e3bdc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 102; y: 38 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 104; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9760 + hash: "0b2765ae503f0194e6e526ea6f9ed8f9" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 105; y: 39 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 108; y: 39 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9776 + hash: "6f6154528c95da216e1f3830de000195" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 109; y: 39 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 110; y: 39 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9792 + hash: "6f6154528c95da216e1f3830de000195" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 111; y: 39 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9808 + hash: "6f6154528c95da216e1f3830de000195" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 112; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9824 + hash: "6f6154528c95da216e1f3830de000195" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 113; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9840 + hash: "6f6154528c95da216e1f3830de000195" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 114; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9856 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 9872 + hash: "6f6154528c95da216e1f3830de000195" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 115; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9888 + hash: "6f6154528c95da216e1f3830de000195" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 116; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9904 + hash: "6f6154528c95da216e1f3830de000195" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 117; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9920 + hash: "6f6154528c95da216e1f3830de000195" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 118; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9936 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 9952 + hash: "6f6154528c95da216e1f3830de000195" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 119; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9968 + hash: "6f6154528c95da216e1f3830de000195" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 120; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9984 + hash: "6f6154528c95da216e1f3830de000195" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 121; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 10000 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10016 + hash: "6f6154528c95da216e1f3830de000195" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 122; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 10032 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10048 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10064 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10080 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10096 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10112 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10128 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10144 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10160 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10176 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10192 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10208 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10224 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10240 + hash: "6f6154528c95da216e1f3830de000195" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 122; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 10256 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10272 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10288 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10304 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10320 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10336 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10352 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10368 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10384 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10400 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10416 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10432 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10448 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10464 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10480 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10496 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10512 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10528 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10544 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10560 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10576 + image: "usingLineEdit.11.png" + } + Frame { + msec: 10592 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10608 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10624 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10640 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10656 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10672 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10688 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10704 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10720 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10736 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10752 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10768 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10784 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10800 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10816 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10832 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10848 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10864 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10880 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10896 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10912 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10928 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10944 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10960 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10976 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 10992 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 11008 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 11024 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 11040 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 11056 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 11072 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 11088 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 11104 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 11120 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 11136 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 11152 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 11168 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 11184 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 11200 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 11216 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 11232 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 11248 + hash: "6f6154528c95da216e1f3830de000195" + } + Frame { + msec: 11264 + hash: "6f6154528c95da216e1f3830de000195" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.0.png new file mode 100644 index 00000000..18dd55ea Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.1.png new file mode 100644 index 00000000..9cc8b85c Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.2.png new file mode 100644 index 00000000..f7c23e2f Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.3.png new file mode 100644 index 00000000..a5bd6cce Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.4.png new file mode 100644 index 00000000..fdcdf88c Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.5.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.5.png new file mode 100644 index 00000000..89fd161f Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.5.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.qml new file mode 100644 index 00000000..e14fb826 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/cursorDelegate.qml @@ -0,0 +1,1551 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "cursorDelegate.0.png" + } + Frame { + msec: 32 + hash: "ea218f136c6c7a70f2a4da569fae92b0" + } + Frame { + msec: 48 + hash: "ea218f136c6c7a70f2a4da569fae92b0" + } + Frame { + msec: 64 + hash: "ea218f136c6c7a70f2a4da569fae92b0" + } + Frame { + msec: 80 + hash: "ea218f136c6c7a70f2a4da569fae92b0" + } + Frame { + msec: 96 + hash: "ea218f136c6c7a70f2a4da569fae92b0" + } + Frame { + msec: 112 + hash: "ea218f136c6c7a70f2a4da569fae92b0" + } + Frame { + msec: 128 + hash: "ea218f136c6c7a70f2a4da569fae92b0" + } + Frame { + msec: 144 + hash: "ea218f136c6c7a70f2a4da569fae92b0" + } + Frame { + msec: 160 + hash: "ea218f136c6c7a70f2a4da569fae92b0" + } + Frame { + msec: 176 + hash: "ea218f136c6c7a70f2a4da569fae92b0" + } + Frame { + msec: 192 + hash: "ea218f136c6c7a70f2a4da569fae92b0" + } + Frame { + msec: 208 + hash: "ea218f136c6c7a70f2a4da569fae92b0" + } + Frame { + msec: 224 + hash: "ea218f136c6c7a70f2a4da569fae92b0" + } + Frame { + msec: 240 + hash: "ea218f136c6c7a70f2a4da569fae92b0" + } + Frame { + msec: 256 + hash: "ea218f136c6c7a70f2a4da569fae92b0" + } + Frame { + msec: 272 + hash: "ea218f136c6c7a70f2a4da569fae92b0" + } + Frame { + msec: 288 + hash: "ea218f136c6c7a70f2a4da569fae92b0" + } + Frame { + msec: 304 + hash: "ea218f136c6c7a70f2a4da569fae92b0" + } + Frame { + msec: 320 + hash: "ea218f136c6c7a70f2a4da569fae92b0" + } + Frame { + msec: 336 + hash: "ea218f136c6c7a70f2a4da569fae92b0" + } + Frame { + msec: 352 + hash: "ea218f136c6c7a70f2a4da569fae92b0" + } + Frame { + msec: 368 + hash: "ea218f136c6c7a70f2a4da569fae92b0" + } + Frame { + msec: 384 + hash: "ea218f136c6c7a70f2a4da569fae92b0" + } + Frame { + msec: 400 + hash: "ea218f136c6c7a70f2a4da569fae92b0" + } + Frame { + msec: 416 + hash: "ea218f136c6c7a70f2a4da569fae92b0" + } + Frame { + msec: 432 + hash: "ea218f136c6c7a70f2a4da569fae92b0" + } + Frame { + msec: 448 + hash: "ea218f136c6c7a70f2a4da569fae92b0" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 464 + hash: "e0cce7628c07ad989161e77d87f7f511" + } + Frame { + msec: 480 + hash: "e0cce7628c07ad989161e77d87f7f511" + } + Frame { + msec: 496 + hash: "e0cce7628c07ad989161e77d87f7f511" + } + Frame { + msec: 512 + hash: "e0cce7628c07ad989161e77d87f7f511" + } + Frame { + msec: 528 + hash: "b86c442f4a561503d34238465fd20aec" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 544 + hash: "36f5f4397549f151ebfc0295ca33f55f" + } + Frame { + msec: 560 + hash: "1cc9682b652e65b547bbeb2b37f9d1e7" + } + Frame { + msec: 576 + hash: "b3874acb58643e1bb70a0b579e517526" + } + Frame { + msec: 592 + hash: "152b962f8a00b68459df073962a1a947" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 608 + hash: "891f86211cdc5050881421613b199939" + } + Frame { + msec: 624 + hash: "5862b5e1ed2d1905357adbc5a7f2ade9" + } + Frame { + msec: 640 + hash: "2fd895e688fa1c8b2f0bbf6e7defdb2a" + } + Frame { + msec: 656 + hash: "66c31658d38604b3e2d424aea15b715d" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 672 + hash: "df5331bc225d5e6f443812d489b19324" + } + Frame { + msec: 688 + hash: "6ca6367bb314804598b6257fd8b49d28" + } + Frame { + msec: 704 + hash: "877f64d93ba9d0d31181c3600bc02f80" + } + Frame { + msec: 720 + hash: "6b3210a6e4f8c448e5d90c6dada7a114" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 736 + hash: "4e64391a8142f94cb1ae38082218af01" + } + Frame { + msec: 752 + hash: "7bc3285fc6a0275622a76e605e2f7609" + } + Frame { + msec: 768 + hash: "895b45ca668e4fe112913d818f28631e" + } + Frame { + msec: 784 + hash: "98e49c0ade7408c3229489ba6681088b" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 800 + hash: "98c7370ca0f570dbe23c2724cb4ddead" + } + Frame { + msec: 816 + hash: "a71a7684552b072754469f6ae16d18b6" + } + Frame { + msec: 832 + hash: "9cf40ec30d20e2cf95de2bfede4e46c6" + } + Frame { + msec: 848 + hash: "ed1efc0873a05be9f0c001c9cab94414" + } + Frame { + msec: 864 + hash: "4909c38a27da00d9c6f0dafc52c45035" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 880 + hash: "81d4e7ca4265332555434fdd5f19c621" + } + Frame { + msec: 896 + hash: "c336bac65473a8b76cecca1854c94752" + } + Frame { + msec: 912 + hash: "8bf0b0c6bd2c0fbf7c9f3529a5b92ebc" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 928 + hash: "8b7f6b8eebd1d7648becb91d256ac475" + } + Frame { + msec: 944 + hash: "6fcc3b9dee14bcdd2b60a32f696eec05" + } + Frame { + msec: 960 + hash: "939ac75fa99f482509ee1bb6b93f2ed0" + } + Frame { + msec: 976 + image: "cursorDelegate.1.png" + } + Frame { + msec: 992 + hash: "87d666ee3bcf7a606e2aecb4954cfb28" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1008 + hash: "87d666ee3bcf7a606e2aecb4954cfb28" + } + Frame { + msec: 1024 + hash: "87d666ee3bcf7a606e2aecb4954cfb28" + } + Frame { + msec: 1040 + hash: "87d666ee3bcf7a606e2aecb4954cfb28" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1056 + hash: "87d666ee3bcf7a606e2aecb4954cfb28" + } + Frame { + msec: 1072 + hash: "3d6db6e3ee77ee75341ce16dc4a56c59" + } + Frame { + msec: 1088 + hash: "ff43ccdb14ae4d12ffead2eb261a5056" + } + Frame { + msec: 1104 + hash: "cd14458426f94efbbc729112e6a481c5" + } + Frame { + msec: 1120 + hash: "6bd66d118ff27b0cea7944ea22c727c9" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1136 + hash: "c294f1f7b7dd842d797ec5346f8794b3" + } + Frame { + msec: 1152 + hash: "185228bb06e052a279bc0481760a1920" + } + Frame { + msec: 1168 + hash: "81b01e755b7fcbda18634b88052326e4" + } + Frame { + msec: 1184 + hash: "ff16045d2ae8a5e48440fe5094780987" + } + Frame { + msec: 1200 + hash: "01b2a227010cba52952763cd9fbc8c94" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1216 + hash: "3c6ffa5250e90c994e334745efa15b19" + } + Frame { + msec: 1232 + hash: "9656663feae42fced5646d8c21ad05ec" + } + Frame { + msec: 1248 + hash: "95ecea8c39c38c2319a8a0de1c3c97b1" + } + Frame { + msec: 1264 + hash: "7bc610d4efadf5ef603d0c62e81021b2" + } + Frame { + msec: 1280 + hash: "b5343907926d112165a1e8914fa12383" + } + Frame { + msec: 1296 + hash: "7b1be2c0e963b92accd35606cd9521f5" + } + Key { + type: 6 + key: 16777249 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1312 + hash: "2004b105d197f736f68eef070574767d" + } + Key { + type: 6 + key: 16777248 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1328 + hash: "dbafec45c35739835180f7644f4bf66c" + } + Frame { + msec: 1344 + hash: "ed86b86cc0eb1c8c05b0ddb063937270" + } + Frame { + msec: 1360 + hash: "bdc640c90728a4f39c22e0a415c595b4" + } + Frame { + msec: 1376 + hash: "2af0c828b767942ba1745dd9838a54b5" + } + Key { + type: 6 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1392 + hash: "547f4cbf1637d997f50f755965dd4704" + } + Frame { + msec: 1408 + hash: "ede46a74a6e5297454da63227684d6cf" + } + Frame { + msec: 1424 + hash: "3a8747e0b26763c7bbc5ecd433c41d5a" + } + Frame { + msec: 1440 + hash: "0ae75d3cf890fe95e53f4c2c2eb0c660" + } + Frame { + msec: 1456 + hash: "1014ed3a45803f4ca8dfd669137d3502" + } + Frame { + msec: 1472 + hash: "0abf6b3183b4b85eabbcb3f2d4173473" + } + Frame { + msec: 1488 + hash: "39dbf6788ad997531894fd5138953f21" + } + Key { + type: 7 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1504 + hash: "0fd0841b32106155e25c274b47724d60" + } + Frame { + msec: 1520 + hash: "9fa396cab1425ca03e394c681ccb798d" + } + Frame { + msec: 1536 + hash: "3c62d2a016bba6cd3f83982dcb7c1582" + } + Frame { + msec: 1552 + hash: "ee6f16b9165eb663ae78716f723e5b16" + } + Frame { + msec: 1568 + hash: "dd2c49caa8b8f690fd8a29aac7f85dc8" + } + Frame { + msec: 1584 + hash: "79343bd1b7472d75daad9ae9848b89ba" + } + Frame { + msec: 1600 + hash: "4c087ae0614e4736130235eea0af5267" + } + Frame { + msec: 1616 + hash: "87d75b0e3bd197084f8d8c0601ba195d" + } + Frame { + msec: 1632 + hash: "ccd66bab965c78aa3b39728aef0648c6" + } + Frame { + msec: 1648 + hash: "d311116fafc9693e6c55eb2c1273a487" + } + Frame { + msec: 1664 + hash: "a4c1bc9c9f987bacfd19ea64f9a3ec2c" + } + Frame { + msec: 1680 + hash: "a6b86821b0563c06b478b62037edffe5" + } + Key { + type: 6 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1696 + hash: "30b8fd8f9d3e63c9101cf3558fc7f0d6" + } + Frame { + msec: 1712 + hash: "8224ae61cfce9bbf9f69677071285ddc" + } + Frame { + msec: 1728 + hash: "1b7408ad665e5e316893397c9362e069" + } + Frame { + msec: 1744 + hash: "7ace1472840c3184263fe23cec5ba929" + } + Frame { + msec: 1760 + hash: "ea3f542c80564ad841675197b51272c9" + } + Frame { + msec: 1776 + hash: "0c4989dbd8d4008c1834140e28b98405" + } + Frame { + msec: 1792 + hash: "337452c36385bebadb35498172eb82ef" + } + Key { + type: 7 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1808 + hash: "030ff7472ad4d566166e99aeb1daf1ad" + } + Frame { + msec: 1824 + hash: "59f7bb68de85445bad114caca87ae859" + } + Frame { + msec: 1840 + hash: "5c0e8905d830357ca7bc26c6383a2dcc" + } + Frame { + msec: 1856 + hash: "b00e889ee28556eaca18a6d52b8b4c0c" + } + Key { + type: 7 + key: 16777248 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1872 + hash: "07d4cc37e71ff6fb34c1370db27bd0f9" + } + Key { + type: 6 + key: 16777248 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1888 + hash: "86d74cd53c541fde95b36a3899859272" + } + Frame { + msec: 1904 + hash: "82457df6a73b8aa32b567cac53d19679" + } + Frame { + msec: 1920 + hash: "63be8d924bace20717f87f7d260060e5" + } + Frame { + msec: 1936 + image: "cursorDelegate.2.png" + } + Frame { + msec: 1952 + hash: "d274989f514174cda3316fa6650aed05" + } + Frame { + msec: 1968 + hash: "f1cae5982318ec621423513f7a090adf" + } + Frame { + msec: 1984 + hash: "1b30dd4a817370d8b6f5908cef69eeb9" + } + Frame { + msec: 2000 + hash: "1b30dd4a817370d8b6f5908cef69eeb9" + } + Frame { + msec: 2016 + hash: "1b30dd4a817370d8b6f5908cef69eeb9" + } + Frame { + msec: 2032 + hash: "1b30dd4a817370d8b6f5908cef69eeb9" + } + Key { + type: 7 + key: 16777249 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2048 + hash: "1b30dd4a817370d8b6f5908cef69eeb9" + } + Key { + type: 7 + key: 16777248 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2064 + hash: "f1cae5982318ec621423513f7a090adf" + } + Frame { + msec: 2080 + hash: "d274989f514174cda3316fa6650aed05" + } + Frame { + msec: 2096 + hash: "4c51c2e71ee1fef13b9ac5213b057cef" + } + Frame { + msec: 2112 + hash: "63be8d924bace20717f87f7d260060e5" + } + Frame { + msec: 2128 + hash: "82457df6a73b8aa32b567cac53d19679" + } + Frame { + msec: 2144 + hash: "86d74cd53c541fde95b36a3899859272" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2160 + hash: "9bfb6b9a2604b4c534539bc731abda10" + } + Frame { + msec: 2176 + hash: "dfa52bb483388dfee56577968d013c8f" + } + Frame { + msec: 2192 + hash: "ea77a49e7e246649248e19b72d6433c9" + } + Frame { + msec: 2208 + hash: "348e6a82b1491739e72c5c361158a967" + } + Frame { + msec: 2224 + hash: "bb52aa533659d770d01deb8bef5a8b4d" + } + Frame { + msec: 2240 + hash: "082441b5fea02f2676ad4d53aefb6927" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2256 + hash: "9194cd1399ceeda421944cd87182039b" + } + Frame { + msec: 2272 + hash: "edff1333eb3a0047c527503ab3dbe71c" + } + Frame { + msec: 2288 + hash: "e5c9931c8baf260d77f9cfcc1bb41101" + } + Frame { + msec: 2304 + hash: "75c37de92c5af3305733a92d405a4ec8" + } + Frame { + msec: 2320 + hash: "f27082799d0860c660d16c3f9fe6e538" + } + Frame { + msec: 2336 + hash: "5d79ff6cac5bd6943b656964c1d78b00" + } + Frame { + msec: 2352 + hash: "d58a1176858e49c89fc77bed260c6269" + } + Key { + type: 6 + key: 16777249 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Key { + type: 6 + key: 16777248 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2368 + hash: "70deb136fd364646e73390f0aa751baa" + } + Frame { + msec: 2384 + hash: "ed3bf83d975d6b8f830ce0b5a0ad64cc" + } + Frame { + msec: 2400 + hash: "9007b93c9b9ae3612a0f97fe2e2ae825" + } + Frame { + msec: 2416 + hash: "c39f05a5471fb3a26f57feab2b99c8fa" + } + Frame { + msec: 2432 + hash: "49cd710decb32599d7a9c8e0239bf9a5" + } + Key { + type: 6 + key: 16777234 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2448 + hash: "df3e2a44ed4e7cf6adb49f84b1d4fc53" + } + Frame { + msec: 2464 + hash: "5b7984204405b31a0262da011ff3903e" + } + Frame { + msec: 2480 + hash: "0dd2dc00c42eb7bb731d64e9a7188c83" + } + Frame { + msec: 2496 + hash: "1b811aa744375668672fb8b4e0d75621" + } + Frame { + msec: 2512 + hash: "f34c084f977a20fcf96eaf1e7b5423f7" + } + Key { + type: 7 + key: 16777234 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2528 + hash: "145b1c6526e04f02adf94eb5d0369ae0" + } + Frame { + msec: 2544 + hash: "1b047f1cb4738188c10d8b05e636694a" + } + Frame { + msec: 2560 + hash: "3f5921d19c63c7d434f0428cb155426e" + } + Frame { + msec: 2576 + hash: "940a9ca625a813af3c9f74600b9dd668" + } + Frame { + msec: 2592 + hash: "3df53c013eae20a71e4337be5499ff65" + } + Key { + type: 6 + key: 16777234 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2608 + hash: "34e4524d132bbb2a9e4aaffa0982ad33" + } + Frame { + msec: 2624 + hash: "87942e371bd51726dbfa5a09fdd31631" + } + Frame { + msec: 2640 + hash: "a2baf811e2b51215c4e5f88f0854f5a5" + } + Key { + type: 7 + key: 16777234 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2656 + hash: "cc12390ac2a3296c04f2538fb3b4cc00" + } + Frame { + msec: 2672 + hash: "f209d32ec1742194c8436c36230a8239" + } + Frame { + msec: 2688 + hash: "444d87a6fc19b8f0e8dcda0615a484aa" + } + Frame { + msec: 2704 + hash: "2e492b973fffd68245c24d603d2a8221" + } + Frame { + msec: 2720 + hash: "742ab9c9d4d8e37337f237f792aba160" + } + Key { + type: 6 + key: 16777234 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2736 + hash: "74db3d75c0b30946b18edf5fc115dfce" + } + Frame { + msec: 2752 + hash: "86685be3dbb2236676f767894c694a5a" + } + Frame { + msec: 2768 + hash: "327351a6164fd566dd0f7ead05c7ea36" + } + Frame { + msec: 2784 + hash: "ba9262ab3d8824e3a9cdcfe29059bbda" + } + Key { + type: 7 + key: 16777234 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2800 + hash: "8c8aba2c44a7ea5b4d1e2206a3dbd6a2" + } + Frame { + msec: 2816 + hash: "560067cbba922e2958bc7bae5ab93572" + } + Frame { + msec: 2832 + hash: "566c84584e49c633fdada833ea386565" + } + Frame { + msec: 2848 + hash: "615819749d92cb0b927e370c05321f5b" + } + Frame { + msec: 2864 + hash: "9f11ee25f10750cc2302e6b528ab68b9" + } + Frame { + msec: 2880 + hash: "5140d2ac5f1b361776fb335d43fcda1a" + } + Frame { + msec: 2896 + image: "cursorDelegate.3.png" + } + Frame { + msec: 2912 + hash: "5fb75369681ac189b4de918dfa639f55" + } + Frame { + msec: 2928 + hash: "9da1688d1084f1588b6d203698c8a2b6" + } + Frame { + msec: 2944 + hash: "91bbae5a8fd04da71b1353f687c15d9f" + } + Frame { + msec: 2960 + hash: "d3c0a6ed0510abb6135fb2e61f8721d8" + } + Frame { + msec: 2976 + hash: "23e728398c03c805066766081e434d41" + } + Frame { + msec: 2992 + hash: "23e728398c03c805066766081e434d41" + } + Frame { + msec: 3008 + hash: "23e728398c03c805066766081e434d41" + } + Frame { + msec: 3024 + hash: "23e728398c03c805066766081e434d41" + } + Frame { + msec: 3040 + hash: "23e728398c03c805066766081e434d41" + } + Frame { + msec: 3056 + hash: "23e728398c03c805066766081e434d41" + } + Frame { + msec: 3072 + hash: "d3c0a6ed0510abb6135fb2e61f8721d8" + } + Key { + type: 6 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3088 + hash: "d5519a015a697dcb1763748bd2789441" + } + Frame { + msec: 3104 + hash: "d8ca000081bf565a4f3de5a5e94d894b" + } + Frame { + msec: 3120 + hash: "03984ab7a25d80e24dd0650f881b8203" + } + Frame { + msec: 3136 + hash: "edfea780ea62d48ac69afa5e6cad00af" + } + Frame { + msec: 3152 + hash: "b00a5d2424568d823eb7be0438dafa1f" + } + Key { + type: 7 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3168 + hash: "76fda33dcea27a034ddfab61031d8de6" + } + Frame { + msec: 3184 + hash: "11b9e3a58fd2c6d86e61a5e3b7db04b4" + } + Frame { + msec: 3200 + hash: "f7c583d00d7154d9e8af88bec706f97f" + } + Frame { + msec: 3216 + hash: "8680b8c69c544213fb8d55233bde4ce5" + } + Frame { + msec: 3232 + hash: "74fc148e3c466023e2449c6b1367bceb" + } + Frame { + msec: 3248 + hash: "9495a0ffe7589351cfced8b26f6d64e4" + } + Key { + type: 6 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3264 + hash: "519c58c8c0f62d96005b49f68648565b" + } + Frame { + msec: 3280 + hash: "609a2d8f02c8b42e0921a2a900edccbd" + } + Frame { + msec: 3296 + hash: "c54617fb7b21ef8dc2bc0d8492ec476e" + } + Frame { + msec: 3312 + hash: "096dc0d8b3ed47894ab0289bcfe3aa8f" + } + Frame { + msec: 3328 + hash: "5b725bb5951caa968d221fe7c5dd6370" + } + Frame { + msec: 3344 + hash: "6733673178a1b85b22d22610a6f6c3d7" + } + Frame { + msec: 3360 + hash: "5efbed8f4de4387572c5a98ba14f3c27" + } + Key { + type: 7 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3376 + hash: "650a0792ee0025e12f7f0ce6df72df6c" + } + Frame { + msec: 3392 + hash: "0064815fa6e2bcbbe5f2ea8222ddd2b0" + } + Frame { + msec: 3408 + hash: "13ca683ddd0071771e853a09fc6e5842" + } + Frame { + msec: 3424 + hash: "1625325eee9b4eaab2df135e0d2f0f14" + } + Frame { + msec: 3440 + hash: "9e3f1df1b243167b5470778e8c44f7d1" + } + Frame { + msec: 3456 + hash: "493634fa37f10eb02d255253171d190d" + } + Frame { + msec: 3472 + hash: "86ddfc357d158deae39a7565c512d0c0" + } + Frame { + msec: 3488 + hash: "74486ca31cf165f0e55aacfae7af9e4c" + } + Frame { + msec: 3504 + hash: "3479f78faf16d4d07b6b44d7682ac016" + } + Key { + type: 7 + key: 16777249 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3520 + hash: "cb35c6a887f191b2eb5de961912c94b8" + } + Frame { + msec: 3536 + hash: "53f5028e96fc65cc6171e78c31c16026" + } + Key { + type: 7 + key: 16777248 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3552 + hash: "c77e078983f12d8007c5509cd8b356f9" + } + Frame { + msec: 3568 + hash: "ec2da5c6869161936e2598961c605674" + } + Frame { + msec: 3584 + hash: "bb9adcb5730aeafb2956e01d9aacaee1" + } + Frame { + msec: 3600 + hash: "49cd710decb32599d7a9c8e0239bf9a5" + } + Frame { + msec: 3616 + hash: "c39f05a5471fb3a26f57feab2b99c8fa" + } + Frame { + msec: 3632 + hash: "9007b93c9b9ae3612a0f97fe2e2ae825" + } + Frame { + msec: 3648 + hash: "ed3bf83d975d6b8f830ce0b5a0ad64cc" + } + Frame { + msec: 3664 + hash: "70deb136fd364646e73390f0aa751baa" + } + Frame { + msec: 3680 + hash: "d58a1176858e49c89fc77bed260c6269" + } + Frame { + msec: 3696 + hash: "5d79ff6cac5bd6943b656964c1d78b00" + } + Frame { + msec: 3712 + hash: "f27082799d0860c660d16c3f9fe6e538" + } + Frame { + msec: 3728 + hash: "75c37de92c5af3305733a92d405a4ec8" + } + Frame { + msec: 3744 + hash: "e5c9931c8baf260d77f9cfcc1bb41101" + } + Frame { + msec: 3760 + hash: "edff1333eb3a0047c527503ab3dbe71c" + } + Frame { + msec: 3776 + hash: "9194cd1399ceeda421944cd87182039b" + } + Frame { + msec: 3792 + hash: "082441b5fea02f2676ad4d53aefb6927" + } + Frame { + msec: 3808 + hash: "bb52aa533659d770d01deb8bef5a8b4d" + } + Frame { + msec: 3824 + hash: "348e6a82b1491739e72c5c361158a967" + } + Frame { + msec: 3840 + hash: "ea77a49e7e246649248e19b72d6433c9" + } + Frame { + msec: 3856 + image: "cursorDelegate.4.png" + } + Frame { + msec: 3872 + hash: "9bfb6b9a2604b4c534539bc731abda10" + } + Frame { + msec: 3888 + hash: "02b01092c1f0e279872490306163647d" + } + Frame { + msec: 3904 + hash: "acf688ab0ceba1d5d1e0225b90fd706f" + } + Frame { + msec: 3920 + hash: "5866ceee0fd72361dd490a2163b4fc55" + } + Frame { + msec: 3936 + hash: "218083c830ad133e2aeb4692d2d1517d" + } + Frame { + msec: 3952 + hash: "3542537f0b0e1375d81c7f0365bbdf1d" + } + Frame { + msec: 3968 + hash: "ca17401d638025fde8aad18b9a358029" + } + Frame { + msec: 3984 + hash: "87d666ee3bcf7a606e2aecb4954cfb28" + } + Frame { + msec: 4000 + hash: "87d666ee3bcf7a606e2aecb4954cfb28" + } + Frame { + msec: 4016 + hash: "87d666ee3bcf7a606e2aecb4954cfb28" + } + Frame { + msec: 4032 + hash: "87d666ee3bcf7a606e2aecb4954cfb28" + } + Frame { + msec: 4048 + hash: "87d666ee3bcf7a606e2aecb4954cfb28" + } + Frame { + msec: 4064 + hash: "ca17401d638025fde8aad18b9a358029" + } + Frame { + msec: 4080 + hash: "3542537f0b0e1375d81c7f0365bbdf1d" + } + Frame { + msec: 4096 + hash: "218083c830ad133e2aeb4692d2d1517d" + } + Frame { + msec: 4112 + hash: "5866ceee0fd72361dd490a2163b4fc55" + } + Frame { + msec: 4128 + hash: "acf688ab0ceba1d5d1e0225b90fd706f" + } + Frame { + msec: 4144 + hash: "02b01092c1f0e279872490306163647d" + } + Frame { + msec: 4160 + hash: "9bfb6b9a2604b4c534539bc731abda10" + } + Frame { + msec: 4176 + hash: "dfa52bb483388dfee56577968d013c8f" + } + Frame { + msec: 4192 + hash: "ea77a49e7e246649248e19b72d6433c9" + } + Frame { + msec: 4208 + hash: "348e6a82b1491739e72c5c361158a967" + } + Frame { + msec: 4224 + hash: "bb52aa533659d770d01deb8bef5a8b4d" + } + Frame { + msec: 4240 + hash: "082441b5fea02f2676ad4d53aefb6927" + } + Frame { + msec: 4256 + hash: "9194cd1399ceeda421944cd87182039b" + } + Frame { + msec: 4272 + hash: "edff1333eb3a0047c527503ab3dbe71c" + } + Frame { + msec: 4288 + hash: "e5c9931c8baf260d77f9cfcc1bb41101" + } + Frame { + msec: 4304 + hash: "75c37de92c5af3305733a92d405a4ec8" + } + Frame { + msec: 4320 + hash: "f27082799d0860c660d16c3f9fe6e538" + } + Frame { + msec: 4336 + hash: "5d79ff6cac5bd6943b656964c1d78b00" + } + Frame { + msec: 4352 + hash: "d58a1176858e49c89fc77bed260c6269" + } + Frame { + msec: 4368 + hash: "70deb136fd364646e73390f0aa751baa" + } + Frame { + msec: 4384 + hash: "ed3bf83d975d6b8f830ce0b5a0ad64cc" + } + Frame { + msec: 4400 + hash: "9007b93c9b9ae3612a0f97fe2e2ae825" + } + Frame { + msec: 4416 + hash: "c39f05a5471fb3a26f57feab2b99c8fa" + } + Frame { + msec: 4432 + hash: "49cd710decb32599d7a9c8e0239bf9a5" + } + Frame { + msec: 4448 + hash: "bb9adcb5730aeafb2956e01d9aacaee1" + } + Frame { + msec: 4464 + hash: "ec2da5c6869161936e2598961c605674" + } + Frame { + msec: 4480 + hash: "c77e078983f12d8007c5509cd8b356f9" + } + Frame { + msec: 4496 + hash: "53f5028e96fc65cc6171e78c31c16026" + } + Frame { + msec: 4512 + hash: "cb35c6a887f191b2eb5de961912c94b8" + } + Frame { + msec: 4528 + hash: "3479f78faf16d4d07b6b44d7682ac016" + } + Frame { + msec: 4544 + hash: "74486ca31cf165f0e55aacfae7af9e4c" + } + Frame { + msec: 4560 + hash: "86ddfc357d158deae39a7565c512d0c0" + } + Frame { + msec: 4576 + hash: "493634fa37f10eb02d255253171d190d" + } + Frame { + msec: 4592 + hash: "9e3f1df1b243167b5470778e8c44f7d1" + } + Frame { + msec: 4608 + hash: "1625325eee9b4eaab2df135e0d2f0f14" + } + Frame { + msec: 4624 + hash: "13ca683ddd0071771e853a09fc6e5842" + } + Frame { + msec: 4640 + hash: "0064815fa6e2bcbbe5f2ea8222ddd2b0" + } + Frame { + msec: 4656 + hash: "650a0792ee0025e12f7f0ce6df72df6c" + } + Frame { + msec: 4672 + hash: "5efbed8f4de4387572c5a98ba14f3c27" + } + Frame { + msec: 4688 + hash: "6733673178a1b85b22d22610a6f6c3d7" + } + Frame { + msec: 4704 + hash: "5b725bb5951caa968d221fe7c5dd6370" + } + Frame { + msec: 4720 + hash: "096dc0d8b3ed47894ab0289bcfe3aa8f" + } + Frame { + msec: 4736 + hash: "c54617fb7b21ef8dc2bc0d8492ec476e" + } + Frame { + msec: 4752 + hash: "609a2d8f02c8b42e0921a2a900edccbd" + } + Frame { + msec: 4768 + hash: "519c58c8c0f62d96005b49f68648565b" + } + Frame { + msec: 4784 + hash: "5d1dd05aade754c204d13f5de03413dd" + } + Frame { + msec: 4800 + hash: "ceca317086930994c35b0ed08db71d64" + } + Frame { + msec: 4816 + image: "cursorDelegate.5.png" + } + Frame { + msec: 4832 + hash: "64fcbd6ba961634b0ba33ec5b6693945" + } + Frame { + msec: 4848 + hash: "48a6ced88807a05aea34b47d36261347" + } + Frame { + msec: 4864 + hash: "aafa7081d0f1a46478c0956ad5c56d1d" + } + Frame { + msec: 4880 + hash: "6a9f14ec3fcd119afe68cbf372b13076" + } + Frame { + msec: 4896 + hash: "927556bdf4e883c409ba8797001152ce" + } + Frame { + msec: 4912 + hash: "b93878281f21c85c211908086f2899e7" + } + Frame { + msec: 4928 + hash: "235b68812a3cb48fc09bd8319aef40f1" + } + Frame { + msec: 4944 + hash: "8943d47912a4206e61836d99cca835da" + } + Frame { + msec: 4960 + hash: "4d06d264f71d75421c9a6d5a87d6a9ba" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.0.png new file mode 100644 index 00000000..63b17794 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.1.png new file mode 100644 index 00000000..79246521 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.2.png new file mode 100644 index 00000000..e77bfde0 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.3.png new file mode 100644 index 00000000..67d7e525 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.qml new file mode 100644 index 00000000..ee29db61 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/echoMode.qml @@ -0,0 +1,1043 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "echoMode.0.png" + } + Frame { + msec: 32 + hash: "75bcecaf83ffc9b851894db0be2c02bc" + } + Key { + type: 6 + key: 16777248 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 48 + hash: "75bcecaf83ffc9b851894db0be2c02bc" + } + Frame { + msec: 64 + hash: "75bcecaf83ffc9b851894db0be2c02bc" + } + Frame { + msec: 80 + hash: "75bcecaf83ffc9b851894db0be2c02bc" + } + Frame { + msec: 96 + hash: "75bcecaf83ffc9b851894db0be2c02bc" + } + Frame { + msec: 112 + hash: "75bcecaf83ffc9b851894db0be2c02bc" + } + Frame { + msec: 128 + hash: "75bcecaf83ffc9b851894db0be2c02bc" + } + Frame { + msec: 144 + hash: "75bcecaf83ffc9b851894db0be2c02bc" + } + Frame { + msec: 160 + hash: "75bcecaf83ffc9b851894db0be2c02bc" + } + Frame { + msec: 176 + hash: "75bcecaf83ffc9b851894db0be2c02bc" + } + Frame { + msec: 192 + hash: "75bcecaf83ffc9b851894db0be2c02bc" + } + Frame { + msec: 208 + hash: "75bcecaf83ffc9b851894db0be2c02bc" + } + Frame { + msec: 224 + hash: "75bcecaf83ffc9b851894db0be2c02bc" + } + Frame { + msec: 240 + hash: "75bcecaf83ffc9b851894db0be2c02bc" + } + Frame { + msec: 256 + hash: "75bcecaf83ffc9b851894db0be2c02bc" + } + Frame { + msec: 272 + hash: "75bcecaf83ffc9b851894db0be2c02bc" + } + Frame { + msec: 288 + hash: "75bcecaf83ffc9b851894db0be2c02bc" + } + Frame { + msec: 304 + hash: "75bcecaf83ffc9b851894db0be2c02bc" + } + Frame { + msec: 320 + hash: "75bcecaf83ffc9b851894db0be2c02bc" + } + Frame { + msec: 336 + hash: "75bcecaf83ffc9b851894db0be2c02bc" + } + Frame { + msec: 352 + hash: "75bcecaf83ffc9b851894db0be2c02bc" + } + Key { + type: 6 + key: 74 + modifiers: 33554432 + text: "4a" + autorep: false + count: 1 + } + Frame { + msec: 368 + hash: "1a9f4d47e3982ce68eee8446fd735487" + } + Frame { + msec: 384 + hash: "1a9f4d47e3982ce68eee8446fd735487" + } + Frame { + msec: 400 + hash: "1a9f4d47e3982ce68eee8446fd735487" + } + Frame { + msec: 416 + hash: "1a9f4d47e3982ce68eee8446fd735487" + } + Frame { + msec: 432 + hash: "1a9f4d47e3982ce68eee8446fd735487" + } + Key { + type: 7 + key: 74 + modifiers: 33554432 + text: "4a" + autorep: false + count: 1 + } + Frame { + msec: 448 + hash: "1a9f4d47e3982ce68eee8446fd735487" + } + Frame { + msec: 464 + hash: "1a9f4d47e3982ce68eee8446fd735487" + } + Frame { + msec: 480 + hash: "1a9f4d47e3982ce68eee8446fd735487" + } + Frame { + msec: 496 + hash: "1a9f4d47e3982ce68eee8446fd735487" + } + Frame { + msec: 512 + hash: "1a9f4d47e3982ce68eee8446fd735487" + } + Frame { + msec: 528 + hash: "1a9f4d47e3982ce68eee8446fd735487" + } + Key { + type: 7 + key: 16777248 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 544 + hash: "1a9f4d47e3982ce68eee8446fd735487" + } + Frame { + msec: 560 + hash: "1a9f4d47e3982ce68eee8446fd735487" + } + Frame { + msec: 576 + hash: "1a9f4d47e3982ce68eee8446fd735487" + } + Frame { + msec: 592 + hash: "1a9f4d47e3982ce68eee8446fd735487" + } + Frame { + msec: 608 + hash: "1a9f4d47e3982ce68eee8446fd735487" + } + Frame { + msec: 624 + hash: "1a9f4d47e3982ce68eee8446fd735487" + } + Frame { + msec: 640 + hash: "1a9f4d47e3982ce68eee8446fd735487" + } + Frame { + msec: 656 + hash: "1a9f4d47e3982ce68eee8446fd735487" + } + Frame { + msec: 672 + hash: "1a9f4d47e3982ce68eee8446fd735487" + } + Frame { + msec: 688 + hash: "1a9f4d47e3982ce68eee8446fd735487" + } + Key { + type: 6 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 704 + hash: "9ab137169f2ea0f4b140a6e668f59ad2" + } + Frame { + msec: 720 + hash: "9ab137169f2ea0f4b140a6e668f59ad2" + } + Frame { + msec: 736 + hash: "9ab137169f2ea0f4b140a6e668f59ad2" + } + Frame { + msec: 752 + hash: "9ab137169f2ea0f4b140a6e668f59ad2" + } + Frame { + msec: 768 + hash: "9ab137169f2ea0f4b140a6e668f59ad2" + } + Key { + type: 7 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 784 + hash: "9ab137169f2ea0f4b140a6e668f59ad2" + } + Frame { + msec: 800 + hash: "9ab137169f2ea0f4b140a6e668f59ad2" + } + Frame { + msec: 816 + hash: "9ab137169f2ea0f4b140a6e668f59ad2" + } + Frame { + msec: 832 + hash: "9ab137169f2ea0f4b140a6e668f59ad2" + } + Frame { + msec: 848 + hash: "9ab137169f2ea0f4b140a6e668f59ad2" + } + Key { + type: 6 + key: 67 + modifiers: 0 + text: "63" + autorep: false + count: 1 + } + Frame { + msec: 864 + hash: "3080734a2da042b87ef9177cbb314835" + } + Frame { + msec: 880 + hash: "3080734a2da042b87ef9177cbb314835" + } + Frame { + msec: 896 + hash: "3080734a2da042b87ef9177cbb314835" + } + Key { + type: 7 + key: 67 + modifiers: 0 + text: "63" + autorep: false + count: 1 + } + Frame { + msec: 912 + hash: "3080734a2da042b87ef9177cbb314835" + } + Frame { + msec: 928 + hash: "3080734a2da042b87ef9177cbb314835" + } + Frame { + msec: 944 + hash: "3080734a2da042b87ef9177cbb314835" + } + Frame { + msec: 960 + hash: "3080734a2da042b87ef9177cbb314835" + } + Frame { + msec: 976 + image: "echoMode.1.png" + } + Key { + type: 6 + key: 75 + modifiers: 0 + text: "6b" + autorep: false + count: 1 + } + Frame { + msec: 992 + hash: "e591963b05361595383b1a60eec289cb" + } + Frame { + msec: 1008 + hash: "e591963b05361595383b1a60eec289cb" + } + Frame { + msec: 1024 + hash: "e591963b05361595383b1a60eec289cb" + } + Frame { + msec: 1040 + hash: "e591963b05361595383b1a60eec289cb" + } + Key { + type: 7 + key: 75 + modifiers: 0 + text: "6b" + autorep: false + count: 1 + } + Frame { + msec: 1056 + hash: "e591963b05361595383b1a60eec289cb" + } + Frame { + msec: 1072 + hash: "e591963b05361595383b1a60eec289cb" + } + Frame { + msec: 1088 + hash: "e591963b05361595383b1a60eec289cb" + } + Frame { + msec: 1104 + hash: "e591963b05361595383b1a60eec289cb" + } + Frame { + msec: 1120 + hash: "e591963b05361595383b1a60eec289cb" + } + Frame { + msec: 1136 + hash: "e591963b05361595383b1a60eec289cb" + } + Frame { + msec: 1152 + hash: "e591963b05361595383b1a60eec289cb" + } + Frame { + msec: 1168 + hash: "e591963b05361595383b1a60eec289cb" + } + Frame { + msec: 1184 + hash: "e591963b05361595383b1a60eec289cb" + } + Frame { + msec: 1200 + hash: "e591963b05361595383b1a60eec289cb" + } + Frame { + msec: 1216 + hash: "e591963b05361595383b1a60eec289cb" + } + Frame { + msec: 1232 + hash: "e591963b05361595383b1a60eec289cb" + } + Key { + type: 6 + key: 68 + modifiers: 0 + text: "64" + autorep: false + count: 1 + } + Frame { + msec: 1248 + hash: "8a528bf3110bace8275f6fe33ce528b9" + } + Frame { + msec: 1264 + hash: "8a528bf3110bace8275f6fe33ce528b9" + } + Frame { + msec: 1280 + hash: "8a528bf3110bace8275f6fe33ce528b9" + } + Key { + type: 7 + key: 68 + modifiers: 0 + text: "64" + autorep: false + count: 1 + } + Frame { + msec: 1296 + hash: "8a528bf3110bace8275f6fe33ce528b9" + } + Frame { + msec: 1312 + hash: "8a528bf3110bace8275f6fe33ce528b9" + } + Frame { + msec: 1328 + hash: "8a528bf3110bace8275f6fe33ce528b9" + } + Key { + type: 6 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 1344 + hash: "03d56caa0c86b5544d1f5148e0dccd92" + } + Frame { + msec: 1360 + hash: "03d56caa0c86b5544d1f5148e0dccd92" + } + Frame { + msec: 1376 + hash: "03d56caa0c86b5544d1f5148e0dccd92" + } + Frame { + msec: 1392 + hash: "03d56caa0c86b5544d1f5148e0dccd92" + } + Frame { + msec: 1408 + hash: "03d56caa0c86b5544d1f5148e0dccd92" + } + Frame { + msec: 1424 + hash: "03d56caa0c86b5544d1f5148e0dccd92" + } + Frame { + msec: 1440 + hash: "03d56caa0c86b5544d1f5148e0dccd92" + } + Frame { + msec: 1456 + hash: "03d56caa0c86b5544d1f5148e0dccd92" + } + Frame { + msec: 1472 + hash: "03d56caa0c86b5544d1f5148e0dccd92" + } + Key { + type: 7 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 1488 + hash: "03d56caa0c86b5544d1f5148e0dccd92" + } + Key { + type: 6 + key: 87 + modifiers: 0 + text: "77" + autorep: false + count: 1 + } + Frame { + msec: 1504 + hash: "d9aac9ed4ca0ad97b440db3ac7384001" + } + Frame { + msec: 1520 + hash: "d9aac9ed4ca0ad97b440db3ac7384001" + } + Frame { + msec: 1536 + hash: "d9aac9ed4ca0ad97b440db3ac7384001" + } + Frame { + msec: 1552 + hash: "d9aac9ed4ca0ad97b440db3ac7384001" + } + Key { + type: 7 + key: 87 + modifiers: 0 + text: "77" + autorep: false + count: 1 + } + Frame { + msec: 1568 + hash: "d9aac9ed4ca0ad97b440db3ac7384001" + } + Frame { + msec: 1584 + hash: "d9aac9ed4ca0ad97b440db3ac7384001" + } + Frame { + msec: 1600 + hash: "d9aac9ed4ca0ad97b440db3ac7384001" + } + Frame { + msec: 1616 + hash: "d9aac9ed4ca0ad97b440db3ac7384001" + } + Frame { + msec: 1632 + hash: "d9aac9ed4ca0ad97b440db3ac7384001" + } + Frame { + msec: 1648 + hash: "d9aac9ed4ca0ad97b440db3ac7384001" + } + Key { + type: 6 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 1664 + hash: "a2e8a6a742b11b4f30a2d75df14d5f47" + } + Frame { + msec: 1680 + hash: "a2e8a6a742b11b4f30a2d75df14d5f47" + } + Frame { + msec: 1696 + hash: "a2e8a6a742b11b4f30a2d75df14d5f47" + } + Frame { + msec: 1712 + hash: "a2e8a6a742b11b4f30a2d75df14d5f47" + } + Frame { + msec: 1728 + hash: "a2e8a6a742b11b4f30a2d75df14d5f47" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 1744 + hash: "021641e69fef4720acf6af15d4a2da82" + } + Key { + type: 7 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 1760 + hash: "021641e69fef4720acf6af15d4a2da82" + } + Frame { + msec: 1776 + hash: "021641e69fef4720acf6af15d4a2da82" + } + Frame { + msec: 1792 + hash: "021641e69fef4720acf6af15d4a2da82" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 1808 + hash: "021641e69fef4720acf6af15d4a2da82" + } + Frame { + msec: 1824 + hash: "021641e69fef4720acf6af15d4a2da82" + } + Frame { + msec: 1840 + hash: "021641e69fef4720acf6af15d4a2da82" + } + Frame { + msec: 1856 + hash: "021641e69fef4720acf6af15d4a2da82" + } + Key { + type: 6 + key: 76 + modifiers: 0 + text: "6c" + autorep: false + count: 1 + } + Frame { + msec: 1872 + hash: "46ece14e3a61aefcb28b3c888ac7ea59" + } + Frame { + msec: 1888 + hash: "46ece14e3a61aefcb28b3c888ac7ea59" + } + Frame { + msec: 1904 + hash: "46ece14e3a61aefcb28b3c888ac7ea59" + } + Frame { + msec: 1920 + hash: "46ece14e3a61aefcb28b3c888ac7ea59" + } + Key { + type: 7 + key: 76 + modifiers: 0 + text: "6c" + autorep: false + count: 1 + } + Frame { + msec: 1936 + image: "echoMode.2.png" + } + Frame { + msec: 1952 + hash: "46ece14e3a61aefcb28b3c888ac7ea59" + } + Frame { + msec: 1968 + hash: "46ece14e3a61aefcb28b3c888ac7ea59" + } + Frame { + msec: 1984 + hash: "46ece14e3a61aefcb28b3c888ac7ea59" + } + Frame { + msec: 2000 + hash: "46ece14e3a61aefcb28b3c888ac7ea59" + } + Frame { + msec: 2016 + hash: "46ece14e3a61aefcb28b3c888ac7ea59" + } + Key { + type: 6 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 2032 + hash: "ffa55ac51f20c82725cadbb445908fd2" + } + Frame { + msec: 2048 + hash: "ffa55ac51f20c82725cadbb445908fd2" + } + Key { + type: 7 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 2064 + hash: "ffa55ac51f20c82725cadbb445908fd2" + } + Frame { + msec: 2080 + hash: "ffa55ac51f20c82725cadbb445908fd2" + } + Key { + type: 6 + key: 86 + modifiers: 0 + text: "76" + autorep: false + count: 1 + } + Frame { + msec: 2096 + hash: "e9e2edb9176cb57506a3f130fca15d1e" + } + Frame { + msec: 2112 + hash: "e9e2edb9176cb57506a3f130fca15d1e" + } + Frame { + msec: 2128 + hash: "e9e2edb9176cb57506a3f130fca15d1e" + } + Frame { + msec: 2144 + hash: "e9e2edb9176cb57506a3f130fca15d1e" + } + Key { + type: 6 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Key { + type: 7 + key: 86 + modifiers: 0 + text: "76" + autorep: false + count: 1 + } + Frame { + msec: 2160 + hash: "87c3cf93b47a766d6373ecaec7239dd4" + } + Frame { + msec: 2176 + hash: "87c3cf93b47a766d6373ecaec7239dd4" + } + Frame { + msec: 2192 + hash: "87c3cf93b47a766d6373ecaec7239dd4" + } + Frame { + msec: 2208 + hash: "87c3cf93b47a766d6373ecaec7239dd4" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 2224 + hash: "1fb4aa190807d169d1ceaff7d9fa92ad" + } + Key { + type: 7 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Frame { + msec: 2240 + hash: "1fb4aa190807d169d1ceaff7d9fa92ad" + } + Frame { + msec: 2256 + hash: "1fb4aa190807d169d1ceaff7d9fa92ad" + } + Frame { + msec: 2272 + hash: "1fb4aa190807d169d1ceaff7d9fa92ad" + } + Frame { + msec: 2288 + hash: "1fb4aa190807d169d1ceaff7d9fa92ad" + } + Frame { + msec: 2304 + hash: "1fb4aa190807d169d1ceaff7d9fa92ad" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 2320 + hash: "1fb4aa190807d169d1ceaff7d9fa92ad" + } + Frame { + msec: 2336 + hash: "1fb4aa190807d169d1ceaff7d9fa92ad" + } + Key { + type: 6 + key: 77 + modifiers: 0 + text: "6d" + autorep: false + count: 1 + } + Frame { + msec: 2352 + hash: "e9cd789b114befb4637fcff39d4413b0" + } + Frame { + msec: 2368 + hash: "e9cd789b114befb4637fcff39d4413b0" + } + Frame { + msec: 2384 + hash: "e9cd789b114befb4637fcff39d4413b0" + } + Frame { + msec: 2400 + hash: "e9cd789b114befb4637fcff39d4413b0" + } + Frame { + msec: 2416 + hash: "e9cd789b114befb4637fcff39d4413b0" + } + Frame { + msec: 2432 + hash: "e9cd789b114befb4637fcff39d4413b0" + } + Key { + type: 7 + key: 77 + modifiers: 0 + text: "6d" + autorep: false + count: 1 + } + Frame { + msec: 2448 + hash: "e9cd789b114befb4637fcff39d4413b0" + } + Frame { + msec: 2464 + hash: "e9cd789b114befb4637fcff39d4413b0" + } + Frame { + msec: 2480 + hash: "e9cd789b114befb4637fcff39d4413b0" + } + Frame { + msec: 2496 + hash: "e9cd789b114befb4637fcff39d4413b0" + } + Key { + type: 6 + key: 89 + modifiers: 0 + text: "79" + autorep: false + count: 1 + } + Frame { + msec: 2512 + hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb" + } + Frame { + msec: 2528 + hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb" + } + Frame { + msec: 2544 + hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb" + } + Key { + type: 7 + key: 89 + modifiers: 0 + text: "79" + autorep: false + count: 1 + } + Frame { + msec: 2560 + hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb" + } + Frame { + msec: 2576 + hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb" + } + Frame { + msec: 2592 + hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb" + } + Frame { + msec: 2608 + hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb" + } + Frame { + msec: 2624 + hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb" + } + Frame { + msec: 2640 + hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb" + } + Frame { + msec: 2656 + hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb" + } + Frame { + msec: 2672 + hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb" + } + Frame { + msec: 2688 + hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb" + } + Frame { + msec: 2704 + hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb" + } + Frame { + msec: 2720 + hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb" + } + Frame { + msec: 2736 + hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb" + } + Frame { + msec: 2752 + hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb" + } + Frame { + msec: 2768 + hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb" + } + Frame { + msec: 2784 + hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb" + } + Frame { + msec: 2800 + hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb" + } + Frame { + msec: 2816 + hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb" + } + Frame { + msec: 2832 + hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb" + } + Frame { + msec: 2848 + hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb" + } + Frame { + msec: 2864 + hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb" + } + Frame { + msec: 2880 + hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb" + } + Frame { + msec: 2896 + image: "echoMode.3.png" + } + Frame { + msec: 2912 + hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb" + } + Frame { + msec: 2928 + hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb" + } + Frame { + msec: 2944 + hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb" + } + Frame { + msec: 2960 + hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb" + } + Frame { + msec: 2976 + hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb" + } + Frame { + msec: 2992 + hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb" + } + Frame { + msec: 3008 + hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb" + } + Frame { + msec: 3024 + hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb" + } + Frame { + msec: 3040 + hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb" + } + Frame { + msec: 3056 + hash: "15f91fda9bcc8a2a9ebf3b9c32f61efb" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/hAlign.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/hAlign.0.png new file mode 100644 index 00000000..4c04a1b2 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/hAlign.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/hAlign.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/hAlign.qml new file mode 100644 index 00000000..74ee95f6 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/hAlign.qml @@ -0,0 +1,107 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "hAlign.0.png" + } + Frame { + msec: 32 + hash: "93758371bdc69b81077989e911f62fb0" + } + Frame { + msec: 48 + hash: "93758371bdc69b81077989e911f62fb0" + } + Frame { + msec: 64 + hash: "93758371bdc69b81077989e911f62fb0" + } + Frame { + msec: 80 + hash: "93758371bdc69b81077989e911f62fb0" + } + Frame { + msec: 96 + hash: "93758371bdc69b81077989e911f62fb0" + } + Frame { + msec: 112 + hash: "93758371bdc69b81077989e911f62fb0" + } + Frame { + msec: 128 + hash: "93758371bdc69b81077989e911f62fb0" + } + Frame { + msec: 144 + hash: "93758371bdc69b81077989e911f62fb0" + } + Frame { + msec: 160 + hash: "93758371bdc69b81077989e911f62fb0" + } + Frame { + msec: 176 + hash: "93758371bdc69b81077989e911f62fb0" + } + Frame { + msec: 192 + hash: "93758371bdc69b81077989e911f62fb0" + } + Frame { + msec: 208 + hash: "93758371bdc69b81077989e911f62fb0" + } + Frame { + msec: 224 + hash: "93758371bdc69b81077989e911f62fb0" + } + Frame { + msec: 240 + hash: "93758371bdc69b81077989e911f62fb0" + } + Frame { + msec: 256 + hash: "93758371bdc69b81077989e911f62fb0" + } + Frame { + msec: 272 + hash: "93758371bdc69b81077989e911f62fb0" + } + Frame { + msec: 288 + hash: "93758371bdc69b81077989e911f62fb0" + } + Frame { + msec: 304 + hash: "93758371bdc69b81077989e911f62fb0" + } + Frame { + msec: 320 + hash: "93758371bdc69b81077989e911f62fb0" + } + Frame { + msec: 336 + hash: "93758371bdc69b81077989e911f62fb0" + } + Frame { + msec: 352 + hash: "93758371bdc69b81077989e911f62fb0" + } + Frame { + msec: 368 + hash: "93758371bdc69b81077989e911f62fb0" + } + Frame { + msec: 384 + hash: "93758371bdc69b81077989e911f62fb0" + } + Frame { + msec: 400 + hash: "93758371bdc69b81077989e911f62fb0" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.0.png new file mode 100644 index 00000000..fc34b1aa Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.1.png new file mode 100644 index 00000000..fc34b1aa Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.2.png new file mode 100644 index 00000000..fc34b1aa Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.3.png new file mode 100644 index 00000000..fb2c90b8 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.4.png new file mode 100644 index 00000000..fb2c90b8 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.5.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.5.png new file mode 100644 index 00000000..e2231ffc Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.5.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.qml new file mode 100644 index 00000000..790dffae --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/qtbug-15818.qml @@ -0,0 +1,1039 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "qtbug-15818.0.png" + } + Frame { + msec: 32 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 48 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 64 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 80 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 96 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 112 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 128 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 144 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 160 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 176 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 192 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 208 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 224 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 240 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 256 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 272 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 288 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 304 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 320 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 336 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 352 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 368 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 384 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 400 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 416 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 432 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 448 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 464 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 480 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 496 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 512 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 528 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 544 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 560 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 576 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 592 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 608 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 624 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 640 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 656 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 672 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 688 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 704 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 720 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 736 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 752 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 768 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 784 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 800 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 816 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 832 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 848 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 864 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 880 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 26; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 896 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 912 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 928 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 27; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 27; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 944 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 960 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 976 + image: "qtbug-15818.1.png" + } + Frame { + msec: 992 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Mouse { + type: 4 + button: 1 + buttons: 1 + x: 27; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1008 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1024 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1040 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1056 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1072 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1088 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1104 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 27; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1120 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1136 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1152 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1168 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1184 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1200 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1216 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1232 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1248 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1264 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1280 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1296 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1312 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1328 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1344 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1360 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1376 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1392 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1408 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1424 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1440 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1456 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1472 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1488 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1504 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1520 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1536 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1552 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1568 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1584 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1600 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1616 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1632 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1648 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1664 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1680 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1696 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1712 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1728 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1744 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1760 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1776 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Frame { + msec: 1792 + hash: "8833dfac6aae78ce1309222cc4438e6f" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 43; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1808 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 1824 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 1840 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 1856 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 1872 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 1888 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 43; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1904 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 1920 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 1936 + image: "qtbug-15818.2.png" + } + Frame { + msec: 1952 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Mouse { + type: 4 + button: 1 + buttons: 1 + x: 43; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1968 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 1984 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2000 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2016 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2032 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2048 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2064 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 43; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2080 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2096 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2112 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2128 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2144 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2160 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2176 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2192 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2208 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2224 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2240 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2256 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2272 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2288 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2304 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2320 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2336 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2352 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2368 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2384 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2400 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2416 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2432 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2448 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2464 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2480 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2496 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2512 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2528 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2544 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2560 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2576 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2592 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2608 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2624 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2640 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2656 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2672 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2688 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 54; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2704 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 2720 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 2736 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 2752 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 2768 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 2784 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 55; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 55; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2800 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 2816 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 2832 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Frame { + msec: 2848 + hash: "0a63463fc1004efffd15f9524bcf3a29" + } + Mouse { + type: 4 + button: 1 + buttons: 1 + x: 55; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2864 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2880 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2896 + image: "qtbug-15818.3.png" + } + Frame { + msec: 2912 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2928 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2944 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2960 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 2976 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 55; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2992 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3008 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3024 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3040 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3056 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3072 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3088 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3104 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3120 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3136 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3152 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3168 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3184 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3200 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3216 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3232 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3248 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3264 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3280 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3296 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3312 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3328 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3344 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3360 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3376 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3392 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3408 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3424 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3440 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3456 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3472 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3488 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3504 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3520 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3536 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3552 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3568 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3584 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3600 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3616 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3632 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3648 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3664 + hash: "270462ec02bce658757e0ea4fb2136b1" + } + Frame { + msec: 3680 + hash: "270462ec02bce658757e0ea4fb2136b1" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.0.png new file mode 100644 index 00000000..fb0eb85e Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.1.png new file mode 100644 index 00000000..444ee344 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.10.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.10.png new file mode 100644 index 00000000..5f3668c7 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.10.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.11.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.11.png new file mode 100644 index 00000000..7829e03b Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.11.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.2.png new file mode 100644 index 00000000..444ee344 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.3.png new file mode 100644 index 00000000..9bcd6a7a Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.4.png new file mode 100644 index 00000000..04a1e66d Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.5.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.5.png new file mode 100644 index 00000000..716f59bb Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.5.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.6.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.6.png new file mode 100644 index 00000000..f6b9fcea Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.6.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.7.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.7.png new file mode 100644 index 00000000..61430e8e Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.7.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.8.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.8.png new file mode 100644 index 00000000..be9691f6 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.8.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.9.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.9.png new file mode 100644 index 00000000..4f285b19 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.9.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.qml new file mode 100644 index 00000000..8957e393 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data-X11/usingLineEdit.qml @@ -0,0 +1,4335 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "usingLineEdit.0.png" + } + Frame { + msec: 32 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 48 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 64 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 80 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 96 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 112 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 128 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 144 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 160 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 176 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 192 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 208 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 224 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 240 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 256 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 272 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 288 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 304 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 320 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 336 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 352 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 368 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 384 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 400 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 416 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 432 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 448 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 464 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 480 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 496 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 512 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 528 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 544 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 560 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 576 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 592 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 608 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 624 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 640 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 656 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 672 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 688 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 704 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 720 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 736 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 752 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 768 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 784 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 800 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 816 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 832 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 848 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 864 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 880 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 896 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 912 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Frame { + msec: 928 + hash: "2e747d3e26cc85e4c36c42097ab3f379" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 85; y: 11 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 944 + hash: "227431895322480615fb61a635305230" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 85; y: 11 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 960 + hash: "227431895322480615fb61a635305230" + } + Mouse { + type: 4 + button: 1 + buttons: 1 + x: 85; y: 11 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 976 + image: "usingLineEdit.1.png" + } + Frame { + msec: 992 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1008 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1024 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1040 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1056 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 85; y: 11 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1072 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1088 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1104 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1120 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1136 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1152 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1168 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1184 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1200 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1216 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1232 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1248 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1264 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1280 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1296 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1312 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1328 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1344 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1360 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Key { + type: 6 + key: 16777249 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1376 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1392 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1408 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1424 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1440 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1456 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1472 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1488 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1504 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1520 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1536 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1552 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1568 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1584 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1600 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1616 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1632 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1648 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1664 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1680 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1696 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1712 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1728 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1744 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1760 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1776 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1792 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1808 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1824 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1840 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1856 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1872 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1888 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1904 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1920 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1936 + image: "usingLineEdit.2.png" + } + Frame { + msec: 1952 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1968 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 1984 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Key { + type: 6 + key: 67 + modifiers: 67108864 + text: "03" + autorep: false + count: 1 + } + Frame { + msec: 2000 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 2016 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 2032 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 2048 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 2064 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 2080 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 2096 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 2112 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Key { + type: 7 + key: 16777249 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Key { + type: 7 + key: 67 + modifiers: 0 + text: "63" + autorep: false + count: 1 + } + Frame { + msec: 2128 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 2144 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 2160 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 2176 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 2192 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 2208 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 2224 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 2240 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 2256 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 2272 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 2288 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 2304 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 2320 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 2336 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 2352 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 2368 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 2384 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 2400 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 2416 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 2432 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 2448 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 2464 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Frame { + msec: 2480 + hash: "b888cf6d6e002e28690cff49726eea70" + } + Key { + type: 6 + key: 16777233 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2496 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 2512 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 2528 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 2544 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 2560 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 2576 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Key { + type: 7 + key: 16777233 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2592 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 2608 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 2624 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 2640 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 2656 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 2672 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 2688 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 2704 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 2720 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 2736 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 2752 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 2768 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 2784 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Key { + type: 6 + key: 16777249 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2800 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 2816 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 2832 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 2848 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 2864 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 2880 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 2896 + image: "usingLineEdit.3.png" + } + Frame { + msec: 2912 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 2928 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 2944 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 2960 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 2976 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 2992 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 3008 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 3024 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 3040 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 3056 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 3072 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 3088 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 3104 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 3120 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 3136 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 3152 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 3168 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 3184 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 3200 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Frame { + msec: 3216 + hash: "62afc4e3874da1bcd7e86860bbf6db20" + } + Key { + type: 6 + key: 86 + modifiers: 67108864 + text: "16" + autorep: false + count: 1 + } + Frame { + msec: 3232 + hash: "dc7187f95e9f178cd5d5a0c4e0d637c3" + } + Frame { + msec: 3248 + hash: "dc7187f95e9f178cd5d5a0c4e0d637c3" + } + Frame { + msec: 3264 + hash: "dc7187f95e9f178cd5d5a0c4e0d637c3" + } + Frame { + msec: 3280 + hash: "dc7187f95e9f178cd5d5a0c4e0d637c3" + } + Frame { + msec: 3296 + hash: "dc7187f95e9f178cd5d5a0c4e0d637c3" + } + Frame { + msec: 3312 + hash: "dc7187f95e9f178cd5d5a0c4e0d637c3" + } + Frame { + msec: 3328 + hash: "dc7187f95e9f178cd5d5a0c4e0d637c3" + } + Key { + type: 7 + key: 86 + modifiers: 67108864 + text: "16" + autorep: false + count: 1 + } + Frame { + msec: 3344 + hash: "dc7187f95e9f178cd5d5a0c4e0d637c3" + } + Frame { + msec: 3360 + hash: "dc7187f95e9f178cd5d5a0c4e0d637c3" + } + Frame { + msec: 3376 + hash: "dc7187f95e9f178cd5d5a0c4e0d637c3" + } + Frame { + msec: 3392 + hash: "dc7187f95e9f178cd5d5a0c4e0d637c3" + } + Frame { + msec: 3408 + hash: "dc7187f95e9f178cd5d5a0c4e0d637c3" + } + Frame { + msec: 3424 + hash: "dc7187f95e9f178cd5d5a0c4e0d637c3" + } + Frame { + msec: 3440 + hash: "dc7187f95e9f178cd5d5a0c4e0d637c3" + } + Frame { + msec: 3456 + hash: "dc7187f95e9f178cd5d5a0c4e0d637c3" + } + Frame { + msec: 3472 + hash: "dc7187f95e9f178cd5d5a0c4e0d637c3" + } + Frame { + msec: 3488 + hash: "dc7187f95e9f178cd5d5a0c4e0d637c3" + } + Frame { + msec: 3504 + hash: "dc7187f95e9f178cd5d5a0c4e0d637c3" + } + Frame { + msec: 3520 + hash: "dc7187f95e9f178cd5d5a0c4e0d637c3" + } + Frame { + msec: 3536 + hash: "dc7187f95e9f178cd5d5a0c4e0d637c3" + } + Frame { + msec: 3552 + hash: "dc7187f95e9f178cd5d5a0c4e0d637c3" + } + Key { + type: 6 + key: 86 + modifiers: 67108864 + text: "16" + autorep: false + count: 1 + } + Frame { + msec: 3568 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 3584 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 3600 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 3616 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 3632 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 3648 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 3664 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 3680 + hash: "942d2dde9d40eb0864831831b9056525" + } + Key { + type: 7 + key: 86 + modifiers: 67108864 + text: "16" + autorep: false + count: 1 + } + Frame { + msec: 3696 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 3712 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 3728 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 3744 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 3760 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 3776 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 3792 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 3808 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 3824 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 3840 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 3856 + image: "usingLineEdit.4.png" + } + Frame { + msec: 3872 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 3888 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 3904 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 3920 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 3936 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 3952 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 3968 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 3984 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4000 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4016 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4032 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4048 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4064 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4080 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4096 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4112 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4128 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4144 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4160 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4176 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4192 + hash: "942d2dde9d40eb0864831831b9056525" + } + Key { + type: 7 + key: 16777249 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 4208 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4224 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4240 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4256 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4272 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4288 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4304 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4320 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4336 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4352 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4368 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4384 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4400 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4416 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4432 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4448 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4464 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4480 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4496 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4512 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4528 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4544 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4560 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4576 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4592 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4608 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4624 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4640 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4656 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4672 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4688 + hash: "942d2dde9d40eb0864831831b9056525" + } + Frame { + msec: 4704 + hash: "942d2dde9d40eb0864831831b9056525" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 69; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4720 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 4736 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 4752 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 4768 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 4784 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 4800 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 69; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4816 + image: "usingLineEdit.5.png" + } + Frame { + msec: 4832 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 4848 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 4864 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 4880 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 4896 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 4912 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 4928 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 4944 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 4960 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 4976 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 4992 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 5008 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 5024 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 5040 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 5056 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 5072 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 5088 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 5104 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 5120 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 5136 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 5152 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 5168 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 5184 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 5200 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 5216 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 5232 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 5248 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 5264 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 5280 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 5296 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 5312 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 5328 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 5344 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Frame { + msec: 5360 + hash: "9103b19d12565b6d28380f48acfce3c3" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 5376 + hash: "3c6258003fba9b4a61bde3a5eb2394d5" + } + Frame { + msec: 5392 + hash: "3c6258003fba9b4a61bde3a5eb2394d5" + } + Frame { + msec: 5408 + hash: "3c6258003fba9b4a61bde3a5eb2394d5" + } + Frame { + msec: 5424 + hash: "3c6258003fba9b4a61bde3a5eb2394d5" + } + Frame { + msec: 5440 + hash: "3c6258003fba9b4a61bde3a5eb2394d5" + } + Frame { + msec: 5456 + hash: "3c6258003fba9b4a61bde3a5eb2394d5" + } + Frame { + msec: 5472 + hash: "3c6258003fba9b4a61bde3a5eb2394d5" + } + Frame { + msec: 5488 + hash: "3c6258003fba9b4a61bde3a5eb2394d5" + } + Frame { + msec: 5504 + hash: "3c6258003fba9b4a61bde3a5eb2394d5" + } + Frame { + msec: 5520 + hash: "3c6258003fba9b4a61bde3a5eb2394d5" + } + Frame { + msec: 5536 + hash: "3c6258003fba9b4a61bde3a5eb2394d5" + } + Frame { + msec: 5552 + hash: "3c6258003fba9b4a61bde3a5eb2394d5" + } + Frame { + msec: 5568 + hash: "3c6258003fba9b4a61bde3a5eb2394d5" + } + Frame { + msec: 5584 + hash: "3c6258003fba9b4a61bde3a5eb2394d5" + } + Frame { + msec: 5600 + hash: "3c6258003fba9b4a61bde3a5eb2394d5" + } + Frame { + msec: 5616 + hash: "3c6258003fba9b4a61bde3a5eb2394d5" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 5632 + hash: "f2c1bfd1a4ffb5bc0a5a354707a8ecf8" + } + Frame { + msec: 5648 + hash: "f2c1bfd1a4ffb5bc0a5a354707a8ecf8" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 5664 + hash: "9f4fc35d1b6f5984972da9f819a4031e" + } + Frame { + msec: 5680 + hash: "9f4fc35d1b6f5984972da9f819a4031e" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 5696 + hash: "68e84d0e6c0febe00cbc8ff13e7efae1" + } + Frame { + msec: 5712 + hash: "68e84d0e6c0febe00cbc8ff13e7efae1" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 5728 + hash: "f0c61e706be86d31f124d6405c14c5b4" + } + Frame { + msec: 5744 + hash: "f0c61e706be86d31f124d6405c14c5b4" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 5760 + hash: "dbca3c9292e2a6efac887a33b735607f" + } + Frame { + msec: 5776 + image: "usingLineEdit.6.png" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 5792 + hash: "6cb5d4a9c79ac3dc6522c5a1022b2e6e" + } + Frame { + msec: 5808 + hash: "6cb5d4a9c79ac3dc6522c5a1022b2e6e" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 5824 + hash: "71d67363467f3053393382b887f43401" + } + Frame { + msec: 5840 + hash: "71d67363467f3053393382b887f43401" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 5856 + hash: "71d67363467f3053393382b887f43401" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 5872 + hash: "db9175c9b81cb4b43f6d4d80549a5ae1" + } + Frame { + msec: 5888 + hash: "db9175c9b81cb4b43f6d4d80549a5ae1" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 5904 + hash: "535d1bbe1d2147d70bec0b7d932eff41" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 5920 + hash: "535d1bbe1d2147d70bec0b7d932eff41" + } + Frame { + msec: 5936 + hash: "535d1bbe1d2147d70bec0b7d932eff41" + } + Frame { + msec: 5952 + hash: "535d1bbe1d2147d70bec0b7d932eff41" + } + Frame { + msec: 5968 + hash: "535d1bbe1d2147d70bec0b7d932eff41" + } + Frame { + msec: 5984 + hash: "535d1bbe1d2147d70bec0b7d932eff41" + } + Frame { + msec: 6000 + hash: "535d1bbe1d2147d70bec0b7d932eff41" + } + Frame { + msec: 6016 + hash: "535d1bbe1d2147d70bec0b7d932eff41" + } + Frame { + msec: 6032 + hash: "535d1bbe1d2147d70bec0b7d932eff41" + } + Frame { + msec: 6048 + hash: "535d1bbe1d2147d70bec0b7d932eff41" + } + Key { + type: 6 + key: 16777249 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 6064 + hash: "535d1bbe1d2147d70bec0b7d932eff41" + } + Frame { + msec: 6080 + hash: "535d1bbe1d2147d70bec0b7d932eff41" + } + Frame { + msec: 6096 + hash: "535d1bbe1d2147d70bec0b7d932eff41" + } + Frame { + msec: 6112 + hash: "535d1bbe1d2147d70bec0b7d932eff41" + } + Frame { + msec: 6128 + hash: "535d1bbe1d2147d70bec0b7d932eff41" + } + Frame { + msec: 6144 + hash: "535d1bbe1d2147d70bec0b7d932eff41" + } + Key { + type: 6 + key: 16777234 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 6160 + hash: "63132fa980a9fdcce415af1503f34ca6" + } + Frame { + msec: 6176 + hash: "63132fa980a9fdcce415af1503f34ca6" + } + Frame { + msec: 6192 + hash: "63132fa980a9fdcce415af1503f34ca6" + } + Frame { + msec: 6208 + hash: "63132fa980a9fdcce415af1503f34ca6" + } + Frame { + msec: 6224 + hash: "63132fa980a9fdcce415af1503f34ca6" + } + Frame { + msec: 6240 + hash: "63132fa980a9fdcce415af1503f34ca6" + } + Frame { + msec: 6256 + hash: "63132fa980a9fdcce415af1503f34ca6" + } + Frame { + msec: 6272 + hash: "63132fa980a9fdcce415af1503f34ca6" + } + Frame { + msec: 6288 + hash: "63132fa980a9fdcce415af1503f34ca6" + } + Frame { + msec: 6304 + hash: "63132fa980a9fdcce415af1503f34ca6" + } + Frame { + msec: 6320 + hash: "63132fa980a9fdcce415af1503f34ca6" + } + Frame { + msec: 6336 + hash: "63132fa980a9fdcce415af1503f34ca6" + } + Frame { + msec: 6352 + hash: "63132fa980a9fdcce415af1503f34ca6" + } + Frame { + msec: 6368 + hash: "63132fa980a9fdcce415af1503f34ca6" + } + Frame { + msec: 6384 + hash: "63132fa980a9fdcce415af1503f34ca6" + } + Frame { + msec: 6400 + hash: "63132fa980a9fdcce415af1503f34ca6" + } + Key { + type: 7 + key: 16777234 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Key { + type: 6 + key: 16777234 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 6416 + hash: "cf2ccad24e42d8764c1395e076f3a0df" + } + Frame { + msec: 6432 + hash: "cf2ccad24e42d8764c1395e076f3a0df" + } + Key { + type: 7 + key: 16777234 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Key { + type: 6 + key: 16777234 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 6448 + hash: "cf2ccad24e42d8764c1395e076f3a0df" + } + Frame { + msec: 6464 + hash: "cf2ccad24e42d8764c1395e076f3a0df" + } + Key { + type: 7 + key: 16777234 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Key { + type: 6 + key: 16777234 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Key { + type: 7 + key: 16777234 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 6480 + hash: "cf2ccad24e42d8764c1395e076f3a0df" + } + Frame { + msec: 6496 + hash: "cf2ccad24e42d8764c1395e076f3a0df" + } + Frame { + msec: 6512 + hash: "cf2ccad24e42d8764c1395e076f3a0df" + } + Frame { + msec: 6528 + hash: "cf2ccad24e42d8764c1395e076f3a0df" + } + Frame { + msec: 6544 + hash: "cf2ccad24e42d8764c1395e076f3a0df" + } + Frame { + msec: 6560 + hash: "cf2ccad24e42d8764c1395e076f3a0df" + } + Frame { + msec: 6576 + hash: "cf2ccad24e42d8764c1395e076f3a0df" + } + Frame { + msec: 6592 + hash: "cf2ccad24e42d8764c1395e076f3a0df" + } + Frame { + msec: 6608 + hash: "cf2ccad24e42d8764c1395e076f3a0df" + } + Frame { + msec: 6624 + hash: "cf2ccad24e42d8764c1395e076f3a0df" + } + Frame { + msec: 6640 + hash: "cf2ccad24e42d8764c1395e076f3a0df" + } + Frame { + msec: 6656 + hash: "cf2ccad24e42d8764c1395e076f3a0df" + } + Frame { + msec: 6672 + hash: "cf2ccad24e42d8764c1395e076f3a0df" + } + Frame { + msec: 6688 + hash: "cf2ccad24e42d8764c1395e076f3a0df" + } + Frame { + msec: 6704 + hash: "cf2ccad24e42d8764c1395e076f3a0df" + } + Frame { + msec: 6720 + hash: "cf2ccad24e42d8764c1395e076f3a0df" + } + Frame { + msec: 6736 + image: "usingLineEdit.7.png" + } + Frame { + msec: 6752 + hash: "cf2ccad24e42d8764c1395e076f3a0df" + } + Frame { + msec: 6768 + hash: "cf2ccad24e42d8764c1395e076f3a0df" + } + Frame { + msec: 6784 + hash: "cf2ccad24e42d8764c1395e076f3a0df" + } + Key { + type: 6 + key: 16777234 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 6800 + hash: "cf2ccad24e42d8764c1395e076f3a0df" + } + Key { + type: 7 + key: 16777234 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 6816 + hash: "cf2ccad24e42d8764c1395e076f3a0df" + } + Frame { + msec: 6832 + hash: "cf2ccad24e42d8764c1395e076f3a0df" + } + Frame { + msec: 6848 + hash: "cf2ccad24e42d8764c1395e076f3a0df" + } + Frame { + msec: 6864 + hash: "cf2ccad24e42d8764c1395e076f3a0df" + } + Frame { + msec: 6880 + hash: "cf2ccad24e42d8764c1395e076f3a0df" + } + Frame { + msec: 6896 + hash: "cf2ccad24e42d8764c1395e076f3a0df" + } + Frame { + msec: 6912 + hash: "cf2ccad24e42d8764c1395e076f3a0df" + } + Frame { + msec: 6928 + hash: "cf2ccad24e42d8764c1395e076f3a0df" + } + Frame { + msec: 6944 + hash: "cf2ccad24e42d8764c1395e076f3a0df" + } + Key { + type: 6 + key: 16777236 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 6960 + hash: "43217b3192aea23b17e2a2e7d820def8" + } + Frame { + msec: 6976 + hash: "43217b3192aea23b17e2a2e7d820def8" + } + Frame { + msec: 6992 + hash: "43217b3192aea23b17e2a2e7d820def8" + } + Frame { + msec: 7008 + hash: "43217b3192aea23b17e2a2e7d820def8" + } + Key { + type: 7 + key: 16777236 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 7024 + hash: "43217b3192aea23b17e2a2e7d820def8" + } + Frame { + msec: 7040 + hash: "43217b3192aea23b17e2a2e7d820def8" + } + Frame { + msec: 7056 + hash: "43217b3192aea23b17e2a2e7d820def8" + } + Frame { + msec: 7072 + hash: "43217b3192aea23b17e2a2e7d820def8" + } + Frame { + msec: 7088 + hash: "43217b3192aea23b17e2a2e7d820def8" + } + Key { + type: 6 + key: 16777236 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 7104 + hash: "02dceb1b71d82bfbea5fcfb630fef22d" + } + Frame { + msec: 7120 + hash: "02dceb1b71d82bfbea5fcfb630fef22d" + } + Frame { + msec: 7136 + hash: "02dceb1b71d82bfbea5fcfb630fef22d" + } + Frame { + msec: 7152 + hash: "02dceb1b71d82bfbea5fcfb630fef22d" + } + Key { + type: 7 + key: 16777236 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 7168 + hash: "02dceb1b71d82bfbea5fcfb630fef22d" + } + Frame { + msec: 7184 + hash: "02dceb1b71d82bfbea5fcfb630fef22d" + } + Frame { + msec: 7200 + hash: "02dceb1b71d82bfbea5fcfb630fef22d" + } + Frame { + msec: 7216 + hash: "02dceb1b71d82bfbea5fcfb630fef22d" + } + Frame { + msec: 7232 + hash: "02dceb1b71d82bfbea5fcfb630fef22d" + } + Frame { + msec: 7248 + hash: "02dceb1b71d82bfbea5fcfb630fef22d" + } + Frame { + msec: 7264 + hash: "02dceb1b71d82bfbea5fcfb630fef22d" + } + Key { + type: 6 + key: 16777236 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 7280 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7296 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7312 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7328 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7344 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Key { + type: 7 + key: 16777236 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 7360 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7376 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7392 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7408 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7424 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7440 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7456 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7472 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7488 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7504 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7520 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Key { + type: 7 + key: 16777249 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 7536 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7552 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7568 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7584 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7600 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7616 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7632 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7648 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7664 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7680 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7696 + image: "usingLineEdit.8.png" + } + Frame { + msec: 7712 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7728 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7744 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7760 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7776 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7792 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7808 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7824 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7840 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7856 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7872 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7888 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7904 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7920 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7936 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7952 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7968 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 7984 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 8000 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 8016 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 8032 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 8048 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 8064 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 8080 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 8096 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 8112 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 8128 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 8144 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 8160 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 8176 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 8192 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 8208 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 8224 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 8240 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 8256 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 8272 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 8288 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 8304 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 8320 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 8336 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 8352 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 8368 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 8384 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 8400 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 8416 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 8432 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 8448 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 8464 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 8480 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Frame { + msec: 8496 + hash: "cff8ff96fe5f67faac7a04805d2a945b" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 61; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8512 + hash: "b901d339089fccecd217f562e3b0253a" + } + Frame { + msec: 8528 + hash: "b901d339089fccecd217f562e3b0253a" + } + Frame { + msec: 8544 + hash: "b901d339089fccecd217f562e3b0253a" + } + Frame { + msec: 8560 + hash: "b901d339089fccecd217f562e3b0253a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 60; y: 38 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 58; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8576 + hash: "b901d339089fccecd217f562e3b0253a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 46; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8592 + hash: "8173ad74ad73a8061af3edb8322b3e28" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 41; y: 38 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 40; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8608 + hash: "8173ad74ad73a8061af3edb8322b3e28" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 32; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8624 + hash: "a470057b75a1aade3945dbb61526ae50" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 31; y: 38 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 30; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8640 + hash: "a470057b75a1aade3945dbb61526ae50" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 29; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8656 + image: "usingLineEdit.9.png" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 28; y: 38 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 27; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8672 + hash: "74c1edc228a7c4ba1c0adab9ed7dd086" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 26; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8688 + hash: "74c1edc228a7c4ba1c0adab9ed7dd086" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 25; y: 38 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 24; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8704 + hash: "74c1edc228a7c4ba1c0adab9ed7dd086" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 23; y: 38 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 22; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8720 + hash: "74c1edc228a7c4ba1c0adab9ed7dd086" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 20; y: 38 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 19; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8736 + hash: "11e31d23d38f163c2c28ca042af7f9f6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 18; y: 38 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8752 + hash: "11e31d23d38f163c2c28ca042af7f9f6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 16; y: 38 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 15; y: 37 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8768 + hash: "11e31d23d38f163c2c28ca042af7f9f6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 14; y: 37 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 13; y: 37 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8784 + hash: "11e31d23d38f163c2c28ca042af7f9f6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 12; y: 37 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 11; y: 37 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8800 + hash: "045f891731548aae37090e0cefb62170" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 10; y: 37 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 8; y: 37 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8816 + hash: "045f891731548aae37090e0cefb62170" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 6; y: 37 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 5; y: 36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8832 + hash: "3b6f55bc49e7e326e40b0f3faae71a8b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 3; y: 36 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 2; y: 36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8848 + hash: "abc04cd8ca8759f981f8e2c3b30a33ac" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 0; y: 36 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -1; y: 36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8864 + hash: "f96cc6aa0a38639146d8d691d699946b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -2; y: 36 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -3; y: 36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8880 + hash: "483743419cee348e8f6e24fd1e900ae6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -5; y: 36 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -6; y: 36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8896 + hash: "50292f48ceeaee5f55795aea736631d0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -7; y: 36 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -9; y: 36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8912 + hash: "9739b19d1496baabad1a01cf35c90374" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -10; y: 36 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -11; y: 36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8928 + hash: "bcf1719dc1ec19d3cca83e41ffd4ba0d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -12; y: 36 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -13; y: 36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8944 + hash: "192a6cf285d42c7a2996bf0342e69c97" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -14; y: 36 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -15; y: 36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8960 + hash: "192a6cf285d42c7a2996bf0342e69c97" + } + Frame { + msec: 8976 + hash: "192a6cf285d42c7a2996bf0342e69c97" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -16; y: 36 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -17; y: 36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 8992 + hash: "192a6cf285d42c7a2996bf0342e69c97" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -18; y: 36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9008 + hash: "192a6cf285d42c7a2996bf0342e69c97" + } + Frame { + msec: 9024 + hash: "192a6cf285d42c7a2996bf0342e69c97" + } + Frame { + msec: 9040 + hash: "192a6cf285d42c7a2996bf0342e69c97" + } + Frame { + msec: 9056 + hash: "192a6cf285d42c7a2996bf0342e69c97" + } + Frame { + msec: 9072 + hash: "192a6cf285d42c7a2996bf0342e69c97" + } + Frame { + msec: 9088 + hash: "192a6cf285d42c7a2996bf0342e69c97" + } + Frame { + msec: 9104 + hash: "192a6cf285d42c7a2996bf0342e69c97" + } + Frame { + msec: 9120 + hash: "192a6cf285d42c7a2996bf0342e69c97" + } + Frame { + msec: 9136 + hash: "192a6cf285d42c7a2996bf0342e69c97" + } + Frame { + msec: 9152 + hash: "192a6cf285d42c7a2996bf0342e69c97" + } + Frame { + msec: 9168 + hash: "192a6cf285d42c7a2996bf0342e69c97" + } + Frame { + msec: 9184 + hash: "192a6cf285d42c7a2996bf0342e69c97" + } + Frame { + msec: 9200 + hash: "192a6cf285d42c7a2996bf0342e69c97" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -17; y: 36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9216 + hash: "192a6cf285d42c7a2996bf0342e69c97" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -16; y: 36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9232 + hash: "192a6cf285d42c7a2996bf0342e69c97" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -14; y: 35 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -13; y: 35 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9248 + hash: "192a6cf285d42c7a2996bf0342e69c97" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -11; y: 35 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -10; y: 34 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9264 + hash: "192a6cf285d42c7a2996bf0342e69c97" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -8; y: 34 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -7; y: 34 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9280 + hash: "192a6cf285d42c7a2996bf0342e69c97" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -6; y: 33 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -5; y: 33 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9296 + hash: "192a6cf285d42c7a2996bf0342e69c97" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -3; y: 32 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: -1; y: 32 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9312 + hash: "192a6cf285d42c7a2996bf0342e69c97" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 1; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 3; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9328 + hash: "192a6cf285d42c7a2996bf0342e69c97" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 4; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 6; y: 30 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9344 + hash: "192a6cf285d42c7a2996bf0342e69c97" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 7; y: 30 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 8; y: 30 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9360 + hash: "192a6cf285d42c7a2996bf0342e69c97" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 10; y: 30 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 11; y: 30 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9376 + hash: "b79a6b6b2a670212a0f4310323352862" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 12; y: 30 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 14; y: 30 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9392 + hash: "b79a6b6b2a670212a0f4310323352862" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 15; y: 30 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 30 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9408 + hash: "b79a6b6b2a670212a0f4310323352862" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 21; y: 30 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 24; y: 30 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9424 + hash: "82ad8cef2dc81cf061785c211f1b2233" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 27; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 30; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9440 + hash: "dc5c2e4ac2c51ac7b84a527a77313ff5" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 33; y: 32 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 35; y: 32 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9456 + hash: "dc5c2e4ac2c51ac7b84a527a77313ff5" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 38; y: 32 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 39; y: 33 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9472 + hash: "dceeee37f46351f54a6dbf9e1d304017" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: 33 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 45; y: 33 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9488 + hash: "dceeee37f46351f54a6dbf9e1d304017" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 48; y: 33 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 50; y: 33 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9504 + hash: "b5b370f86804d875363c8aa9fa53c0fe" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 51; y: 33 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 53; y: 33 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9520 + hash: "b5b370f86804d875363c8aa9fa53c0fe" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 55; y: 33 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9536 + hash: "b5b370f86804d875363c8aa9fa53c0fe" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 56; y: 33 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 58; y: 33 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9552 + hash: "8ae0e57709d94c27ecf34f9e76623ba8" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 61; y: 33 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 64; y: 33 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9568 + hash: "8ae0e57709d94c27ecf34f9e76623ba8" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 67; y: 33 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 33 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9584 + hash: "a29b5440525c9fbed90096f287396c91" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 73; y: 33 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 74; y: 34 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9600 + hash: "d1091d48e0875fec9372c382c6961562" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 76; y: 34 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9616 + image: "usingLineEdit.10.png" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 77; y: 34 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 78; y: 34 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9632 + hash: "d1091d48e0875fec9372c382c6961562" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 79; y: 34 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 80; y: 35 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9648 + hash: "d1091d48e0875fec9372c382c6961562" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 81; y: 35 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 84; y: 35 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9664 + hash: "e1ac646b512dec95946fb52811c269da" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 85; y: 36 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 88; y: 36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9680 + hash: "29dfbe2f8ecee4ff5ecdf358a94f35f8" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 89; y: 37 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 91; y: 37 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9696 + hash: "2ce02f81e21d4f9a3fd8d78fc8182898" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 92; y: 37 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 94; y: 37 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9712 + hash: "09e41ca9d2286e99cdecb446a33cbf99" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 95; y: 37 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 96; y: 37 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9728 + hash: "6d780f15bc7597420fc10b1a2f1c7f7f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 98; y: 38 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 100; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9744 + hash: "afb956a94411eba22a0257faa5cbc57f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 102; y: 38 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 104; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9760 + hash: "8739d2d2f9d96f0bce61ce95bf1e6062" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 105; y: 39 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 108; y: 39 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9776 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 109; y: 39 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 110; y: 39 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9792 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 111; y: 39 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9808 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 112; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9824 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 113; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9840 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 114; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9856 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 9872 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 115; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9888 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 116; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9904 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 117; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9920 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 118; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9936 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 9952 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 119; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9968 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 120; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 9984 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 121; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 10000 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10016 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 122; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 10032 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10048 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10064 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10080 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10096 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10112 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10128 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10144 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10160 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10176 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10192 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10208 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10224 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10240 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 122; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 10256 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10272 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10288 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10304 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10320 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10336 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10352 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10368 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10384 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10400 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10416 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10432 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10448 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10464 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10480 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10496 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10512 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10528 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10544 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10560 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10576 + image: "usingLineEdit.11.png" + } + Frame { + msec: 10592 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10608 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10624 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10640 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10656 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10672 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10688 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10704 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10720 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10736 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10752 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10768 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10784 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10800 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10816 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10832 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10848 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10864 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10880 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10896 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10912 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10928 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10944 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10960 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10976 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 10992 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 11008 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 11024 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 11040 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 11056 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 11072 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 11088 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 11104 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 11120 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 11136 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 11152 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 11168 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 11184 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 11200 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 11216 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 11232 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 11248 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } + Frame { + msec: 11264 + hash: "4e2cb8e4cedab8df2ff823e18b17e575" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/cursorDelegate.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/cursorDelegate.qml new file mode 100644 index 00000000..81f1bcc6 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/cursorDelegate.qml @@ -0,0 +1,1551 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + hash: "65bbc5da769f475d1c47bdedb92ba65e" + } + Frame { + msec: 32 + hash: "65bbc5da769f475d1c47bdedb92ba65e" + } + Frame { + msec: 48 + hash: "65bbc5da769f475d1c47bdedb92ba65e" + } + Frame { + msec: 64 + hash: "65bbc5da769f475d1c47bdedb92ba65e" + } + Frame { + msec: 80 + hash: "65bbc5da769f475d1c47bdedb92ba65e" + } + Frame { + msec: 96 + hash: "65bbc5da769f475d1c47bdedb92ba65e" + } + Frame { + msec: 112 + hash: "65bbc5da769f475d1c47bdedb92ba65e" + } + Frame { + msec: 128 + hash: "65bbc5da769f475d1c47bdedb92ba65e" + } + Frame { + msec: 144 + hash: "65bbc5da769f475d1c47bdedb92ba65e" + } + Frame { + msec: 160 + hash: "65bbc5da769f475d1c47bdedb92ba65e" + } + Frame { + msec: 176 + hash: "65bbc5da769f475d1c47bdedb92ba65e" + } + Frame { + msec: 192 + hash: "65bbc5da769f475d1c47bdedb92ba65e" + } + Frame { + msec: 208 + hash: "65bbc5da769f475d1c47bdedb92ba65e" + } + Frame { + msec: 224 + hash: "65bbc5da769f475d1c47bdedb92ba65e" + } + Frame { + msec: 240 + hash: "65bbc5da769f475d1c47bdedb92ba65e" + } + Frame { + msec: 256 + hash: "65bbc5da769f475d1c47bdedb92ba65e" + } + Frame { + msec: 272 + hash: "65bbc5da769f475d1c47bdedb92ba65e" + } + Frame { + msec: 288 + hash: "65bbc5da769f475d1c47bdedb92ba65e" + } + Frame { + msec: 304 + hash: "65bbc5da769f475d1c47bdedb92ba65e" + } + Frame { + msec: 320 + hash: "65bbc5da769f475d1c47bdedb92ba65e" + } + Frame { + msec: 336 + hash: "65bbc5da769f475d1c47bdedb92ba65e" + } + Frame { + msec: 352 + hash: "65bbc5da769f475d1c47bdedb92ba65e" + } + Frame { + msec: 368 + hash: "65bbc5da769f475d1c47bdedb92ba65e" + } + Frame { + msec: 384 + hash: "65bbc5da769f475d1c47bdedb92ba65e" + } + Frame { + msec: 400 + hash: "65bbc5da769f475d1c47bdedb92ba65e" + } + Frame { + msec: 416 + hash: "65bbc5da769f475d1c47bdedb92ba65e" + } + Frame { + msec: 432 + hash: "65bbc5da769f475d1c47bdedb92ba65e" + } + Frame { + msec: 448 + hash: "65bbc5da769f475d1c47bdedb92ba65e" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 464 + hash: "97eff9733db71f7c5d396969582c572b" + } + Frame { + msec: 480 + hash: "97eff9733db71f7c5d396969582c572b" + } + Frame { + msec: 496 + hash: "97eff9733db71f7c5d396969582c572b" + } + Frame { + msec: 512 + hash: "97eff9733db71f7c5d396969582c572b" + } + Frame { + msec: 528 + hash: "87902d32dba1439e71ce5f57f514748e" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 544 + hash: "cad95931a38718eb481a9175fdfec305" + } + Frame { + msec: 560 + hash: "1dc99e5c7e4d2fa6b624b6df250b78fc" + } + Frame { + msec: 576 + hash: "5d5739beb039a83bebb2c41489166edf" + } + Frame { + msec: 592 + hash: "6320c9a1c0013f5aa6180992b934ca59" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 608 + hash: "9d9837c1f3779e5dab0dfeb1d11fdea1" + } + Frame { + msec: 624 + hash: "9d868112eaf70ce02ce93603278a565d" + } + Frame { + msec: 640 + hash: "d2bccb3184d3bb42b91017410a8655b6" + } + Frame { + msec: 656 + hash: "68f8be3e16637fd39a35f0cebb62b74a" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 672 + hash: "04f5781b57ed9fee32d5ef80dc33f4ff" + } + Frame { + msec: 688 + hash: "06cc2e24a848d441074de5ddff1c739a" + } + Frame { + msec: 704 + hash: "94526186deb7248ac9c747ede15b106d" + } + Frame { + msec: 720 + hash: "1ac130517df314f4f44b9bde2d3dcc53" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 736 + hash: "270ecf4900e94d60599ded230633aa02" + } + Frame { + msec: 752 + hash: "ef2093584cbce9182b99f297fcd2465d" + } + Frame { + msec: 768 + hash: "c445cf5f56213a712585934681d8af55" + } + Frame { + msec: 784 + hash: "9f0edb3871e015a549622e1b70d1b748" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 800 + hash: "144c51d7aa47ea8cc8d79a97efa4b430" + } + Frame { + msec: 816 + hash: "34f768a7c99dfb3c8f0e1fb1a08a37ac" + } + Frame { + msec: 832 + hash: "4f3970c4ad02b69f96c11610494e8a50" + } + Frame { + msec: 848 + hash: "815a1cf66f0c9eb47e244753eebb83ba" + } + Frame { + msec: 864 + hash: "5db11f795c000b382fdc30726a711c65" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 880 + hash: "67976ee172d0d55992c0e4734fbb7ccf" + } + Frame { + msec: 896 + hash: "c764e4d5317acbbf5118a08565e5d5fd" + } + Frame { + msec: 912 + hash: "a83f566d01b990e91f43bb63a58fb5b8" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 928 + hash: "031282f352e01f23bc5f73bf8ce82c9a" + } + Frame { + msec: 944 + hash: "1f3dc1d3ad0304376eac5d60d3c226ee" + } + Frame { + msec: 960 + image: "cursorDelegate.0.png" + } + Frame { + msec: 976 + hash: "7bae45481596788afde8866a3c97edd7" + } + Frame { + msec: 992 + hash: "7bae45481596788afde8866a3c97edd7" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1008 + hash: "7bae45481596788afde8866a3c97edd7" + } + Frame { + msec: 1024 + hash: "7bae45481596788afde8866a3c97edd7" + } + Frame { + msec: 1040 + hash: "7bae45481596788afde8866a3c97edd7" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1056 + hash: "7bae45481596788afde8866a3c97edd7" + } + Frame { + msec: 1072 + hash: "a2ad07326fafcb3012cdb869f39af466" + } + Frame { + msec: 1088 + hash: "8622eb25a6da44926b5161bce213a483" + } + Frame { + msec: 1104 + hash: "ccbd4d1e4865ebd9b0fe923e6ab05e5c" + } + Frame { + msec: 1120 + hash: "775cd79b012f79b773449a0ad8457149" + } + Key { + type: 6 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1136 + hash: "2a4ed061e512c5afd11072c4b707f707" + } + Frame { + msec: 1152 + hash: "c855df7b17811f25fd17e4fb108c02e1" + } + Frame { + msec: 1168 + hash: "46c37d8e67ece5cae4f766acf50f3ca3" + } + Frame { + msec: 1184 + hash: "95a70f14ce01aae61190080ed3d55c77" + } + Frame { + msec: 1200 + hash: "87da182d1285f3613bb2e4673e701757" + } + Key { + type: 7 + key: 16777234 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1216 + hash: "5b97f13f43e713a6fbe96bdca8969191" + } + Frame { + msec: 1232 + hash: "4d003182e7b7b0a05413b80f82a0fc41" + } + Frame { + msec: 1248 + hash: "dba09e038291a8dfdc61911d6b4b9bdf" + } + Frame { + msec: 1264 + hash: "a2ae1e5cc6cd72fae70804e07df5a8a1" + } + Frame { + msec: 1280 + hash: "f1c2a24b6f0ebcf98122e8db1cdcb66f" + } + Frame { + msec: 1296 + hash: "142dade1639655132435ae260b7935a0" + } + Key { + type: 6 + key: 16777249 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1312 + hash: "e80c0175d947bceef4bf53b60bf7eac0" + } + Key { + type: 6 + key: 16777248 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1328 + hash: "de912cd8bd2fe762ec6b1ec819732507" + } + Frame { + msec: 1344 + hash: "d3fa9dfab37ee26572d25bcbe8c66b72" + } + Frame { + msec: 1360 + hash: "33bdb2817a2858ce430813d0774f0172" + } + Frame { + msec: 1376 + hash: "4f10f0ffb6b1c87155eedd53af36c74f" + } + Key { + type: 6 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1392 + hash: "1b94be0de8412bd9380689895f290af7" + } + Frame { + msec: 1408 + hash: "48b3a5e2b04c86a75f4b6595eb2c1f55" + } + Frame { + msec: 1424 + hash: "d092fabd3dd51c718486e1e7dadaa0dc" + } + Frame { + msec: 1440 + hash: "243359437235563f1a60b8eaf63365b6" + } + Frame { + msec: 1456 + hash: "a986c8ed8ad2d8b6aab2a001906ba2ad" + } + Frame { + msec: 1472 + hash: "da5e06dc481e9cb7d9159a84d0cc150a" + } + Frame { + msec: 1488 + hash: "1d70a05fce3a05477e21d22b127ae96a" + } + Key { + type: 7 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1504 + hash: "913448213a07f6c8427c8e310d2026de" + } + Frame { + msec: 1520 + hash: "51bef5ae52977a935b66af4baf1da4e6" + } + Frame { + msec: 1536 + hash: "367bc25f868c23005d7fe903a9ea681b" + } + Frame { + msec: 1552 + hash: "3c25181652e788d128ed571ca4fea0b1" + } + Frame { + msec: 1568 + hash: "0218f939ff2b8c0bc22a537ed0f053f0" + } + Frame { + msec: 1584 + hash: "a3b765a823b2b3811273a1be90850533" + } + Frame { + msec: 1600 + hash: "2a42a29774eb4f962d299f8c2c213d55" + } + Frame { + msec: 1616 + hash: "1f0ad54d0fe8fc27cadbaaeaa37364e0" + } + Frame { + msec: 1632 + hash: "04d6028d1b1a1178e5bf774db8eef2c6" + } + Frame { + msec: 1648 + hash: "c325e46e89e8df04e2c3d8bf111c5f09" + } + Frame { + msec: 1664 + hash: "70e6223ce16a797e2c56e21ad74b188b" + } + Frame { + msec: 1680 + hash: "0fb8762fd28564b84b83c17d749a3645" + } + Key { + type: 6 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1696 + hash: "ef5d19b59792ea8822e2391fe0d91dbd" + } + Frame { + msec: 1712 + hash: "70ad15030164be8afbb4ab22d1ae5f5f" + } + Frame { + msec: 1728 + hash: "a5dfb8bd4b681e0d8d2c082821a2a976" + } + Frame { + msec: 1744 + hash: "864781fbb8673b1e603df015f2d88601" + } + Frame { + msec: 1760 + hash: "0bdb6a155cdd14f4dce9fde3c5116dde" + } + Frame { + msec: 1776 + hash: "5421f521a9bdccc8478fcee97e0dbc99" + } + Frame { + msec: 1792 + hash: "c5f29693dd017932767f37e2fb2f22f2" + } + Key { + type: 7 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1808 + hash: "b5e8abeaec33407e673f8021212528b1" + } + Frame { + msec: 1824 + hash: "917c968e5ee8f0b25fdb175719d7dbfa" + } + Frame { + msec: 1840 + hash: "56495c63676b9f73004e76e38d60567e" + } + Frame { + msec: 1856 + hash: "86f1ccdd7ff408c5b141d79797eea1fa" + } + Key { + type: 7 + key: 16777248 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1872 + hash: "9e9b32a9f71ab1aa4e87ddc323ccda03" + } + Key { + type: 6 + key: 16777248 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 1888 + hash: "360aef37452ce8f045659c227285cb82" + } + Frame { + msec: 1904 + hash: "805949377c620fa4310aa4328eba1f23" + } + Frame { + msec: 1920 + image: "cursorDelegate.1.png" + } + Frame { + msec: 1936 + hash: "00df8110a2008ba77b7e0bf2130e5319" + } + Frame { + msec: 1952 + hash: "835f6f723577071461e41da1fd2e990a" + } + Frame { + msec: 1968 + hash: "6876cafa4d6d3a7d387602eba4d26db1" + } + Frame { + msec: 1984 + hash: "5570ae1e700cdf42ba516be69fbaadc0" + } + Frame { + msec: 2000 + hash: "5570ae1e700cdf42ba516be69fbaadc0" + } + Frame { + msec: 2016 + hash: "5570ae1e700cdf42ba516be69fbaadc0" + } + Frame { + msec: 2032 + hash: "5570ae1e700cdf42ba516be69fbaadc0" + } + Key { + type: 7 + key: 16777249 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2048 + hash: "5570ae1e700cdf42ba516be69fbaadc0" + } + Key { + type: 7 + key: 16777248 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2064 + hash: "6876cafa4d6d3a7d387602eba4d26db1" + } + Frame { + msec: 2080 + hash: "835f6f723577071461e41da1fd2e990a" + } + Frame { + msec: 2096 + hash: "00df8110a2008ba77b7e0bf2130e5319" + } + Frame { + msec: 2112 + hash: "627206a252bd6fcbf57d9f1cde0506bb" + } + Frame { + msec: 2128 + hash: "805949377c620fa4310aa4328eba1f23" + } + Frame { + msec: 2144 + hash: "360aef37452ce8f045659c227285cb82" + } + Key { + type: 6 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2160 + hash: "0ac33070e0c736bc0fb5ab12fa444b5c" + } + Frame { + msec: 2176 + hash: "520a544fd92f17a14380803e253b396f" + } + Frame { + msec: 2192 + hash: "4a080a5154c517e6bcf24b3a1f1d7f2c" + } + Frame { + msec: 2208 + hash: "e83642b0793f5a790efca65ccf20a720" + } + Frame { + msec: 2224 + hash: "8210b9cbf19f519ee34f4bb1a6afce16" + } + Frame { + msec: 2240 + hash: "54d04e64af5c0a3d29f2dc8c0977ed3a" + } + Key { + type: 7 + key: 16777236 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2256 + hash: "ae2a644f96bd7b2662ebcf4ebc33d930" + } + Frame { + msec: 2272 + hash: "718ac9cb5ef2992b06b34e957f987b7a" + } + Frame { + msec: 2288 + hash: "a2e1dea5e5f37697c7ce1a9419b94f65" + } + Frame { + msec: 2304 + hash: "c0eb56c72311263d892ce65331547531" + } + Frame { + msec: 2320 + hash: "585ad3efb7330de889b8cf56a51a0899" + } + Frame { + msec: 2336 + hash: "236e54ae31e5ee3d08a7bc9aeaef0d9b" + } + Frame { + msec: 2352 + hash: "d6218c8bb4da9d62bdb5d0cf5d7f8e37" + } + Key { + type: 6 + key: 16777249 + modifiers: 67108864 + text: "" + autorep: false + count: 1 + } + Key { + type: 6 + key: 16777248 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2368 + hash: "1dddd18a4ef66df9d9b431b2860e24d1" + } + Frame { + msec: 2384 + hash: "5b1b45e75f5a829b31c0b6eb0189da7c" + } + Frame { + msec: 2400 + hash: "062091bc7a5f3296c669614318b80fe7" + } + Frame { + msec: 2416 + hash: "836f37fe92a46233640e0bd2c0932fea" + } + Frame { + msec: 2432 + hash: "f14ec1544a380fc9993b39754c23c2f4" + } + Key { + type: 6 + key: 16777234 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2448 + hash: "2d549b5fea734e47682415df1717e6a6" + } + Frame { + msec: 2464 + hash: "824c5960260dd3ed7527709ebfb06d27" + } + Frame { + msec: 2480 + hash: "258f034fe1e71f25a92e667e05f53e82" + } + Frame { + msec: 2496 + hash: "c432e758e19c44d788cb38df6e4c6d69" + } + Frame { + msec: 2512 + hash: "a1856592208f9a00385b13c44e1c4503" + } + Key { + type: 7 + key: 16777234 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2528 + hash: "2b4d40a0555df0b86f52d13790185459" + } + Frame { + msec: 2544 + hash: "b153143e6b16c47fa06663dc6b1034d6" + } + Frame { + msec: 2560 + hash: "ac52236c5d73aeae7c0834df1e6bd84e" + } + Frame { + msec: 2576 + hash: "136eeb348b0b96edc9aaf9fbea741973" + } + Frame { + msec: 2592 + hash: "4f8a1dfa8906de2bcdfbf5c3b29fbf9b" + } + Key { + type: 6 + key: 16777234 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2608 + hash: "7dc9726df2d112b46f4d9dbe66d534c7" + } + Frame { + msec: 2624 + hash: "f64086ca0e83fa8bb0fae28065260fdc" + } + Frame { + msec: 2640 + hash: "5237dd2b79d71bbfa0a0d3963a7f42b7" + } + Key { + type: 7 + key: 16777234 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2656 + hash: "8dd435b577bb258979d33034885a8cd8" + } + Frame { + msec: 2672 + hash: "2609c066b8f102b4189991bf7d01eaad" + } + Frame { + msec: 2688 + hash: "986fab22391264d04df9a55b18aee645" + } + Frame { + msec: 2704 + hash: "0256423680aa0843fe8ec84f5e68fc9b" + } + Frame { + msec: 2720 + hash: "b822bdcad69aa868f48b2bbf2d62e297" + } + Key { + type: 6 + key: 16777234 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2736 + hash: "14effed70ca60233be9b2f6d0a1b5e6c" + } + Frame { + msec: 2752 + hash: "1abaf2c36a0fb9f04606c0e191d113cf" + } + Frame { + msec: 2768 + hash: "cffb8ca29b0369d183d6461bf9e63fdf" + } + Frame { + msec: 2784 + hash: "9378bebddb09036bec98ff7018dcf7c1" + } + Key { + type: 7 + key: 16777234 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 2800 + hash: "0c3823994ee8f838c26040118ba62622" + } + Frame { + msec: 2816 + hash: "d374547f47adc81a18428c7a79cb9cf2" + } + Frame { + msec: 2832 + hash: "449c2996a2d0e74f2300adad619700bc" + } + Frame { + msec: 2848 + hash: "14379a320b6fc36de5d2a6776f1dc963" + } + Frame { + msec: 2864 + hash: "cb010a99ffa3b6df26c6cd263a21cfcd" + } + Frame { + msec: 2880 + image: "cursorDelegate.2.png" + } + Frame { + msec: 2896 + hash: "a445d23288d462009916e31f370a2068" + } + Frame { + msec: 2912 + hash: "8b3f2811300830e837797056f262bec2" + } + Frame { + msec: 2928 + hash: "2303a27e72334cae84b4fe51a62974ba" + } + Frame { + msec: 2944 + hash: "f3a9f3e74d2d83e38aee78cab7209bd6" + } + Frame { + msec: 2960 + hash: "ca4777127a535655f057af57cf3e8c7b" + } + Frame { + msec: 2976 + hash: "de2b65920fa9177a79019f33712c2275" + } + Frame { + msec: 2992 + hash: "de2b65920fa9177a79019f33712c2275" + } + Frame { + msec: 3008 + hash: "de2b65920fa9177a79019f33712c2275" + } + Frame { + msec: 3024 + hash: "de2b65920fa9177a79019f33712c2275" + } + Frame { + msec: 3040 + hash: "de2b65920fa9177a79019f33712c2275" + } + Frame { + msec: 3056 + hash: "de2b65920fa9177a79019f33712c2275" + } + Frame { + msec: 3072 + hash: "ca4777127a535655f057af57cf3e8c7b" + } + Key { + type: 6 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3088 + hash: "83cfb141f6b77fa062443a442a5b2e9e" + } + Frame { + msec: 3104 + hash: "b3e262864238d03f988c9750cc74e48f" + } + Frame { + msec: 3120 + hash: "6ed2086ae01be46f0684bbecc05484c4" + } + Frame { + msec: 3136 + hash: "91f6dad8f05577af6e4f5f0aceb06b4b" + } + Frame { + msec: 3152 + hash: "1bfb0c299c3c0db0518eaa54137c22b0" + } + Key { + type: 7 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3168 + hash: "37cc96ef4b760faadf76cc471f6ba49a" + } + Frame { + msec: 3184 + hash: "67c848bf93e845eaf5eebc9b8e57482c" + } + Frame { + msec: 3200 + hash: "e3906ad9b1dfbd1170364c11ff4b286f" + } + Frame { + msec: 3216 + hash: "24dd59673c5659e3bf6f52723e1bcd07" + } + Frame { + msec: 3232 + hash: "4b694f05f147bcf901a16807d4e3ec7c" + } + Frame { + msec: 3248 + hash: "9d9dbf34f6a67a49210caa249b8a1abb" + } + Key { + type: 6 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3264 + hash: "5381cde4763aa45c97793124e42db6f5" + } + Frame { + msec: 3280 + hash: "0f113c0263faa47428c4d16891ac4d4f" + } + Frame { + msec: 3296 + hash: "cc1767ec13803959333cd35bfb2d9119" + } + Frame { + msec: 3312 + hash: "ec1b4c71f9bd63ccf6d766b0b2f68b30" + } + Frame { + msec: 3328 + hash: "114ad78597ede2afc4dd8bafa1d4df21" + } + Frame { + msec: 3344 + hash: "d08dc22ddc707316483f09b796ea0380" + } + Frame { + msec: 3360 + hash: "135b2b0f4e469b207e673d1e7086cd4f" + } + Key { + type: 7 + key: 16777236 + modifiers: 100663296 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3376 + hash: "4267354fe0d24597bdb5ee1a6e9affbb" + } + Frame { + msec: 3392 + hash: "700bd56ecea646bbec2017007bbb5b84" + } + Frame { + msec: 3408 + hash: "874a65c2069f4ba89301c129f884f217" + } + Frame { + msec: 3424 + hash: "b5ec22f95abb43c83533f7dc606667f6" + } + Frame { + msec: 3440 + hash: "445de6663e80d1fe1527ec5acf4ec1de" + } + Frame { + msec: 3456 + hash: "87c129a5bf08536d3fca90375283e26b" + } + Frame { + msec: 3472 + hash: "a63e2438a9cd412c2b119cd42b11009f" + } + Frame { + msec: 3488 + hash: "61a3475bef5fd276b836cf3483526f57" + } + Frame { + msec: 3504 + hash: "097ab9a1a1fe9743f162f57b93599fe7" + } + Key { + type: 7 + key: 16777249 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3520 + hash: "ebae1fb540c6ff6b0bc9a951391e2e94" + } + Frame { + msec: 3536 + hash: "ffc2da2e4c091eadaa9746b42b56d9e4" + } + Key { + type: 7 + key: 16777248 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 3552 + hash: "f243d823fc9977e69a008010d8db8a01" + } + Frame { + msec: 3568 + hash: "592ac5bbf1c4b3a360be4d76c40a2be2" + } + Frame { + msec: 3584 + hash: "bd5b206097f30dfce884a8c74856857d" + } + Frame { + msec: 3600 + hash: "f14ec1544a380fc9993b39754c23c2f4" + } + Frame { + msec: 3616 + hash: "836f37fe92a46233640e0bd2c0932fea" + } + Frame { + msec: 3632 + hash: "062091bc7a5f3296c669614318b80fe7" + } + Frame { + msec: 3648 + hash: "5b1b45e75f5a829b31c0b6eb0189da7c" + } + Frame { + msec: 3664 + hash: "1dddd18a4ef66df9d9b431b2860e24d1" + } + Frame { + msec: 3680 + hash: "d6218c8bb4da9d62bdb5d0cf5d7f8e37" + } + Frame { + msec: 3696 + hash: "236e54ae31e5ee3d08a7bc9aeaef0d9b" + } + Frame { + msec: 3712 + hash: "585ad3efb7330de889b8cf56a51a0899" + } + Frame { + msec: 3728 + hash: "c0eb56c72311263d892ce65331547531" + } + Frame { + msec: 3744 + hash: "a2e1dea5e5f37697c7ce1a9419b94f65" + } + Frame { + msec: 3760 + hash: "718ac9cb5ef2992b06b34e957f987b7a" + } + Frame { + msec: 3776 + hash: "ae2a644f96bd7b2662ebcf4ebc33d930" + } + Frame { + msec: 3792 + hash: "54d04e64af5c0a3d29f2dc8c0977ed3a" + } + Frame { + msec: 3808 + hash: "8210b9cbf19f519ee34f4bb1a6afce16" + } + Frame { + msec: 3824 + hash: "e83642b0793f5a790efca65ccf20a720" + } + Frame { + msec: 3840 + image: "cursorDelegate.3.png" + } + Frame { + msec: 3856 + hash: "520a544fd92f17a14380803e253b396f" + } + Frame { + msec: 3872 + hash: "0ac33070e0c736bc0fb5ab12fa444b5c" + } + Frame { + msec: 3888 + hash: "5ee8c9dc7b238db131b3a078e46a8bbd" + } + Frame { + msec: 3904 + hash: "69720bcca91f99f229aebc74c5e74261" + } + Frame { + msec: 3920 + hash: "41d8f4031223f7c833d50208e231964a" + } + Frame { + msec: 3936 + hash: "6fa8fd3252f367f3fafea4e3c7317a48" + } + Frame { + msec: 3952 + hash: "8a1b63c42867f87a1cf4b47944b3860a" + } + Frame { + msec: 3968 + hash: "8c6052eb4cf03d7742a73874d9f15285" + } + Frame { + msec: 3984 + hash: "7bae45481596788afde8866a3c97edd7" + } + Frame { + msec: 4000 + hash: "7bae45481596788afde8866a3c97edd7" + } + Frame { + msec: 4016 + hash: "7bae45481596788afde8866a3c97edd7" + } + Frame { + msec: 4032 + hash: "7bae45481596788afde8866a3c97edd7" + } + Frame { + msec: 4048 + hash: "7bae45481596788afde8866a3c97edd7" + } + Frame { + msec: 4064 + hash: "8c6052eb4cf03d7742a73874d9f15285" + } + Frame { + msec: 4080 + hash: "8a1b63c42867f87a1cf4b47944b3860a" + } + Frame { + msec: 4096 + hash: "6fa8fd3252f367f3fafea4e3c7317a48" + } + Frame { + msec: 4112 + hash: "41d8f4031223f7c833d50208e231964a" + } + Frame { + msec: 4128 + hash: "69720bcca91f99f229aebc74c5e74261" + } + Frame { + msec: 4144 + hash: "5ee8c9dc7b238db131b3a078e46a8bbd" + } + Frame { + msec: 4160 + hash: "0ac33070e0c736bc0fb5ab12fa444b5c" + } + Frame { + msec: 4176 + hash: "520a544fd92f17a14380803e253b396f" + } + Frame { + msec: 4192 + hash: "4a080a5154c517e6bcf24b3a1f1d7f2c" + } + Frame { + msec: 4208 + hash: "e83642b0793f5a790efca65ccf20a720" + } + Frame { + msec: 4224 + hash: "8210b9cbf19f519ee34f4bb1a6afce16" + } + Frame { + msec: 4240 + hash: "54d04e64af5c0a3d29f2dc8c0977ed3a" + } + Frame { + msec: 4256 + hash: "ae2a644f96bd7b2662ebcf4ebc33d930" + } + Frame { + msec: 4272 + hash: "718ac9cb5ef2992b06b34e957f987b7a" + } + Frame { + msec: 4288 + hash: "a2e1dea5e5f37697c7ce1a9419b94f65" + } + Frame { + msec: 4304 + hash: "c0eb56c72311263d892ce65331547531" + } + Frame { + msec: 4320 + hash: "585ad3efb7330de889b8cf56a51a0899" + } + Frame { + msec: 4336 + hash: "236e54ae31e5ee3d08a7bc9aeaef0d9b" + } + Frame { + msec: 4352 + hash: "d6218c8bb4da9d62bdb5d0cf5d7f8e37" + } + Frame { + msec: 4368 + hash: "1dddd18a4ef66df9d9b431b2860e24d1" + } + Frame { + msec: 4384 + hash: "5b1b45e75f5a829b31c0b6eb0189da7c" + } + Frame { + msec: 4400 + hash: "062091bc7a5f3296c669614318b80fe7" + } + Frame { + msec: 4416 + hash: "836f37fe92a46233640e0bd2c0932fea" + } + Frame { + msec: 4432 + hash: "f14ec1544a380fc9993b39754c23c2f4" + } + Frame { + msec: 4448 + hash: "bd5b206097f30dfce884a8c74856857d" + } + Frame { + msec: 4464 + hash: "592ac5bbf1c4b3a360be4d76c40a2be2" + } + Frame { + msec: 4480 + hash: "f243d823fc9977e69a008010d8db8a01" + } + Frame { + msec: 4496 + hash: "ffc2da2e4c091eadaa9746b42b56d9e4" + } + Frame { + msec: 4512 + hash: "ebae1fb540c6ff6b0bc9a951391e2e94" + } + Frame { + msec: 4528 + hash: "097ab9a1a1fe9743f162f57b93599fe7" + } + Frame { + msec: 4544 + hash: "61a3475bef5fd276b836cf3483526f57" + } + Frame { + msec: 4560 + hash: "a63e2438a9cd412c2b119cd42b11009f" + } + Frame { + msec: 4576 + hash: "87c129a5bf08536d3fca90375283e26b" + } + Frame { + msec: 4592 + hash: "445de6663e80d1fe1527ec5acf4ec1de" + } + Frame { + msec: 4608 + hash: "b5ec22f95abb43c83533f7dc606667f6" + } + Frame { + msec: 4624 + hash: "874a65c2069f4ba89301c129f884f217" + } + Frame { + msec: 4640 + hash: "700bd56ecea646bbec2017007bbb5b84" + } + Frame { + msec: 4656 + hash: "4267354fe0d24597bdb5ee1a6e9affbb" + } + Frame { + msec: 4672 + hash: "135b2b0f4e469b207e673d1e7086cd4f" + } + Frame { + msec: 4688 + hash: "d08dc22ddc707316483f09b796ea0380" + } + Frame { + msec: 4704 + hash: "114ad78597ede2afc4dd8bafa1d4df21" + } + Frame { + msec: 4720 + hash: "ec1b4c71f9bd63ccf6d766b0b2f68b30" + } + Frame { + msec: 4736 + hash: "cc1767ec13803959333cd35bfb2d9119" + } + Frame { + msec: 4752 + hash: "0f113c0263faa47428c4d16891ac4d4f" + } + Frame { + msec: 4768 + hash: "5381cde4763aa45c97793124e42db6f5" + } + Frame { + msec: 4784 + hash: "99940d6744ac1245f82d62f08c371285" + } + Frame { + msec: 4800 + image: "cursorDelegate.4.png" + } + Frame { + msec: 4816 + hash: "77bbed46c7eb023252cdd80d0a15f38a" + } + Frame { + msec: 4832 + hash: "36ee4da72825e96d5f670c94865a30d8" + } + Frame { + msec: 4848 + hash: "c64d56c1b7df0a5c63ab8ff08ae6daf9" + } + Frame { + msec: 4864 + hash: "942e038a3426fa318212a8f245141225" + } + Frame { + msec: 4880 + hash: "c033ebaee12dd8fe953e91160f986c3d" + } + Frame { + msec: 4896 + hash: "07e64024cf7eda082297f6f83dba8067" + } + Frame { + msec: 4912 + hash: "b33cd5bbb90d435dd7ea3ab67bef88ee" + } + Frame { + msec: 4928 + hash: "90712efd7c17b0ad33d2c2c02e9eaa97" + } + Frame { + msec: 4944 + hash: "7e2e55555ee2c7e172e61ddb6365355d" + } + Frame { + msec: 4960 + hash: "87ca0584879b25336a1023ac3252fc9a" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/echoMode.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/echoMode.qml new file mode 100644 index 00000000..707734ab --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/echoMode.qml @@ -0,0 +1,1043 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + hash: "b73bd9c2fef8812591fff9f43b73da13" + } + Frame { + msec: 32 + hash: "b73bd9c2fef8812591fff9f43b73da13" + } + Key { + type: 6 + key: 16777248 + modifiers: 33554432 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 48 + hash: "b73bd9c2fef8812591fff9f43b73da13" + } + Frame { + msec: 64 + hash: "b73bd9c2fef8812591fff9f43b73da13" + } + Frame { + msec: 80 + hash: "b73bd9c2fef8812591fff9f43b73da13" + } + Frame { + msec: 96 + hash: "b73bd9c2fef8812591fff9f43b73da13" + } + Frame { + msec: 112 + hash: "b73bd9c2fef8812591fff9f43b73da13" + } + Frame { + msec: 128 + hash: "b73bd9c2fef8812591fff9f43b73da13" + } + Frame { + msec: 144 + hash: "b73bd9c2fef8812591fff9f43b73da13" + } + Frame { + msec: 160 + hash: "b73bd9c2fef8812591fff9f43b73da13" + } + Frame { + msec: 176 + hash: "b73bd9c2fef8812591fff9f43b73da13" + } + Frame { + msec: 192 + hash: "b73bd9c2fef8812591fff9f43b73da13" + } + Frame { + msec: 208 + hash: "b73bd9c2fef8812591fff9f43b73da13" + } + Frame { + msec: 224 + hash: "b73bd9c2fef8812591fff9f43b73da13" + } + Frame { + msec: 240 + hash: "b73bd9c2fef8812591fff9f43b73da13" + } + Frame { + msec: 256 + hash: "b73bd9c2fef8812591fff9f43b73da13" + } + Frame { + msec: 272 + hash: "b73bd9c2fef8812591fff9f43b73da13" + } + Frame { + msec: 288 + hash: "b73bd9c2fef8812591fff9f43b73da13" + } + Frame { + msec: 304 + hash: "b73bd9c2fef8812591fff9f43b73da13" + } + Frame { + msec: 320 + hash: "b73bd9c2fef8812591fff9f43b73da13" + } + Frame { + msec: 336 + hash: "b73bd9c2fef8812591fff9f43b73da13" + } + Frame { + msec: 352 + hash: "b73bd9c2fef8812591fff9f43b73da13" + } + Key { + type: 6 + key: 74 + modifiers: 33554432 + text: "4a" + autorep: false + count: 1 + } + Frame { + msec: 368 + hash: "e8b6bdc7d552bb13c5dc2f50b8cf1125" + } + Frame { + msec: 384 + hash: "e8b6bdc7d552bb13c5dc2f50b8cf1125" + } + Frame { + msec: 400 + hash: "e8b6bdc7d552bb13c5dc2f50b8cf1125" + } + Frame { + msec: 416 + hash: "e8b6bdc7d552bb13c5dc2f50b8cf1125" + } + Frame { + msec: 432 + hash: "e8b6bdc7d552bb13c5dc2f50b8cf1125" + } + Key { + type: 7 + key: 74 + modifiers: 33554432 + text: "4a" + autorep: false + count: 1 + } + Frame { + msec: 448 + hash: "e8b6bdc7d552bb13c5dc2f50b8cf1125" + } + Frame { + msec: 464 + hash: "e8b6bdc7d552bb13c5dc2f50b8cf1125" + } + Frame { + msec: 480 + hash: "e8b6bdc7d552bb13c5dc2f50b8cf1125" + } + Frame { + msec: 496 + hash: "e8b6bdc7d552bb13c5dc2f50b8cf1125" + } + Frame { + msec: 512 + hash: "e8b6bdc7d552bb13c5dc2f50b8cf1125" + } + Frame { + msec: 528 + hash: "e8b6bdc7d552bb13c5dc2f50b8cf1125" + } + Key { + type: 7 + key: 16777248 + modifiers: 0 + text: "" + autorep: false + count: 1 + } + Frame { + msec: 544 + hash: "e8b6bdc7d552bb13c5dc2f50b8cf1125" + } + Frame { + msec: 560 + hash: "e8b6bdc7d552bb13c5dc2f50b8cf1125" + } + Frame { + msec: 576 + hash: "e8b6bdc7d552bb13c5dc2f50b8cf1125" + } + Frame { + msec: 592 + hash: "e8b6bdc7d552bb13c5dc2f50b8cf1125" + } + Frame { + msec: 608 + hash: "e8b6bdc7d552bb13c5dc2f50b8cf1125" + } + Frame { + msec: 624 + hash: "e8b6bdc7d552bb13c5dc2f50b8cf1125" + } + Frame { + msec: 640 + hash: "e8b6bdc7d552bb13c5dc2f50b8cf1125" + } + Frame { + msec: 656 + hash: "e8b6bdc7d552bb13c5dc2f50b8cf1125" + } + Frame { + msec: 672 + hash: "e8b6bdc7d552bb13c5dc2f50b8cf1125" + } + Frame { + msec: 688 + hash: "e8b6bdc7d552bb13c5dc2f50b8cf1125" + } + Key { + type: 6 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 704 + hash: "fbc09d695e0b47aae6e977c13f535bfd" + } + Frame { + msec: 720 + hash: "fbc09d695e0b47aae6e977c13f535bfd" + } + Frame { + msec: 736 + hash: "fbc09d695e0b47aae6e977c13f535bfd" + } + Frame { + msec: 752 + hash: "fbc09d695e0b47aae6e977c13f535bfd" + } + Frame { + msec: 768 + hash: "fbc09d695e0b47aae6e977c13f535bfd" + } + Key { + type: 7 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 784 + hash: "fbc09d695e0b47aae6e977c13f535bfd" + } + Frame { + msec: 800 + hash: "fbc09d695e0b47aae6e977c13f535bfd" + } + Frame { + msec: 816 + hash: "fbc09d695e0b47aae6e977c13f535bfd" + } + Frame { + msec: 832 + hash: "fbc09d695e0b47aae6e977c13f535bfd" + } + Frame { + msec: 848 + hash: "fbc09d695e0b47aae6e977c13f535bfd" + } + Key { + type: 6 + key: 67 + modifiers: 0 + text: "63" + autorep: false + count: 1 + } + Frame { + msec: 864 + hash: "a4b81c526a5bf8902fde9b8721980977" + } + Frame { + msec: 880 + hash: "a4b81c526a5bf8902fde9b8721980977" + } + Frame { + msec: 896 + hash: "a4b81c526a5bf8902fde9b8721980977" + } + Key { + type: 7 + key: 67 + modifiers: 0 + text: "63" + autorep: false + count: 1 + } + Frame { + msec: 912 + hash: "a4b81c526a5bf8902fde9b8721980977" + } + Frame { + msec: 928 + hash: "a4b81c526a5bf8902fde9b8721980977" + } + Frame { + msec: 944 + hash: "a4b81c526a5bf8902fde9b8721980977" + } + Frame { + msec: 960 + image: "echoMode.0.png" + } + Frame { + msec: 976 + hash: "a4b81c526a5bf8902fde9b8721980977" + } + Key { + type: 6 + key: 75 + modifiers: 0 + text: "6b" + autorep: false + count: 1 + } + Frame { + msec: 992 + hash: "d072aebc2314a149a856634786b208a0" + } + Frame { + msec: 1008 + hash: "d072aebc2314a149a856634786b208a0" + } + Frame { + msec: 1024 + hash: "d072aebc2314a149a856634786b208a0" + } + Frame { + msec: 1040 + hash: "d072aebc2314a149a856634786b208a0" + } + Key { + type: 7 + key: 75 + modifiers: 0 + text: "6b" + autorep: false + count: 1 + } + Frame { + msec: 1056 + hash: "d072aebc2314a149a856634786b208a0" + } + Frame { + msec: 1072 + hash: "d072aebc2314a149a856634786b208a0" + } + Frame { + msec: 1088 + hash: "d072aebc2314a149a856634786b208a0" + } + Frame { + msec: 1104 + hash: "d072aebc2314a149a856634786b208a0" + } + Frame { + msec: 1120 + hash: "d072aebc2314a149a856634786b208a0" + } + Frame { + msec: 1136 + hash: "d072aebc2314a149a856634786b208a0" + } + Frame { + msec: 1152 + hash: "d072aebc2314a149a856634786b208a0" + } + Frame { + msec: 1168 + hash: "d072aebc2314a149a856634786b208a0" + } + Frame { + msec: 1184 + hash: "d072aebc2314a149a856634786b208a0" + } + Frame { + msec: 1200 + hash: "d072aebc2314a149a856634786b208a0" + } + Frame { + msec: 1216 + hash: "d072aebc2314a149a856634786b208a0" + } + Frame { + msec: 1232 + hash: "d072aebc2314a149a856634786b208a0" + } + Key { + type: 6 + key: 68 + modifiers: 0 + text: "64" + autorep: false + count: 1 + } + Frame { + msec: 1248 + hash: "94defec2865529f185d02cfcbfe166cc" + } + Frame { + msec: 1264 + hash: "94defec2865529f185d02cfcbfe166cc" + } + Frame { + msec: 1280 + hash: "94defec2865529f185d02cfcbfe166cc" + } + Key { + type: 7 + key: 68 + modifiers: 0 + text: "64" + autorep: false + count: 1 + } + Frame { + msec: 1296 + hash: "94defec2865529f185d02cfcbfe166cc" + } + Frame { + msec: 1312 + hash: "94defec2865529f185d02cfcbfe166cc" + } + Frame { + msec: 1328 + hash: "94defec2865529f185d02cfcbfe166cc" + } + Key { + type: 6 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 1344 + hash: "f625a2a82879df96141000e6931d4487" + } + Frame { + msec: 1360 + hash: "f625a2a82879df96141000e6931d4487" + } + Frame { + msec: 1376 + hash: "f625a2a82879df96141000e6931d4487" + } + Frame { + msec: 1392 + hash: "f625a2a82879df96141000e6931d4487" + } + Frame { + msec: 1408 + hash: "f625a2a82879df96141000e6931d4487" + } + Frame { + msec: 1424 + hash: "f625a2a82879df96141000e6931d4487" + } + Frame { + msec: 1440 + hash: "f625a2a82879df96141000e6931d4487" + } + Frame { + msec: 1456 + hash: "f625a2a82879df96141000e6931d4487" + } + Frame { + msec: 1472 + hash: "f625a2a82879df96141000e6931d4487" + } + Key { + type: 7 + key: 65 + modifiers: 0 + text: "61" + autorep: false + count: 1 + } + Frame { + msec: 1488 + hash: "f625a2a82879df96141000e6931d4487" + } + Key { + type: 6 + key: 87 + modifiers: 0 + text: "77" + autorep: false + count: 1 + } + Frame { + msec: 1504 + hash: "1cf29837a4ea63bbb06c15382680d1b6" + } + Frame { + msec: 1520 + hash: "1cf29837a4ea63bbb06c15382680d1b6" + } + Frame { + msec: 1536 + hash: "1cf29837a4ea63bbb06c15382680d1b6" + } + Frame { + msec: 1552 + hash: "1cf29837a4ea63bbb06c15382680d1b6" + } + Key { + type: 7 + key: 87 + modifiers: 0 + text: "77" + autorep: false + count: 1 + } + Frame { + msec: 1568 + hash: "1cf29837a4ea63bbb06c15382680d1b6" + } + Frame { + msec: 1584 + hash: "1cf29837a4ea63bbb06c15382680d1b6" + } + Frame { + msec: 1600 + hash: "1cf29837a4ea63bbb06c15382680d1b6" + } + Frame { + msec: 1616 + hash: "1cf29837a4ea63bbb06c15382680d1b6" + } + Frame { + msec: 1632 + hash: "1cf29837a4ea63bbb06c15382680d1b6" + } + Frame { + msec: 1648 + hash: "1cf29837a4ea63bbb06c15382680d1b6" + } + Key { + type: 6 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 1664 + hash: "6eabb6d168ecc9ac604dcf2db0075380" + } + Frame { + msec: 1680 + hash: "6eabb6d168ecc9ac604dcf2db0075380" + } + Frame { + msec: 1696 + hash: "6eabb6d168ecc9ac604dcf2db0075380" + } + Frame { + msec: 1712 + hash: "6eabb6d168ecc9ac604dcf2db0075380" + } + Frame { + msec: 1728 + hash: "6eabb6d168ecc9ac604dcf2db0075380" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 1744 + hash: "6eabb6d168ecc9ac604dcf2db0075380" + } + Key { + type: 7 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 1760 + hash: "6eabb6d168ecc9ac604dcf2db0075380" + } + Frame { + msec: 1776 + hash: "6eabb6d168ecc9ac604dcf2db0075380" + } + Frame { + msec: 1792 + hash: "6eabb6d168ecc9ac604dcf2db0075380" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 1808 + hash: "6eabb6d168ecc9ac604dcf2db0075380" + } + Frame { + msec: 1824 + hash: "6eabb6d168ecc9ac604dcf2db0075380" + } + Frame { + msec: 1840 + hash: "6eabb6d168ecc9ac604dcf2db0075380" + } + Frame { + msec: 1856 + hash: "6eabb6d168ecc9ac604dcf2db0075380" + } + Key { + type: 6 + key: 76 + modifiers: 0 + text: "6c" + autorep: false + count: 1 + } + Frame { + msec: 1872 + hash: "cb2dc1c4fc4e213841b873561f404a4f" + } + Frame { + msec: 1888 + hash: "cb2dc1c4fc4e213841b873561f404a4f" + } + Frame { + msec: 1904 + hash: "cb2dc1c4fc4e213841b873561f404a4f" + } + Frame { + msec: 1920 + image: "echoMode.1.png" + } + Key { + type: 7 + key: 76 + modifiers: 0 + text: "6c" + autorep: false + count: 1 + } + Frame { + msec: 1936 + hash: "cb2dc1c4fc4e213841b873561f404a4f" + } + Frame { + msec: 1952 + hash: "cb2dc1c4fc4e213841b873561f404a4f" + } + Frame { + msec: 1968 + hash: "cb2dc1c4fc4e213841b873561f404a4f" + } + Frame { + msec: 1984 + hash: "cb2dc1c4fc4e213841b873561f404a4f" + } + Frame { + msec: 2000 + hash: "cb2dc1c4fc4e213841b873561f404a4f" + } + Frame { + msec: 2016 + hash: "cb2dc1c4fc4e213841b873561f404a4f" + } + Key { + type: 6 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 2032 + hash: "c2aff1ebdee69cca7dc67a102fce5e8e" + } + Frame { + msec: 2048 + hash: "c2aff1ebdee69cca7dc67a102fce5e8e" + } + Key { + type: 7 + key: 79 + modifiers: 0 + text: "6f" + autorep: false + count: 1 + } + Frame { + msec: 2064 + hash: "c2aff1ebdee69cca7dc67a102fce5e8e" + } + Frame { + msec: 2080 + hash: "c2aff1ebdee69cca7dc67a102fce5e8e" + } + Key { + type: 6 + key: 86 + modifiers: 0 + text: "76" + autorep: false + count: 1 + } + Frame { + msec: 2096 + hash: "c82441813af6ff577687f29f6a09da38" + } + Frame { + msec: 2112 + hash: "c82441813af6ff577687f29f6a09da38" + } + Frame { + msec: 2128 + hash: "c82441813af6ff577687f29f6a09da38" + } + Frame { + msec: 2144 + hash: "c82441813af6ff577687f29f6a09da38" + } + Key { + type: 6 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Key { + type: 7 + key: 86 + modifiers: 0 + text: "76" + autorep: false + count: 1 + } + Frame { + msec: 2160 + hash: "d7da9862980b99e97a1fcd1b5c4c976f" + } + Frame { + msec: 2176 + hash: "d7da9862980b99e97a1fcd1b5c4c976f" + } + Frame { + msec: 2192 + hash: "d7da9862980b99e97a1fcd1b5c4c976f" + } + Frame { + msec: 2208 + hash: "d7da9862980b99e97a1fcd1b5c4c976f" + } + Key { + type: 6 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 2224 + hash: "d7da9862980b99e97a1fcd1b5c4c976f" + } + Key { + type: 7 + key: 69 + modifiers: 0 + text: "65" + autorep: false + count: 1 + } + Frame { + msec: 2240 + hash: "d7da9862980b99e97a1fcd1b5c4c976f" + } + Frame { + msec: 2256 + hash: "d7da9862980b99e97a1fcd1b5c4c976f" + } + Frame { + msec: 2272 + hash: "d7da9862980b99e97a1fcd1b5c4c976f" + } + Frame { + msec: 2288 + hash: "d7da9862980b99e97a1fcd1b5c4c976f" + } + Frame { + msec: 2304 + hash: "d7da9862980b99e97a1fcd1b5c4c976f" + } + Key { + type: 7 + key: 32 + modifiers: 0 + text: "20" + autorep: false + count: 1 + } + Frame { + msec: 2320 + hash: "d7da9862980b99e97a1fcd1b5c4c976f" + } + Frame { + msec: 2336 + hash: "d7da9862980b99e97a1fcd1b5c4c976f" + } + Key { + type: 6 + key: 77 + modifiers: 0 + text: "6d" + autorep: false + count: 1 + } + Frame { + msec: 2352 + hash: "8f36e26d8685fe55e7a1dd294188f649" + } + Frame { + msec: 2368 + hash: "8f36e26d8685fe55e7a1dd294188f649" + } + Frame { + msec: 2384 + hash: "8f36e26d8685fe55e7a1dd294188f649" + } + Frame { + msec: 2400 + hash: "8f36e26d8685fe55e7a1dd294188f649" + } + Frame { + msec: 2416 + hash: "8f36e26d8685fe55e7a1dd294188f649" + } + Frame { + msec: 2432 + hash: "8f36e26d8685fe55e7a1dd294188f649" + } + Key { + type: 7 + key: 77 + modifiers: 0 + text: "6d" + autorep: false + count: 1 + } + Frame { + msec: 2448 + hash: "8f36e26d8685fe55e7a1dd294188f649" + } + Frame { + msec: 2464 + hash: "8f36e26d8685fe55e7a1dd294188f649" + } + Frame { + msec: 2480 + hash: "8f36e26d8685fe55e7a1dd294188f649" + } + Frame { + msec: 2496 + hash: "8f36e26d8685fe55e7a1dd294188f649" + } + Key { + type: 6 + key: 89 + modifiers: 0 + text: "79" + autorep: false + count: 1 + } + Frame { + msec: 2512 + hash: "316f2ba46d059755576e6822dc77afb2" + } + Frame { + msec: 2528 + hash: "316f2ba46d059755576e6822dc77afb2" + } + Frame { + msec: 2544 + hash: "316f2ba46d059755576e6822dc77afb2" + } + Key { + type: 7 + key: 89 + modifiers: 0 + text: "79" + autorep: false + count: 1 + } + Frame { + msec: 2560 + hash: "316f2ba46d059755576e6822dc77afb2" + } + Frame { + msec: 2576 + hash: "316f2ba46d059755576e6822dc77afb2" + } + Frame { + msec: 2592 + hash: "316f2ba46d059755576e6822dc77afb2" + } + Frame { + msec: 2608 + hash: "316f2ba46d059755576e6822dc77afb2" + } + Frame { + msec: 2624 + hash: "316f2ba46d059755576e6822dc77afb2" + } + Frame { + msec: 2640 + hash: "316f2ba46d059755576e6822dc77afb2" + } + Frame { + msec: 2656 + hash: "316f2ba46d059755576e6822dc77afb2" + } + Frame { + msec: 2672 + hash: "316f2ba46d059755576e6822dc77afb2" + } + Frame { + msec: 2688 + hash: "316f2ba46d059755576e6822dc77afb2" + } + Frame { + msec: 2704 + hash: "316f2ba46d059755576e6822dc77afb2" + } + Frame { + msec: 2720 + hash: "316f2ba46d059755576e6822dc77afb2" + } + Frame { + msec: 2736 + hash: "316f2ba46d059755576e6822dc77afb2" + } + Frame { + msec: 2752 + hash: "316f2ba46d059755576e6822dc77afb2" + } + Frame { + msec: 2768 + hash: "316f2ba46d059755576e6822dc77afb2" + } + Frame { + msec: 2784 + hash: "316f2ba46d059755576e6822dc77afb2" + } + Frame { + msec: 2800 + hash: "316f2ba46d059755576e6822dc77afb2" + } + Frame { + msec: 2816 + hash: "316f2ba46d059755576e6822dc77afb2" + } + Frame { + msec: 2832 + hash: "316f2ba46d059755576e6822dc77afb2" + } + Frame { + msec: 2848 + hash: "316f2ba46d059755576e6822dc77afb2" + } + Frame { + msec: 2864 + hash: "316f2ba46d059755576e6822dc77afb2" + } + Frame { + msec: 2880 + image: "echoMode.2.png" + } + Frame { + msec: 2896 + hash: "316f2ba46d059755576e6822dc77afb2" + } + Frame { + msec: 2912 + hash: "316f2ba46d059755576e6822dc77afb2" + } + Frame { + msec: 2928 + hash: "316f2ba46d059755576e6822dc77afb2" + } + Frame { + msec: 2944 + hash: "316f2ba46d059755576e6822dc77afb2" + } + Frame { + msec: 2960 + hash: "316f2ba46d059755576e6822dc77afb2" + } + Frame { + msec: 2976 + hash: "316f2ba46d059755576e6822dc77afb2" + } + Frame { + msec: 2992 + hash: "316f2ba46d059755576e6822dc77afb2" + } + Frame { + msec: 3008 + hash: "316f2ba46d059755576e6822dc77afb2" + } + Frame { + msec: 3024 + hash: "316f2ba46d059755576e6822dc77afb2" + } + Frame { + msec: 3040 + hash: "316f2ba46d059755576e6822dc77afb2" + } + Frame { + msec: 3056 + hash: "316f2ba46d059755576e6822dc77afb2" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.0.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.0.png new file mode 100644 index 00000000..431bed84 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.0.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.1.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.1.png new file mode 100644 index 00000000..9708b4f3 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.1.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.2.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.2.png new file mode 100644 index 00000000..7034946c Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.2.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.3.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.3.png new file mode 100644 index 00000000..7c56f006 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.3.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.4.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.4.png new file mode 100644 index 00000000..431bed84 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.4.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.5.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.5.png new file mode 100644 index 00000000..30b7a081 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.5.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.6.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.6.png new file mode 100644 index 00000000..54e13cbf Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.6.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.7.png b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.7.png new file mode 100644 index 00000000..34c099b5 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.7.png differ diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.qml new file mode 100644 index 00000000..de69c6af --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/flickableInput.qml @@ -0,0 +1,3279 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "flickableInput.0.png" + } + Frame { + msec: 32 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 48 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 64 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 80 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 96 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 112 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 128 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 144 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 160 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 176 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 192 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 208 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 224 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 240 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 256 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 272 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 288 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 304 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 320 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 336 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 352 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 368 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 384 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 400 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 416 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 432 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 448 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 464 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 480 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 496 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 512 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 528 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 544 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 560 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 576 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 592 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 608 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 624 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 640 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 656 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 672 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 688 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 704 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 720 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 736 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 752 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 768 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 39; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 784 + hash: "6ef5c0ad42aca699271501f9358d3de6" + } + Frame { + msec: 800 + hash: "6ef5c0ad42aca699271501f9358d3de6" + } + Frame { + msec: 816 + hash: "6ef5c0ad42aca699271501f9358d3de6" + } + Frame { + msec: 832 + hash: "6ef5c0ad42aca699271501f9358d3de6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 41; y: 8 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 43; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 848 + hash: "6ef5c0ad42aca699271501f9358d3de6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 46; y: 8 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 50; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 864 + hash: "c54c442eb01186dc8d5be7ff7b242aa1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 53; y: 8 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 57; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 880 + hash: "8eb5252ed783eae4dd998ea5a451c6bb" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 62; y: 8 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 68; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 896 + hash: "f80423adedb40b1c9ed88bb171590626" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 73; y: 8 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 79; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 912 + hash: "afb2d22b60113d05b038fd09b5966151" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 84; y: 8 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 90; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 928 + hash: "e0a4a243acd0c4f3960ea77fdb5e30c1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 95; y: 8 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 101; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 944 + hash: "24c5185a748dc4b02fdd40fd2d0420ff" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 106; y: 8 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 111; y: 8 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 960 + hash: "e271a2cd9847828da3e39c1e618f828a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 117; y: 7 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 122; y: 7 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 976 + image: "flickableInput.1.png" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 127; y: 7 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 132; y: 6 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 992 + hash: "3f40064784f716ce75ef9390d90a1eac" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 136; y: 6 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 139; y: 6 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1008 + hash: "77a95b3d8d4682eb8e613bd86ea7b3c7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 142; y: 5 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 145; y: 5 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1024 + hash: "308ea214fc63e47141623bc436df0efc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 148; y: 5 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 150; y: 5 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1040 + hash: "3e0a860238ab282aebd733a92321f86f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 154; y: 4 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 156; y: 4 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1056 + hash: "ed4c6a18ed003922f5724ebc8e798c6c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 159; y: 4 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 161; y: 4 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1072 + hash: "ed4c6a18ed003922f5724ebc8e798c6c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 163; y: 4 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 165; y: 4 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1088 + hash: "90bc837ada7b6cd08028e790b1a87ae2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 166; y: 4 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 169; y: 4 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1104 + hash: "90bc837ada7b6cd08028e790b1a87ae2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 170; y: 4 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 171; y: 4 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1120 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 173; y: 4 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1136 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 174; y: 4 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1152 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1168 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 175; y: 4 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1184 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 176; y: 4 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1200 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1216 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1232 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1248 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1264 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1280 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1296 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1312 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1328 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1344 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1360 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1376 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 176; y: 4 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1392 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1408 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1424 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1440 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1456 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1472 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1488 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1504 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1520 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1536 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1552 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1568 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1584 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1600 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 1616 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1632 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1648 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1664 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1680 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1696 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1712 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1728 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1744 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1760 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1776 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1792 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1808 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1824 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1840 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1856 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1872 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1888 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1904 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1920 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1936 + image: "flickableInput.2.png" + } + Frame { + msec: 1952 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1968 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 1984 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 2000 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 2016 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 2032 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 2048 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 2064 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 2080 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 2096 + hash: "44850466b240778a11644fdea11d26d0" + } + Frame { + msec: 2112 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 2128 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 2144 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 2160 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 2176 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 2192 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 2208 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 2224 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 2240 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 2256 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 2272 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Frame { + msec: 2288 + hash: "556d042ec98e01fc1bdb0b2a5032a39e" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 17; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2304 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 2320 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 2336 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 2352 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 2368 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 2384 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 2400 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 2416 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 10 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 12 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2432 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 13 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 14 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2448 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 15 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 17 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2464 + hash: "6865c870740497e31dfeb91e09737206" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 18 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2480 + hash: "541acf0d74762064d970506a40f6600b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 20 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2496 + hash: "956939b887f2bb0d45400214685f1fac" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 21 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2512 + hash: "956939b887f2bb0d45400214685f1fac" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 22 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2528 + hash: "3eff05a088e55df16f0b30546ad8c87f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 23 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2544 + hash: "3eff05a088e55df16f0b30546ad8c87f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2560 + hash: "5b0488fc2a7f840f73d4fc9d17a5a738" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 27 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2576 + hash: "e17d039213c12708ff378789705e281a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 28 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2592 + hash: "2e2eaab559d0dd7543c2e6e17e0f7740" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 30 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2608 + hash: "49a9baad5178009409e28618a4132544" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2624 + hash: "49a9baad5178009409e28618a4132544" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 32 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2640 + hash: "a867fe835626e562d5e060c0b2bc4ea3" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 33 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 34 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2656 + hash: "1479e0feffdff866bfd14cbbf76017c7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 35 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2672 + hash: "1479e0feffdff866bfd14cbbf76017c7" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 36 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 37 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2688 + hash: "dfa99d1eee5ed8d2913c0e603be3ad0e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2704 + hash: "b55abbe5e7d2c3f5cdaf6dcf5a12c00a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2720 + hash: "46be0cd1b01d80de8e9d8cd78364fdd4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 41 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2736 + hash: "46be0cd1b01d80de8e9d8cd78364fdd4" + } + Frame { + msec: 2752 + hash: "46be0cd1b01d80de8e9d8cd78364fdd4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 17; y: 42 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2768 + hash: "c9ec87a419171b4d6311a36c952eaef1" + } + Frame { + msec: 2784 + hash: "c9ec87a419171b4d6311a36c952eaef1" + } + Frame { + msec: 2800 + hash: "34cb0a13417b38ff6c78a98a128f1b40" + } + Frame { + msec: 2816 + hash: "34cb0a13417b38ff6c78a98a128f1b40" + } + Frame { + msec: 2832 + hash: "34cb0a13417b38ff6c78a98a128f1b40" + } + Frame { + msec: 2848 + hash: "34cb0a13417b38ff6c78a98a128f1b40" + } + Frame { + msec: 2864 + hash: "34cb0a13417b38ff6c78a98a128f1b40" + } + Frame { + msec: 2880 + hash: "34cb0a13417b38ff6c78a98a128f1b40" + } + Frame { + msec: 2896 + image: "flickableInput.3.png" + } + Frame { + msec: 2912 + hash: "34cb0a13417b38ff6c78a98a128f1b40" + } + Frame { + msec: 2928 + hash: "34cb0a13417b38ff6c78a98a128f1b40" + } + Frame { + msec: 2944 + hash: "34cb0a13417b38ff6c78a98a128f1b40" + } + Frame { + msec: 2960 + hash: "34cb0a13417b38ff6c78a98a128f1b40" + } + Frame { + msec: 2976 + hash: "34cb0a13417b38ff6c78a98a128f1b40" + } + Frame { + msec: 2992 + hash: "34cb0a13417b38ff6c78a98a128f1b40" + } + Frame { + msec: 3008 + hash: "34cb0a13417b38ff6c78a98a128f1b40" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 17; y: 42 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3024 + hash: "34cb0a13417b38ff6c78a98a128f1b40" + } + Frame { + msec: 3040 + hash: "34cb0a13417b38ff6c78a98a128f1b40" + } + Frame { + msec: 3056 + hash: "34cb0a13417b38ff6c78a98a128f1b40" + } + Frame { + msec: 3072 + hash: "09201585ad57e87efda13c469e1bc95d" + } + Frame { + msec: 3088 + hash: "09201585ad57e87efda13c469e1bc95d" + } + Frame { + msec: 3104 + hash: "b816b96270a846ed5776e6f53d507eb8" + } + Frame { + msec: 3120 + hash: "6ee997c78cadb4357b30db81acf4ee40" + } + Frame { + msec: 3136 + hash: "abbab9e07614915a49fc8f30242932a7" + } + Frame { + msec: 3152 + hash: "47f0d0fe751a8ad3dd3f6341d76c929d" + } + Frame { + msec: 3168 + hash: "0304cbed0c52d5486df52312898fe81d" + } + Frame { + msec: 3184 + hash: "6ac82afa8805f1bdb4c67a2f1a1aff32" + } + Frame { + msec: 3200 + hash: "4cc6db0a1dbe6c70d5e2dfe60fe70a51" + } + Frame { + msec: 3216 + hash: "cf04ff1b13f5aa36470fd8ae23523153" + } + Frame { + msec: 3232 + hash: "20fcdfd24f21125d61ac45cbe94e48a7" + } + Frame { + msec: 3248 + hash: "e017109961b5e6c6701c3045f284ebf7" + } + Frame { + msec: 3264 + hash: "e017109961b5e6c6701c3045f284ebf7" + } + Frame { + msec: 3280 + hash: "c2a770b8c95959f4abf91420c0a3e8b2" + } + Frame { + msec: 3296 + hash: "6865c870740497e31dfeb91e09737206" + } + Frame { + msec: 3312 + hash: "6865c870740497e31dfeb91e09737206" + } + Frame { + msec: 3328 + hash: "6865c870740497e31dfeb91e09737206" + } + Frame { + msec: 3344 + hash: "6865c870740497e31dfeb91e09737206" + } + Frame { + msec: 3360 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3376 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3392 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3408 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3424 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3440 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3456 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3472 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3488 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3504 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3520 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3536 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3552 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3568 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3584 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3600 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3616 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3632 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3648 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3664 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3680 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3696 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3712 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3728 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3744 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3760 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3776 + hash: "7b10e4abcc38d2359bb253f8477858e6" + } + Frame { + msec: 3792 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 3808 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 3824 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 3840 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 3856 + image: "flickableInput.4.png" + } + Frame { + msec: 3872 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 3888 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 3904 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 3920 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 3936 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Frame { + msec: 3952 + hash: "a5480e4c53bbd8c58aa2d574c7644871" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 12; y: 24 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3968 + hash: "b6dd7639973f6ee654a7ab6dec2fabbe" + } + Frame { + msec: 3984 + hash: "b6dd7639973f6ee654a7ab6dec2fabbe" + } + Frame { + msec: 4000 + hash: "b6dd7639973f6ee654a7ab6dec2fabbe" + } + Frame { + msec: 4016 + hash: "b6dd7639973f6ee654a7ab6dec2fabbe" + } + Frame { + msec: 4032 + hash: "b6dd7639973f6ee654a7ab6dec2fabbe" + } + Frame { + msec: 4048 + hash: "b6dd7639973f6ee654a7ab6dec2fabbe" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 13; y: 24 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4064 + hash: "b6dd7639973f6ee654a7ab6dec2fabbe" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 16; y: 24 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 20; y: 24 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4080 + hash: "b6dd7639973f6ee654a7ab6dec2fabbe" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 23; y: 24 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 27; y: 25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4096 + hash: "ab2ea5988d2b3288d3c57369f68933dc" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 31; y: 25 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 36; y: 25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4112 + hash: "986834600427959d170d547a1c5ecce0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 41; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 47; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4128 + hash: "52847e87c1fef2d7357c86abb0944df4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 52; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 58; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4144 + hash: "bc68a47163712646cf8439459fb0d100" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 62; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 66; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4160 + hash: "9e9f66e9545c77a2e7ee02d46acd102e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 72; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 76; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4176 + hash: "4e9e7500185499c5a5f9d65e0e9406a0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 80; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 83; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4192 + hash: "550d6c645bf694c544734d67e2ae5ac3" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 87; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 90; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4208 + hash: "0736bab3f9c1cec0f944003bebe3d499" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 94; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 97; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4224 + hash: "efffb9f6d6a7dacf297530b1cb68a713" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 100; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 103; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4240 + hash: "d5458a8dd8a9bf22e67439c9d8d9c366" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 106; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 109; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4256 + hash: "2d30acf6dc0e186577bd6f7ce858ab92" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 112; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 115; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4272 + hash: "e1a926cc5f7a49c9320a8d49c8a1bb3f" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 117; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 120; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4288 + hash: "cfc9c0bca9e269887ad5c67cc684b753" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 122; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 124; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4304 + hash: "7b561e04ef93399460eb3b4b850c3cab" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 126; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 127; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4320 + hash: "1c17d036e08b24b47239f9a38df3d87d" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 128; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 130; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4336 + hash: "3ec95ad7622048b68a53cfd3fdeac999" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 132; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 133; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4352 + hash: "1e20084ed70b7423885a2d0f06fba660" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 134; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 136; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4368 + hash: "f19e136b3c3d57d8b8e63c64b17c29e4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 137; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4384 + hash: "f19e136b3c3d57d8b8e63c64b17c29e4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 138; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4400 + hash: "894d439a8463cf460e5a66fdcf51a1b5" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 139; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4416 + hash: "894d439a8463cf460e5a66fdcf51a1b5" + } + Frame { + msec: 4432 + hash: "894d439a8463cf460e5a66fdcf51a1b5" + } + Frame { + msec: 4448 + hash: "894d439a8463cf460e5a66fdcf51a1b5" + } + Frame { + msec: 4464 + hash: "03c99addee96254d19db72746f1bef11" + } + Frame { + msec: 4480 + hash: "03c99addee96254d19db72746f1bef11" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 140; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4496 + hash: "cb087b0af44fd7e767b3ff5da1f49790" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 142; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 143; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4512 + hash: "8c36fa6a9c8bfb66e272c8628aec7077" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 145; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 146; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4528 + hash: "971154dba58b18b1d82999f5b6a40cc1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 149; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 151; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4544 + hash: "253397b603f99f7d092dda82d794e944" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 153; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 155; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4560 + hash: "f8ded9e6f36a35a73fbe2264321838ca" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 158; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 161; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4576 + hash: "83b9cec7bbe65ba9d68b089211296116" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 164; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 166; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4592 + hash: "525ffec3a2d2a7a9e0c82f2c98b09ea0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 168; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 171; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4608 + hash: "c4fb902f66abebb6b7c3489a073e17d4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 172; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 173; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4624 + hash: "0f4526d9f840c0a95e9d145c9822d6e1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 174; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4640 + hash: "db00d1ba5c8416b3418e9e5ca65be5ea" + } + Frame { + msec: 4656 + hash: "db00d1ba5c8416b3418e9e5ca65be5ea" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 175; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4672 + hash: "db00d1ba5c8416b3418e9e5ca65be5ea" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 176; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4688 + hash: "d6f7a50416c3805aeafbdf55905e8276" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 177; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4704 + hash: "d6f7a50416c3805aeafbdf55905e8276" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 178; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4720 + hash: "7586c3d3f46eba4a1abe2fe223e7fde2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 179; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4736 + hash: "7586c3d3f46eba4a1abe2fe223e7fde2" + } + Frame { + msec: 4752 + hash: "7586c3d3f46eba4a1abe2fe223e7fde2" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 180; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4768 + hash: "4f63c550ebf5c52fe55558310b366b11" + } + Frame { + msec: 4784 + hash: "4f63c550ebf5c52fe55558310b366b11" + } + Frame { + msec: 4800 + hash: "4f63c550ebf5c52fe55558310b366b11" + } + Frame { + msec: 4816 + image: "flickableInput.5.png" + } + Frame { + msec: 4832 + hash: "4f63c550ebf5c52fe55558310b366b11" + } + Frame { + msec: 4848 + hash: "4f63c550ebf5c52fe55558310b366b11" + } + Frame { + msec: 4864 + hash: "4f63c550ebf5c52fe55558310b366b11" + } + Frame { + msec: 4880 + hash: "4f63c550ebf5c52fe55558310b366b11" + } + Frame { + msec: 4896 + hash: "4f63c550ebf5c52fe55558310b366b11" + } + Frame { + msec: 4912 + hash: "4f63c550ebf5c52fe55558310b366b11" + } + Frame { + msec: 4928 + hash: "4f63c550ebf5c52fe55558310b366b11" + } + Frame { + msec: 4944 + hash: "4f63c550ebf5c52fe55558310b366b11" + } + Frame { + msec: 4960 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 4976 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 4992 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5008 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5024 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5040 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5056 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5072 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5088 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5104 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5120 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5136 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5152 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5168 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5184 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5200 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5216 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5232 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5248 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5264 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5280 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5296 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5312 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5328 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5344 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5360 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5376 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5392 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5408 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5424 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5440 + hash: "9fcd1fb769766e6019fd7e85cd3e05dc" + } + Frame { + msec: 5456 + hash: "4f63c550ebf5c52fe55558310b366b11" + } + Frame { + msec: 5472 + hash: "4f63c550ebf5c52fe55558310b366b11" + } + Frame { + msec: 5488 + hash: "4f63c550ebf5c52fe55558310b366b11" + } + Frame { + msec: 5504 + hash: "4f63c550ebf5c52fe55558310b366b11" + } + Frame { + msec: 5520 + hash: "4f63c550ebf5c52fe55558310b366b11" + } + Frame { + msec: 5536 + hash: "4f63c550ebf5c52fe55558310b366b11" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 177; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5552 + hash: "d6f7a50416c3805aeafbdf55905e8276" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 176; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 175; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5568 + hash: "db00d1ba5c8416b3418e9e5ca65be5ea" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 174; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 171; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5584 + hash: "c4fb902f66abebb6b7c3489a073e17d4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 170; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 168; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5600 + hash: "04c6accf277b5bca4c53c1817f85bafe" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 166; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 164; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5616 + hash: "8eb14964fea798ceccc150310a12fd4b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 162; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 160; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5632 + hash: "83b9cec7bbe65ba9d68b089211296116" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 158; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 157; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5648 + hash: "e59ae71a5636c48e6befa305eba76ec8" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 155; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 153; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5664 + hash: "73e178775ee01d28cf03378f267753b1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 151; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 150; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5680 + hash: "253397b603f99f7d092dda82d794e944" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 148; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 146; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5696 + hash: "971154dba58b18b1d82999f5b6a40cc1" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 145; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 144; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5712 + hash: "5bd30e73b37592c06f735541f802f367" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 142; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 140; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5728 + hash: "cb087b0af44fd7e767b3ff5da1f49790" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 138; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5744 + hash: "03c99addee96254d19db72746f1bef11" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 137; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 135; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5760 + hash: "0f76d8a89e383e7e742a3d194d770061" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 133; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 131; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5776 + image: "flickableInput.6.png" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 129; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 127; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5792 + hash: "f047f32822850b2c0fee18b4a8f8a96a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 124; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 121; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5808 + hash: "160c8c8447a469291fc2f87c2b6c97ce" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 119; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 116; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5824 + hash: "4a9d610f3fa37336c0cab7b4e575713b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 114; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 112; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5840 + hash: "5a00b185983ad89bcf1ceb036c424dd4" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 110; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 109; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5856 + hash: "a578449e7df3994d0806f7ee2e5a7815" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 107; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5872 + hash: "445cb1ae1934659c3c8b5800bc30fc74" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 106; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 105; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5888 + hash: "ad22110876a867ca80530ca6d132dfe3" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 105; y: 25 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 105; y: 25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5904 + hash: "7a644a888de5691c69543699229ec8ca" + } + Frame { + msec: 5920 + hash: "7a644a888de5691c69543699229ec8ca" + } + Frame { + msec: 5936 + hash: "41c14cc9ea05712aea8d1feb18ca85f3" + } + Frame { + msec: 5952 + hash: "921d476813711e64b9c2272aeff3ed40" + } + Frame { + msec: 5968 + hash: "2dad691263389dce74c99530f188cd20" + } + Frame { + msec: 5984 + hash: "b426ff8ba6d1c52974b117fb8b912b76" + } + Frame { + msec: 6000 + hash: "bbcae0d0547e1cfe9a4db1a6f86bf4b6" + } + Frame { + msec: 6016 + hash: "b8e54bc1a48d7a225cce25c3735c2933" + } + Frame { + msec: 6032 + hash: "b59e0f6eea3c41cedb10ac7a7e2629ef" + } + Frame { + msec: 6048 + hash: "48add89789f9d1be82aedeecf6fda362" + } + Frame { + msec: 6064 + hash: "3cf7a035a5b7dbc81c3da5e99efa5024" + } + Frame { + msec: 6080 + hash: "ff9c7173f7138e273cdbdfa8c6f5fedf" + } + Frame { + msec: 6096 + hash: "bc5e19862dfb38e687d1bfc37690a3b8" + } + Frame { + msec: 6112 + hash: "6ff97512731fd97d3c540245ffff6205" + } + Frame { + msec: 6128 + hash: "290e8c8bf51ced134e965f72a868e467" + } + Frame { + msec: 6144 + hash: "3a63687a5179896572be2e1e0d00766f" + } + Frame { + msec: 6160 + hash: "80f8d13272a23e8816ef45fbbef922fe" + } + Frame { + msec: 6176 + hash: "7888e0ece9522f751417944855824be8" + } + Frame { + msec: 6192 + hash: "3d81f8cde15b7d0b009fc9b46a1144e1" + } + Frame { + msec: 6208 + hash: "3d81f8cde15b7d0b009fc9b46a1144e1" + } + Frame { + msec: 6224 + hash: "d19f7d7d94695ca307b59ffdfea497d0" + } + Frame { + msec: 6240 + hash: "d19f7d7d94695ca307b59ffdfea497d0" + } + Frame { + msec: 6256 + hash: "d19f7d7d94695ca307b59ffdfea497d0" + } + Frame { + msec: 6272 + hash: "d19f7d7d94695ca307b59ffdfea497d0" + } + Frame { + msec: 6288 + hash: "d19f7d7d94695ca307b59ffdfea497d0" + } + Frame { + msec: 6304 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 6320 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 6336 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 6352 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 6368 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 6384 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 6400 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 6416 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 6432 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 6448 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 6464 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6480 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6496 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6512 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6528 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6544 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6560 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6576 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6592 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6608 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6624 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6640 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6656 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6672 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6688 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6704 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6720 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6736 + image: "flickableInput.7.png" + } + Frame { + msec: 6752 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6768 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6784 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6800 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6816 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6832 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6848 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6864 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6880 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6896 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6912 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6928 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6944 + hash: "399526752d472f9379d3d218d5d3fdf8" + } + Frame { + msec: 6960 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 6976 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 6992 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7008 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7024 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7040 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7056 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7072 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7088 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7104 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7120 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7136 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7152 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7168 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7184 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7200 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7216 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7232 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7248 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7264 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7280 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } + Frame { + msec: 7296 + hash: "ef425c131e1c80a6d62d777963f3d08f" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/hAlign.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/hAlign.qml new file mode 100644 index 00000000..a0351e87 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/data/hAlign.qml @@ -0,0 +1,107 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + hash: "7619ed68aca3544f373777e11a4bfefa" + } + Frame { + msec: 32 + hash: "7619ed68aca3544f373777e11a4bfefa" + } + Frame { + msec: 48 + hash: "7619ed68aca3544f373777e11a4bfefa" + } + Frame { + msec: 64 + hash: "7619ed68aca3544f373777e11a4bfefa" + } + Frame { + msec: 80 + hash: "7619ed68aca3544f373777e11a4bfefa" + } + Frame { + msec: 96 + hash: "7619ed68aca3544f373777e11a4bfefa" + } + Frame { + msec: 112 + hash: "7619ed68aca3544f373777e11a4bfefa" + } + Frame { + msec: 128 + hash: "7619ed68aca3544f373777e11a4bfefa" + } + Frame { + msec: 144 + hash: "7619ed68aca3544f373777e11a4bfefa" + } + Frame { + msec: 160 + hash: "7619ed68aca3544f373777e11a4bfefa" + } + Frame { + msec: 176 + hash: "7619ed68aca3544f373777e11a4bfefa" + } + Frame { + msec: 192 + hash: "7619ed68aca3544f373777e11a4bfefa" + } + Frame { + msec: 208 + hash: "7619ed68aca3544f373777e11a4bfefa" + } + Frame { + msec: 224 + hash: "7619ed68aca3544f373777e11a4bfefa" + } + Frame { + msec: 240 + hash: "7619ed68aca3544f373777e11a4bfefa" + } + Frame { + msec: 256 + hash: "7619ed68aca3544f373777e11a4bfefa" + } + Frame { + msec: 272 + hash: "7619ed68aca3544f373777e11a4bfefa" + } + Frame { + msec: 288 + hash: "7619ed68aca3544f373777e11a4bfefa" + } + Frame { + msec: 304 + hash: "7619ed68aca3544f373777e11a4bfefa" + } + Frame { + msec: 320 + hash: "7619ed68aca3544f373777e11a4bfefa" + } + Frame { + msec: 336 + hash: "7619ed68aca3544f373777e11a4bfefa" + } + Frame { + msec: 352 + hash: "7619ed68aca3544f373777e11a4bfefa" + } + Frame { + msec: 368 + hash: "7619ed68aca3544f373777e11a4bfefa" + } + Frame { + msec: 384 + hash: "7619ed68aca3544f373777e11a4bfefa" + } + Frame { + msec: 400 + hash: "7619ed68aca3544f373777e11a4bfefa" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/echoMode.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/echoMode.qml new file mode 100644 index 00000000..83ec088a --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/echoMode.qml @@ -0,0 +1,11 @@ +import QtQuick 1.0 +import "../shared" 1.0 + +Item { + height: 50; width: 200 + Column { + //Not an exhaustive echo mode test, that's in QLineEdit (since the functionality is in QLineControl) + TestTextInput { id: main; focus: true; echoMode: TextInput.Password; passwordCharacter: '.' } + TestText { text: main.text } + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/flickableInput.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/flickableInput.qml new file mode 100644 index 00000000..7af74acc --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/flickableInput.qml @@ -0,0 +1,21 @@ +import QtQuick 1.0 + +Flickable { + width: 200 + height: 50 + contentWidth: 400 + contentHeight: 100 + + Column { + anchors.fill: parent + + TextInput { + selectByMouse: true + text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + } + TextInput { + selectByMouse: false + text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + } + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/hAlign.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/hAlign.qml new file mode 100644 index 00000000..f36a752f --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/hAlign.qml @@ -0,0 +1,41 @@ +import QtQuick 1.0 +import "../shared" 1.0 + +Item{ + width:600; + height:300; + Column { + //Because they have auto width, these three should look the same + TestTextInput { + text: "Jackdaws love my big sphinx of quartz"; + horizontalAlignment: TextInput.AlignLeft; + } + TestTextInput { + text: "Jackdaws love my big sphinx of quartz"; + horizontalAlignment: TextInput.AlignHCenter; + } + TestTextInput { + text: "Jackdaws love my big sphinx of quartz"; + horizontalAlignment: TextInput.AlignRight; + } + Rectangle{ width: 600; height: 10; color: "pink" } + TestTextInput { + height: 30; + width: 600; + text: "Jackdaws love my big sphinx of quartz"; + horizontalAlignment: TextInput.AlignLeft; + } + TestTextInput { + height: 30; + width: 600; + text: "Jackdaws love my big sphinx of quartz"; + horizontalAlignment: TextInput.AlignHCenter; + } + TestTextInput { + height: 30; + width: 600; + text: "Jackdaws love my big sphinx of quartz"; + horizontalAlignment: TextInput.AlignRight; + } + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/qtbug-15818.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/qtbug-15818.qml new file mode 100644 index 00000000..59710a4c --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/qtbug-15818.qml @@ -0,0 +1,13 @@ +import QtQuick 1.1 +//Test that doubleclicking on the front of a word only selects that word, and not the word in front + +Item{ + width: 200 + height: 100 + TextInput{ + anchors.fill: parent + readOnly: true + selectByMouse: true + text: "abc a cba test" + } +} diff --git a/tests/auto/declarative/qmlvisual/qdeclarativetextinput/usingLineEdit.qml b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/usingLineEdit.qml new file mode 100644 index 00000000..758717ea --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qdeclarativetextinput/usingLineEdit.qml @@ -0,0 +1,10 @@ +import QtQuick 1.0 + +Rectangle{ + width: 600 + height: 200 + Column { + LineEdit {text: 'Hello world'} + LineEdit {text: 'Hello underwhelmingly verbose world'; width: 80; height: 24;} + } +} diff --git a/tests/auto/declarative/qmlvisual/qmlvisual.pro b/tests/auto/declarative/qmlvisual/qmlvisual.pro new file mode 100644 index 00000000..36d2600d --- /dev/null +++ b/tests/auto/declarative/qmlvisual/qmlvisual.pro @@ -0,0 +1,37 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +macx:CONFIG -= app_bundle + +SOURCES += tst_qmlvisual.cpp + +symbian: { + importFiles.path = . + importFiles.files = animation \ + fillmode \ + focusscope \ + ListView \ + qdeclarativeborderimage \ + qdeclarativeflickable \ + qdeclarativeflipable \ + qdeclarativegridview \ + qdeclarativemousearea \ + qdeclarativeparticles \ + qdeclarativepathview \ + qdeclarativepositioners \ + qdeclarativesmoothedanimation \ + qdeclarativespringanimation \ + qdeclarativetext \ + qdeclarativetextedit \ + qdeclarativetextinput \ + rect \ + repeater \ + selftest_noimages \ + webview + DEPLOYMENT += importFiles +} else { + DEFINES += QT_TEST_SOURCE_DIR=\"\\\"$$PWD\\\"\" +} + +CONFIG += parallel_test + +CONFIG+=insignificant_test # QTQAINFRA-428 diff --git a/tests/auto/declarative/qmlvisual/rect/GradientRect.qml b/tests/auto/declarative/qmlvisual/rect/GradientRect.qml new file mode 100644 index 00000000..5ac7dcf2 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/rect/GradientRect.qml @@ -0,0 +1,25 @@ +import QtQuick 1.0 + +Item { + id: rect + property color color + property color border : Qt.rgba(0,0,0,0) + property int rotation + property int radius + property int borderWidth + property bool smooth: false + + width: 40; height: 40 + Item { + anchors.centerIn: parent; rotation: rect.rotation; + Rectangle { + anchors.centerIn: parent; width: 40; height: 40 + border.color: rect.border; border.width: rect.border != Qt.rgba(0,0,0,0) ? 2 : 0 + radius: rect.radius; smooth: rect.smooth + gradient: Gradient { + GradientStop { position: 0.0; color: rect.color } + GradientStop { position: 1.0; color: "white" } + } + } + } +} diff --git a/tests/auto/declarative/qmlvisual/rect/MyRect.qml b/tests/auto/declarative/qmlvisual/rect/MyRect.qml new file mode 100644 index 00000000..99226d35 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/rect/MyRect.qml @@ -0,0 +1,21 @@ +import QtQuick 1.0 + +Item { + id: rect + property color color + property color border : Qt.rgba(0,0,0,0) + property int rotation + property int radius + property int borderWidth + property bool smooth: false + + width: 40; height: 40 + Item { + anchors.centerIn: parent; rotation: rect.rotation; + Rectangle { + anchors.centerIn: parent; width: 40; height: 40 + color: rect.color; border.color: rect.border; border.width: rect.border != Qt.rgba(0,0,0,0) ? 2 : 0 + radius: rect.radius; smooth: rect.smooth + } + } +} diff --git a/tests/auto/declarative/qmlvisual/rect/data/GradientRect.0.png b/tests/auto/declarative/qmlvisual/rect/data/GradientRect.0.png new file mode 100644 index 00000000..2ca5d282 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/rect/data/GradientRect.0.png differ diff --git a/tests/auto/declarative/qmlvisual/rect/data/GradientRect.qml b/tests/auto/declarative/qmlvisual/rect/data/GradientRect.qml new file mode 100644 index 00000000..116ab2ae --- /dev/null +++ b/tests/auto/declarative/qmlvisual/rect/data/GradientRect.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "GradientRect.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/rect/data/MyRect.0.png b/tests/auto/declarative/qmlvisual/rect/data/MyRect.0.png new file mode 100644 index 00000000..3eb9a8d5 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/rect/data/MyRect.0.png differ diff --git a/tests/auto/declarative/qmlvisual/rect/data/MyRect.qml b/tests/auto/declarative/qmlvisual/rect/data/MyRect.qml new file mode 100644 index 00000000..72141c83 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/rect/data/MyRect.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "MyRect.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/rect/data/rect-painting.0.png b/tests/auto/declarative/qmlvisual/rect/data/rect-painting.0.png new file mode 100644 index 00000000..3556dce1 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/rect/data/rect-painting.0.png differ diff --git a/tests/auto/declarative/qmlvisual/rect/data/rect-painting.qml b/tests/auto/declarative/qmlvisual/rect/data/rect-painting.qml new file mode 100644 index 00000000..9fc073ca --- /dev/null +++ b/tests/auto/declarative/qmlvisual/rect/data/rect-painting.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "rect-painting.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/rect/rect-painting.qml b/tests/auto/declarative/qmlvisual/rect/rect-painting.qml new file mode 100644 index 00000000..2de414db --- /dev/null +++ b/tests/auto/declarative/qmlvisual/rect/rect-painting.qml @@ -0,0 +1,55 @@ +import QtQuick 1.0 + +Rectangle { + width: 450; height: 250 + color: "white" + + Rectangle { + anchors.top: parent.verticalCenter + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + color: "#eeeeee" + } + + Grid { + anchors.centerIn: parent + columns: 8; rows:4; spacing: 15 + + MyRect { color: "lightsteelblue" } + MyRect { color: "lightsteelblue"; border: "gray" } + MyRect { color: "lightsteelblue"; radius: 10 } + MyRect { color: "lightsteelblue"; radius: 10; border: "gray" } + GradientRect { color: "lightsteelblue" } + GradientRect { color: "lightsteelblue"; border: "gray" } + GradientRect { color: "lightsteelblue"; radius: 10 } + GradientRect { color: "lightsteelblue"; radius: 10; border: "gray" } + + MyRect { color: "thistle"; rotation: 10 } + MyRect { color: "thistle"; border: "gray"; rotation: 10 } + MyRect { color: "thistle"; radius: 10; rotation: 10 } + MyRect { color: "thistle"; radius: 10; border: "gray"; rotation: 10 } + GradientRect { color: "thistle"; rotation: 10 } + GradientRect { color: "thistle"; border: "gray"; rotation: 10 } + GradientRect { color: "thistle"; radius: 10; rotation: 10 } + GradientRect { color: "thistle"; radius: 10; border: "gray"; rotation: 10 } + + MyRect { color: "lightsteelblue"; smooth: true } + MyRect { color: "lightsteelblue"; border: "gray"; smooth: true } + MyRect { color: "lightsteelblue"; radius: 10; smooth: true } + MyRect { color: "lightsteelblue"; radius: 10; border: "gray"; smooth: true } + GradientRect { color: "lightsteelblue"; smooth: true } + GradientRect { color: "lightsteelblue"; border: "gray"; smooth: true } + GradientRect { color: "lightsteelblue"; radius: 10; smooth: true } + GradientRect { color: "lightsteelblue"; radius: 10; border: "gray"; smooth: true } + + MyRect { color: "thistle"; rotation: 10; smooth: true } + MyRect { color: "thistle"; border: "gray"; rotation: 10; smooth: true } + MyRect { color: "thistle"; radius: 10; rotation: 10; smooth: true } + MyRect { color: "thistle"; radius: 10; border: "gray"; rotation: 10; smooth: true } + GradientRect { color: "thistle"; rotation: 10; smooth: true } + GradientRect { color: "thistle"; border: "gray"; rotation: 10; smooth: true } + GradientRect { color: "thistle"; radius: 10; rotation: 10; smooth: true } + GradientRect { color: "thistle"; radius: 10; border: "gray"; rotation: 10; smooth: true } + } +} diff --git a/tests/auto/declarative/qmlvisual/repeater/basic1.qml b/tests/auto/declarative/qmlvisual/repeater/basic1.qml new file mode 100644 index 00000000..5d994b96 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/repeater/basic1.qml @@ -0,0 +1,31 @@ +import QtQuick 1.0 + +Rectangle { + color: "white" + width: 120 + height: 240 + id: page + Column{ + Repeater{ + delegate: Rectangle { + color: "thistle" + width: 100 + height: 100 + Rectangle { + anchors.centerIn: parent + width: 60 + height: 60 + color: name + } + } + model: ListModel { + ListElement { + name: "palegoldenrod" + } + ListElement { + name: "lightsteelblue" + } + } + } + } +} diff --git a/tests/auto/declarative/qmlvisual/repeater/basic2.qml b/tests/auto/declarative/qmlvisual/repeater/basic2.qml new file mode 100644 index 00000000..ea14e92e --- /dev/null +++ b/tests/auto/declarative/qmlvisual/repeater/basic2.qml @@ -0,0 +1,35 @@ +import QtQuick 1.0 + +Rectangle { + color: "white" + width: 120 + height: 240 + id: page + Component { + id: delegate + Rectangle { + color: "thistle" + width: 100 + height: 100 + Rectangle { + anchors.centerIn: parent + width: 60 + height: 60 + color: name + } + } + } + Column{ + Repeater{ + delegate: delegate + model: ListModel { + ListElement { + name: "palegoldenrod" + } + ListElement { + name: "lightsteelblue" + } + } + } + } +} diff --git a/tests/auto/declarative/qmlvisual/repeater/basic3.qml b/tests/auto/declarative/qmlvisual/repeater/basic3.qml new file mode 100644 index 00000000..0193db30 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/repeater/basic3.qml @@ -0,0 +1,33 @@ +import QtQuick 1.0 + +Rectangle { + color: "white" + width: 120 + height: 240 + id: page + ListModel { + id: model + ListElement { + name: "palegoldenrod" + } + ListElement { + name: "lightsteelblue" + } + } + Column{ + Repeater{ + model: model + delegate: Rectangle { + color: "thistle" + width: 100 + height: 100 + Rectangle { + anchors.centerIn: parent + width: 60 + height: 60 + color: name + } + } + } + } +} diff --git a/tests/auto/declarative/qmlvisual/repeater/basic4.qml b/tests/auto/declarative/qmlvisual/repeater/basic4.qml new file mode 100644 index 00000000..c7c0d296 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/repeater/basic4.qml @@ -0,0 +1,37 @@ +import QtQuick 1.0 + +Rectangle { + color: "white" + width: 120 + height: 240 + id: page + ListModel { + id: model + ListElement { + name: "palegoldenrod" + } + ListElement { + name: "lightsteelblue" + } + } + Component { + id: delegate + Rectangle { + color: "thistle" + width: 100 + height: 100 + Rectangle { + anchors.centerIn: parent + width: 60 + height: 60 + color: name + } + } + } + Column{ + Repeater{ + model: model + delegate: delegate + } + } +} diff --git a/tests/auto/declarative/qmlvisual/repeater/data/basic1.0.png b/tests/auto/declarative/qmlvisual/repeater/data/basic1.0.png new file mode 100644 index 00000000..3e8043a6 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/repeater/data/basic1.0.png differ diff --git a/tests/auto/declarative/qmlvisual/repeater/data/basic1.qml b/tests/auto/declarative/qmlvisual/repeater/data/basic1.qml new file mode 100644 index 00000000..aad4858c --- /dev/null +++ b/tests/auto/declarative/qmlvisual/repeater/data/basic1.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "basic1.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/repeater/data/basic2.0.png b/tests/auto/declarative/qmlvisual/repeater/data/basic2.0.png new file mode 100644 index 00000000..3e8043a6 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/repeater/data/basic2.0.png differ diff --git a/tests/auto/declarative/qmlvisual/repeater/data/basic2.qml b/tests/auto/declarative/qmlvisual/repeater/data/basic2.qml new file mode 100644 index 00000000..373ad27c --- /dev/null +++ b/tests/auto/declarative/qmlvisual/repeater/data/basic2.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "basic2.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/repeater/data/basic3.0.png b/tests/auto/declarative/qmlvisual/repeater/data/basic3.0.png new file mode 100644 index 00000000..3e8043a6 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/repeater/data/basic3.0.png differ diff --git a/tests/auto/declarative/qmlvisual/repeater/data/basic3.qml b/tests/auto/declarative/qmlvisual/repeater/data/basic3.qml new file mode 100644 index 00000000..f5dbf65a --- /dev/null +++ b/tests/auto/declarative/qmlvisual/repeater/data/basic3.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "basic3.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/repeater/data/basic4.0.png b/tests/auto/declarative/qmlvisual/repeater/data/basic4.0.png new file mode 100644 index 00000000..3e8043a6 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/repeater/data/basic4.0.png differ diff --git a/tests/auto/declarative/qmlvisual/repeater/data/basic4.qml b/tests/auto/declarative/qmlvisual/repeater/data/basic4.qml new file mode 100644 index 00000000..5e494d13 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/repeater/data/basic4.qml @@ -0,0 +1,11 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "basic4.0.png" + } +} diff --git a/tests/auto/declarative/qmlvisual/selftest_noimages/data/selftest_noimages.qml b/tests/auto/declarative/qmlvisual/selftest_noimages/data/selftest_noimages.qml new file mode 100644 index 00000000..ccadea0d --- /dev/null +++ b/tests/auto/declarative/qmlvisual/selftest_noimages/data/selftest_noimages.qml @@ -0,0 +1,356 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + } + Frame { + msec: 32 + } + Frame { + msec: 48 + } + Frame { + msec: 64 + } + Frame { + msec: 80 + } + Frame { + msec: 96 + } + Frame { + msec: 112 + } + Frame { + msec: 128 + } + Frame { + msec: 144 + } + Frame { + msec: 160 + } + Frame { + msec: 176 + } + Frame { + msec: 192 + } + Frame { + msec: 208 + } + Frame { + msec: 224 + } + Frame { + msec: 240 + } + Frame { + msec: 256 + } + Frame { + msec: 272 + } + Frame { + msec: 288 + } + Frame { + msec: 304 + } + Frame { + msec: 320 + } + Frame { + msec: 336 + } + Frame { + msec: 352 + } + Frame { + msec: 368 + } + Frame { + msec: 384 + } + Frame { + msec: 400 + } + Frame { + msec: 416 + } + Frame { + msec: 432 + } + Frame { + msec: 448 + } + Frame { + msec: 464 + } + Frame { + msec: 480 + } + Frame { + msec: 496 + } + Frame { + msec: 512 + } + Frame { + msec: 528 + } + Frame { + msec: 544 + } + Frame { + msec: 560 + } + Frame { + msec: 576 + } + Frame { + msec: 592 + } + Frame { + msec: 608 + } + Frame { + msec: 624 + } + Frame { + msec: 640 + } + Frame { + msec: 656 + } + Frame { + msec: 672 + } + Frame { + msec: 688 + } + Frame { + msec: 704 + } + Frame { + msec: 720 + } + Frame { + msec: 736 + } + Frame { + msec: 752 + } + Frame { + msec: 768 + } + Frame { + msec: 784 + } + Frame { + msec: 800 + } + Frame { + msec: 816 + } + Frame { + msec: 832 + } + Frame { + msec: 848 + } + Frame { + msec: 864 + } + Frame { + msec: 880 + } + Frame { + msec: 896 + } + Frame { + msec: 912 + } + Frame { + msec: 928 + } + Frame { + msec: 944 + } + Frame { + msec: 960 + } + Frame { + msec: 976 + } + Frame { + msec: 992 + } + Frame { + msec: 1008 + } + Frame { + msec: 1024 + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 53; y: 47 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1040 + } + Frame { + msec: 1056 + } + Frame { + msec: 1072 + } + Frame { + msec: 1088 + } + Frame { + msec: 1104 + } + Frame { + msec: 1120 + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 53; y: 47 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1136 + } + Frame { + msec: 1152 + } + Frame { + msec: 1168 + } + Frame { + msec: 1184 + } + Frame { + msec: 1200 + } + Frame { + msec: 1216 + } + Frame { + msec: 1232 + } + Frame { + msec: 1248 + } + Frame { + msec: 1264 + } + Frame { + msec: 1280 + } + Frame { + msec: 1296 + } + Frame { + msec: 1312 + } + Frame { + msec: 1328 + } + Frame { + msec: 1344 + } + Frame { + msec: 1360 + } + Frame { + msec: 1376 + } + Frame { + msec: 1392 + } + Frame { + msec: 1408 + } + Frame { + msec: 1424 + } + Frame { + msec: 1440 + } + Frame { + msec: 1456 + } + Frame { + msec: 1472 + } + Frame { + msec: 1488 + } + Frame { + msec: 1504 + } + Frame { + msec: 1520 + } + Frame { + msec: 1536 + } + Frame { + msec: 1552 + } + Frame { + msec: 1568 + } + Frame { + msec: 1584 + } + Frame { + msec: 1600 + } + Frame { + msec: 1616 + } + Frame { + msec: 1632 + } + Frame { + msec: 1648 + } + Frame { + msec: 1664 + } + Frame { + msec: 1680 + } + Frame { + msec: 1696 + } + Frame { + msec: 1712 + } + Frame { + msec: 1728 + } + Frame { + msec: 1744 + } + Frame { + msec: 1760 + } + Frame { + msec: 1776 + } +} diff --git a/tests/auto/declarative/qmlvisual/selftest_noimages/selftest_noimages.qml b/tests/auto/declarative/qmlvisual/selftest_noimages/selftest_noimages.qml new file mode 100644 index 00000000..3ef2a663 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/selftest_noimages/selftest_noimages.qml @@ -0,0 +1,9 @@ +import QtQuick 1.0 +Text { + property string error: "not pressed" + text: (new Date()).valueOf() + MouseArea { + anchors.fill: parent + onPressed: error="" + } +} diff --git a/tests/auto/declarative/qmlvisual/shared/DejaVuSansMono.ttf b/tests/auto/declarative/qmlvisual/shared/DejaVuSansMono.ttf new file mode 100644 index 00000000..029fcac3 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/shared/DejaVuSansMono.ttf differ diff --git a/tests/auto/declarative/qmlvisual/shared/README b/tests/auto/declarative/qmlvisual/shared/README new file mode 100644 index 00000000..56a88ae5 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/shared/README @@ -0,0 +1,7 @@ +These components provide a standard set of what would otherwise be system dependant settings. These are +-default font +-default fontSize +-cursor blink time (unblinking cursor) + +This should probably be replaced with a Test Style/Theme once QtComponents is done. +Note that having multiple font loaders is probably quite inefficient, so don't use these for performance tests. diff --git a/tests/auto/declarative/qmlvisual/shared/TestText.qml b/tests/auto/declarative/qmlvisual/shared/TestText.qml new file mode 100644 index 00000000..ab624c31 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/shared/TestText.qml @@ -0,0 +1,8 @@ +import QtQuick 1.0 +import "../shared" 1.0 + +Text{ + FontLoader { id: fixedFont; source: "DejaVuSansMono.ttf" } + font.family: fixedFont.name + font.pixelSize: 12 +} diff --git a/tests/auto/declarative/qmlvisual/shared/TestTextEdit.qml b/tests/auto/declarative/qmlvisual/shared/TestTextEdit.qml new file mode 100644 index 00000000..e7c5bc1b --- /dev/null +++ b/tests/auto/declarative/qmlvisual/shared/TestTextEdit.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 +import "../shared" 1.0 + +TextEdit { + id: edit + FontLoader { id: fixedFont; source: "DejaVuSansMono.ttf" } + font.family: fixedFont.name + font.pixelSize: 12 + cursorDelegate: Rectangle { + width: 1; + color: "black"; + visible: edit.cursorVisible + } +} diff --git a/tests/auto/declarative/qmlvisual/shared/TestTextInput.qml b/tests/auto/declarative/qmlvisual/shared/TestTextInput.qml new file mode 100644 index 00000000..64938e04 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/shared/TestTextInput.qml @@ -0,0 +1,14 @@ +import QtQuick 1.0 +import "../shared" 1.0 + +TextInput { + id: inp + FontLoader { id: fixedFont; source: "DejaVuSansMono.ttf" } + font.family: fixedFont.name + font.pixelSize: 12 + cursorDelegate: Rectangle { + width: 1; + color: "black"; + visible: parent.cursorVisible//bug that 'inp' doesn't seem to work? + } +} diff --git a/tests/auto/declarative/qmlvisual/shared/qmldir b/tests/auto/declarative/qmlvisual/shared/qmldir new file mode 100644 index 00000000..4aebb393 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/shared/qmldir @@ -0,0 +1,3 @@ +TestText 1.0 TestText.qml +TestTextEdit 1.0 TestTextEdit.qml +TestTextInput 1.0 TestTextInput.qml diff --git a/tests/auto/declarative/qmlvisual/tst_qmlvisual.cpp b/tests/auto/declarative/qmlvisual/tst_qmlvisual.cpp new file mode 100644 index 00000000..3d59b177 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/tst_qmlvisual.cpp @@ -0,0 +1,422 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +#define QT_TEST_SOURCE_DIR "." +#endif + +enum Mode { Record, RecordNoVisuals, RecordSnapshot, Play, TestVisuals, RemoveVisuals, UpdateVisuals, UpdatePlatformVisuals, Test }; + +static QString testdir; +class tst_qmlvisual : public QObject +{ + Q_OBJECT +public: + tst_qmlvisual(); + + static QString toTestScript(const QString &, Mode=Test); + static QString viewer(); + + static QStringList findQmlFiles(const QDir &d); +private slots: + void visual_data(); + void visual(); + +private: + QString qmlruntime; +}; + + +tst_qmlvisual::tst_qmlvisual() +{ + qmlruntime = viewer(); +} + +QString tst_qmlvisual::viewer() +{ + QString binaries = QLibraryInfo::location(QLibraryInfo::BinariesPath); + + QString qmlruntime; + +#if defined(Q_WS_MAC) + qmlruntime = QDir(binaries).absoluteFilePath("QMLViewer.app/Contents/MacOS/QMLViewer"); +#elif defined(Q_WS_WIN) || defined(Q_WS_S60) + qmlruntime = QDir(binaries).absoluteFilePath("qmlviewer.exe"); +#else + qmlruntime = QDir(binaries).absoluteFilePath("qmlviewer"); +#endif + + return qmlruntime; +} + +void tst_qmlvisual::visual_data() +{ + QTest::addColumn("file"); + QTest::addColumn("testdata"); + + QStringList files; + files << findQmlFiles(QDir(QT_TEST_SOURCE_DIR)); + if (qgetenv("QMLVISUAL_ALL") != "1") { +#if defined(Q_WS_MAC) + //Text on Mac varies per version. Only check the text on 10.6 + if(QSysInfo::MacintoshVersion != QSysInfo::MV_10_6) + foreach(const QString &str, files.filter(QRegExp(".*text.*"))) + files.removeAll(str); +#endif +#if defined(Q_WS_QWS) + //We don't want QWS test results to mire down the CI system + files.clear(); + //Needs at least one test data or it fails anyways + files << QT_TEST_SOURCE_DIR "/selftest_noimages/selftest_noimages.qml"; +#endif + } + + foreach (const QString &file, files) { + QString testdata = toTestScript(file); + if (testdata.isEmpty()) + continue; + + QTest::newRow(file.toLatin1().constData()) << file << testdata; + } +} + +void tst_qmlvisual::visual() +{ + QFETCH(QString, file); + QFETCH(QString, testdata); + + QStringList arguments; +#ifdef Q_WS_MAC + arguments << "-no-opengl"; +#endif + arguments << "-script" << testdata + << "-scriptopts" << "play,testimages,testerror,testskip,exitoncomplete,exitonfailure" + << file; +#ifdef Q_WS_QWS + arguments << "-qws"; +#endif + + QProcess p; + p.start(qmlruntime, arguments); + bool finished = p.waitForFinished(); + QByteArray output = p.readAllStandardOutput() + p.readAllStandardError(); + QVERIFY2(finished, output.data()); + if (p.exitCode() != 0) + qDebug() << output; + QCOMPARE(p.exitStatus(), QProcess::NormalExit); + QCOMPARE(p.exitCode(), 0); +} + +QString tst_qmlvisual::toTestScript(const QString &file, Mode mode) +{ + if (!file.endsWith(".qml")) + return QString(); + + int index = file.lastIndexOf(QDir::separator()); + if (index == -1) + index = file.lastIndexOf('/'); + if (index == -1) + return QString(); + + const char* platformsuffix=0; // platforms with different fonts +#if defined(Q_WS_MACX) + platformsuffix = "-MAC"; +#elif defined(Q_WS_X11) + platformsuffix = "-X11"; +#elif defined(Q_WS_WIN32) + platformsuffix = "-WIN"; +#elif defined(Q_WS_QWS) + platformsuffix = "-QWS"; +#elif defined(Q_WS_S60) + platformsuffix = "-S60"; +#endif + + QString testdata = file.left(index + 1) + + QString("data"); + QString testname = file.mid(index + 1, file.length() - index - 5); + + if (platformsuffix && (mode == UpdatePlatformVisuals || QFile::exists(testdata+QLatin1String(platformsuffix)+QDir::separator()+testname+".qml"))) { + QString platformdir = testdata + QLatin1String(platformsuffix); + if (mode == UpdatePlatformVisuals) { + if (!QDir().mkpath(platformdir)) { + qFatal("Cannot make path %s", qPrintable(platformdir)); + } + // Copy from base + QDir dir(testdata,testname+".*"); + dir.setFilter(QDir::Files); + QFileInfoList list = dir.entryInfoList(); + for (int i = 0; i < list.size(); ++i) { + QFile in(list.at(i).filePath()); + if (!in.open(QIODevice::ReadOnly)) { + qFatal("Cannot open file %s: %s", qPrintable(in.fileName()), qPrintable(in.errorString())); + } + QFile out(platformdir + QDir::separator() + list.at(i).fileName()); + if (!out.open(QIODevice::WriteOnly)) { + qFatal("Cannot open file %s: %s", qPrintable(out.fileName()), qPrintable(out.errorString())); + } + out.write(in.readAll()); + } + } + testdata = platformdir; + } + + testdata += QDir::separator() + testname; + + return testdata; +} + +QStringList tst_qmlvisual::findQmlFiles(const QDir &d) +{ + QStringList rv; + + QStringList files = d.entryList(QStringList() << QLatin1String("*.qml"), + QDir::Files); + foreach (const QString &file, files) { + if (file.at(0).isLower()) { + rv << d.absoluteFilePath(file); + } + } + + QStringList dirs = d.entryList(QDir::Dirs | QDir::NoDotAndDotDot | + QDir::NoSymLinks); + foreach (const QString &dir, dirs) { + if (dir.left(4) == "data") + continue; + + QDir sub = d; + sub.cd(dir); + rv << findQmlFiles(sub); + } + + return rv; +} + +void action(Mode mode, const QString &file) +{ + QString testdata = tst_qmlvisual::toTestScript(file,mode); + + QStringList arguments; +#ifdef Q_WS_MAC + arguments << "-no-opengl"; +#endif + switch (mode) { + case Test: + // Don't run qml + break; + case Record: + arguments << "-script" << testdata + << "-scriptopts" << "record,testimages,saveonexit" + << file; + break; + case RecordNoVisuals: + arguments << "-script" << testdata + << "-scriptopts" << "record,saveonexit" + << file; + break; + case RecordSnapshot: + arguments << "-script" << testdata + << "-scriptopts" << "record,testimages,snapshot,saveonexit" + << file; + break; + case Play: + arguments << "-script" << testdata + << "-scriptopts" << "play,testimages,testerror,testskip,exitoncomplete" + << file; + break; + case TestVisuals: + arguments << "-script" << testdata + << "-scriptopts" << "play" + << file; + break; + case UpdateVisuals: + case UpdatePlatformVisuals: + arguments << "-script" << testdata + << "-scriptopts" << "play,record,testimages,exitoncomplete,saveonexit" + << file; + break; + case RemoveVisuals: + arguments << "-script" << testdata + << "-scriptopts" << "play,record,exitoncomplete,saveonexit" + << file; + break; + } + if (!arguments.isEmpty()) { + QProcess p; + p.setProcessChannelMode(QProcess::ForwardedChannels); + p.start(tst_qmlvisual::viewer(), arguments); + p.waitForFinished(); + } +} + +void usage() +{ + fprintf(stderr, "\n"); + fprintf(stderr, "QML related options\n"); + fprintf(stderr, " -listtests : list all the tests seen by tst_qmlvisual, and then exit immediately\n"); + fprintf(stderr, " -record file : record new test data for file\n"); + fprintf(stderr, " -recordnovisuals file : record new test data for file, but ignore visuals\n"); + fprintf(stderr, " -recordsnapshot file : record new snapshot for file (like record but only records a single frame and then exits)\n"); + fprintf(stderr, " -play file : playback test data for file, printing errors\n"); + fprintf(stderr, " -testvisuals file : playback test data for file, without errors\n"); + fprintf(stderr, " -updatevisuals file : playback test data for file, accept new visuals for file\n"); + fprintf(stderr, " -updateplatformvisuals file : playback test data for file, accept new visuals for file only on current platform (MacOSX/Win32/X11/QWS/S60)\n"); + fprintf(stderr, "\n" + "Visual tests are recordings of manual interactions with a QML test,\n" + "that can then be run automatically. To record a new test, run:\n" + "\n" + " tst_qmlvisual -record yourtestdir/yourtest.qml\n" + "\n" + "This records everything you do (try to keep it short).\n" + "To play back a test, run:\n" + "\n" + " tst_qmlvisual -play yourtestdir/yourtest.qml\n" + "\n" + "Your test may include QML code to test itself, reporting any error to an\n" + "'error' property on the root object - the test will fail if this property\n" + "gets set to anything non-empty.\n" + "\n" + "If your test changes slightly but is still correct (check with -play), you\n" + "can update the visuals by running:\n" + "\n" + " tst_qmlvisual -updatevisuals yourtestdir/yourtest.qml\n" + "\n" + "If your test includes platform-sensitive visuals (eg. text in system fonts),\n" + "you should create platform-specific visuals, using -updateplatformvisuals\n" + "instead.\n" + "\n" + "If you ONLY wish to use the 'error' property, you can record your test with\n" + "-recordnovisuals, or discard existing visuals with -removevisuals; the test\n" + "will then only fail on a syntax error, crash, or non-empty 'error' property.\n" + "\n" + "If your test has anything set to the 'skip' property on the root object then\n" + "test failures will be ignored. This allows for an opt-out of automated\n" + "aggregation of test results. The value of the 'skip' property (usually a\n" + "string) will then be printed to stdout when the test is run as part of the\n" + "message saying the test has been skipped.\n" + ); +} + +int main(int argc, char **argv) +{ + QApplication app(argc, argv); + + Mode mode = Test; + QString file; + bool showHelp = false; + + int newArgc = 1; + char **newArgv = new char*[argc]; + newArgv[0] = argv[0]; + + for (int ii = 1; ii < argc; ++ii) { + QString arg(argv[ii]); + if (arg == "-play" && (ii + 1) < argc) { + mode = Play; + file = argv[++ii]; + } else if (arg == "-record" && (ii + 1) < argc) { + mode = Record; + file = argv[++ii]; + } else if (arg == "-recordnovisuals" && (ii + 1) < argc) { + mode = RecordNoVisuals; + file = argv[++ii]; + } else if (arg == "-recordsnapshot" && (ii + 1) < argc) { + mode = RecordSnapshot; + file = argv[++ii]; + } else if (arg == "-testvisuals" && (ii + 1) < argc) { + mode = TestVisuals; + file = argv[++ii]; + } else if (arg == "-removevisuals" && (ii + 1) < argc) { + mode = RemoveVisuals; + file = argv[++ii]; + } else if (arg == "-updatevisuals" && (ii + 1) < argc) { + mode = UpdateVisuals; + file = argv[++ii]; + } else if (arg == "-updateplatformvisuals" && (ii + 1) < argc) { + mode = UpdatePlatformVisuals; + file = argv[++ii]; + } else { + newArgv[newArgc++] = argv[ii]; + } + + if (arg == "-help" || arg == "-?" || arg == "--help") { + atexit(usage); + showHelp = true; + } + + if (arg == "-listtests") { + QStringList list = tst_qmlvisual::findQmlFiles(QDir(QT_TEST_SOURCE_DIR)); + foreach (QString test, list) { + qWarning() << qPrintable(test); + } + return 0; + } + } + + if (mode == Test || showHelp) { + tst_qmlvisual tc; + return QTest::qExec(&tc, newArgc, newArgv); + } else { + if (!file.endsWith(QLatin1String(".qml"))) { + qWarning() << "Error: Invalid file name (must end in .qml)"; + return -1; + } + QDir d = QDir::current(); + QString absFile = d.absoluteFilePath(file); + if (!QFile::exists(absFile)) { + qWarning() << "Error: File does not exist"; + return -1; + } + + action(mode, absFile); + return 0; + } +} + +#include "tst_qmlvisual.moc" diff --git a/tests/auto/declarative/qmlvisual/webview/autosize/autosize.qml b/tests/auto/declarative/qmlvisual/webview/autosize/autosize.qml new file mode 100644 index 00000000..1cd0c7b5 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/webview/autosize/autosize.qml @@ -0,0 +1,62 @@ +import QtQuick 1.0 +import QtWebKit 1.0 + +// The WebView size is determined by the width, height, +// preferredWidth, and preferredHeight properties. +Rectangle { + property string skip: "WebView tests not counting until resources allocated to WebView maintenance" + id: rect + color: "white" + width: 200 + height: layout.height + Column { + id: layout + spacing: 2 + WebView { + html: "No width defined." + Rectangle { color: "#10000000" + anchors.fill: parent + } + } + WebView { + width: rect.width + html: "The width is full." + Rectangle { + color: "#10000000" + anchors.fill: parent + } + } + WebView { + width: rect.width/2 + html: "The width is half." + Rectangle { + color: "#10000000" + anchors.fill: parent + } + } + WebView { + preferredWidth: rect.width/2 + html: "The preferredWidth is half." + Rectangle { + color: "#10000000" + anchors.fill: parent + } + } + WebView { + preferredWidth: rect.width/2 + html: "The_preferredWidth_is_half." + Rectangle { + color: "#10000000" + anchors.fill: parent + } + } + WebView { + width: rect.width/2 + html: "The_width_is_half." + Rectangle { + color: "#10000000" + anchors.fill: parent + } + } + } +} diff --git a/tests/auto/declarative/qmlvisual/webview/autosize/data-X11/autosize.0.png b/tests/auto/declarative/qmlvisual/webview/autosize/data-X11/autosize.0.png new file mode 100644 index 00000000..ed87174d Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/autosize/data-X11/autosize.0.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/autosize/data-X11/autosize.1.png b/tests/auto/declarative/qmlvisual/webview/autosize/data-X11/autosize.1.png new file mode 100644 index 00000000..ed87174d Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/autosize/data-X11/autosize.1.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/autosize/data-X11/autosize.2.png b/tests/auto/declarative/qmlvisual/webview/autosize/data-X11/autosize.2.png new file mode 100644 index 00000000..ed87174d Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/autosize/data-X11/autosize.2.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/autosize/data-X11/autosize.3.png b/tests/auto/declarative/qmlvisual/webview/autosize/data-X11/autosize.3.png new file mode 100644 index 00000000..ed87174d Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/autosize/data-X11/autosize.3.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/autosize/data-X11/autosize.4.png b/tests/auto/declarative/qmlvisual/webview/autosize/data-X11/autosize.4.png new file mode 100644 index 00000000..ed87174d Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/autosize/data-X11/autosize.4.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/autosize/data/autosize.0.png b/tests/auto/declarative/qmlvisual/webview/autosize/data/autosize.0.png new file mode 100644 index 00000000..ed87174d Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/autosize/data/autosize.0.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/autosize/data/autosize.1.png b/tests/auto/declarative/qmlvisual/webview/autosize/data/autosize.1.png new file mode 100644 index 00000000..ed87174d Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/autosize/data/autosize.1.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/autosize/data/autosize.2.png b/tests/auto/declarative/qmlvisual/webview/autosize/data/autosize.2.png new file mode 100644 index 00000000..ed87174d Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/autosize/data/autosize.2.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/autosize/data/autosize.3.png b/tests/auto/declarative/qmlvisual/webview/autosize/data/autosize.3.png new file mode 100644 index 00000000..ed87174d Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/autosize/data/autosize.3.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/autosize/data/autosize.4.png b/tests/auto/declarative/qmlvisual/webview/autosize/data/autosize.4.png new file mode 100644 index 00000000..ed87174d Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/autosize/data/autosize.4.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/autosize/data/autosize.qml b/tests/auto/declarative/qmlvisual/webview/autosize/data/autosize.qml new file mode 100644 index 00000000..61221387 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/webview/autosize/data/autosize.qml @@ -0,0 +1,115 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + hash: "b2d863e57dee2a297d038e18acc70f92" + } + Frame { + msec: 32 + hash: "903a4c7e619abba5342c8c827f26a722" + } + Frame { + msec: 48 + hash: "903a4c7e619abba5342c8c827f26a722" + } + Frame { + msec: 64 + hash: "903a4c7e619abba5342c8c827f26a722" + } + Frame { + msec: 80 + hash: "903a4c7e619abba5342c8c827f26a722" + } + Frame { + msec: 96 + hash: "903a4c7e619abba5342c8c827f26a722" + } + Frame { + msec: 112 + hash: "903a4c7e619abba5342c8c827f26a722" + } + Frame { + msec: 128 + hash: "903a4c7e619abba5342c8c827f26a722" + } + Frame { + msec: 144 + hash: "903a4c7e619abba5342c8c827f26a722" + } + Frame { + msec: 160 + hash: "903a4c7e619abba5342c8c827f26a722" + } + Frame { + msec: 176 + hash: "903a4c7e619abba5342c8c827f26a722" + } + Frame { + msec: 192 + hash: "903a4c7e619abba5342c8c827f26a722" + } + Frame { + msec: 208 + hash: "903a4c7e619abba5342c8c827f26a722" + } + Frame { + msec: 224 + hash: "903a4c7e619abba5342c8c827f26a722" + } + Frame { + msec: 240 + hash: "903a4c7e619abba5342c8c827f26a722" + } + Frame { + msec: 256 + hash: "903a4c7e619abba5342c8c827f26a722" + } + Frame { + msec: 272 + hash: "903a4c7e619abba5342c8c827f26a722" + } + Frame { + msec: 288 + hash: "903a4c7e619abba5342c8c827f26a722" + } + Frame { + msec: 304 + hash: "903a4c7e619abba5342c8c827f26a722" + } + Frame { + msec: 320 + hash: "903a4c7e619abba5342c8c827f26a722" + } + Frame { + msec: 336 + hash: "903a4c7e619abba5342c8c827f26a722" + } + Frame { + msec: 352 + hash: "903a4c7e619abba5342c8c827f26a722" + } + Frame { + msec: 368 + hash: "903a4c7e619abba5342c8c827f26a722" + } + Frame { + msec: 384 + hash: "903a4c7e619abba5342c8c827f26a722" + } + Frame { + msec: 400 + hash: "903a4c7e619abba5342c8c827f26a722" + } + Frame { + msec: 416 + hash: "903a4c7e619abba5342c8c827f26a722" + } + Frame { + msec: 432 + hash: "903a4c7e619abba5342c8c827f26a722" + } +} diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.0.png b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.0.png new file mode 100644 index 00000000..513aab69 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.0.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.1.png b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.1.png new file mode 100644 index 00000000..513aab69 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.1.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.10.png b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.10.png new file mode 100644 index 00000000..bb22d01d Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.10.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.2.png b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.2.png new file mode 100644 index 00000000..1357551f Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.2.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.3.png b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.3.png new file mode 100644 index 00000000..513aab69 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.3.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.4.png b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.4.png new file mode 100644 index 00000000..bb22d01d Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.4.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.5.png b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.5.png new file mode 100644 index 00000000..bb22d01d Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.5.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.6.png b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.6.png new file mode 100644 index 00000000..c61ae3fd Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.6.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.7.png b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.7.png new file mode 100644 index 00000000..bb22d01d Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.7.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.8.png b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.8.png new file mode 100644 index 00000000..bb22d01d Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.8.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.9.png b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.9.png new file mode 100644 index 00000000..bb22d01d Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.9.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.qml b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.qml new file mode 100644 index 00000000..c248167f --- /dev/null +++ b/tests/auto/declarative/qmlvisual/webview/flickable/data/flickweb.qml @@ -0,0 +1,6083 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + image: "flickweb.0.png" + } + Frame { + msec: 32 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 48 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 64 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 80 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 96 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 112 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 128 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 144 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 160 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 176 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 192 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 208 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 224 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 240 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 256 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 272 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 288 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 304 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 320 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 336 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 352 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 368 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 384 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 400 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 416 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 432 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 448 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 464 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 480 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 496 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 512 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 528 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 544 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 0; y: 7 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 0; y: 7 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 560 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 12; y: 10 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 576 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 15; y: 11 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 592 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 608 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 624 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 640 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 12; y: 10 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 11; y: 10 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 656 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 9; y: 10 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 672 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 688 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 9; y: 11 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 704 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 9; y: 12 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 9; y: 15 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 720 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 9; y: 18 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 12; y: 24 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 736 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 14; y: 28 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 18; y: 35 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 752 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 19; y: 39 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 22; y: 43 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 768 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 22; y: 44 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 23; y: 44 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 784 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 800 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 23; y: 43 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 816 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 24; y: 45 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 832 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 26; y: 47 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 28; y: 49 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 848 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 29; y: 51 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 32; y: 55 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 864 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 34; y: 57 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 36; y: 61 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 880 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 38; y: 62 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 41; y: 66 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 896 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 43; y: 68 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 48; y: 73 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 912 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 50; y: 76 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 57; y: 80 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 928 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 63; y: 85 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 66; y: 87 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 944 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 72; y: 91 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 74; y: 93 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 960 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 80; y: 97 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 82; y: 99 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 976 + image: "flickweb.1.png" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 86; y: 102 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 88; y: 103 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 992 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 91; y: 103 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 92; y: 104 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1008 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 1024 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 1040 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 92; y: 105 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1056 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 92; y: 106 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1072 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 92; y: 107 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 92; y: 108 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1088 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 92; y: 109 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1104 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 92; y: 110 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 92; y: 111 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1120 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 92; y: 112 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1136 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 92; y: 113 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 92; y: 114 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1152 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 92; y: 115 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 92; y: 116 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1168 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 92; y: 117 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1184 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 1200 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 92; y: 117 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1216 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 92; y: 116 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 92; y: 115 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1232 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 91; y: 112 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 91; y: 111 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1248 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 90; y: 107 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 90; y: 104 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1264 + hash: "e891b00cd44578b4a8e635ffe4c6d3fd" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 90; y: 101 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 89; y: 96 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1280 + hash: "61a543282ffb5e751ea1d97f0c95b208" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 89; y: 93 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 89; y: 85 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1296 + hash: "102e4b664bade46ab3bbb611acee22c9" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 89; y: 81 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 87; y: 70 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1312 + hash: "6bf42ac28a14db681442aeb7ed0c7610" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 85; y: 60 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 85; y: 60 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 84; y: 56 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1328 + hash: "ef531060d6b75cec8a6e3c01b3f69cc0" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 84; y: 51 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 84; y: 49 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1344 + hash: "e839af9d67f6214f0901977b3aa96d1a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 84; y: 46 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 84; y: 43 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1360 + hash: "b2d6b68f1f7229e8e65bb37e4c418a1b" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 84; y: 41 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 85; y: 39 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1376 + hash: "e4a562aa35aa532d15c9b129e22797bb" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 83; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1392 + hash: "029d347e9c99dd4a9cec5120ac7fc25e" + } + Frame { + msec: 1408 + hash: "3c16a74e18a59630f35511ab5514c769" + } + Frame { + msec: 1424 + hash: "5dc472d6c5198d5a628510bd45a61a11" + } + Frame { + msec: 1440 + hash: "430d60127ed59dbc5904647424ead40d" + } + Frame { + msec: 1456 + hash: "cb27cfcfbbb77b55c2a8bf7e51c0af07" + } + Frame { + msec: 1472 + hash: "46f2eb33b0e8316c4123ddbee2f60ae2" + } + Frame { + msec: 1488 + hash: "1df306111ca012c9f405018778c0a12b" + } + Frame { + msec: 1504 + hash: "1eafab8fd457ad9acda068344178b4a8" + } + Frame { + msec: 1520 + hash: "286656898100e53d6d7728b51ce93df5" + } + Frame { + msec: 1536 + hash: "e2a88f0ba3030a430028147930989bbb" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 84; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1552 + hash: "fb23cf265c4d253470c2515043bc5dd8" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 83; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1568 + hash: "1dba4f0e5e5948b7133725ea8bbef3e7" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 83; y: 37 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 84; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1584 + hash: "8578965c5ad012284e4e0a14a42da25e" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 84; y: 34 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1600 + hash: "3ef187decae08baa2ec92998c2cbb7f7" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 83; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1616 + hash: "4e0491128eac0bbfa7a131b1f18f243c" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 83; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1632 + hash: "c2d0799526e908204efbd3aa980e086c" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 83; y: 23 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1648 + hash: "cc87e09a6784d61680f8c6ab0d6a38fa" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 84; y: 22 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 85; y: 16 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1664 + hash: "13dec7e835b4f26970f98b66533f84f1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 85; y: 14 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1680 + hash: "e5d2862bee024b64326b7d85e5e45399" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 85; y: 12 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1696 + hash: "0b1401ce4a91811ac9c3eec5f94b380d" + } + Frame { + msec: 1712 + hash: "0de290542c9d3e03ed78f51423011c16" + } + Frame { + msec: 1728 + hash: "4c9aa06ad1e246b4b026742fc8cf37bc" + } + Frame { + msec: 1744 + hash: "c33003a8262c2ba25510ece181e61bc9" + } + Frame { + msec: 1760 + hash: "c33003a8262c2ba25510ece181e61bc9" + } + Frame { + msec: 1776 + hash: "ad184fa88c4299b8911c9b7ada5b3736" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 85; y: 12 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 85; y: 13 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 85; y: 15 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1792 + hash: "ad184fa88c4299b8911c9b7ada5b3736" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 85; y: 17 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 85; y: 23 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1808 + hash: "c2d0799526e908204efbd3aa980e086c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 85; y: 30 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 85; y: 34 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1824 + hash: "b343a9ed7e9740ec1725837fad766745" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 85; y: 41 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 85; y: 44 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1840 + hash: "b33260ad955474452f204ed5d468ef78" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 85; y: 51 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 86; y: 55 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1856 + hash: "9a647c54e378bd0ee35ef4164892722c" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 87; y: 61 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 88; y: 67 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 88; y: 67 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 89; y: 73 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1872 + hash: "dc553d1a7b678dffea41147fc6b841f6" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 89; y: 74 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 89; y: 78 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1888 + hash: "2d61b4fb1e5a8beb6e3c3cb53c21db42" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 89; y: 79 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 89; y: 82 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1904 + hash: "209faf0b20fd53d9a1c261c8cae9666f" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 90; y: 82 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 91; y: 83 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1920 + hash: "3497258aa07c76f0e31b5a492ee7e7cb" + } + Frame { + msec: 1936 + image: "flickweb.2.png" + } + Frame { + msec: 1952 + hash: "64c677ac4fea0e525279e86bf831d5d3" + } + Frame { + msec: 1968 + hash: "76c6c887fea94288e9fd975655e5181c" + } + Frame { + msec: 1984 + hash: "71b85e596c88b84a851a52aa3389e63a" + } + Frame { + msec: 2000 + hash: "e4a562aa35aa532d15c9b129e22797bb" + } + Frame { + msec: 2016 + hash: "148484dd95c88720cc5ef196334cb9a8" + } + Frame { + msec: 2032 + hash: "924c6254ffa1707b69174f49e4e95213" + } + Frame { + msec: 2048 + hash: "9e61907acedb27941d8be2befa364cfb" + } + Frame { + msec: 2064 + hash: "9e61907acedb27941d8be2befa364cfb" + } + Frame { + msec: 2080 + hash: "f2c4e99db1bb087a40b277ce8ce628f6" + } + Frame { + msec: 2096 + hash: "f2c4e99db1bb087a40b277ce8ce628f6" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 91; y: 82 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2112 + hash: "b2d6b68f1f7229e8e65bb37e4c418a1b" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 90; y: 82 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2128 + hash: "b2d6b68f1f7229e8e65bb37e4c418a1b" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 89; y: 81 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 88; y: 80 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2144 + hash: "b2d6b68f1f7229e8e65bb37e4c418a1b" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 87; y: 79 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 86; y: 77 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2160 + hash: "b2d6b68f1f7229e8e65bb37e4c418a1b" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 86; y: 76 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 86; y: 75 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2176 + hash: "b2d6b68f1f7229e8e65bb37e4c418a1b" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 85; y: 73 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 84; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2192 + hash: "b2d6b68f1f7229e8e65bb37e4c418a1b" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 82; y: 68 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 81; y: 67 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2208 + hash: "b2d6b68f1f7229e8e65bb37e4c418a1b" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 76; y: 61 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 75; y: 59 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2224 + hash: "b2d6b68f1f7229e8e65bb37e4c418a1b" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 71; y: 54 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 70; y: 51 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2240 + hash: "b2d6b68f1f7229e8e65bb37e4c418a1b" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 70; y: 50 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 70; y: 49 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2256 + hash: "b2d6b68f1f7229e8e65bb37e4c418a1b" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 70; y: 47 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 69; y: 46 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2272 + hash: "b2d6b68f1f7229e8e65bb37e4c418a1b" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 68; y: 45 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 67; y: 43 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2288 + hash: "b2d6b68f1f7229e8e65bb37e4c418a1b" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 66; y: 43 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 65; y: 41 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2304 + hash: "b2d6b68f1f7229e8e65bb37e4c418a1b" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 64; y: 40 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 64; y: 39 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2320 + hash: "b2d6b68f1f7229e8e65bb37e4c418a1b" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 63; y: 38 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 63; y: 37 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2336 + hash: "b2d6b68f1f7229e8e65bb37e4c418a1b" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 63; y: 35 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 63; y: 34 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2352 + hash: "b2d6b68f1f7229e8e65bb37e4c418a1b" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 63; y: 33 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2368 + hash: "b2d6b68f1f7229e8e65bb37e4c418a1b" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 64; y: 32 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2384 + hash: "b2d6b68f1f7229e8e65bb37e4c418a1b" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 65; y: 32 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 65; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2400 + hash: "b2d6b68f1f7229e8e65bb37e4c418a1b" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 66; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 68; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2416 + hash: "b2d6b68f1f7229e8e65bb37e4c418a1b" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 69; y: 30 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 71; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2432 + hash: "b2d6b68f1f7229e8e65bb37e4c418a1b" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 73; y: 27 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 73; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2448 + hash: "b2d6b68f1f7229e8e65bb37e4c418a1b" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 74; y: 24 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 74; y: 22 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2464 + hash: "b2d6b68f1f7229e8e65bb37e4c418a1b" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 74; y: 21 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 74; y: 20 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2480 + hash: "b2d6b68f1f7229e8e65bb37e4c418a1b" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 74; y: 18 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 74; y: 17 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2496 + hash: "b2d6b68f1f7229e8e65bb37e4c418a1b" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 74; y: 16 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 73; y: 15 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2512 + hash: "b2d6b68f1f7229e8e65bb37e4c418a1b" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 73; y: 14 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2528 + hash: "b2d6b68f1f7229e8e65bb37e4c418a1b" + } + Frame { + msec: 2544 + hash: "b2d6b68f1f7229e8e65bb37e4c418a1b" + } + Frame { + msec: 2560 + hash: "b2d6b68f1f7229e8e65bb37e4c418a1b" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 73; y: 14 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2576 + hash: "b2d6b68f1f7229e8e65bb37e4c418a1b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 73; y: 15 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 72; y: 17 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2592 + hash: "b2d6b68f1f7229e8e65bb37e4c418a1b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 72; y: 24 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 72; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2608 + hash: "b2d6b68f1f7229e8e65bb37e4c418a1b" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 72; y: 40 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 71; y: 47 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2624 + hash: "c4dd48fca556c2760c8f81db7fea6938" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 60 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 78 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2640 + hash: "9dbad8cb2692807d67f74e7ac4a4a70e" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 88 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 70; y: 96 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 70; y: 96 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2656 + hash: "152648affe4045a81f0d6ff9150889f1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 70; y: 99 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 70; y: 102 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2672 + hash: "152648affe4045a81f0d6ff9150889f1" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 73; y: 103 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 74; y: 103 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2688 + hash: "152648affe4045a81f0d6ff9150889f1" + } + Frame { + msec: 2704 + hash: "152648affe4045a81f0d6ff9150889f1" + } + Frame { + msec: 2720 + hash: "152648affe4045a81f0d6ff9150889f1" + } + Frame { + msec: 2736 + hash: "152648affe4045a81f0d6ff9150889f1" + } + Frame { + msec: 2752 + hash: "152648affe4045a81f0d6ff9150889f1" + } + Frame { + msec: 2768 + hash: "c9eee2b7529b07a17151e7140444c099" + } + Frame { + msec: 2784 + hash: "c9eee2b7529b07a17151e7140444c099" + } + Frame { + msec: 2800 + hash: "c9eee2b7529b07a17151e7140444c099" + } + Frame { + msec: 2816 + hash: "c9eee2b7529b07a17151e7140444c099" + } + Frame { + msec: 2832 + hash: "c9eee2b7529b07a17151e7140444c099" + } + Frame { + msec: 2848 + hash: "c9eee2b7529b07a17151e7140444c099" + } + Frame { + msec: 2864 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 2880 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 2896 + image: "flickweb.3.png" + } + Frame { + msec: 2912 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 2928 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 74; y: 102 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2944 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 74; y: 101 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 73; y: 98 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2960 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 69; y: 93 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 67; y: 91 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2976 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 62; y: 85 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 60; y: 83 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2992 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 56; y: 77 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 55; y: 75 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3008 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 52; y: 70 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 49; y: 67 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3024 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 49; y: 65 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 48; y: 61 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3040 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 48; y: 60 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 46; y: 56 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3056 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 45; y: 54 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 42; y: 50 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3072 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 39; y: 47 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 38; y: 45 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3088 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 37; y: 44 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 36; y: 43 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3104 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 35; y: 41 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 35; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3120 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 33; y: 39 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 33; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3136 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 32; y: 37 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3152 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 32; y: 36 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 31; y: 36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3168 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 31; y: 35 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3184 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 30; y: 35 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 30; y: 33 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3200 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 28; y: 32 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 28; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3216 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 26; y: 29 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 26; y: 28 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3232 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 25; y: 27 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3248 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 25; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3264 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 3280 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 3296 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 3312 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 25; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3328 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 3344 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 3360 + hash: "d045839439e4091210c745f0ea173e52" + } + Frame { + msec: 3376 + hash: "d045839439e4091210c745f0ea173e52" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 25; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3392 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 25; y: 27 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3408 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 26; y: 27 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 26; y: 28 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3424 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 27; y: 28 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 27; y: 29 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3440 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 3456 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 3472 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 3488 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 3504 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 27; y: 30 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3520 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 28; y: 31 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 29; y: 34 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3536 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 31; y: 36 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 37; y: 43 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3552 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 40; y: 48 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 50; y: 59 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3568 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 55; y: 64 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 65; y: 73 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3584 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 69; y: 77 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 75; y: 83 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3600 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 78; y: 85 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 80; y: 86 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3616 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 82; y: 88 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 83; y: 89 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3632 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 85; y: 90 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3648 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 3664 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 3680 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 3696 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 3712 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 3728 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 3744 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 3760 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 85; y: 89 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3776 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 3792 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 84; y: 88 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 84; y: 87 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3808 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 85; y: 85 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 84; y: 83 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3824 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 3840 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 3856 + image: "flickweb.4.png" + } + Frame { + msec: 3872 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 3888 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 3904 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 3920 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 3936 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 3952 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 3968 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 3984 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4000 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4016 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 84; y: 84 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4032 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 84; y: 87 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4048 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 83; y: 88 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4064 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4080 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4096 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4112 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4128 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 83; y: 89 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4144 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 82; y: 90 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4160 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 82; y: 91 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 82; y: 92 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4176 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 82; y: 93 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 82; y: 95 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4192 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 82; y: 97 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 83; y: 100 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4208 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 83; y: 101 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 83; y: 105 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4224 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 83; y: 107 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 83; y: 110 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4240 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 83; y: 113 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 83; y: 114 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4256 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 83; y: 115 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 83; y: 116 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4272 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 83; y: 117 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4288 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4304 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4320 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4336 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4352 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4368 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4384 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4400 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4416 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4432 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4448 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4464 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4480 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 83; y: 116 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4496 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4512 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4528 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4544 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4560 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4576 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4592 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4608 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 82; y: 116 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4624 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4640 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 82; y: 117 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4656 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4672 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4688 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 82; y: 118 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4704 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4720 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4736 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4752 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4768 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4784 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 83; y: 119 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4800 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4816 + image: "flickweb.5.png" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 83; y: 119 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4832 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 4848 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 84; y: 119 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4864 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 85; y: 118 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 85; y: 117 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4880 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 86; y: 113 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 87; y: 111 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4896 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 89; y: 107 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 90; y: 104 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4912 + hash: "f10fa114e248809ed280788d03a3e234" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 92; y: 99 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 93; y: 95 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4928 + hash: "442357340d9690811d582f548f933d92" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 95; y: 88 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 98; y: 81 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 98; y: 81 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4944 + hash: "188b8f78b2a2180a8e96a8a05bb20fe2" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 98; y: 77 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 99; y: 69 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4960 + hash: "2b8ee42c5660f4f938cf10507690abbe" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 100; y: 66 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 101; y: 60 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4976 + hash: "3d4aab388f62e64c5f72c631fb8584aa" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 103; y: 59 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 104; y: 56 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4992 + hash: "439364cea3330411f526093d58ece463" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 104; y: 55 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 104; y: 53 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5008 + hash: "27653ec59651e6b3cb2ebf2bc81a975a" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 104; y: 52 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 104; y: 51 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5024 + hash: "d9c0fb2cbf968e0524291ae2570ca585" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 105; y: 50 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 105; y: 49 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5040 + hash: "ef75df694a972985f410e21182dbb12b" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 105; y: 48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5056 + hash: "adda6aa851c1587c1bb2605809348725" + } + Frame { + msec: 5072 + hash: "196c12052069f0f8c775aa38d3291bef" + } + Frame { + msec: 5088 + hash: "eaa025b6aee87edf95643cc46880d0db" + } + Frame { + msec: 5104 + hash: "edeab897b82df47ae6deb858eca3087e" + } + Frame { + msec: 5120 + hash: "46e3b5da149cfc40036a860e74e0cd78" + } + Frame { + msec: 5136 + hash: "46e3b5da149cfc40036a860e74e0cd78" + } + Frame { + msec: 5152 + hash: "0fe9b13b9b0752ab4ad74f4e43f94d86" + } + Frame { + msec: 5168 + hash: "0fe9b13b9b0752ab4ad74f4e43f94d86" + } + Frame { + msec: 5184 + hash: "695e9c7292475cad011ca76799452042" + } + Frame { + msec: 5200 + hash: "695e9c7292475cad011ca76799452042" + } + Frame { + msec: 5216 + hash: "695e9c7292475cad011ca76799452042" + } + Frame { + msec: 5232 + hash: "695e9c7292475cad011ca76799452042" + } + Frame { + msec: 5248 + hash: "695e9c7292475cad011ca76799452042" + } + Frame { + msec: 5264 + hash: "695e9c7292475cad011ca76799452042" + } + Frame { + msec: 5280 + hash: "695e9c7292475cad011ca76799452042" + } + Frame { + msec: 5296 + hash: "695e9c7292475cad011ca76799452042" + } + Frame { + msec: 5312 + hash: "695e9c7292475cad011ca76799452042" + } + Frame { + msec: 5328 + hash: "695e9c7292475cad011ca76799452042" + } + Frame { + msec: 5344 + hash: "695e9c7292475cad011ca76799452042" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 105; y: 47 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 104; y: 46 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5360 + hash: "695e9c7292475cad011ca76799452042" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 103; y: 45 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 102; y: 45 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5376 + hash: "695e9c7292475cad011ca76799452042" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 102; y: 44 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5392 + hash: "695e9c7292475cad011ca76799452042" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 101; y: 43 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5408 + hash: "695e9c7292475cad011ca76799452042" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 101; y: 42 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 100; y: 42 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5424 + hash: "695e9c7292475cad011ca76799452042" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 99; y: 41 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 98; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5440 + hash: "695e9c7292475cad011ca76799452042" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 98; y: 39 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5456 + hash: "695e9c7292475cad011ca76799452042" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 98; y: 38 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 98; y: 37 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5472 + hash: "695e9c7292475cad011ca76799452042" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 98; y: 36 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 98; y: 35 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5488 + hash: "695e9c7292475cad011ca76799452042" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 98; y: 33 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 98; y: 30 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5504 + hash: "695e9c7292475cad011ca76799452042" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 98; y: 29 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 98; y: 28 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5520 + hash: "695e9c7292475cad011ca76799452042" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 98; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 98; y: 25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5536 + hash: "695e9c7292475cad011ca76799452042" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 98; y: 24 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 98; y: 23 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5552 + hash: "695e9c7292475cad011ca76799452042" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 97; y: 23 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 97; y: 22 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5568 + hash: "695e9c7292475cad011ca76799452042" + } + Frame { + msec: 5584 + hash: "695e9c7292475cad011ca76799452042" + } + Frame { + msec: 5600 + hash: "695e9c7292475cad011ca76799452042" + } + Frame { + msec: 5616 + hash: "695e9c7292475cad011ca76799452042" + } + Frame { + msec: 5632 + hash: "695e9c7292475cad011ca76799452042" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 97; y: 22 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5648 + hash: "695e9c7292475cad011ca76799452042" + } + Frame { + msec: 5664 + hash: "695e9c7292475cad011ca76799452042" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 97; y: 24 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 97; y: 26 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5680 + hash: "695e9c7292475cad011ca76799452042" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 97; y: 28 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 97; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5696 + hash: "695e9c7292475cad011ca76799452042" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 97; y: 37 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 97; y: 42 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5712 + hash: "27653ec59651e6b3cb2ebf2bc81a975a" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 97; y: 50 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 97; y: 58 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5728 + hash: "f2a68c3a60002a796b0cd595ae89e477" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 97; y: 63 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 97; y: 71 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5744 + hash: "2628ffe66f06c997d9c9b66febc04ce8" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 97; y: 75 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 98; y: 83 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5760 + hash: "9b68c76d622f7b883a13927a112179f0" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 99; y: 86 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 101; y: 91 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 101; y: 91 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5776 + image: "flickweb.6.png" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 103; y: 95 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 104; y: 95 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5792 + hash: "6d6d87355037ec4a15b2a81c8d48b74d" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 107; y: 95 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 107; y: 94 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5808 + hash: "6d6d87355037ec4a15b2a81c8d48b74d" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 107; y: 93 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5824 + hash: "6d6d87355037ec4a15b2a81c8d48b74d" + } + Frame { + msec: 5840 + hash: "6d6d87355037ec4a15b2a81c8d48b74d" + } + Frame { + msec: 5856 + hash: "34c3edc4500a268a326b5c2156c12f09" + } + Frame { + msec: 5872 + hash: "34c3edc4500a268a326b5c2156c12f09" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 106; y: 92 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 105; y: 91 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5888 + hash: "34c3edc4500a268a326b5c2156c12f09" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 104; y: 91 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 103; y: 90 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5904 + hash: "ac600900160ab37ec8a3e67eb82d0259" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 101; y: 89 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 100; y: 88 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5920 + hash: "ac600900160ab37ec8a3e67eb82d0259" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 99; y: 86 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 98; y: 86 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5936 + hash: "dc3cef419e3b7d59f450d3307aeebefa" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 97; y: 85 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 96; y: 85 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5952 + hash: "dc3cef419e3b7d59f450d3307aeebefa" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 94; y: 84 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 93; y: 83 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5968 + hash: "9b68c76d622f7b883a13927a112179f0" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 90; y: 82 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 86; y: 81 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 5984 + hash: "9b68c76d622f7b883a13927a112179f0" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 85; y: 80 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 81; y: 79 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6000 + hash: "9b68c76d622f7b883a13927a112179f0" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 79; y: 78 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 76; y: 76 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6016 + hash: "9b68c76d622f7b883a13927a112179f0" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 75; y: 76 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 72; y: 73 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6032 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 68; y: 70 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 66; y: 68 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6048 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 63; y: 65 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 61; y: 63 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6064 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 58; y: 60 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 57; y: 59 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6080 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 54; y: 56 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 53; y: 54 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6096 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 51; y: 50 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 48; y: 46 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6112 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 48; y: 45 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 46; y: 41 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6128 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 45; y: 39 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 43; y: 36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6144 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 43; y: 35 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 41; y: 32 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6160 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 40; y: 30 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 38; y: 28 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6176 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 36; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 35; y: 24 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6192 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 33; y: 22 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 32; y: 21 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6208 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 31; y: 20 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 30; y: 19 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6224 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 29; y: 19 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 28; y: 18 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6240 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 27; y: 18 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 26; y: 17 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6256 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 25; y: 17 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6272 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 24; y: 17 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6288 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 6304 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 6320 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 6336 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 6352 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 24; y: 17 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6368 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 6384 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 6400 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 6416 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 24; y: 17 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6432 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 24; y: 18 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6448 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 25; y: 18 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 25; y: 19 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6464 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 26; y: 19 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 27; y: 20 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6480 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 28; y: 21 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6496 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 6512 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 6528 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 29; y: 22 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6544 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 30; y: 23 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 31; y: 24 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6560 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 32; y: 25 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 33; y: 25 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6576 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 34; y: 26 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 34; y: 27 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6592 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 37; y: 30 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 38; y: 31 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6608 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 41; y: 35 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 42; y: 37 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6624 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 45; y: 42 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 50; y: 46 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6640 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 52; y: 49 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 57; y: 53 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6656 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 60; y: 55 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 65; y: 58 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6672 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 66; y: 59 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 71; y: 61 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6688 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 75; y: 62 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 77; y: 63 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6704 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 80; y: 64 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 81; y: 64 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6720 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 83; y: 64 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 84; y: 64 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6736 + image: "flickweb.7.png" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 85; y: 64 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 86; y: 64 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6752 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 87; y: 64 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 88; y: 64 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6768 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 90; y: 64 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 93; y: 64 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6784 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 94; y: 64 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 99; y: 63 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6800 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 102; y: 63 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 106; y: 62 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6816 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 110; y: 62 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 116; y: 62 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6832 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 122; y: 62 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 124; y: 62 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6848 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 125; y: 62 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 6864 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 6880 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 6896 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 6912 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 6928 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 6944 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 6960 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 6976 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 6992 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7008 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7024 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7040 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7056 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7072 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7088 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 126; y: 62 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7104 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 127; y: 62 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 129; y: 64 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7120 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 132; y: 65 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 134; y: 66 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7136 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 139; y: 68 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 144; y: 69 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7152 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 148; y: 69 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 154; y: 69 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7168 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 158; y: 68 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 162; y: 66 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7184 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 164; y: 65 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 165; y: 62 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7200 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 165; y: 60 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 165; y: 54 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7216 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 162; y: 45 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 159; y: 39 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7232 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 151; y: 27 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 146; y: 22 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7248 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 129; y: 3 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 7264 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7280 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7296 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7312 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7328 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7344 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7360 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7376 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7392 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7408 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7424 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7440 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7456 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7472 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7488 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7504 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7520 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7536 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7552 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7568 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7584 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7600 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7616 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7632 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7648 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7664 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7680 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7696 + image: "flickweb.8.png" + } + Frame { + msec: 7712 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7728 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7744 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7760 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7776 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7792 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7808 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7824 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7840 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7856 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7872 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7888 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7904 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7920 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7936 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7952 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7968 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 7984 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8000 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8016 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8032 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8048 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8064 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8080 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8096 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8112 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8128 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8144 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8160 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8176 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8192 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8208 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8224 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8240 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8256 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8272 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8288 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8304 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8320 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8336 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8352 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8368 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8384 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8400 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8416 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8432 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8448 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8464 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8480 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8496 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8512 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8528 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8544 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8560 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8576 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8592 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8608 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8624 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8640 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8656 + image: "flickweb.9.png" + } + Frame { + msec: 8672 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8688 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8704 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8720 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8736 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8752 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8768 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8784 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8800 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8816 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8832 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8848 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8864 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8880 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8896 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8912 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8928 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8944 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8960 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8976 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 8992 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9008 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9024 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9040 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9056 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9072 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9088 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9104 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9120 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9136 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9152 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9168 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9184 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9200 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9216 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9232 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9248 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9264 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9280 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9296 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9312 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9328 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9344 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9360 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9376 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9392 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9408 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9424 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9440 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9456 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9472 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9488 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9504 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9520 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9536 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9552 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9568 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9584 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9600 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9616 + image: "flickweb.10.png" + } + Frame { + msec: 9632 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9648 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9664 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9680 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9696 + hash: "98990f624351f88347b2eb010bb5cd13" + } + Frame { + msec: 9712 + hash: "98990f624351f88347b2eb010bb5cd13" + } +} diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/flickweb.qml b/tests/auto/declarative/qmlvisual/webview/flickable/flickweb.qml new file mode 100644 index 00000000..af09389f --- /dev/null +++ b/tests/auto/declarative/qmlvisual/webview/flickable/flickweb.qml @@ -0,0 +1,35 @@ +import QtQuick 1.0 +import QtWebKit 1.0 + +Flickable { + id: flickable + width: 320 + height: 200 + contentWidth: Math.max(flickable.width,webView.width) + contentHeight: Math.max(flickable.height,webView.height) + pressDelay: 100 + + WebView { + id: webView + transformOrigin: Item.TopLeft + smooth: false // We don't want smooth scaling, since we only scale during (fast) transitions + url: "test.html" + preferredWidth: flickable.width + preferredHeight: flickable.height + contentsScale: 1 + onContentsSizeChanged: { + // zoom out + contentsScale = Math.min(1,flickable.width / contentsSize.width) + } + } + + Rectangle { + id: button + width: 50; height: 50; color: "red" + MouseArea { + anchors.fill: parent + onPressed: button.color = "blue" + onReleased: button.color = "green" + } + } +} diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/qtlogo.png b/tests/auto/declarative/qmlvisual/webview/flickable/qtlogo.png new file mode 100644 index 00000000..399bd0b1 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/flickable/qtlogo.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/flickable/test.html b/tests/auto/declarative/qmlvisual/webview/flickable/test.html new file mode 100644 index 00000000..35eb7184 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/webview/flickable/test.html @@ -0,0 +1,3 @@ + + + diff --git a/tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.0.png b/tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.0.png new file mode 100644 index 00000000..139aa9d8 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.0.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.1.png b/tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.1.png new file mode 100644 index 00000000..e2e16442 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.1.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.2.png b/tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.2.png new file mode 100644 index 00000000..aa2fb828 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.2.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.3.png b/tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.3.png new file mode 100644 index 00000000..19764309 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.3.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.4.png b/tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.4.png new file mode 100644 index 00000000..c895a0a3 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.4.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.5.png b/tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.5.png new file mode 100644 index 00000000..c895a0a3 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.5.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.6.png b/tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.6.png new file mode 100644 index 00000000..c895a0a3 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.6.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.7.png b/tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.7.png new file mode 100644 index 00000000..c895a0a3 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.7.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.8.png b/tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.8.png new file mode 100644 index 00000000..c895a0a3 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.8.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.qml b/tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.qml new file mode 100644 index 00000000..bfe40da2 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/webview/javascript/data/evaluateJavaScript.qml @@ -0,0 +1,3759 @@ +import Qt.VisualTest 4.7 + +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/qmlvisual/webview/javascript/data/windowObjects.0.png b/tests/auto/declarative/qmlvisual/webview/javascript/data/windowObjects.0.png new file mode 100644 index 00000000..b5c35d21 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/javascript/data/windowObjects.0.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/javascript/data/windowObjects.1.png b/tests/auto/declarative/qmlvisual/webview/javascript/data/windowObjects.1.png new file mode 100644 index 00000000..b5c35d21 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/javascript/data/windowObjects.1.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/javascript/data/windowObjects.2.png b/tests/auto/declarative/qmlvisual/webview/javascript/data/windowObjects.2.png new file mode 100644 index 00000000..28403c88 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/javascript/data/windowObjects.2.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/javascript/data/windowObjects.3.png b/tests/auto/declarative/qmlvisual/webview/javascript/data/windowObjects.3.png new file mode 100644 index 00000000..241b9f8b Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/javascript/data/windowObjects.3.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/javascript/data/windowObjects.4.png b/tests/auto/declarative/qmlvisual/webview/javascript/data/windowObjects.4.png new file mode 100644 index 00000000..1877cb26 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/javascript/data/windowObjects.4.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/javascript/data/windowObjects.qml b/tests/auto/declarative/qmlvisual/webview/javascript/data/windowObjects.qml new file mode 100644 index 00000000..07aa13d2 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/webview/javascript/data/windowObjects.qml @@ -0,0 +1,2643 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 32 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 48 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 64 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 80 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 96 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 112 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 128 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 144 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 160 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 176 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 192 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 208 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 224 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 240 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 256 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 272 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 288 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 304 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 320 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 336 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 352 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 368 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 384 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 400 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 416 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 432 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 448 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 464 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 480 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 496 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 512 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 528 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 544 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 560 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 576 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 592 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 608 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 624 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 640 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 656 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 672 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 688 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 704 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 720 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 736 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 752 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 768 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 784 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 800 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 816 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 832 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 848 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 864 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 880 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 896 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 912 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 928 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 944 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 960 + image: "windowObjects.0.png" + } + Frame { + msec: 976 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 992 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1008 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1024 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1040 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 155; y: 9 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 145; y: 23 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1056 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 137; y: 37 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 127; y: 53 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1072 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 119; y: 67 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 111; y: 77 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1088 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 103; y: 87 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1104 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 97; y: 93 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 91; y: 101 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 87; y: 109 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1120 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 83; y: 117 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 81; y: 125 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1136 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 81; y: 133 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 79; y: 139 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1152 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 79; y: 142 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 79; y: 145 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1168 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 78; y: 146 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 78; y: 147 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1184 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1200 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1216 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1232 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1248 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 82; y: 143 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1264 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1280 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 83; y: 142 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 83; y: 141 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 84; y: 139 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1296 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 85; y: 138 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1312 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1328 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1344 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 86; y: 137 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 87; y: 137 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1360 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 88; y: 137 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1376 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 89; y: 138 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 89; y: 139 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1392 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 90; y: 141 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 90; y: 142 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1408 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 91; y: 144 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1424 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 91; y: 146 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 91; y: 148 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 91; y: 149 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1440 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 91; y: 151 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 91; y: 153 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1456 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 90; y: 154 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 90; y: 155 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1472 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 89; y: 156 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1488 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1504 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1520 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1536 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1552 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1568 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1584 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1600 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1616 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1632 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1648 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1664 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1680 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1696 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1712 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1728 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1744 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1760 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1776 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1792 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1808 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1824 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1840 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1856 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1872 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1888 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1904 + hash: "b1a19797afefa71e30f4594064aa4951" + } + Frame { + msec: 1920 + image: "windowObjects.1.png" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 89; y: 156 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1936 + hash: "fca76207a4fa6f2c4bb01d28aa018f0c" + } + Frame { + msec: 1952 + hash: "fca76207a4fa6f2c4bb01d28aa018f0c" + } + Frame { + msec: 1968 + hash: "fca76207a4fa6f2c4bb01d28aa018f0c" + } + Frame { + msec: 1984 + hash: "fca76207a4fa6f2c4bb01d28aa018f0c" + } + Frame { + msec: 2000 + hash: "fca76207a4fa6f2c4bb01d28aa018f0c" + } + Frame { + msec: 2016 + hash: "fca76207a4fa6f2c4bb01d28aa018f0c" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 89; y: 156 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2032 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2048 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2064 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2080 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2096 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2112 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2128 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2144 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2160 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2176 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2192 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2208 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2224 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2240 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2256 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2272 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2288 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 89; y: 157 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 88; y: 158 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 87; y: 160 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2304 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 87; y: 161 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 83; y: 167 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2320 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 82; y: 169 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 80; y: 175 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2336 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 78; y: 183 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 74; y: 189 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2352 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 72; y: 195 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 68; y: 201 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2368 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 64; y: 207 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 62; y: 213 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2384 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 61; y: 215 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 59; y: 221 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2400 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 58; y: 222 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 57; y: 224 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2416 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2432 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2448 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2464 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2480 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2496 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2512 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2528 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2544 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2560 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2576 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2592 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2608 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2624 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2640 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2656 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2672 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2688 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2704 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2720 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2736 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 49; y: 225 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 50; y: 224 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2752 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 50; y: 223 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2768 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 51; y: 222 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2784 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 51; y: 221 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 52; y: 220 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2800 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 52; y: 218 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2816 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 53; y: 217 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2832 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2848 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2864 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 54; y: 216 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2880 + image: "windowObjects.2.png" + } + Frame { + msec: 2896 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 55; y: 215 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2912 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2928 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 56; y: 214 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2944 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2960 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 2976 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 57; y: 214 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 57; y: 214 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2992 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 3008 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 3024 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 3040 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 3056 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 3072 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 3088 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 3104 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 57; y: 214 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3120 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 3136 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 3152 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 3168 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 3184 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 3200 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 3216 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Frame { + msec: 3232 + hash: "6927f81ca01ef75d204994aa82c60c4d" + } + Key { + type: 6 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 3248 + hash: "2165224e8f66a797ae5c991462fb56d8" + } + Frame { + msec: 3264 + hash: "2165224e8f66a797ae5c991462fb56d8" + } + Frame { + msec: 3280 + hash: "2165224e8f66a797ae5c991462fb56d8" + } + Frame { + msec: 3296 + hash: "2165224e8f66a797ae5c991462fb56d8" + } + Key { + type: 7 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 3312 + hash: "2165224e8f66a797ae5c991462fb56d8" + } + Frame { + msec: 3328 + hash: "2165224e8f66a797ae5c991462fb56d8" + } + Frame { + msec: 3344 + hash: "2165224e8f66a797ae5c991462fb56d8" + } + Frame { + msec: 3360 + hash: "2165224e8f66a797ae5c991462fb56d8" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 57; y: 212 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3376 + hash: "2165224e8f66a797ae5c991462fb56d8" + } + Frame { + msec: 3392 + hash: "2165224e8f66a797ae5c991462fb56d8" + } + Frame { + msec: 3408 + hash: "2165224e8f66a797ae5c991462fb56d8" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 57; y: 211 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3424 + hash: "2165224e8f66a797ae5c991462fb56d8" + } + Key { + type: 6 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 3440 + hash: "c6ac7e0be8b7b2a80966344389def97a" + } + Frame { + msec: 3456 + hash: "c6ac7e0be8b7b2a80966344389def97a" + } + Frame { + msec: 3472 + hash: "c6ac7e0be8b7b2a80966344389def97a" + } + Frame { + msec: 3488 + hash: "40f333072bb9f1d334d5ae432d9641b9" + } + Frame { + msec: 3504 + hash: "40f333072bb9f1d334d5ae432d9641b9" + } + Key { + type: 7 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 3520 + hash: "40f333072bb9f1d334d5ae432d9641b9" + } + Frame { + msec: 3536 + hash: "40f333072bb9f1d334d5ae432d9641b9" + } + Frame { + msec: 3552 + hash: "40f333072bb9f1d334d5ae432d9641b9" + } + Frame { + msec: 3568 + hash: "40f333072bb9f1d334d5ae432d9641b9" + } + Frame { + msec: 3584 + hash: "40f333072bb9f1d334d5ae432d9641b9" + } + Frame { + msec: 3600 + hash: "40f333072bb9f1d334d5ae432d9641b9" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 58; y: 210 + modifiers: 0 + sendToViewport: true + } + Key { + type: 6 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 3616 + hash: "96f727ef0dacfda9ea77fb5651493030" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 60; y: 209 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 61; y: 207 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3632 + hash: "96f727ef0dacfda9ea77fb5651493030" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 62; y: 205 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3648 + hash: "96f727ef0dacfda9ea77fb5651493030" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 62; y: 204 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 63; y: 203 + modifiers: 0 + sendToViewport: true + } + Key { + type: 7 + key: 83 + modifiers: 0 + text: "73" + autorep: false + count: 1 + } + Frame { + msec: 3664 + hash: "96f727ef0dacfda9ea77fb5651493030" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 63; y: 202 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 64; y: 200 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3680 + hash: "96f727ef0dacfda9ea77fb5651493030" + } + Frame { + msec: 3696 + hash: "96f727ef0dacfda9ea77fb5651493030" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 65; y: 198 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 66; y: 197 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 67; y: 195 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3712 + hash: "96f727ef0dacfda9ea77fb5651493030" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 68; y: 194 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 69; y: 192 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3728 + hash: "96f727ef0dacfda9ea77fb5651493030" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 70; y: 190 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 70; y: 188 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3744 + hash: "96f727ef0dacfda9ea77fb5651493030" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 70; y: 186 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 70; y: 185 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3760 + hash: "96f727ef0dacfda9ea77fb5651493030" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 71; y: 183 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 71; y: 181 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3776 + hash: "96f727ef0dacfda9ea77fb5651493030" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 72; y: 179 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 73; y: 178 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3792 + hash: "96f727ef0dacfda9ea77fb5651493030" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 73; y: 176 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 73; y: 175 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3808 + hash: "96f727ef0dacfda9ea77fb5651493030" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 74; y: 174 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 74; y: 173 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3824 + hash: "96f727ef0dacfda9ea77fb5651493030" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 74; y: 172 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3840 + image: "windowObjects.3.png" + } + Frame { + msec: 3856 + hash: "96f727ef0dacfda9ea77fb5651493030" + } + Frame { + msec: 3872 + hash: "96f727ef0dacfda9ea77fb5651493030" + } + Frame { + msec: 3888 + hash: "96f727ef0dacfda9ea77fb5651493030" + } + Frame { + msec: 3904 + hash: "96f727ef0dacfda9ea77fb5651493030" + } + Frame { + msec: 3920 + hash: "96f727ef0dacfda9ea77fb5651493030" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 75; y: 171 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 76; y: 171 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3936 + hash: "96f727ef0dacfda9ea77fb5651493030" + } + Frame { + msec: 3952 + hash: "96f727ef0dacfda9ea77fb5651493030" + } + Frame { + msec: 3968 + hash: "96f727ef0dacfda9ea77fb5651493030" + } + Frame { + msec: 3984 + hash: "ed7b3d93d690df73be5cbee8c41a1931" + } + Frame { + msec: 4000 + hash: "ed7b3d93d690df73be5cbee8c41a1931" + } + Frame { + msec: 4016 + hash: "ed7b3d93d690df73be5cbee8c41a1931" + } + Frame { + msec: 4032 + hash: "ed7b3d93d690df73be5cbee8c41a1931" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 76; y: 170 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4048 + hash: "ed7b3d93d690df73be5cbee8c41a1931" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 77; y: 169 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 78; y: 168 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4064 + hash: "ed7b3d93d690df73be5cbee8c41a1931" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 79; y: 168 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4080 + hash: "ed7b3d93d690df73be5cbee8c41a1931" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 81; y: 167 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 81; y: 166 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4096 + hash: "ed7b3d93d690df73be5cbee8c41a1931" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 82; y: 165 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4112 + hash: "ed7b3d93d690df73be5cbee8c41a1931" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 83; y: 164 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4128 + hash: "ed7b3d93d690df73be5cbee8c41a1931" + } + Frame { + msec: 4144 + hash: "ed7b3d93d690df73be5cbee8c41a1931" + } + Frame { + msec: 4160 + hash: "ed7b3d93d690df73be5cbee8c41a1931" + } + Frame { + msec: 4176 + hash: "ed7b3d93d690df73be5cbee8c41a1931" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 83; y: 164 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4192 + hash: "5b3505be865f704640e81cea092d35ba" + } + Frame { + msec: 4208 + hash: "5b3505be865f704640e81cea092d35ba" + } + Frame { + msec: 4224 + hash: "5b3505be865f704640e81cea092d35ba" + } + Frame { + msec: 4240 + hash: "5b3505be865f704640e81cea092d35ba" + } + Frame { + msec: 4256 + hash: "5b3505be865f704640e81cea092d35ba" + } + Frame { + msec: 4272 + hash: "5b3505be865f704640e81cea092d35ba" + } + Frame { + msec: 4288 + hash: "5b3505be865f704640e81cea092d35ba" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 83; y: 164 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4304 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 4320 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 4336 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 4352 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 4368 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 4384 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 4400 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 4416 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 4432 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 4448 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 4464 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 85; y: 158 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 85; y: 156 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4480 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 86; y: 154 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 86; y: 152 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4496 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 87; y: 150 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 89; y: 144 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4512 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 93; y: 138 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 99; y: 134 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4528 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 101; y: 128 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 105; y: 122 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4544 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 109; y: 114 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 113; y: 108 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4560 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 114; y: 106 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 114; y: 105 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4576 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 115; y: 104 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 115; y: 102 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4592 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 115; y: 100 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 116; y: 98 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4608 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 120; y: 92 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 122; y: 86 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4624 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 126; y: 76 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 130; y: 66 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4640 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 132; y: 56 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 134; y: 46 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4656 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 136; y: 38 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 138; y: 30 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4672 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 140; y: 22 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 141; y: 20 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4688 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 143; y: 14 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 144; y: 12 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4704 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 144; y: 11 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 144; y: 9 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4720 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 144; y: 7 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 144; y: 6 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4736 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 143; y: 4 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 143; y: 2 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4752 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 143; y: 1 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 4768 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 4784 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 4800 + image: "windowObjects.4.png" + } + Frame { + msec: 4816 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 4832 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 4848 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 4864 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 4880 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 4896 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 4912 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 4928 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 4944 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 4960 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 4976 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 4992 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5008 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5024 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5040 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5056 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5072 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5088 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5104 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5120 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5136 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5152 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5168 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5184 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5200 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5216 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5232 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5248 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5264 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5280 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5296 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5312 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5328 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5344 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5360 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5376 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5392 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5408 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5424 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5440 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5456 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5472 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5488 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5504 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5520 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5536 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5552 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5568 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } + Frame { + msec: 5584 + hash: "cb5a42e7ab70e05a8bbecabb587f9e5e" + } +} diff --git a/tests/auto/declarative/qmlvisual/webview/javascript/evaluateJavaScript.qml b/tests/auto/declarative/qmlvisual/webview/javascript/evaluateJavaScript.qml new file mode 100644 index 00000000..9ea2b64b --- /dev/null +++ b/tests/auto/declarative/qmlvisual/webview/javascript/evaluateJavaScript.qml @@ -0,0 +1,33 @@ +import QtQuick 1.0 +import QtWebKit 1.0 + +Column { + property string skip: "WebView tests not counting until resources allocated to WebView maintenance" + WebView { + id: webview + width: 200 + height: 200 + url: "test-objects.html" + javaScriptWindowObjects: + QtObject { + 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/qmlvisual/webview/javascript/test-objects.html b/tests/auto/declarative/qmlvisual/webview/javascript/test-objects.html new file mode 100644 index 00000000..ed7d2ea4 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/webview/javascript/test-objects.html @@ -0,0 +1,12 @@ + + + + +

Boring Document

+

+This is a boring document. +It gets the text on this button: + +from QML. +

diff --git a/tests/auto/declarative/qmlvisual/webview/javascript/windowObjects.qml b/tests/auto/declarative/qmlvisual/webview/javascript/windowObjects.qml new file mode 100644 index 00000000..0b78539c --- /dev/null +++ b/tests/auto/declarative/qmlvisual/webview/javascript/windowObjects.qml @@ -0,0 +1,28 @@ +import QtQuick 1.0 +import QtWebKit 1.0 + +Column { + property string skip: "WebView tests not counting until resources allocated to WebView maintenance" + WebView { + width: 200 + height: 200 + url: "test-objects.html" + javaScriptWindowObjects: + QtObject { + property string text: btntext.text + WebView.windowObjectName: "qmltext" + } + } + Row { + Text { text: "Input:" } + Rectangle { + width: btntext.width+10 + height: btntext.height+10 + border.color: "black" + TextInput { + id: btntext + text: "Blah" + } + } + } +} diff --git a/tests/auto/declarative/qmlvisual/webview/settings/data/fontFamily.0.png b/tests/auto/declarative/qmlvisual/webview/settings/data/fontFamily.0.png new file mode 100644 index 00000000..7721e755 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/settings/data/fontFamily.0.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/settings/data/fontFamily.qml b/tests/auto/declarative/qmlvisual/webview/settings/data/fontFamily.qml new file mode 100644 index 00000000..34d11166 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/webview/settings/data/fontFamily.qml @@ -0,0 +1,395 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 32 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 48 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 64 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 80 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 96 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 112 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 128 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 144 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 160 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 176 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 192 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 208 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 224 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 240 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 256 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 272 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 288 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 304 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 320 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 336 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 352 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 368 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 384 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 400 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 416 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 432 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 448 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 464 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 480 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 496 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 512 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 528 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 544 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 560 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 576 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 592 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 608 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 624 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 640 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 656 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 672 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 688 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 196; y: 25 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 194; y: 19 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 190; y: 13 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 704 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 720 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 736 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 752 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 768 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 784 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 800 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 816 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 832 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 848 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 864 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 880 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 896 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 912 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 928 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 944 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 960 + image: "fontFamily.0.png" + } + Frame { + msec: 976 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 992 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 1008 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 1024 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 1040 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 1056 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 1072 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 1088 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 1104 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 1120 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 1136 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 1152 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 1168 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 1184 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 1200 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 1216 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 1232 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 1248 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 1264 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 1280 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 1296 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 1312 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 1328 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 1344 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 1360 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 1376 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 1392 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 1408 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 1424 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 1440 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } + Frame { + msec: 1456 + hash: "5d66fdee6a0a96bb24e89244f02eacc9" + } +} diff --git a/tests/auto/declarative/qmlvisual/webview/settings/data/fontSize.0.png b/tests/auto/declarative/qmlvisual/webview/settings/data/fontSize.0.png new file mode 100644 index 00000000..95196a1b Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/settings/data/fontSize.0.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/settings/data/fontSize.qml b/tests/auto/declarative/qmlvisual/webview/settings/data/fontSize.qml new file mode 100644 index 00000000..efe38755 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/webview/settings/data/fontSize.qml @@ -0,0 +1,339 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 32 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 48 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 64 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 80 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 96 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 112 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 128 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 144 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 160 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 176 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 192 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 208 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 224 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 240 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 256 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 272 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 288 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 304 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 320 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 336 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 352 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 368 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 384 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 400 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 416 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 432 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 448 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 464 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 480 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 496 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 512 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 528 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 544 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 560 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 576 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 592 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 608 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 624 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 640 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 656 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 672 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 688 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 704 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 720 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 736 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 752 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 768 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 784 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 800 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 816 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 832 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 848 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 864 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 880 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 896 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 912 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 928 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 944 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 960 + image: "fontSize.0.png" + } + Frame { + msec: 976 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 992 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 1008 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 1024 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 1040 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 1056 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 1072 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 1088 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 1104 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 1120 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 1136 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 1152 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 1168 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 1184 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 1200 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 1216 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 1232 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 1248 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 1264 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 1280 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 1296 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 1312 + hash: "962e77f522956d38f3b1b890df749f0a" + } + Frame { + msec: 1328 + hash: "962e77f522956d38f3b1b890df749f0a" + } +} diff --git a/tests/auto/declarative/qmlvisual/webview/settings/data/noAutoLoadImages.0.png b/tests/auto/declarative/qmlvisual/webview/settings/data/noAutoLoadImages.0.png new file mode 100644 index 00000000..48920a23 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/settings/data/noAutoLoadImages.0.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/settings/data/noAutoLoadImages.1.png b/tests/auto/declarative/qmlvisual/webview/settings/data/noAutoLoadImages.1.png new file mode 100644 index 00000000..48920a23 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/settings/data/noAutoLoadImages.1.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/settings/data/noAutoLoadImages.qml b/tests/auto/declarative/qmlvisual/webview/settings/data/noAutoLoadImages.qml new file mode 100644 index 00000000..624a16bd --- /dev/null +++ b/tests/auto/declarative/qmlvisual/webview/settings/data/noAutoLoadImages.qml @@ -0,0 +1,595 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 32 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 48 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 64 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 80 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 96 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 112 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 128 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 144 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 160 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 176 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 192 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 208 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 224 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 240 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 256 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 272 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 288 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 304 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 320 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 336 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 352 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 368 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 384 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 400 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 416 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 432 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 448 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 464 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 480 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 496 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 512 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 528 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 544 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 560 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 576 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 592 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 608 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 624 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 640 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 656 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 672 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 688 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 704 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 720 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 736 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 752 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 768 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 784 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 800 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 816 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 832 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 848 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 864 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 880 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 896 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 912 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 928 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 944 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 960 + image: "noAutoLoadImages.0.png" + } + Frame { + msec: 976 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 992 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1008 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1024 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1040 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1056 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1072 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1088 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1104 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1120 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1136 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1152 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1168 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1184 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1200 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1216 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1232 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1248 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1264 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1280 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1296 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1312 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1328 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1344 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1360 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1376 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1392 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1408 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1424 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1440 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1456 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1472 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1488 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1504 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1520 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1536 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1552 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1568 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1584 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1600 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1616 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1632 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1648 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1664 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1680 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1696 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1712 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1728 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1744 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1760 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1776 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1792 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1808 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1824 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1840 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1856 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1872 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1888 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1904 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1920 + image: "noAutoLoadImages.1.png" + } + Frame { + msec: 1936 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1952 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1968 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 1984 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 2000 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 2016 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 2032 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 2048 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 2064 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 2080 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 2096 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 2112 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 2128 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 2144 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 2160 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 2176 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 2192 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 2208 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 2224 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 2240 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 2256 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 2272 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 2288 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 2304 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 2320 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 2336 + hash: "5146cfbeefc51268eca7717d84775750" + } + Frame { + msec: 2352 + hash: "5146cfbeefc51268eca7717d84775750" + } +} diff --git a/tests/auto/declarative/qmlvisual/webview/settings/data/setFontFamily.0.png b/tests/auto/declarative/qmlvisual/webview/settings/data/setFontFamily.0.png new file mode 100644 index 00000000..f3c621af Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/settings/data/setFontFamily.0.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/settings/data/setFontFamily.qml b/tests/auto/declarative/qmlvisual/webview/settings/data/setFontFamily.qml new file mode 100644 index 00000000..414d64fb --- /dev/null +++ b/tests/auto/declarative/qmlvisual/webview/settings/data/setFontFamily.qml @@ -0,0 +1,351 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 32 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 48 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 64 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 80 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 96 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 112 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 128 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 144 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 160 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 176 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 192 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 208 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 224 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 240 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 256 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 272 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 288 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 304 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 320 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 336 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 352 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 368 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 384 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 400 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 416 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 432 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 448 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 464 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 480 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 496 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 512 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 528 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 544 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 560 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 576 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 592 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 608 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 624 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 640 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 656 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 672 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 688 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 704 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 720 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 736 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 752 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 768 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 784 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 800 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 816 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 832 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 848 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 864 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 880 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 896 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 912 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 928 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 944 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 960 + image: "setFontFamily.0.png" + } + Frame { + msec: 976 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 992 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 1008 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 1024 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 1040 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 1056 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 1072 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 1088 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 1104 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 1120 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 1136 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 1152 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 1168 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 1184 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 1200 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 1216 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 1232 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 1248 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 1264 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 1280 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 1296 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 1312 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 1328 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 1344 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 1360 + hash: "7ef8bb83c146898bd75de8951a932b58" + } + Frame { + msec: 1376 + hash: "7ef8bb83c146898bd75de8951a932b58" + } +} diff --git a/tests/auto/declarative/qmlvisual/webview/settings/fontFamily.qml b/tests/auto/declarative/qmlvisual/webview/settings/fontFamily.qml new file mode 100644 index 00000000..7c327042 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/webview/settings/fontFamily.qml @@ -0,0 +1,18 @@ +import QtQuick 1.0 +import QtWebKit 1.0 + +WebView { + property string skip: "WebView tests not counting until resources allocated to WebView maintenance" + id: web + width: 200 + height: 200 + Column { + anchors.fill: parent + Text { text: "standard: " + web.settings.standardFontFamily } + Text { text: "fixed: " + web.settings.fixedFontFamily } + Text { text: "serif: " + web.settings.serifFontFamily } + Text { text: "sansserif: " + web.settings.sansSerifFontFamily } + Text { text: "cursive: " + web.settings.cursiveFontFamily } + Text { text: "fantasy: " + web.settings.fantasyFontFamily } + } +} diff --git a/tests/auto/declarative/qmlvisual/webview/settings/fontSize.qml b/tests/auto/declarative/qmlvisual/webview/settings/fontSize.qml new file mode 100644 index 00000000..988ff641 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/webview/settings/fontSize.qml @@ -0,0 +1,72 @@ +import QtQuick 1.0 +import QtWebKit 1.0 + +Grid { + property string skip: "WebView tests not counting until resources allocated to WebView maintenance" + columns: 3 + Rectangle { + Text { color: "green"; text: "Normal" } + border.color: "black" + width: 200 + height: 200 + WebView { + anchors.fill: parent + url: "test.html" + } + } + Rectangle { + Text { color: "green"; text: "Big" } + border.color: "black" + width: 200 + height: 200 + WebView { + anchors.fill: parent + url: "test.html" + settings.minimumFontSize: 20 + } + } + Rectangle { + Text { color: "green"; text: "Big (logical)" } + border.color: "black" + width: 200 + height: 200 + WebView { + anchors.fill: parent + url: "test.html" + settings.minimumLogicalFontSize: 20 + } + } + Rectangle { + Text { color: "green"; text: "Bigger" } + border.color: "black" + width: 200 + height: 200 + WebView { + anchors.fill: parent + url: "test.html" + settings.minimumFontSize: 30 + } + } + Rectangle { + Text { color: "green"; text: "Small (except fixed)" } + border.color: "black" + width: 200 + height: 200 + WebView { + anchors.fill: parent + url: "test.html" + settings.defaultFontSize: 8 + } + } + Rectangle { + Text { color: "green"; text: "Small fixed" } + border.color: "black" + width: 200 + height: 200 + WebView { + anchors.fill: parent + url: "test.html" + settings.defaultFixedFontSize: 8 + } + } +} diff --git a/tests/auto/declarative/qmlvisual/webview/settings/noAutoLoadImages.qml b/tests/auto/declarative/qmlvisual/webview/settings/noAutoLoadImages.qml new file mode 100644 index 00000000..c465be8b --- /dev/null +++ b/tests/auto/declarative/qmlvisual/webview/settings/noAutoLoadImages.qml @@ -0,0 +1,22 @@ +import QtQuick 1.0 +import QtWebKit 1.0 + +Grid { + property string skip: "WebView tests not counting until resources allocated to WebView maintenance" + columns: 2 + Rectangle { + Text { id: label; x:10; y:170; color: "green"; text: "No image" } + border.color: "black" + width: 200 + height: 200 + WebView { + anchors.fill: parent + settings.autoLoadImages: false + url: "test-img.html" + MouseArea { + anchors.fill: parent + onClicked: { parent.settings.autoLoadImages=true; label.text=""; parent.reload.trigger() } + } + } + } +} diff --git a/tests/auto/declarative/qmlvisual/webview/settings/qtlogo.png b/tests/auto/declarative/qmlvisual/webview/settings/qtlogo.png new file mode 100644 index 00000000..399bd0b1 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/settings/qtlogo.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/settings/setFontFamily.qml b/tests/auto/declarative/qmlvisual/webview/settings/setFontFamily.qml new file mode 100644 index 00000000..11de161f --- /dev/null +++ b/tests/auto/declarative/qmlvisual/webview/settings/setFontFamily.qml @@ -0,0 +1,12 @@ +import QtQuick 1.0 +import QtWebKit 1.0 + +WebView { + property string skip: "WebView tests not counting until resources allocated to WebView maintenance" + url: "test.html" + width: 300 + height: 300 + settings.standardFontFamily: font.name + // WebKit doesn't seem to honour any other FontFamily settings + FontLoader { id: font; source: "tarzeau_ocr_a.ttf" } +} diff --git a/tests/auto/declarative/qmlvisual/webview/settings/tarzeau_ocr_a.ttf b/tests/auto/declarative/qmlvisual/webview/settings/tarzeau_ocr_a.ttf new file mode 100644 index 00000000..cf93f965 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/settings/tarzeau_ocr_a.ttf differ diff --git a/tests/auto/declarative/qmlvisual/webview/settings/test-img.html b/tests/auto/declarative/qmlvisual/webview/settings/test-img.html new file mode 100644 index 00000000..cdd63ace --- /dev/null +++ b/tests/auto/declarative/qmlvisual/webview/settings/test-img.html @@ -0,0 +1,6 @@ + + +

Boring Document

+

+This is a boring document. +With a picture: diff --git a/tests/auto/declarative/qmlvisual/webview/settings/test.html b/tests/auto/declarative/qmlvisual/webview/settings/test.html new file mode 100644 index 00000000..3265e205 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/webview/settings/test.html @@ -0,0 +1,9 @@ + + +

Boring Document

+

+This is a boring document. +

+This is italic. +This is bold. +This is fixed. diff --git a/tests/auto/declarative/qmlvisual/webview/zooming/data/pageWidth.qml b/tests/auto/declarative/qmlvisual/webview/zooming/data/pageWidth.qml new file mode 100644 index 00000000..2e60b7ff --- /dev/null +++ b/tests/auto/declarative/qmlvisual/webview/zooming/data/pageWidth.qml @@ -0,0 +1,227 @@ +import Qt.VisualTest 4.7 + +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/qmlvisual/webview/zooming/data/renderControl.0.png b/tests/auto/declarative/qmlvisual/webview/zooming/data/renderControl.0.png new file mode 100644 index 00000000..38df70e1 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/zooming/data/renderControl.0.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/zooming/data/renderControl.qml b/tests/auto/declarative/qmlvisual/webview/zooming/data/renderControl.qml new file mode 100644 index 00000000..464e0090 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/webview/zooming/data/renderControl.qml @@ -0,0 +1,415 @@ +import Qt.VisualTest 4.7 + +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/qmlvisual/webview/zooming/data/resolution.0.png b/tests/auto/declarative/qmlvisual/webview/zooming/data/resolution.0.png new file mode 100644 index 00000000..7e989c62 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/zooming/data/resolution.0.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/zooming/data/resolution.1.png b/tests/auto/declarative/qmlvisual/webview/zooming/data/resolution.1.png new file mode 100644 index 00000000..60ccc0b5 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/zooming/data/resolution.1.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/zooming/data/resolution.2.png b/tests/auto/declarative/qmlvisual/webview/zooming/data/resolution.2.png new file mode 100644 index 00000000..6c22494b Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/zooming/data/resolution.2.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/zooming/data/resolution.3.png b/tests/auto/declarative/qmlvisual/webview/zooming/data/resolution.3.png new file mode 100644 index 00000000..71dd56fe Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/zooming/data/resolution.3.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/zooming/data/resolution.4.png b/tests/auto/declarative/qmlvisual/webview/zooming/data/resolution.4.png new file mode 100644 index 00000000..ce03cb68 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/zooming/data/resolution.4.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/zooming/data/resolution.qml b/tests/auto/declarative/qmlvisual/webview/zooming/data/resolution.qml new file mode 100644 index 00000000..edf80401 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/webview/zooming/data/resolution.qml @@ -0,0 +1,1319 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + hash: "ac1d9c1cc13813b5e94c692a209a4e36" + } + Frame { + msec: 32 + hash: "1f189a436cf74ae83a03c3bb63c24ec2" + } + Frame { + msec: 48 + hash: "369f761053d5910e00672aa866f698ba" + } + Frame { + msec: 64 + hash: "30a191ae899121ae22d10acee6593415" + } + Frame { + msec: 80 + hash: "7af041898748bb5950643b057ca59eea" + } + Frame { + msec: 96 + hash: "e0a2ed91e78ff9a994deb9649a8afc16" + } + Frame { + msec: 112 + hash: "649ad1a3fb57fb088e4e5cfd749bf2e5" + } + Frame { + msec: 128 + hash: "9053a92e343ebb79bd2831f5ab94a1b5" + } + Frame { + msec: 144 + hash: "dc78b09e27bbc0a2cfec83436eef4446" + } + Frame { + msec: 160 + hash: "2aaa3749f93734dd203e1fea91a9f24a" + } + Frame { + msec: 176 + hash: "8df8dd33eada434231332b81e03430ce" + } + Frame { + msec: 192 + hash: "b5b1beb4dd4720eaa8b888fbef1ba875" + } + Frame { + msec: 208 + hash: "e531d33ef14b58ad843a6be6d7cb0961" + } + Frame { + msec: 224 + hash: "011c0bcca7717b08bc53738718203f7e" + } + Frame { + msec: 240 + hash: "412a630348aa44d56f36f04982035e36" + } + Frame { + msec: 256 + hash: "45528cdc62622b6d01e44466cd85bd38" + } + Frame { + msec: 272 + hash: "0901c99f959d6c10a0b6ea46a282d8fd" + } + Frame { + msec: 288 + hash: "3f200fca4815d555f22912d9fcdc20ee" + } + Frame { + msec: 304 + hash: "5e3c58e2f3a57f4ea48f4315d37ed813" + } + Frame { + msec: 320 + hash: "e8d98ec2d13ef4324feba11be95d0735" + } + Frame { + msec: 336 + hash: "4f3b79b341b63499a20f1e1e2cd979f9" + } + Frame { + msec: 352 + hash: "5ddbc3bc10292bec41531e83c0921c59" + } + Frame { + msec: 368 + hash: "9bc9801e83267689cd2750226f2b08ce" + } + Frame { + msec: 384 + hash: "f87195f2393914a0bbed9a454de01ff5" + } + Frame { + msec: 400 + hash: "4e0fd7f45e53a8d44c416eb9235ec877" + } + Frame { + msec: 416 + hash: "a579d6324fb4bf9ac5ceaba2aa708764" + } + Frame { + msec: 432 + hash: "b9f3f08168fb55ba01e56e670db565de" + } + Frame { + msec: 448 + hash: "cbd63ec868578e295a83170f42b23678" + } + Frame { + msec: 464 + hash: "2ed9d0e09b61dee8b2703e580007d7a5" + } + Frame { + msec: 480 + hash: "92fa2d9ef05140eb9d0fcf78b55f202e" + } + Frame { + msec: 496 + hash: "9a3f9dc04a900020f0e488309d7b4757" + } + Frame { + msec: 512 + hash: "93b4876c3e185ff4875a7447b0bf4f0f" + } + Frame { + msec: 528 + hash: "41b40e36f77d04e62f72ad34aa50709a" + } + Frame { + msec: 544 + hash: "2ea69aeb32fee61b61aa9c4efb2834bf" + } + Frame { + msec: 560 + hash: "0971ac1e05ea2ba387c78d4d103f5ea1" + } + Frame { + msec: 576 + hash: "98e46dff678f293fd6a4e9313ab3aec7" + } + Frame { + msec: 592 + hash: "82b94393071d6c32dd8028e1ee69e7fb" + } + Frame { + msec: 608 + hash: "240df67aa72a24546eb6e043e0d3d205" + } + Frame { + msec: 624 + hash: "56c4113cc341c254ccab66f3bc313154" + } + Frame { + msec: 640 + hash: "20d758c1537ed1a9aff657414b50926c" + } + Frame { + msec: 656 + hash: "ae252d835a05e01c2a12ae820335049a" + } + Frame { + msec: 672 + hash: "4d53256fbb012e738ba3868e2482250d" + } + Frame { + msec: 688 + hash: "261a341cab38986fb2f53b8e430f04a3" + } + Frame { + msec: 704 + hash: "1030f795d310f742ba491a2a90ff52d8" + } + Frame { + msec: 720 + hash: "59d24ebfedd2a87bdbd755d06c4361d2" + } + Frame { + msec: 736 + hash: "a6eaa480b3f93d33ae23bb36b7691b92" + } + Frame { + msec: 752 + hash: "cb6cf1e6e89da3fcbad323f744aef18d" + } + Frame { + msec: 768 + hash: "33a4f07cf7f5d16f006541c61ae2e4ee" + } + Frame { + msec: 784 + hash: "6e857b106486ea0aaa5321d4a7a07eae" + } + Frame { + msec: 800 + hash: "0f80edaf3eecf7a8c015d3fcecc0a494" + } + Frame { + msec: 816 + hash: "24b45d00d70904694c30ebd422c739ce" + } + Frame { + msec: 832 + hash: "c0ca66fefb19294852b9be0c4ba36481" + } + Frame { + msec: 848 + hash: "047846d243e7613193a8ddd526c4268e" + } + Frame { + msec: 864 + hash: "ca85f90e450ccda6b76e6a29a3187a63" + } + Frame { + msec: 880 + hash: "fcd803f5640d054190c2ddc9a6406bb9" + } + Frame { + msec: 896 + hash: "f81152b8a464bfa8343f52efcb0c8b8c" + } + Frame { + msec: 912 + hash: "e86be73d83699584dca986dfdb030b36" + } + Frame { + msec: 928 + hash: "d9798e4ebaf72c35b19a56b336d2ea93" + } + Frame { + msec: 944 + hash: "460f13d8e05b529c0e4fba39b1449ff1" + } + Frame { + msec: 960 + image: "resolution.0.png" + } + Frame { + msec: 976 + hash: "8b2f13580c6de9ec231809330d2d0362" + } + Frame { + msec: 992 + hash: "94a2cc520340573557e6a310f2ea125e" + } + Frame { + msec: 1008 + hash: "a8df78ab2e800349ec887ea6b1f5dcb8" + } + Frame { + msec: 1024 + hash: "0f3a56dbe26d453847ed4847c0e81d1a" + } + Frame { + msec: 1040 + hash: "96c89325862a982235b4b75922ec4669" + } + Frame { + msec: 1056 + hash: "ead6352a4ca47da59422e8d6a5844aa4" + } + Frame { + msec: 1072 + hash: "b50a6b14f15882e2c1ae6e3babeecdf8" + } + Frame { + msec: 1088 + hash: "2f32245c3388b86194e8183a290e99b8" + } + Frame { + msec: 1104 + hash: "2b54d49d30ccbf11ccb5ba8d62ba7d83" + } + Frame { + msec: 1120 + hash: "495b25d87cb6d1d4bdea4d5ec62c698e" + } + Frame { + msec: 1136 + hash: "3d45b061939783b6359fa4cdb908ecc0" + } + Frame { + msec: 1152 + hash: "e9e601c2a65a09b6354fff2c162106d6" + } + Frame { + msec: 1168 + hash: "8cfba8a724e85403b573caf7bbac9d83" + } + Frame { + msec: 1184 + hash: "5910765354645b724e14681cbdea227e" + } + Frame { + msec: 1200 + hash: "4358af7f2ccfc0919614351bfd5a7405" + } + Frame { + msec: 1216 + hash: "032e064336b458a6de03fdc98684cc34" + } + Frame { + msec: 1232 + hash: "c81d87bf83ee7e834a4b15dd103f7082" + } + Frame { + msec: 1248 + hash: "9d4416b55ed3b9e45a2314e9be5a5f2d" + } + Frame { + msec: 1264 + hash: "5b96da1a52a0413f9e8edbc9291a2502" + } + Frame { + msec: 1280 + hash: "aaa4008281ebc60b15616c818816e195" + } + Frame { + msec: 1296 + hash: "81ebf882aeb89648300dfc2e8e2cf11b" + } + Frame { + msec: 1312 + hash: "4e686e6cee12902f92e0ece915386fb3" + } + Frame { + msec: 1328 + hash: "6ff8d9bd6ec4dce414cdc7330646156e" + } + Frame { + msec: 1344 + hash: "dac6334e8b221527ef74b4f93eeef7c3" + } + Frame { + msec: 1360 + hash: "e58dbf419d1831e001e802600803aaa5" + } + Frame { + msec: 1376 + hash: "e8685f9b12c9ccb9d0e471946f1f6f9c" + } + Frame { + msec: 1392 + hash: "0936715ff8d38c2c813ebef0683a3246" + } + Frame { + msec: 1408 + hash: "37ad0a5532af8b083a7d4c4b044075ca" + } + Frame { + msec: 1424 + hash: "52ae25414d353d994cba36918644949a" + } + Frame { + msec: 1440 + hash: "07719485f9a7d0012eb0f3f211f0f21b" + } + Frame { + msec: 1456 + hash: "2d1a4f2c8d4a8d6316a31a81a2d20c61" + } + Frame { + msec: 1472 + hash: "3b279fb9e7b3efe05becc1651ba59493" + } + Frame { + msec: 1488 + hash: "4b9c126dcdf499f9de4e09d4f6ab86bf" + } + Frame { + msec: 1504 + hash: "6a1b8d8ea46949cb65e8f4155ab94819" + } + Frame { + msec: 1520 + hash: "6dbd2106b91ffbbb8a845e6cddbd47d7" + } + Frame { + msec: 1536 + hash: "8244eda92302f2b5cff01f05d438bf20" + } + Frame { + msec: 1552 + hash: "f939bd80ae865e365e554a532ade38f5" + } + Frame { + msec: 1568 + hash: "92d135616eee6737333b3d86d0aa5956" + } + Frame { + msec: 1584 + hash: "ca75854d6e5a77c8e609d65971b5671a" + } + Frame { + msec: 1600 + hash: "b0a113800cd05768b57bac6b9a338b1d" + } + Frame { + msec: 1616 + hash: "7af1a2aa6a201e36c3a969be4330af04" + } + Frame { + msec: 1632 + hash: "e54e8a2cfb0e6678b2a7cc64b8ae08bc" + } + Frame { + msec: 1648 + hash: "5d212c7efd9cf7d3eb5219b0bbe766d7" + } + Frame { + msec: 1664 + hash: "f4f2c95380c0f76c9e89820cdbeb5b31" + } + Frame { + msec: 1680 + hash: "b8eefbf5ade1a6b9eef9608f66a46474" + } + Frame { + msec: 1696 + hash: "d699ace9babbb152aad2fa852114c099" + } + Frame { + msec: 1712 + hash: "ceb3dea0d2b93cc5882a2b38ab3d1b95" + } + Frame { + msec: 1728 + hash: "08175810bfb80e1c5816b0d0aebbac4a" + } + Frame { + msec: 1744 + hash: "86abce93f50e7e7ebbd90690cfb20dd2" + } + Frame { + msec: 1760 + hash: "2918979f2682bd32beb5eaf7ecb3e463" + } + Frame { + msec: 1776 + hash: "b165ab96b0d51d41578bf99cbf7f6d02" + } + Frame { + msec: 1792 + hash: "d56cfdb2c65372cb36aeb13fd9c73deb" + } + Frame { + msec: 1808 + hash: "c53f0e4dc8204e5892ed4f367a6bade3" + } + Frame { + msec: 1824 + hash: "b3ae62e13149160f3695ed5c116411aa" + } + Frame { + msec: 1840 + hash: "057e4a0428ea2ff9893becd40e6d2977" + } + Frame { + msec: 1856 + hash: "10c050131093cc0d3f4b80c44eb1218b" + } + Frame { + msec: 1872 + hash: "17ce5a6dace37f4eb316f37ea26a8a2c" + } + Frame { + msec: 1888 + hash: "6e00c7e74bfaed5cf06aba54c8b73e57" + } + Frame { + msec: 1904 + hash: "5a03b1b698ca28d2afd9c67aef3bc2e9" + } + Frame { + msec: 1920 + image: "resolution.1.png" + } + Frame { + msec: 1936 + hash: "0fab102a33521e8893afdb6a11a3c5c9" + } + Frame { + msec: 1952 + hash: "232e8f1b060ef55e37a372bec4435d11" + } + Frame { + msec: 1968 + hash: "2107724eac0d1b8735060876f80d303a" + } + Frame { + msec: 1984 + hash: "cf5d12d2707975ad364750d5ba787944" + } + Frame { + msec: 2000 + hash: "2457c88828c2cb39feb1d34556077139" + } + Frame { + msec: 2016 + hash: "5f08d6dab8199b3f0f57d32cf2da4d67" + } + Frame { + msec: 2032 + hash: "2457c88828c2cb39feb1d34556077139" + } + Frame { + msec: 2048 + hash: "cf5d12d2707975ad364750d5ba787944" + } + Frame { + msec: 2064 + hash: "2107724eac0d1b8735060876f80d303a" + } + Frame { + msec: 2080 + hash: "232e8f1b060ef55e37a372bec4435d11" + } + Frame { + msec: 2096 + hash: "0a93c515cd328978ebd8103539a2fd63" + } + Frame { + msec: 2112 + hash: "63d6c7beac12e3bd83f9ef58c233c7d2" + } + Frame { + msec: 2128 + hash: "5a03b1b698ca28d2afd9c67aef3bc2e9" + } + Frame { + msec: 2144 + hash: "6e00c7e74bfaed5cf06aba54c8b73e57" + } + Frame { + msec: 2160 + hash: "17ce5a6dace37f4eb316f37ea26a8a2c" + } + Frame { + msec: 2176 + hash: "10c050131093cc0d3f4b80c44eb1218b" + } + Frame { + msec: 2192 + hash: "057e4a0428ea2ff9893becd40e6d2977" + } + Frame { + msec: 2208 + hash: "b3ae62e13149160f3695ed5c116411aa" + } + Frame { + msec: 2224 + hash: "c53f0e4dc8204e5892ed4f367a6bade3" + } + Frame { + msec: 2240 + hash: "d56cfdb2c65372cb36aeb13fd9c73deb" + } + Frame { + msec: 2256 + hash: "b165ab96b0d51d41578bf99cbf7f6d02" + } + Frame { + msec: 2272 + hash: "2918979f2682bd32beb5eaf7ecb3e463" + } + Frame { + msec: 2288 + hash: "86abce93f50e7e7ebbd90690cfb20dd2" + } + Frame { + msec: 2304 + hash: "08175810bfb80e1c5816b0d0aebbac4a" + } + Frame { + msec: 2320 + hash: "ceb3dea0d2b93cc5882a2b38ab3d1b95" + } + Frame { + msec: 2336 + hash: "d699ace9babbb152aad2fa852114c099" + } + Frame { + msec: 2352 + hash: "b8eefbf5ade1a6b9eef9608f66a46474" + } + Frame { + msec: 2368 + hash: "f4f2c95380c0f76c9e89820cdbeb5b31" + } + Frame { + msec: 2384 + hash: "5d212c7efd9cf7d3eb5219b0bbe766d7" + } + Frame { + msec: 2400 + hash: "e54e8a2cfb0e6678b2a7cc64b8ae08bc" + } + Frame { + msec: 2416 + hash: "d9408487f747ffb8eff5e1da92207285" + } + Frame { + msec: 2432 + hash: "e6b3fa1829535ac90d1548f45aadb9be" + } + Frame { + msec: 2448 + hash: "ca75854d6e5a77c8e609d65971b5671a" + } + Frame { + msec: 2464 + hash: "92d135616eee6737333b3d86d0aa5956" + } + Frame { + msec: 2480 + hash: "f939bd80ae865e365e554a532ade38f5" + } + Frame { + msec: 2496 + hash: "8244eda92302f2b5cff01f05d438bf20" + } + Frame { + msec: 2512 + hash: "6dbd2106b91ffbbb8a845e6cddbd47d7" + } + Frame { + msec: 2528 + hash: "6a1b8d8ea46949cb65e8f4155ab94819" + } + Frame { + msec: 2544 + hash: "4b9c126dcdf499f9de4e09d4f6ab86bf" + } + Frame { + msec: 2560 + hash: "3b279fb9e7b3efe05becc1651ba59493" + } + Frame { + msec: 2576 + hash: "bb40b884b56defb61ad86757fd51b9e6" + } + Frame { + msec: 2592 + hash: "07719485f9a7d0012eb0f3f211f0f21b" + } + Frame { + msec: 2608 + hash: "52ae25414d353d994cba36918644949a" + } + Frame { + msec: 2624 + hash: "37ad0a5532af8b083a7d4c4b044075ca" + } + Frame { + msec: 2640 + hash: "0936715ff8d38c2c813ebef0683a3246" + } + Frame { + msec: 2656 + hash: "e8685f9b12c9ccb9d0e471946f1f6f9c" + } + Frame { + msec: 2672 + hash: "e58dbf419d1831e001e802600803aaa5" + } + Frame { + msec: 2688 + hash: "dac6334e8b221527ef74b4f93eeef7c3" + } + Frame { + msec: 2704 + hash: "6ff8d9bd6ec4dce414cdc7330646156e" + } + Frame { + msec: 2720 + hash: "4e686e6cee12902f92e0ece915386fb3" + } + Frame { + msec: 2736 + hash: "81ebf882aeb89648300dfc2e8e2cf11b" + } + Frame { + msec: 2752 + hash: "aaa4008281ebc60b15616c818816e195" + } + Frame { + msec: 2768 + hash: "5b96da1a52a0413f9e8edbc9291a2502" + } + Frame { + msec: 2784 + hash: "9d4416b55ed3b9e45a2314e9be5a5f2d" + } + Frame { + msec: 2800 + hash: "c81d87bf83ee7e834a4b15dd103f7082" + } + Frame { + msec: 2816 + hash: "9fdf30d57c49a6644377ba40140b1969" + } + Frame { + msec: 2832 + hash: "4358af7f2ccfc0919614351bfd5a7405" + } + Frame { + msec: 2848 + hash: "5910765354645b724e14681cbdea227e" + } + Frame { + msec: 2864 + hash: "8cfba8a724e85403b573caf7bbac9d83" + } + Frame { + msec: 2880 + image: "resolution.2.png" + } + Frame { + msec: 2896 + hash: "3d45b061939783b6359fa4cdb908ecc0" + } + Frame { + msec: 2912 + hash: "495b25d87cb6d1d4bdea4d5ec62c698e" + } + Frame { + msec: 2928 + hash: "2b54d49d30ccbf11ccb5ba8d62ba7d83" + } + Frame { + msec: 2944 + hash: "2f32245c3388b86194e8183a290e99b8" + } + Frame { + msec: 2960 + hash: "b50a6b14f15882e2c1ae6e3babeecdf8" + } + Frame { + msec: 2976 + hash: "ead6352a4ca47da59422e8d6a5844aa4" + } + Frame { + msec: 2992 + hash: "96c89325862a982235b4b75922ec4669" + } + Frame { + msec: 3008 + hash: "0f3a56dbe26d453847ed4847c0e81d1a" + } + Frame { + msec: 3024 + hash: "a8df78ab2e800349ec887ea6b1f5dcb8" + } + Frame { + msec: 3040 + hash: "94a2cc520340573557e6a310f2ea125e" + } + Frame { + msec: 3056 + hash: "8b2f13580c6de9ec231809330d2d0362" + } + Frame { + msec: 3072 + hash: "5f76ef4f6b8e703fd0822859cd9a1353" + } + Frame { + msec: 3088 + hash: "460f13d8e05b529c0e4fba39b1449ff1" + } + Frame { + msec: 3104 + hash: "d9798e4ebaf72c35b19a56b336d2ea93" + } + Frame { + msec: 3120 + hash: "e86be73d83699584dca986dfdb030b36" + } + Frame { + msec: 3136 + hash: "f81152b8a464bfa8343f52efcb0c8b8c" + } + Frame { + msec: 3152 + hash: "fcd803f5640d054190c2ddc9a6406bb9" + } + Frame { + msec: 3168 + hash: "ca85f90e450ccda6b76e6a29a3187a63" + } + Frame { + msec: 3184 + hash: "047846d243e7613193a8ddd526c4268e" + } + Frame { + msec: 3200 + hash: "c0ca66fefb19294852b9be0c4ba36481" + } + Frame { + msec: 3216 + hash: "d4a075656790c4f2c50addcd2cc660b5" + } + Frame { + msec: 3232 + hash: "0f80edaf3eecf7a8c015d3fcecc0a494" + } + Frame { + msec: 3248 + hash: "6e857b106486ea0aaa5321d4a7a07eae" + } + Frame { + msec: 3264 + hash: "33a4f07cf7f5d16f006541c61ae2e4ee" + } + Frame { + msec: 3280 + hash: "cb6cf1e6e89da3fcbad323f744aef18d" + } + Frame { + msec: 3296 + hash: "a6eaa480b3f93d33ae23bb36b7691b92" + } + Frame { + msec: 3312 + hash: "59d24ebfedd2a87bdbd755d06c4361d2" + } + Frame { + msec: 3328 + hash: "1030f795d310f742ba491a2a90ff52d8" + } + Frame { + msec: 3344 + hash: "261a341cab38986fb2f53b8e430f04a3" + } + Frame { + msec: 3360 + hash: "4d53256fbb012e738ba3868e2482250d" + } + Frame { + msec: 3376 + hash: "ae252d835a05e01c2a12ae820335049a" + } + Frame { + msec: 3392 + hash: "20d758c1537ed1a9aff657414b50926c" + } + Frame { + msec: 3408 + hash: "56c4113cc341c254ccab66f3bc313154" + } + Frame { + msec: 3424 + hash: "240df67aa72a24546eb6e043e0d3d205" + } + Frame { + msec: 3440 + hash: "82b94393071d6c32dd8028e1ee69e7fb" + } + Frame { + msec: 3456 + hash: "98e46dff678f293fd6a4e9313ab3aec7" + } + Frame { + msec: 3472 + hash: "0971ac1e05ea2ba387c78d4d103f5ea1" + } + Frame { + msec: 3488 + hash: "2ea69aeb32fee61b61aa9c4efb2834bf" + } + Frame { + msec: 3504 + hash: "41b40e36f77d04e62f72ad34aa50709a" + } + Frame { + msec: 3520 + hash: "93b4876c3e185ff4875a7447b0bf4f0f" + } + Frame { + msec: 3536 + hash: "9a3f9dc04a900020f0e488309d7b4757" + } + Frame { + msec: 3552 + hash: "92fa2d9ef05140eb9d0fcf78b55f202e" + } + Frame { + msec: 3568 + hash: "2ed9d0e09b61dee8b2703e580007d7a5" + } + Frame { + msec: 3584 + hash: "cbd63ec868578e295a83170f42b23678" + } + Frame { + msec: 3600 + hash: "b9f3f08168fb55ba01e56e670db565de" + } + Frame { + msec: 3616 + hash: "a579d6324fb4bf9ac5ceaba2aa708764" + } + Frame { + msec: 3632 + hash: "4e0fd7f45e53a8d44c416eb9235ec877" + } + Frame { + msec: 3648 + hash: "f87195f2393914a0bbed9a454de01ff5" + } + Frame { + msec: 3664 + hash: "9bc9801e83267689cd2750226f2b08ce" + } + Frame { + msec: 3680 + hash: "5ddbc3bc10292bec41531e83c0921c59" + } + Frame { + msec: 3696 + hash: "4f3b79b341b63499a20f1e1e2cd979f9" + } + Frame { + msec: 3712 + hash: "e8d98ec2d13ef4324feba11be95d0735" + } + Frame { + msec: 3728 + hash: "5e3c58e2f3a57f4ea48f4315d37ed813" + } + Frame { + msec: 3744 + hash: "3f200fca4815d555f22912d9fcdc20ee" + } + Frame { + msec: 3760 + hash: "0901c99f959d6c10a0b6ea46a282d8fd" + } + Frame { + msec: 3776 + hash: "a186b8e984c999e8609472a7a5fa0610" + } + Frame { + msec: 3792 + hash: "412a630348aa44d56f36f04982035e36" + } + Frame { + msec: 3808 + hash: "011c0bcca7717b08bc53738718203f7e" + } + Frame { + msec: 3824 + hash: "e531d33ef14b58ad843a6be6d7cb0961" + } + Frame { + msec: 3840 + image: "resolution.3.png" + } + Frame { + msec: 3856 + hash: "8df8dd33eada434231332b81e03430ce" + } + Frame { + msec: 3872 + hash: "2aaa3749f93734dd203e1fea91a9f24a" + } + Frame { + msec: 3888 + hash: "dc78b09e27bbc0a2cfec83436eef4446" + } + Frame { + msec: 3904 + hash: "9053a92e343ebb79bd2831f5ab94a1b5" + } + Frame { + msec: 3920 + hash: "649ad1a3fb57fb088e4e5cfd749bf2e5" + } + Frame { + msec: 3936 + hash: "3579849956c1101000ef09949aa4c0f9" + } + Frame { + msec: 3952 + hash: "7af041898748bb5950643b057ca59eea" + } + Frame { + msec: 3968 + hash: "30a191ae899121ae22d10acee6593415" + } + Frame { + msec: 3984 + hash: "369f761053d5910e00672aa866f698ba" + } + Frame { + msec: 4000 + hash: "1f189a436cf74ae83a03c3bb63c24ec2" + } + Frame { + msec: 4016 + hash: "ac1d9c1cc13813b5e94c692a209a4e36" + } + Frame { + msec: 4032 + hash: "f0e0b5c041bcf38d8d9144d466ad74a9" + } + Frame { + msec: 4048 + hash: "38a35c94ebcf33f6720fea33821a54e1" + } + Frame { + msec: 4064 + hash: "061d139f43a3dd63daf887b82721f42f" + } + Frame { + msec: 4080 + hash: "623747b5fe99e5ffaa62f4daa3f840ef" + } + Frame { + msec: 4096 + hash: "4dd5081a387ffda296811b64b9235d7d" + } + Frame { + msec: 4112 + hash: "1598cf2fe996f99ab4c15f84d89cd7bd" + } + Frame { + msec: 4128 + hash: "30cac85bf1a622d438a64b6ccb59a8ca" + } + Frame { + msec: 4144 + hash: "114e54ae3e1493750a022f1c019e7f77" + } + Frame { + msec: 4160 + hash: "a585efc3aae3a426e6af5f4a8cc23b10" + } + Frame { + msec: 4176 + hash: "c0f315549baad93dd885d58b185e7ed7" + } + Frame { + msec: 4192 + hash: "3a00f5f034bef58ca341bf9e1056f46f" + } + Frame { + msec: 4208 + hash: "b3022d07dee989499a35aea21e07e4c1" + } + Frame { + msec: 4224 + hash: "e722464809e94fb7d8c752506f0d3ac2" + } + Frame { + msec: 4240 + hash: "82ea3d06367ce9dc582dbdbc186cc70a" + } + Frame { + msec: 4256 + hash: "359040facbe531c7f6b805b8bfc5b17a" + } + Frame { + msec: 4272 + hash: "264c7b65bae7e3945d87c17edfda6889" + } + Frame { + msec: 4288 + hash: "d941ec8e363942af02f36d4672521801" + } + Frame { + msec: 4304 + hash: "e46e145b4d07d1697c1d9efce80c80de" + } + Frame { + msec: 4320 + hash: "d8bed5c42bc5725d811db4dacdab1581" + } + Frame { + msec: 4336 + hash: "aa221160b4a11b30cb73eaa8ccaa9dfd" + } + Frame { + msec: 4352 + hash: "f411483477906d83f872b306cd021406" + } + Frame { + msec: 4368 + hash: "d9c52e4f99416fa1043a9c34a1c29f5a" + } + Frame { + msec: 4384 + hash: "ec2890446f34b8a5d47ae97ba2853d0f" + } + Frame { + msec: 4400 + hash: "6a3e6ef7d832fa7ec813b38171cb3602" + } + Frame { + msec: 4416 + hash: "6dfd75b6cb780f7d80466f3450d0b255" + } + Frame { + msec: 4432 + hash: "170774843dc6f28f51f07c445e046bd8" + } + Frame { + msec: 4448 + hash: "eab348bef656739d9723d3bd659c43ff" + } + Frame { + msec: 4464 + hash: "f06e546bb710002cdf1cefd51ffa47c4" + } + Frame { + msec: 4480 + hash: "52f7ff1348d9aa7cdf43cd81f0a71625" + } + Frame { + msec: 4496 + hash: "55a5b1befa3b7a4674a62d492b5527ea" + } + Frame { + msec: 4512 + hash: "699c093fddc6b9293a011d8d6eccd36d" + } + Frame { + msec: 4528 + hash: "b988e1ad7dc7d26ffeea8f71a69a9abf" + } + Frame { + msec: 4544 + hash: "8dea2b47492f83f961a47536a10aad0c" + } + Frame { + msec: 4560 + hash: "925ea8105779ffd801a3c62129d64bed" + } + Frame { + msec: 4576 + hash: "aa5d957c4f452b1f1c70ea672ce4a0b9" + } + Frame { + msec: 4592 + hash: "85d3ea97a1fb152ae8ad65a17693a16d" + } + Frame { + msec: 4608 + hash: "069b2bc8b86f822c5e7ceca3664e78a6" + } + Frame { + msec: 4624 + hash: "209071b7f72d8c25b9ce27c05397fe56" + } + Frame { + msec: 4640 + hash: "068dea708612620d34bd57c6affb44b1" + } + Frame { + msec: 4656 + hash: "36b53a0845220645059fed803a6ffcbc" + } + Frame { + msec: 4672 + hash: "2c84e15006a39a554eb2047bae9d4f6f" + } + Frame { + msec: 4688 + hash: "1bdab31534f4b5a7e9d27ede3e9acb57" + } + Frame { + msec: 4704 + hash: "688689eeb584b0c74f0322af35857dd5" + } + Frame { + msec: 4720 + hash: "024939fea5b6c6f9d3e26a0abf42ae3c" + } + Frame { + msec: 4736 + hash: "2efb2f47c6f0be3743f0f4dc7a66b08e" + } + Frame { + msec: 4752 + hash: "4631f3756af880693d3654c16cbe47bb" + } + Frame { + msec: 4768 + hash: "2fd77649c1e1ade97534ef530ad05612" + } + Frame { + msec: 4784 + hash: "5d13517bac111c8af49c444d41a42ea1" + } + Frame { + msec: 4800 + image: "resolution.4.png" + } + Frame { + msec: 4816 + hash: "8bd8efe405a42730304dcc120a6e718c" + } + Frame { + msec: 4832 + hash: "a83c543977e3f1dd4c020375eb3273fd" + } + Frame { + msec: 4848 + hash: "c52f38469fec77afc7f0a44b992e3d0d" + } + Frame { + msec: 4864 + hash: "af645449d6ec3f42449ffc59193aaaa4" + } + Frame { + msec: 4880 + hash: "2eb982cf754c77c109158076957775ae" + } + Frame { + msec: 4896 + hash: "9bf2fd4a4e45f302b34b7f038937d3d7" + } + Frame { + msec: 4912 + hash: "5520e309d68c8eedf76a9392714a6150" + } + Frame { + msec: 4928 + hash: "9dcd043a25e33b788729c0a0531301e7" + } + Frame { + msec: 4944 + hash: "1475b9bcfe08c66135673f4284c9bbcd" + } + Frame { + msec: 4960 + hash: "9af1f355bcf4d5f05b42040ebba75e09" + } + Frame { + msec: 4976 + hash: "8b6e04980ea60ca2ff06053d35c06881" + } + Frame { + msec: 4992 + hash: "def466e377a44afc4b2a9a9ebb258f86" + } + Frame { + msec: 5008 + hash: "18f6d6f5a3fdaee0037580df0f4f9ef0" + } + Frame { + msec: 5024 + hash: "ae2579498558f6f93489999c7c82cbcd" + } + Frame { + msec: 5040 + hash: "623d8e756c2c131150554272df231bf9" + } + Frame { + msec: 5056 + hash: "c13146576229848b8a1e1b382fbf749d" + } + Frame { + msec: 5072 + hash: "f963a399aeea1d34ec3bd30a5b991035" + } + Frame { + msec: 5088 + hash: "45a4db021ba0a53ad783c14a3b66aa38" + } + Frame { + msec: 5104 + hash: "2031618470e3bb3a3435fe0e270a15d4" + } + Frame { + msec: 5120 + hash: "f7cc01c301f29110db8364fecc8751f1" + } + Frame { + msec: 5136 + hash: "2d366fa500257ec0a12863f3637d0c47" + } + Frame { + msec: 5152 + hash: "4ba700e7f9ffba4889ca26d903a63029" + } + Frame { + msec: 5168 + hash: "329bec5e3d6a131b4bd9a056659bdb3e" + } + Frame { + msec: 5184 + hash: "48f7356707cdbcb401c135207ee38821" + } + Frame { + msec: 5200 + hash: "5314e448affe60d193d07a784035ecce" + } + Frame { + msec: 5216 + hash: "c87e98becdf99c214ad4987985b4af07" + } + Frame { + msec: 5232 + hash: "ea81d2a967b619980d7e42937ec74668" + } + Frame { + msec: 5248 + hash: "845319d4e0f6ee97697e59c606220e7a" + } +} diff --git a/tests/auto/declarative/qmlvisual/webview/zooming/data/zoomTextOnly.0.png b/tests/auto/declarative/qmlvisual/webview/zooming/data/zoomTextOnly.0.png new file mode 100644 index 00000000..4b9abb4f Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/zooming/data/zoomTextOnly.0.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/zooming/data/zoomTextOnly.1.png b/tests/auto/declarative/qmlvisual/webview/zooming/data/zoomTextOnly.1.png new file mode 100644 index 00000000..5ce97871 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/zooming/data/zoomTextOnly.1.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/zooming/data/zoomTextOnly.qml b/tests/auto/declarative/qmlvisual/webview/zooming/data/zoomTextOnly.qml new file mode 100644 index 00000000..4aab7082 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/webview/zooming/data/zoomTextOnly.qml @@ -0,0 +1,655 @@ +import Qt.VisualTest 4.7 + +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/qmlvisual/webview/zooming/data/zooming.0.png b/tests/auto/declarative/qmlvisual/webview/zooming/data/zooming.0.png new file mode 100644 index 00000000..aaab35d4 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/zooming/data/zooming.0.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/zooming/data/zooming.1.png b/tests/auto/declarative/qmlvisual/webview/zooming/data/zooming.1.png new file mode 100644 index 00000000..aaab35d4 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/zooming/data/zooming.1.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/zooming/data/zooming.2.png b/tests/auto/declarative/qmlvisual/webview/zooming/data/zooming.2.png new file mode 100644 index 00000000..aaab35d4 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/zooming/data/zooming.2.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/zooming/data/zooming.3.png b/tests/auto/declarative/qmlvisual/webview/zooming/data/zooming.3.png new file mode 100644 index 00000000..aaab35d4 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/zooming/data/zooming.3.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/zooming/data/zooming.qml b/tests/auto/declarative/qmlvisual/webview/zooming/data/zooming.qml new file mode 100644 index 00000000..080d4d05 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/webview/zooming/data/zooming.qml @@ -0,0 +1,2115 @@ +import Qt.VisualTest 4.7 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 32 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 48 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 64 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 80 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 96 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 112 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 128 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 144 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 160 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 176 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 192 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 208 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 224 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 240 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 256 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 272 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 288 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 304 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 320 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 336 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 352 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 197; y: 34 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 185; y: 34 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 368 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 169; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 384 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 161; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 400 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 155; y: 44 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 147; y: 46 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 416 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 141; y: 48 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 138; y: 48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 432 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 130; y: 48 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 127; y: 48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 448 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 125; y: 48 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 123; y: 48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 464 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 480 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 121; y: 49 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 496 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 512 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 117; y: 53 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 116; y: 53 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 528 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 115; y: 54 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 544 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 113; y: 54 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 560 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 111; y: 53 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 111; y: 52 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 576 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 110; y: 50 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 592 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 109; y: 48 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 608 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 108; y: 46 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 624 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 108; y: 45 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 107; y: 44 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 640 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 106; y: 43 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 656 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 105; y: 42 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 672 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 105; y: 41 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 688 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 704 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 720 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 736 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 105; y: 40 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 752 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 105; y: 39 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 768 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 105; y: 37 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 105; y: 36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 784 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 105; y: 35 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 105; y: 34 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 800 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 816 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 106; y: 33 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 832 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 848 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 864 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 880 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 896 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 106; y: 33 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 912 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 928 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 944 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 960 + image: "zooming.0.png" + } + Frame { + msec: 976 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 106; y: 33 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 992 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 1008 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 1024 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 1040 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 1056 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 4 + button: 1 + buttons: 1 + x: 106; y: 33 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1072 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 1088 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 1104 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 1120 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 106; y: 33 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1136 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 1152 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 1168 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 1184 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 106; y: 34 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 106; y: 36 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1200 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 105; y: 38 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1216 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 103; y: 44 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1232 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 102; y: 46 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 98; y: 50 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1248 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 94; y: 56 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 90; y: 62 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1264 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 88; y: 70 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 84; y: 78 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1280 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 84; y: 86 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 84; y: 94 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1296 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 84; y: 104 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 86; y: 114 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1312 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 88; y: 124 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 92; y: 136 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1328 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 94; y: 146 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 96; y: 156 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1344 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 96; y: 164 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 96; y: 172 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1360 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 96; y: 180 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 96; y: 188 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1376 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 96; y: 190 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 96; y: 193 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1392 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 95; y: 195 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 95; y: 197 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1408 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 95; y: 198 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 95; y: 200 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1424 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 94; y: 201 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 94; y: 202 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1440 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 94; y: 204 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1456 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 93; y: 205 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1472 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 92; y: 206 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1488 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 92; y: 208 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1504 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 92; y: 210 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1520 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 92; y: 211 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 91; y: 212 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1536 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 1552 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 1568 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 1584 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 1600 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 1616 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 1632 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 91; y: 213 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1648 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 1664 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 1680 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 1696 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 1712 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 91; y: 214 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 91; y: 214 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1728 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 1744 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 1760 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 1776 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 91; y: 214 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1792 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 1808 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 1824 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 1840 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 4 + button: 1 + buttons: 1 + x: 91; y: 214 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1856 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 1872 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 1888 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 1904 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 1920 + image: "zooming.1.png" + } + Frame { + msec: 1936 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 91; y: 214 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 1952 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 1968 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 1984 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2000 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2016 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2032 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2048 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2064 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2080 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2096 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2112 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2128 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 91; y: 212 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2144 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2160 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2176 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2192 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 89; y: 211 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2208 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 88; y: 211 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2224 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2240 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 86; y: 211 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2256 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 85; y: 211 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 84; y: 211 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2272 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 82; y: 211 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 80; y: 211 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2288 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 77; y: 211 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 75; y: 211 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2304 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 69; y: 213 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 66; y: 213 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2320 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 64; y: 213 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 62; y: 213 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2336 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 60; y: 213 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 58; y: 213 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2352 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 56; y: 213 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 55; y: 212 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2368 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2384 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2400 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2416 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2432 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2448 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2464 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2480 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 56; y: 213 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2496 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 58; y: 214 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 59; y: 214 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2512 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 61; y: 215 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 62; y: 216 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2528 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 63; y: 216 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2544 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2560 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2576 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2592 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 64; y: 216 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 2 + button: 1 + buttons: 1 + x: 64; y: 216 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2608 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2624 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2640 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2656 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2672 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 1 + x: 63; y: 216 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 63; y: 216 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2688 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 62; y: 216 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2704 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2720 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2736 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2752 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 4 + button: 1 + buttons: 1 + x: 62; y: 216 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2768 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2784 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2800 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2816 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 3 + button: 1 + buttons: 0 + x: 62; y: 216 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2832 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2848 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 2864 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 62; y: 215 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2880 + image: "zooming.2.png" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 62; y: 214 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2896 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 62; y: 213 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2912 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 62; y: 212 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 63; y: 211 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2928 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 63; y: 209 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 64; y: 208 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2944 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 66; y: 202 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 70; y: 198 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2960 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 72; y: 192 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 74; y: 186 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2976 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 76; y: 180 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 80; y: 170 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 2992 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 84; y: 162 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 88; y: 152 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3008 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 94; y: 142 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 98; y: 130 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3024 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 102; y: 118 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 108; y: 108 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3040 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 112; y: 98 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 114; y: 90 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3056 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 120; y: 80 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 122; y: 72 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3072 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 126; y: 66 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 128; y: 58 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3088 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 132; y: 52 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 134; y: 46 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3104 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 136; y: 40 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 140; y: 32 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3120 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 144; y: 24 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 150; y: 18 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3136 + hash: "c98df558c41f1837398eead42392b780" + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 154; y: 10 + modifiers: 0 + sendToViewport: true + } + Mouse { + type: 5 + button: 0 + buttons: 0 + x: 160; y: 4 + modifiers: 0 + sendToViewport: true + } + Frame { + msec: 3152 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3168 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3184 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3200 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3216 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3232 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3248 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3264 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3280 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3296 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3312 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3328 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3344 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3360 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3376 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3392 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3408 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3424 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3440 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3456 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3472 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3488 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3504 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3520 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3536 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3552 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3568 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3584 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3600 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3616 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3632 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3648 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3664 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3680 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3696 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3712 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3728 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3744 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3760 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3776 + hash: "c98df558c41f1837398eead42392b780" + } + Frame { + msec: 3792 + hash: "c98df558c41f1837398eead42392b780" + } +} diff --git a/tests/auto/declarative/qmlvisual/webview/zooming/pageWidth.qml b/tests/auto/declarative/qmlvisual/webview/zooming/pageWidth.qml new file mode 100644 index 00000000..a2b11ac2 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/webview/zooming/pageWidth.qml @@ -0,0 +1,11 @@ +import QtQuick 1.0 +import QtWebKit 1.0 + +WebView { + property string skip: "WebView tests not counting until resources allocated to WebView maintenance" + //width: 200 + //height: 250 + //url: "resolution.html" + // webPageWidth: 400 + // preferredWidth: 200 +} diff --git a/tests/auto/declarative/qmlvisual/webview/zooming/qtlogo.png b/tests/auto/declarative/qmlvisual/webview/zooming/qtlogo.png new file mode 100644 index 00000000..399bd0b1 Binary files /dev/null and b/tests/auto/declarative/qmlvisual/webview/zooming/qtlogo.png differ diff --git a/tests/auto/declarative/qmlvisual/webview/zooming/renderControl.html b/tests/auto/declarative/qmlvisual/webview/zooming/renderControl.html new file mode 100644 index 00000000..1a01a339 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/webview/zooming/renderControl.html @@ -0,0 +1,7 @@ + + +

Render Control

+

+This test shows how zooming and panning can be +optimized for speed over quality by delaying rendering. + diff --git a/tests/auto/declarative/qmlvisual/webview/zooming/renderControl.qml b/tests/auto/declarative/qmlvisual/webview/zooming/renderControl.qml new file mode 100644 index 00000000..c07f1e1a --- /dev/null +++ b/tests/auto/declarative/qmlvisual/webview/zooming/renderControl.qml @@ -0,0 +1,22 @@ +import QtQuick 1.0 +import QtWebKit 1.0 + +Rectangle { + property string skip: "WebView tests not counting until resources allocated to WebView maintenance" + width: 200 + height: 250 + clip: true + WebView { + id: webview + width: 400 + url: "renderControl.html" + SequentialAnimation on x { + loops: Animation.Infinite + 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/qmlvisual/webview/zooming/resolution.html b/tests/auto/declarative/qmlvisual/webview/zooming/resolution.html new file mode 100644 index 00000000..75b1e3f5 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/webview/zooming/resolution.html @@ -0,0 +1,6 @@ + + +

Resolution

+

+This test shows how zooming can include different resolutions. + diff --git a/tests/auto/declarative/qmlvisual/webview/zooming/resolution.qml b/tests/auto/declarative/qmlvisual/webview/zooming/resolution.qml new file mode 100644 index 00000000..cf5f50f9 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/webview/zooming/resolution.qml @@ -0,0 +1,19 @@ +import QtQuick 1.0 +import QtWebKit 1.0 + +WebView { + property string skip: "WebView tests not counting until resources allocated to WebView maintenance" + /* + width: 200 * zoomFactor + height: 250 * zoomFactor + scale: 1/zoomFactor + url: "resolution.html" + SequentialAnimation on zoomFactor { + loops: Animation.Infinite + NumberAnimation { from: 1; to: 0.25; duration: 2000 } + NumberAnimation { from: 0.25; to: 1; duration: 2000 } + NumberAnimation { from: 1; to: 5; duration: 2000 } + NumberAnimation { from: 5; to: 1; duration: 2000 } + } + */ +} diff --git a/tests/auto/declarative/qmlvisual/webview/zooming/zoomTextOnly.html b/tests/auto/declarative/qmlvisual/webview/zooming/zoomTextOnly.html new file mode 100644 index 00000000..4997712f --- /dev/null +++ b/tests/auto/declarative/qmlvisual/webview/zooming/zoomTextOnly.html @@ -0,0 +1,7 @@ + + +

Zoom Text Only

+

+This test shows how zooming can be done just +on text, not images. + diff --git a/tests/auto/declarative/qmlvisual/webview/zooming/zoomTextOnly.qml b/tests/auto/declarative/qmlvisual/webview/zooming/zoomTextOnly.qml new file mode 100644 index 00000000..03c925f8 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/webview/zooming/zoomTextOnly.qml @@ -0,0 +1,17 @@ +import QtQuick 1.0 +import QtWebKit 1.0 + +WebView { + property string skip: "WebView tests not counting until resources allocated to WebView maintenance" + width: 200 + height: 250 + url: "zoomTextOnly.html" + settings.zoomTextOnly: true + /* + SequentialAnimation on zoomFactor { + loops: Animation.Infinite + NumberAnimation { from: 2; to: 0.25; duration: 1000 } + NumberAnimation { from: 0.25; to: 2; duration: 1000 } + } + */ +} diff --git a/tests/auto/declarative/qmlvisual/webview/zooming/zooming.html b/tests/auto/declarative/qmlvisual/webview/zooming/zooming.html new file mode 100644 index 00000000..4e910353 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/webview/zooming/zooming.html @@ -0,0 +1,6 @@ + + +

Zooming

+

+This test shows how zooming can be to HTML elements.

+ diff --git a/tests/auto/declarative/qmlvisual/webview/zooming/zooming.qml b/tests/auto/declarative/qmlvisual/webview/zooming/zooming.qml new file mode 100644 index 00000000..03fd7809 --- /dev/null +++ b/tests/auto/declarative/qmlvisual/webview/zooming/zooming.qml @@ -0,0 +1,19 @@ +import QtQuick 1.0 +import QtWebKit 1.0 + +// Note that zooming is better done using zoomFactor and careful +// control of rendering to avoid excessive re-rendering during +// zoom animations. This test is written for simplicity. +WebView { + property string skip: "WebView tests not counting until resources allocated to WebView maintenance" + width: 200 + height: 250 + Behavior on x { NumberAnimation { } } + Behavior on y { NumberAnimation { } } + Behavior on scale { NumberAnimation { } } + url: "zooming.html" + preferredWidth: width + preferredHeight: height + onDoubleClick: {console.log(clickX,clickY);heuristicZoom(clickX,clickY,2)} + onZoomTo: {console.log(zoom);scale=zoom;x=width/2-centerX;y=height/2-centerY} +} diff --git a/tests/auto/declarative/qpacketprotocol/qpacketprotocol.pro b/tests/auto/declarative/qpacketprotocol/qpacketprotocol.pro new file mode 100644 index 00000000..7ffda931 --- /dev/null +++ b/tests/auto/declarative/qpacketprotocol/qpacketprotocol.pro @@ -0,0 +1,9 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += network declarative +macx:CONFIG -= app_bundle + +HEADERS += ../shared/debugutil_p.h +SOURCES += tst_qpacketprotocol.cpp \ + ../shared/debugutil.cpp + +CONFIG += parallel_test diff --git a/tests/auto/declarative/qpacketprotocol/tst_qpacketprotocol.cpp b/tests/auto/declarative/qpacketprotocol/tst_qpacketprotocol.cpp new file mode 100644 index 00000000..3823eab8 --- /dev/null +++ b/tests/auto/declarative/qpacketprotocol/tst_qpacketprotocol.cpp @@ -0,0 +1,263 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "../shared/debugutil_p.h" + +class tst_QPacketProtocol : public QObject +{ + Q_OBJECT + +private: + QTcpServer *m_server; + QTcpSocket *m_client; + QTcpSocket *m_serverConn; + +private slots: + void init(); + void cleanup(); + + void maximumPacketSize(); + void setMaximumPacketSize(); + void setMaximumPacketSize_data(); + void send(); + void send_data(); + void packetsAvailable(); + void packetsAvailable_data(); + void clear(); + void read(); + void device(); + + void tst_QPacket_clear(); +}; + +void tst_QPacketProtocol::init() +{ + m_server = new QTcpServer(this); + m_serverConn = 0; + QVERIFY(m_server->listen(QHostAddress("127.0.0.1"))); + + m_client = new QTcpSocket(this); + m_client->connectToHost(m_server->serverAddress(), m_server->serverPort()); + + QVERIFY(m_client->waitForConnected()); + QVERIFY(m_server->waitForNewConnection()); + m_serverConn = m_server->nextPendingConnection(); +} + +void tst_QPacketProtocol::cleanup() +{ + delete m_client; + delete m_serverConn; + delete m_server; +} + +void tst_QPacketProtocol::maximumPacketSize() +{ + QPacketProtocol p(m_client); + QCOMPARE(p.maximumPacketSize(), 0x7FFFFFFF); +} + +void tst_QPacketProtocol::setMaximumPacketSize() +{ + QFETCH(qint32, size); + QFETCH(qint32, expected); + + QPacketProtocol out(m_serverConn); + QCOMPARE(out.setMaximumPacketSize(size), expected); +} + +void tst_QPacketProtocol::setMaximumPacketSize_data() +{ + QTest::addColumn("size"); + QTest::addColumn("expected"); + + QTest::newRow("invalid") << qint32(sizeof(qint32) - 1) << qint32(0x7FFFFFFF); + QTest::newRow("still invalid") << qint32(sizeof(qint32)) << qint32(0x7FFFFFFF); + QTest::newRow("valid") << qint32(sizeof(qint32) + 1) << qint32(sizeof(qint32) + 1); +} + +void tst_QPacketProtocol::send() +{ + QFETCH(bool, useAutoSend); + + QPacketProtocol in(m_client); + QPacketProtocol out(m_serverConn); + + QByteArray ba; + int num; + + if (useAutoSend) { + out.send() << "Hello world" << 123; + } else { + QPacket packet; + packet << "Hello world" << 123; + out.send(packet); + } + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&in, SIGNAL(readyRead()))); + + QPacket p = in.read(); + p >> ba >> num; + QCOMPARE(ba, QByteArray("Hello world") + '\0'); + QCOMPARE(num, 123); +} + +void tst_QPacketProtocol::send_data() +{ + QTest::addColumn("useAutoSend"); + + QTest::newRow("auto send") << true; + QTest::newRow("no auto send") << false; +} + +void tst_QPacketProtocol::packetsAvailable() +{ + QFETCH(int, packetCount); + + QPacketProtocol out(m_client); + QPacketProtocol in(m_serverConn); + + QCOMPARE(out.packetsAvailable(), qint64(0)); + QCOMPARE(in.packetsAvailable(), qint64(0)); + + for (int i=0; i("packetCount"); + + QTest::newRow("1") << 1; + QTest::newRow("2") << 2; + QTest::newRow("10") << 10; +} + +void tst_QPacketProtocol::clear() +{ + QPacketProtocol in(m_client); + QPacketProtocol out(m_serverConn); + + out.send() << 123; + out.send() << 456; + QVERIFY(QDeclarativeDebugTest::waitForSignal(&in, SIGNAL(readyRead()))); + + in.clear(); + QVERIFY(in.read().isEmpty()); +} + +void tst_QPacketProtocol::read() +{ + QPacketProtocol in(m_client); + QPacketProtocol out(m_serverConn); + + QVERIFY(in.read().isEmpty()); + + out.send() << 123; + out.send() << 456; + QVERIFY(QDeclarativeDebugTest::waitForSignal(&in, SIGNAL(readyRead()))); + + int num; + + QPacket p1 = in.read(); + QVERIFY(!p1.isEmpty()); + p1 >> num; + QCOMPARE(num, 123); + + QPacket p2 = in.read(); + QVERIFY(!p2.isEmpty()); + p2 >> num; + QCOMPARE(num, 456); + + QVERIFY(in.read().isEmpty()); +} + +void tst_QPacketProtocol::device() +{ + QPacketProtocol p(m_client); + QVERIFY(p.device() == m_client); +} + +void tst_QPacketProtocol::tst_QPacket_clear() +{ + QPacketProtocol protocol(m_client); + + QPacket packet; + + packet << "Hello world!" << 123; + protocol.send(packet); + + packet.clear(); + QVERIFY(packet.isEmpty()); + packet << "Goodbyte world!" << 789; + protocol.send(packet); + + QByteArray ba; + int num; + QPacketProtocol in(m_serverConn); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&in, SIGNAL(readyRead()))); + + QPacket p1 = in.read(); + p1 >> ba >> num; + QCOMPARE(ba, QByteArray("Hello world!") + '\0'); + QCOMPARE(num, 123); + + QPacket p2 = in.read(); + p2 >> ba >> num; + QCOMPARE(ba, QByteArray("Goodbyte world!") + '\0'); + QCOMPARE(num, 789); +} + +QTEST_MAIN(tst_QPacketProtocol) + +#include "tst_qpacketprotocol.moc" diff --git a/tests/auto/declarative/qperformancetimer/qperformancetimer.pro b/tests/auto/declarative/qperformancetimer/qperformancetimer.pro new file mode 100644 index 00000000..656bf686 --- /dev/null +++ b/tests/auto/declarative/qperformancetimer/qperformancetimer.pro @@ -0,0 +1,7 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative +SOURCES += tst_qperformancetimer.cpp +macx:CONFIG -= app_bundle + +CONFIG += parallel_test + diff --git a/tests/auto/declarative/qperformancetimer/tst_qperformancetimer.cpp b/tests/auto/declarative/qperformancetimer/tst_qperformancetimer.cpp new file mode 100644 index 00000000..a1ca13e9 --- /dev/null +++ b/tests/auto/declarative/qperformancetimer/tst_qperformancetimer.cpp @@ -0,0 +1,68 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include + +class tst_qperformancetimer : public QObject +{ + Q_OBJECT + +public: + tst_qperformancetimer() {} + +private slots: + void units(); +}; + +void tst_qperformancetimer::units() +{ + QPerformanceTimer timer; + timer.start(); + QTest::qWait(300); + qint64 elapsed = timer.elapsed(); + QVERIFY(elapsed > 300000000 && elapsed < 310000000); +} + +QTEST_MAIN(tst_qperformancetimer) + +#include "tst_qperformancetimer.moc" diff --git a/tests/auto/declarative/runall.sh b/tests/auto/declarative/runall.sh new file mode 100755 index 00000000..522be86f --- /dev/null +++ b/tests/auto/declarative/runall.sh @@ -0,0 +1,100 @@ +#!/bin/sh +# +############################################################################# +## +## Copyright (C) 2012 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$ +## GNU Lesser General Public License Usage +## 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. +## +## GNU General Public License Usage +## Alternatively, this file may be used under the terms of the GNU General +## Public License version 3.0 as published by the Free Software Foundation +## and appearing in the file LICENSE.GPL included in the packaging of this +## file. Please review the following information to ensure the GNU General +## Public License version 3.0 requirements will be met: +## http://www.gnu.org/copyleft/gpl.html. +## +## Other Usage +## Alternatively, this file may be used in accordance with the terms and +## conditions contained in a signed written agreement between you and Nokia. +## +## +## +## +## +## $QT_END_LICENSE$ +## +############################################################################/ + +if [ "$(uname)" = Linux ] +then + Xnest :7 2>/dev/null & + sleep 1 + trap "kill $!" EXIT + export DISPLAY=:7 + export LANG=en_US + kwin 2>/dev/null & + sleep 1 +fi + +function filter +{ + exe=$1 + skip=0 + while read line + do + if [ $skip != 0 ] + then + let skip=skip-1 + else + case "$line" in + make*Error) echo "$line";; + make*Stop) echo "$line";; + /*/bin/make*) ;; + make*) ;; + install*) ;; + QDeclarativeDebugServer:*Waiting*) ;; + QDeclarativeDebugServer:*Connection*) ;; + */qmake*) ;; + */bin/moc*) ;; + *targ.debug*) ;; + g++*) ;; + cd*) ;; + XFAIL*) skip=1;; + SKIP*) skip=1;; + PASS*) ;; + QDEBUG*) ;; + Makefile*) ;; + Config*) ;; + Totals*) ;; + \**) ;; + ./*) ;; + *tst_*) echo "$line" ;; + *) echo "$exe: $line" + esac + fi + done +} + +make -k -j1 install 2>&1 | filter build +for exe in $(make install | sed -n 's/^install .* "\([^"]*qt4\/tst_[^"]*\)".*/\1/p') +do + echo $exe + $exe 2>&1 | filter $exe +done + diff --git a/tests/auto/declarative/shared/debugutil.cpp b/tests/auto/declarative/shared/debugutil.cpp new file mode 100644 index 00000000..c53a8c19 --- /dev/null +++ b/tests/auto/declarative/shared/debugutil.cpp @@ -0,0 +1,104 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include + +#include +#include + +#include "debugutil_p.h" + + +bool QDeclarativeDebugTest::waitForSignal(QObject *receiver, const char *member, int timeout) { + QEventLoop loop; + QTimer timer; + timer.setSingleShot(true); + QObject::connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit())); + QObject::connect(receiver, member, &loop, SLOT(quit())); + timer.start(timeout); + loop.exec(); + return timer.isActive(); +} + +QDeclarativeDebugTestService::QDeclarativeDebugTestService(const QString &s, QObject *parent) + : QDeclarativeDebugService(s, parent) +{ +} + +void QDeclarativeDebugTestService::messageReceived(const QByteArray &ba) +{ + sendMessage(ba); +} + +void QDeclarativeDebugTestService::statusChanged(Status) +{ + emit statusHasChanged(); +} + + +QDeclarativeDebugTestClient::QDeclarativeDebugTestClient(const QString &s, QDeclarativeDebugConnection *c) + : QDeclarativeDebugClient(s, c) +{ +} + +QByteArray QDeclarativeDebugTestClient::waitForResponse() +{ + lastMsg.clear(); + QDeclarativeDebugTest::waitForSignal(this, SIGNAL(serverMessage(QByteArray))); + if (lastMsg.isEmpty()) { + qWarning() << "tst_QDeclarativeDebugClient: no response from server!"; + return QByteArray(); + } + return lastMsg; +} + +void QDeclarativeDebugTestClient::statusChanged(Status stat) +{ + QCOMPARE(stat, status()); + emit statusHasChanged(); +} + +void QDeclarativeDebugTestClient::messageReceived(const QByteArray &ba) +{ + lastMsg = ba; + emit serverMessage(ba); +} diff --git a/tests/auto/declarative/shared/debugutil_p.h b/tests/auto/declarative/shared/debugutil_p.h new file mode 100644 index 00000000..61e49286 --- /dev/null +++ b/tests/auto/declarative/shared/debugutil_p.h @@ -0,0 +1,94 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +class QDeclarativeDebugTest +{ +public: + static bool waitForSignal(QObject *receiver, const char *member, int timeout = 5000); +}; + +class QDeclarativeDebugTestService : public QDeclarativeDebugService +{ + Q_OBJECT +public: + QDeclarativeDebugTestService(const QString &s, QObject *parent = 0); + +signals: + void statusHasChanged(); + +protected: + virtual void messageReceived(const QByteArray &ba); + virtual void statusChanged(Status status); +}; + +class QDeclarativeDebugTestClient : public QDeclarativeDebugClient +{ + Q_OBJECT +public: + QDeclarativeDebugTestClient(const QString &s, QDeclarativeDebugConnection *c); + + QByteArray waitForResponse(); + +signals: + void statusHasChanged(); + void serverMessage(const QByteArray &); + +protected: + virtual void statusChanged(Status status); + virtual void messageReceived(const QByteArray &ba); + +private: + QByteArray lastMsg; +}; + + diff --git a/tests/auto/declarative/shared/testhttpserver.cpp b/tests/auto/declarative/shared/testhttpserver.cpp new file mode 100644 index 00000000..67f03c20 --- /dev/null +++ b/tests/auto/declarative/shared/testhttpserver.cpp @@ -0,0 +1,324 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "testhttpserver.h" +#include +#include +#include +#include + +/*! +\internal +\class TestHTTPServer +\brief provides a very, very basic HTTP server for testing. + +Inside the test case, an instance of TestHTTPServer should be created, with the +appropriate port to listen on. The server will listen on the localhost interface. + +Directories to serve can then be added to server, which will be added as "roots". +Each root can be added as a Normal, Delay or Disconnect root. Requests for files +within a Normal root are returned immediately. Request for files within a Delay +root are delayed for 500ms, and then served. Requests for files within a Disconnect +directory cause the server to disconnect immediately. A request for a file that isn't +found in any root will return a 404 error. + +If you have the following directory structure: + +\code +disconnect/disconnectTest.qml +files/main.qml +files/Button.qml +files/content/WebView.qml +slowFiles/slowMain.qml +\endcode +it can be added like this: +\code +TestHTTPServer server(14445); +server.serveDirectory("disconnect", TestHTTPServer::Disconnect); +server.serveDirectory("files"); +server.serveDirectory("slowFiles", TestHTTPServer::Delay); +\endcode + +The following request urls will then result in the appropriate action: +\table +\header \o URL \o Action +\row \o http://localhost:14445/disconnectTest.qml \o Disconnection +\row \o http://localhost:14445/main.qml \o main.qml returned immediately +\row \o http://localhost:14445/Button.qml \o Button.qml returned immediately +\row \o http://localhost:14445/content/WebView.qml \o content/WebView.qml returned immediately +\row \o http://localhost:14445/slowMain.qml \o slowMain.qml returned after 500ms +\endtable +*/ +TestHTTPServer::TestHTTPServer(quint16 port) +: m_hasFailed(false) +{ + QObject::connect(&server, SIGNAL(newConnection()), this, SLOT(newConnection())); + + server.listen(QHostAddress::LocalHost, port); +} + +bool TestHTTPServer::isValid() const +{ + return server.isListening(); +} + +bool TestHTTPServer::serveDirectory(const QString &dir, Mode mode) +{ + dirs.append(qMakePair(dir, mode)); + return true; +} + +/* + Add an alias, so that if filename is requested and does not exist, + alias may be returned. +*/ +void TestHTTPServer::addAlias(const QString &filename, const QString &alias) +{ + aliases.insert(filename, alias); +} + +void TestHTTPServer::addRedirect(const QString &filename, const QString &redirectName) +{ + redirects.insert(filename, redirectName); +} + +bool TestHTTPServer::wait(const QUrl &expect, const QUrl &reply, const QUrl &body) +{ + m_hasFailed = false; + + QFile expectFile(expect.toLocalFile()); + if (!expectFile.open(QIODevice::ReadOnly)) return false; + + QFile replyFile(reply.toLocalFile()); + if (!replyFile.open(QIODevice::ReadOnly)) return false; + + bodyData = QByteArray(); + if (body.isValid()) { + QFile bodyFile(body.toLocalFile()); + if (!bodyFile.open(QIODevice::ReadOnly)) return false; + bodyData = bodyFile.readAll(); + } + + waitData = expectFile.readAll(); + /* + while (waitData.endsWith('\n')) + waitData = waitData.left(waitData.count() - 1); + */ + + replyData = replyFile.readAll(); + + if (!replyData.endsWith('\n')) + replyData.append("\n"); + replyData.append("Content-length: " + QByteArray::number(bodyData.length())); + replyData .append("\n\n"); + + for (int ii = 0; ii < replyData.count(); ++ii) { + if (replyData.at(ii) == '\n' && (!ii || replyData.at(ii - 1) != '\r')) { + replyData.insert(ii, '\r'); + ++ii; + } + } + replyData.append(bodyData); + + return true; +} + +bool TestHTTPServer::hasFailed() const +{ + return m_hasFailed; +} + +void TestHTTPServer::newConnection() +{ + QTcpSocket *socket = server.nextPendingConnection(); + if (!socket) return; + + if (!dirs.isEmpty()) + dataCache.insert(socket, QByteArray()); + + QObject::connect(socket, SIGNAL(disconnected()), this, SLOT(disconnected())); + QObject::connect(socket, SIGNAL(readyRead()), this, SLOT(readyRead())); +} + +void TestHTTPServer::disconnected() +{ + QTcpSocket *socket = qobject_cast(sender()); + if (!socket) return; + + dataCache.remove(socket); + for (int ii = 0; ii < toSend.count(); ++ii) { + if (toSend.at(ii).first == socket) { + toSend.removeAt(ii); + --ii; + } + } + socket->disconnect(); + socket->deleteLater(); +} + +void TestHTTPServer::readyRead() +{ + QTcpSocket *socket = qobject_cast(sender()); + if (!socket || socket->state() == QTcpSocket::ClosingState) return; + + QByteArray ba = socket->readAll(); + + if (!dirs.isEmpty()) { + serveGET(socket, ba); + return; + } + + if (m_hasFailed || waitData.isEmpty()) { + qWarning() << "TestHTTPServer: Unexpected data" << ba; + return; + } + + for (int ii = 0; ii < ba.count(); ++ii) { + const char c = ba.at(ii); + if (c == '\r' && waitData.isEmpty()) + continue; + else if (!waitData.isEmpty() && c == waitData.at(0)) + waitData = waitData.mid(1); + else if (c == '\r') + continue; + else { + QByteArray data = ba.mid(ii); + qWarning() << "TestHTTPServer: Unexpected data" << data << "\nExpected: " << waitData; + m_hasFailed = true; + socket->disconnectFromHost(); + return; + } + } + + if (waitData.isEmpty()) { + socket->write(replyData); + socket->disconnectFromHost(); + } +} + +bool TestHTTPServer::reply(QTcpSocket *socket, const QByteArray &fileName) +{ + if (redirects.contains(fileName)) { + QByteArray response = "HTTP/1.1 302 Found\r\nContent-length: 0\r\nContent-type: text/html; charset=UTF-8\r\nLocation: " + redirects[fileName].toUtf8() + "\r\n\r\n"; + socket->write(response); + return true; + } + + for (int ii = 0; ii < dirs.count(); ++ii) { + QString dir = dirs.at(ii).first; + Mode mode = dirs.at(ii).second; + + QString dirFile = dir + QLatin1String("/") + QLatin1String(fileName); + + if (!QFile::exists(dirFile)) { + if (aliases.contains(fileName)) + dirFile = dir + QLatin1String("/") + aliases.value(fileName); + } + + QFile file(dirFile); + if (file.open(QIODevice::ReadOnly)) { + + if (mode == Disconnect) + return true; + + QByteArray data = file.readAll(); + + QByteArray response = "HTTP/1.0 200 OK\r\nContent-type: text/html; charset=UTF-8\r\nContent-length: "; + response += QByteArray::number(data.count()); + response += "\r\n\r\n"; + response += data; + + if (mode == Delay) { + toSend.append(qMakePair(socket, response)); + QTimer::singleShot(500, this, SLOT(sendOne())); + return false; + } else { + socket->write(response); + return true; + } + } + } + + + QByteArray response = "HTTP/1.0 404 Not found\r\nContent-type: text/html; charset=UTF-8\r\n\r\n"; + socket->write(response); + + return true; +} + +void TestHTTPServer::sendOne() +{ + if (!toSend.isEmpty()) { + toSend.first().first->write(toSend.first().second); + toSend.first().first->close(); + toSend.removeFirst(); + } +} + +void TestHTTPServer::serveGET(QTcpSocket *socket, const QByteArray &data) +{ + if (!dataCache.contains(socket)) + return; + + QByteArray total = dataCache[socket] + data; + dataCache[socket] = total; + + if (total.contains("\n\r\n")) { + + bool close = true; + + if (total.startsWith("GET /")) { + + int space = total.indexOf(' ', 4); + if (space != -1) { + + QByteArray req = total.mid(5, space - 5); + close = reply(socket, req); + + } + } + dataCache.remove(socket); + + if (close) + socket->disconnectFromHost(); + } +} + diff --git a/tests/auto/declarative/shared/testhttpserver.h b/tests/auto/declarative/shared/testhttpserver.h new file mode 100644 index 00000000..52412db2 --- /dev/null +++ b/tests/auto/declarative/shared/testhttpserver.h @@ -0,0 +1,93 @@ +/**************************************************************************** +** +** Copyright (C) 2012 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$ +** GNU Lesser General Public License Usage +** 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. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef TESTHTTPSERVER_H +#define TESTHTTPSERVER_H + +#include +#include +#include +#include + +class TestHTTPServer : public QObject +{ + Q_OBJECT +public: + TestHTTPServer(quint16 port); + + bool isValid() const; + + enum Mode { Normal, Delay, Disconnect }; + bool serveDirectory(const QString &, Mode = Normal); + + bool wait(const QUrl &expect, const QUrl &reply, const QUrl &body); + bool hasFailed() const; + + void addAlias(const QString &filename, const QString &aliasName); + void addRedirect(const QString &filename, const QString &redirectName); + +private slots: + void newConnection(); + void disconnected(); + void readyRead(); + void sendOne(); + +private: + void serveGET(QTcpSocket *, const QByteArray &); + bool reply(QTcpSocket *, const QByteArray &); + + QList > dirs; + QHash dataCache; + QList > toSend; + + QByteArray waitData; + QByteArray replyData; + QByteArray bodyData; + bool m_hasFailed; + + QHash aliases; + QHash redirects; + + QTcpServer server; +}; + +#endif // TESTHTTPSERVER_H + diff --git a/tests/auto/declarative/symbianlibs.pri b/tests/auto/declarative/symbianlibs.pri new file mode 100644 index 00000000..4452f67f --- /dev/null +++ b/tests/auto/declarative/symbianlibs.pri @@ -0,0 +1,9 @@ +#additional libs required for orientation sensor +symbian { + !contains(S60_VERSION, 3.1):!contains(S60_VERSION, 3.2) { + LIBS += -lsensrvclient -lsensrvutil + } + contains(QT_CONFIG, s60): { + LIBS += -lavkon -lcone + } +} -- cgit v1.2.3