@@ -145,7 +145,34 @@ Rectangle {
145145 }
146146 }
147147
148+ // holds some of the internal ApplicationWindow objects we probe during the tests
149+ property var stateGroup: null
150+
151+ function findInterestingApplicationWindowChildren() {
152+ stateGroup = findInvisibleChild(applicationWindowLoader.item, "applicationWindowStateGroup");
153+ verify(stateGroup);
154+ }
155+
156+ function forgetApplicationWindowChildren() {
157+ stateGroup = null;
158+ }
159+
160+ // wait until any transition animation has finished
161+ function waitUntilTransitionsEnd() {
162+ var transitions = stateGroup.transitions;
163+ for (var i = 0; i < transitions.length; ++i) {
164+ var transition = transitions[i];
165+ tryCompare(transition, "running", false, 2000);
166+ }
167+ }
168+
169+ function init() {
170+ findInterestingApplicationWindowChildren();
171+ }
172+
148173 function cleanup() {
174+ forgetApplicationWindowChildren();
175+
149176 // reload our test subject to get it in a fresh state once again
150177 applicationWindowLoader.active = false;
151178
@@ -167,8 +194,6 @@ Rectangle {
167194 }
168195
169196 function test_showSplashUntilAppFullyInit() {
170− var stateGroup = findInvisibleChild(applicationWindowLoader.item, "applicationWindowStateGroup");
171−
172197 verify(stateGroup.state === "splashScreen");
173198
174199 if (data.swapInitOrder) {
@@ -189,25 +214,20 @@ Rectangle {
189214 }
190215
191216 function test_suspendedAppShowsSurface() {
192− var stateGroup = findInvisibleChild(applicationWindowLoader.item, "applicationWindowStateGroup");
193−
194217 surfaceCheckbox.checked = true;
195218 setApplicationState(appRunning);
196219
197220 tryCompare(stateGroup, "state", "surface");
198221
199− // wait until any transition animation has finished
200− tryCompare(stateGroup, "transitioning", false, 2000);
222+ waitUntilTransitionsEnd();
201223
202224 setApplicationState(appSuspended);
203225
204226 verify(stateGroup.state === "surface");
205− verify(stateGroup.transitioning === false);
227+ waitUntilTransitionsEnd();
206228 }
207229
208230 function test_killedAppShowsScreenshot() {
209− var stateGroup = findInvisibleChild(applicationWindowLoader.item, "applicationWindowStateGroup");
210−
211231 surfaceCheckbox.checked = true;
212232 setApplicationState(appRunning);
213233 tryCompare(stateGroup, "state", "surface");
@@ -225,13 +245,12 @@ Rectangle {
225245 }
226246
227247 function test_restartApp() {
228− var stateGroup = findInvisibleChild(applicationWindowLoader.item, "applicationWindowStateGroup");
229248 var screenshotImage = findChild(applicationWindowLoader.item, "screenshotImage");
230249
231250 surfaceCheckbox.checked = true;
232251 setApplicationState(appRunning);
233252 tryCompare(stateGroup, "state", "surface");
234− tryCompare(stateGroup, "transitioning", false, 2000);
253+ waitUntilTransitionsEnd();
235254
236255 setApplicationState(appSuspended);
237256
@@ -239,19 +258,19 @@ Rectangle {
239258 setApplicationState(appStopped);
240259
241260 tryCompare(stateGroup, "state", "screenshot");
242− tryCompare(stateGroup, "transitioning", false, 2000);
261+ waitUntilTransitionsEnd();
243262 tryCompare(fakeApplication, "surface", null);
244263
245264 // and restart it
246265 setApplicationState(appStarting);
247266
248− verify(stateGroup.transitioning === false);
267+ waitUntilTransitionsEnd();
249268 verify(stateGroup.state === "screenshot");
250269 verify(fakeApplication.surface === null);
251270
252271 setApplicationState(appRunning);
253272
254− verify(stateGroup.transitioning === false);
273+ waitUntilTransitionsEnd();
255274 verify(stateGroup.state === "screenshot");
256275
257276 surfaceCheckbox.checked = true;
@@ -261,12 +280,10 @@ Rectangle {
261280 }
262281
263282 function test_appCrashed() {
264− var stateGroup = findInvisibleChild(applicationWindowLoader.item, "applicationWindowStateGroup");
265−
266283 surfaceCheckbox.checked = true;
267284 setApplicationState(appRunning);
268285 tryCompare(stateGroup, "state", "surface");
269− tryCompare(stateGroup, "transitioning", false, 2000);
286+ waitUntilTransitionsEnd();
270287
271288 // oh, it crashed...
272289 setApplicationState(appStopped);
@@ -276,37 +293,32 @@ Rectangle {
276293 }
277294
278295 function test_keepSurfaceWhileInvisible() {
279− var stateGroup = findInvisibleChild(applicationWindowLoader.item, "applicationWindowStateGroup");
280−
281296 surfaceCheckbox.checked = true;
282297 setApplicationState(appRunning);
283298 tryCompare(stateGroup, "state", "surface");
284− tryCompare(stateGroup, "transitioning", false, 2000);
299+ waitUntilTransitionsEnd();
285300 verify(fakeApplication.surface !== null);
286301
287302 applicationWindowLoader.item.visible = false;
288303
289− verify(stateGroup.transitioning === false);
304+ waitUntilTransitionsEnd();
290305 verify(stateGroup.state === "surface");
291306 verify(fakeApplication.surface !== null);
292307
293308 applicationWindowLoader.item.visible = true;
294309
295− verify(stateGroup.transitioning === false);
310+ waitUntilTransitionsEnd();
296311 verify(stateGroup.state === "surface");
297312 verify(fakeApplication.surface !== null);
298313 }
299314
300315 function test_touchesReachSurfaceWhenItsShown() {
301− var stateGroup = findInvisibleChild(applicationWindowLoader.item, "applicationWindowStateGroup");
302−
303316 setApplicationState(appRunning);
304317 surfaceCheckbox.checked = true;
305318
306319 tryCompare(stateGroup, "state", "surface");
307320
308− // wait until any transition animation has finished
309− tryCompare(stateGroup, "transitioning", false, 2000);
321+ waitUntilTransitionsEnd();
310322
311323 // Because doing stuff in C++ is a PITA we keep the counter in the interal qml impl.
312324 var fakeSurface = findChild(fakeApplication.surface, "fakeSurfaceQML");