@@ -46,8 +46,8 @@ Item {
4646 WindowStateStorage.geometry = {
4747 'unity8-dash': Qt.rect(0, units.gu(3), units.gu(50), units.gu(40)),
4848 'dialer-app': Qt.rect(units.gu(51), units.gu(3), units.gu(50), units.gu(40)),
49− 'camera-app': Qt.rect(0, units.gu(44), units.gu(50), units.gu(40)),
50− 'gallery-app': Qt.rect(units.gu(51), units.gu(44), units.gu(50), units.gu(40))
49+ 'gmail-webapp': Qt.rect(0, units.gu(44), units.gu(50), units.gu(40)),
50+ 'twitter-webapp': Qt.rect(units.gu(51), units.gu(44), units.gu(50), units.gu(40))
5151 }
5252 }
5353
@@ -60,10 +60,14 @@ Item {
6060
6161 focus: true
6262
63+ property bool itemDestroyed: false
6364 sourceComponent: Component {
6465 DesktopStage {
6566 color: "darkblue"
6667 anchors.fill: parent
68+ Component.onDestruction: {
69+ desktopStageLoader.itemDestroyed = true;
70+ }
6771 orientations: Orientations {}
6872 }
6973 }
@@ -114,10 +118,16 @@ Item {
114118 property Item desktopStage: desktopStageLoader.status === Loader.Ready ? desktopStageLoader.item : null
115119
116120 function cleanup() {
121+ desktopStageLoader.itemDestroyed = false;
117122 desktopStageLoader.active = false;
118123
119124 tryCompare(desktopStageLoader, "status", Loader.Null);
120125 tryCompare(desktopStageLoader, "item", null);
126+ // Loader.status might be Loader.Null and Loader.item might be null but the Loader
127+ // actually took place. Likely because Loader waits until the next event loop
128+ // iteration to do its work. So to ensure the reload, we will wait until the
129+ // Shell instance gets destroyed.
130+ tryCompare(desktopStageLoader, "itemDestroyed", true);
121131
122132 killAllRunningApps();
123133
@@ -171,8 +181,8 @@ Item {
171181
172182 function test_tappingOnWindowChangesFocusedApp_data() {
173183 return [
174− {tag: "dash to dialer", apps: [ "unity8-dash", "dialer-app", "camera-app" ], focusfrom: 0, focusTo: 1 },
175− {tag: "dialer to dash", apps: [ "unity8-dash", "dialer-app", "camera-app" ], focusfrom: 1, focusTo: 0 },
184+ {tag: "dash to dialer", apps: [ "unity8-dash", "dialer-app", "gmail-webapp"], focusfrom: 0, focusTo: 1 },
185+ {tag: "dialer to dash", apps: [ "unity8-dash", "dialer-app", "gmail-webapp"], focusfrom: 1, focusTo: 0 }
176186 ]
177187 }
178188
@@ -218,8 +228,8 @@ Item {
218228
219229 function test_tappingOnDecorationFocusesApplication_data() {
220230 return [
221− {tag: "dash to dialer", apps: [ "unity8-dash", "dialer-app", "camera-app" ], focusfrom: 0, focusTo: 1 },
222− {tag: "dialer to dash", apps: [ "unity8-dash", "dialer-app", "camera-app" ], focusfrom: 1, focusTo: 0 },
231+ {tag: "dash to dialer", apps: [ "unity8-dash", "dialer-app", "gmail-webapp"], focusfrom: 0, focusTo: 1 },
232+ {tag: "dialer to dash", apps: [ "unity8-dash", "dialer-app", "gmail-webapp"], focusfrom: 1, focusTo: 0 }
223233 ]
224234 }
225235
@@ -229,12 +239,16 @@ Item {
229239 var fromAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusfrom]);
230240 verify(fromAppDecoration);
231241 tap(fromAppDecoration);
232− tryCompare(ApplicationManager.findApplication(data.apps[data.focusfrom]).session.surface, "activeFocus", true);
242+ var fromApp = ApplicationManager.findApplication(data.apps[data.focusfrom]);
243+ verify(fromApp);
244+ tryCompare(fromApp.session.surface, "activeFocus", true);
233245
234246 var toAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusTo]);
235247 verify(toAppDecoration);
236248 tap(toAppDecoration);
237− tryCompare(ApplicationManager.findApplication(data.apps[data.focusTo]).session.surface, "activeFocus", true);
249+ var toApp = ApplicationManager.findApplication(data.apps[data.focusTo]);
250+ verify(toApp);
251+ tryCompare(toApp.session.surface, "activeFocus", true);
238252 }
239253
240254 function test_clickingOnDecorationFocusesApplication_data() {
@@ -354,26 +368,26 @@ Item {
354368 function test_maximizeApplicationHidesSurfacesBehindIt() {
355369 var dashApp = startApplication("unity8-dash");
356370 var dialerApp = startApplication("dialer-app");
357− var cameraApp = startApplication("camera-app");
371+ var gmailApp = startApplication("gmail-webapp");
358372
359373 var dashDelegate = findChild(desktopStage, "appDelegate_unity8-dash");
360374 verify(dashDelegate);
361375 var dialerDelegate = findChild(desktopStage, "appDelegate_dialer-app");
362376 verify(dialerDelegate);
363− var cameraDelegate = findChild(desktopStage, "appDelegate_camera-app");
364− verify(cameraDelegate);
377+ var gmailDelegate = findChild(desktopStage, "appDelegate_gmail-webapp");
378+ verify(gmailDelegate);
365379
366380 // maximize
367− findChild(dialerDelegate, "decoratedWindow").maximize();
381+ dialerDelegate.maximize();
368382 tryCompare(dialerDelegate, "visuallyMaximized", true);
369383
370384 tryCompare(dashApp.session.surface, "visible", false);
371− compare(cameraApp.session.surface.visible, true);
385+ compare(gmailApp.session.surface.visible, true);
372386
373387 // restore
374− findChild(dialerDelegate, "decoratedWindow").maximize();
388+ dialerDelegate.restoreFromMaximized();
375389 compare(dashApp.session.surface.visible, true);
376− compare(cameraApp.session.surface.visible, true);
390+ compare(gmailApp.session.surface.visible, true);
377391 }
378392
379393 function test_applicationsBecomeVisibleWhenOccludingAppRemoved() {
@@ -385,28 +399,52 @@ Item {
385399 var dialerDelegate = findChild(desktopStage, "appDelegate_dialer-app");
386400 verify(dialerDelegate);
387401
388− var cameraApp = startApplication("camera-app");
389− var cameraDelegate = findChild(desktopStage, "appDelegate_camera-app");
390− verify(cameraDelegate);
391− findChild(dialerDelegate, "decoratedWindow").maximize();
402+ var dialerMaximizeButton = findChild(dialerDelegate, "maximizeWindowButton");
403+ verify(dialerMaximizeButton);
404+ mouseClick(dialerMaximizeButton);
405+
406+ var mapApp = startApplication("map");
407+ var mapDelegate = findChild(desktopStage, "appDelegate_map");
408+ verify(mapDelegate);
392409
393− var galleryApp = startApplication("gallery-app");
394− var galleryDelegate = findChild(desktopStage, "appDelegate_gallery-app");
395− verify(galleryDelegate);
396− findChild(galleryDelegate, "decoratedWindow").maximize();
410+ var gmailApp = startApplication("gmail-webapp");
411+ var gmailDelegate = findChild(desktopStage, "appDelegate_gmail-webapp");
412+ verify(gmailDelegate);
413+
414+ var gmailMaximizeButton = findChild(gmailDelegate, "maximizeWindowButton");
415+ verify(gmailMaximizeButton);
416+ mouseClick(gmailMaximizeButton);
397417
398418 tryCompare(dialerDelegate, "visuallyMaximized", true);
399− tryCompare(galleryDelegate, "visuallyMaximized", true);
419+ tryCompare(gmailDelegate, "visuallyMaximized", true);
400420
401421 tryCompare(dashApp.session.surface, "visible", false);
402422 tryCompare(dialerApp.session.surface, "visible", false);
403− tryCompare(cameraApp.session.surface, "visible", false);
423+ tryCompare(mapApp.session.surface, "visible", false);
404424
405− ApplicationManager.stopApplication("gallery-app");
425+ ApplicationManager.stopApplication("gmail-webapp");
406426
407− compare(cameraApp.session.surface.visible, true);
427+ compare(mapApp.session.surface.visible, true);
408428 tryCompare(dialerApp.session.surface, "visible", true);
409429 tryCompare(dashApp.session.surface, "visible", false); // still occluded by maximised dialer
410430 }
431+
432+ function test_maximisedAppStaysVisibleWhenAppStarts() {
433+ var dashApp = startApplication("unity8-dash");
434+ var dashDelegate = findChild(desktopStage, "appDelegate_unity8-dash");
435+ verify(dashDelegate);
436+ // maximize
437+ var dashMaximizeButton = findChild(dashDelegate, "maximizeWindowButton");
438+ verify(dashMaximizeButton);
439+ mouseClick(dashMaximizeButton);
440+ tryCompare(dashDelegate, "visuallyMaximized", true);
441+
442+ var dialerApp = startApplication("dialer-app");
443+ var dialerDelegate = findChild(desktopStage, "appDelegate_dialer-app");
444+ verify(dialerDelegate);
445+
446+ compare(dialerDelegate.visible, true, "Dialer should be visible");
447+ compare(dashDelegate.visible, true, "Dash should still be visible");
448+ }
411449 }
412450}