@@ -138,9 +138,6 @@ Rectangle {
139 mode: shellLoader.mode
139 mode: shellLoader.mode
140 hasTouchscreen: true
140 hasTouchscreen: true
141− Component.onCompleted: {
142− ApplicationManager.startApplication("unity8-dash");
144 Component.onDestruction: {
141 Component.onDestruction: {
145 shellLoader.itemDestroyed = true;
142 shellLoader.itemDestroyed = true;
@@ -601,10 +598,6 @@ Rectangle {
601 topLevelSurfaceList = findInvisibleChild(shell, "topLevelSurfaceList");
598 topLevelSurfaceList = findInvisibleChild(shell, "topLevelSurfaceList");
602 verify(topLevelSurfaceList);
599 verify(topLevelSurfaceList);
603 stage = findChild(shell, "stage");
600 stage = findChild(shell, "stage");
605− // wait until unity8-dash is fully loaded
606− tryCompare(topLevelSurfaceList, "count", 1);
607− waitUntilAppWindowIsFullyLoaded(topLevelSurfaceList.idAt(0));
610 function loadDesktopShellWithApps() {
603 function loadDesktopShellWithApps() {
@@ -612,6 +605,7 @@ Rectangle {
612 waitForRendering(shell)
605 waitForRendering(shell)
613 shell.usageScenario = "desktop"
606 shell.usageScenario = "desktop"
614 waitForRendering(shell)
607 waitForRendering(shell)
608+ var app0 = ApplicationManager.startApplication("unity8-dash")
615 var app1 = ApplicationManager.startApplication("dialer-app")
609 var app1 = ApplicationManager.startApplication("dialer-app")
616 var app2 = ApplicationManager.startApplication("webbrowser-app")
610 var app2 = ApplicationManager.startApplication("webbrowser-app")
617 var app3 = ApplicationManager.startApplication("camera-app")
611 var app3 = ApplicationManager.startApplication("camera-app")
@@ -794,8 +788,37 @@ Rectangle {
794 tryCompare(ApplicationManager, "focusedApplicationId", mainAppId);
788 tryCompare(ApplicationManager, "focusedApplicationId", mainAppId);
791+ function test_greeterStartsCorrectSession() {
792+ loadShell("desktop");
793+ setLightDMMockMode("full");
795+ LightDMController.sessionMode = "full"
796+ LightDMController.numSessions = LightDMController.numAvailableSessions;
797+ var greeter = findChild(shell, "greeter");
798+ var view = findChild(greeter, "WideView");
799+ verify(view, "This test requires WideView to be loaded");
801+ var loginList = findChild(view, "loginList");
803+ compare(view.sessionToStart, greeter.sessionToStart());
805+ // Ensure another session can actually be selected
806+ compare(LightDMController.numSessions > 1, true);
807+ loginList.currentSession = LightDM.Sessions.data(1, LightDM.SessionRoles.KeyRole);
809+ compare(view.sessionToStart, greeter.sessionToStart());
797 function swipeAwayGreeter() {
814 function swipeAwayGreeter() {
798 var greeter = findChild(shell, "greeter");
815 var greeter = findChild(shell, "greeter");
817+ if (!greeter.shown) {
818+ console.log("Greeter not shown. Not swiping.");
799 tryCompare(greeter, "fullyShown", true);
822 tryCompare(greeter, "fullyShown", true);
800 waitForGreeterToStabilize();
823 waitForGreeterToStabilize();
801 removeTimeConstraintsFromSwipeAreas(greeter);
824 removeTimeConstraintsFromSwipeAreas(greeter);
@@ -1222,26 +1245,11 @@ Rectangle {
1223 var wizard = findChild(shell, "wizard");
1246 var wizard = findChild(shell, "wizard");
1224 tryCompare(wizard, "active", true);
1247 tryCompare(wizard, "active", true);
1225− tryCompareFunction(function() { return topLevelSurfaceList.applicationAt(0).appId; }, "unity8-dash");
1227− // Make sure we stay running when there's no top level window (can happen for
1228− // a moment when we restart the dash after switching language)
1229− var dashApplication = ApplicationManager.findApplication("unity8-dash");
1230− ApplicationManager.stopApplication(dashApplication.appId);
1231− // wait until all zombie surfaces are gone. As MirSurfaceItems hold references over them.
1232− // They won't be gone until those surface items are destroyed.
1233− tryCompareFunction(function() { return dashApplication.surfaceList.count }, 0);
1235 tryCompare(topLevelSurfaceList, "count", 0);
1249 tryCompare(topLevelSurfaceList, "count", 0);
1236 compare(wizard.shown, true);
1250 compare(wizard.shown, true);
1238− // And make sure we stay running when dash comes back again
1239− var dashSurfaceId = topLevelSurfaceList.nextId;
1240− ApplicationManager.startApplication(dashApplication.appId);
1241− waitUntilAppWindowIsFullyLoaded(dashSurfaceId);
1242− compare(wizard.shown, true);
1244− // And make sure we stop when some other surface shows app
1252+ // And make sure we stop when some surface shows app
1245 var gallerySurfaceId = topLevelSurfaceList.nextId;
1253 var gallerySurfaceId = topLevelSurfaceList.nextId;
1246 var galleryApp = ApplicationManager.startApplication("gallery-app");
1254 var galleryApp = ApplicationManager.startApplication("gallery-app");
1247 waitUntilAppWindowIsFullyLoaded(gallerySurfaceId);
1255 waitUntilAppWindowIsFullyLoaded(gallerySurfaceId);
@@ -1291,6 +1299,11 @@ Rectangle {
1291 function test_tapOnRightEdgeReachesApplicationSurface() {
1299 function test_tapOnRightEdgeReachesApplicationSurface() {
1292 loadShell("phone");
1300 loadShell("phone");
1293 swipeAwayGreeter();
1301 swipeAwayGreeter();
1303+ var appSurfaceId = topLevelSurfaceList.nextId;
1304+ var app = ApplicationManager.startApplication("unity8-dash")
1305+ waitUntilAppWindowIsFullyLoaded(appSurfaceId);
1294 var topmostSpreadDelegate = findChild(shell, "appDelegate_" + topLevelSurfaceList.idAt(0));
1307 var topmostSpreadDelegate = findChild(shell, "appDelegate_" + topLevelSurfaceList.idAt(0));
1295 verify(topmostSpreadDelegate);
1308 verify(topmostSpreadDelegate);
@@ -1320,6 +1333,11 @@ Rectangle {
1320 function test_rightEdgeDragDoesNotReachApplicationSurface() {
1333 function test_rightEdgeDragDoesNotReachApplicationSurface() {
1321 loadShell("phone");
1334 loadShell("phone");
1322 swipeAwayGreeter();
1335 swipeAwayGreeter();
1337+ var appSurfaceId = topLevelSurfaceList.nextId;
1338+ var app = ApplicationManager.startApplication("unity8-dash")
1339+ waitUntilAppWindowIsFullyLoaded(appSurfaceId);
1323 var topmostSpreadDelegate = findChild(shell, "appDelegate_" + topLevelSurfaceList.idAt(0));
1341 var topmostSpreadDelegate = findChild(shell, "appDelegate_" + topLevelSurfaceList.idAt(0));
1324 var topmostSurfaceItem = findChild(topmostSpreadDelegate, "surfaceItem");
1342 var topmostSurfaceItem = findChild(topmostSpreadDelegate, "surfaceItem");
1325 var rightEdgeDragArea = findChild(shell, "rightEdgeDragArea");
1343 var rightEdgeDragArea = findChild(shell, "rightEdgeDragArea");
@@ -1372,15 +1390,15 @@ Rectangle {
1372 verify(coverPage.shown);
1390 verify(coverPage.shown);
1375− function test_physicalHomeKeyPressFocusesDash() {
1393+ function test_physicalHomeKeyPressOpensDrawer() {
1376 loadShell("phone");
1394 loadShell("phone");
1377−
1395+ swipeAwayGreeter();
1378− var galleryApp = ApplicationManager.startApplication("gallery-app");
1379− tryCompare(ApplicationManager, "focusedApplicationId", "gallery-app");
1381 var windowInputMonitor = findInvisibleChild(shell, "windowInputMonitor");
1397 var windowInputMonitor = findInvisibleChild(shell, "windowInputMonitor");
1382 windowInputMonitor.homeKeyActivated();
1398 windowInputMonitor.homeKeyActivated();
1383− tryCompare(ApplicationManager, "focusedApplicationId", "unity8-dash");
1399+
1400+ var launcher = findChild(shell, "launcher");
1401+ tryCompare(launcher, "drawerShown", true);
1386 function test_tabletLogin_data() {
1404 function test_tabletLogin_data() {
@@ -1499,6 +1517,10 @@ Rectangle {
1499 loadShell("tablet");
1517 loadShell("tablet");
1500 shell.usageScenario = "desktop";
1518 shell.usageScenario = "desktop";
1520+ var appSurfaceId = topLevelSurfaceList.nextId;
1521+ var app = ApplicationManager.startApplication("unity8-dash")
1522+ waitUntilAppWindowIsFullyLoaded(appSurfaceId);
1502 var webBrowserSurfaceId = topLevelSurfaceList.nextId;
1524 var webBrowserSurfaceId = topLevelSurfaceList.nextId;
1503 var webBrowserApp = ApplicationManager.startApplication("webbrowser-app");
1525 var webBrowserApp = ApplicationManager.startApplication("webbrowser-app");
1504 waitUntilAppWindowIsFullyLoaded(webBrowserSurfaceId);
1526 waitUntilAppWindowIsFullyLoaded(webBrowserSurfaceId);
@@ -1523,6 +1545,10 @@ Rectangle {
1523 loadShell("tablet");
1545 loadShell("tablet");
1524 shell.usageScenario = "tablet";
1546 shell.usageScenario = "tablet";
1548+ var appSurfaceId = topLevelSurfaceList.nextId;
1549+ var app = ApplicationManager.startApplication("unity8-dash")
1550+ waitUntilAppWindowIsFullyLoaded(appSurfaceId);
1526 var webBrowserSurfaceId = topLevelSurfaceList.nextId;
1552 var webBrowserSurfaceId = topLevelSurfaceList.nextId;
1527 var webBrowserApp = ApplicationManager.startApplication("webbrowser-app");
1553 var webBrowserApp = ApplicationManager.startApplication("webbrowser-app");
1528 waitUntilAppWindowIsFullyLoaded(webBrowserSurfaceId);
1554 waitUntilAppWindowIsFullyLoaded(webBrowserSurfaceId);
@@ -2415,7 +2441,7 @@ Rectangle {
2416 tryCompare(broadcastUrlSpy, "count", 1);
2442 tryCompare(broadcastUrlSpy, "count", 1);
2417 compare(broadcastUrlSpy.signalArguments[0][0], "application:///" + appIcon.appId + ".desktop");
2443 compare(broadcastUrlSpy.signalArguments[0][0], "application:///" + appIcon.appId + ".desktop");
2418− compare(ApplicationManager.count, 1); // confirm only dash is open, we didn't start new app
2444+ compare(ApplicationManager.count, 0); // confirm no app is open, we didn't start new app
2420 var coverPage = findChild(shell, "coverPage");
2446 var coverPage = findChild(shell, "coverPage");
2421 tryCompare(coverPage, "showProgress", 0);
2447 tryCompare(coverPage, "showProgress", 0);
@@ -2456,7 +2482,7 @@ Rectangle {
2457 tryCompare(broadcastUrlSpy, "count", 1);
2483 tryCompare(broadcastUrlSpy, "count", 1);
2458 compare(broadcastUrlSpy.signalArguments[0][0], "test:");
2484 compare(broadcastUrlSpy.signalArguments[0][0], "test:");
2459− compare(ApplicationManager.count, 1); // confirm only dash is open, we didn't start new app
2485+ compare(ApplicationManager.count, 0); // confirm no app is open, we didn't start new app
2461 var coverPage = findChild(shell, "coverPage");
2487 var coverPage = findChild(shell, "coverPage");
2462 tryCompare(coverPage, "showProgress", 0);
2488 tryCompare(coverPage, "showProgress", 0);
@@ -2685,6 +2711,10 @@ Rectangle {
2685 ensureInputMethodSurface();
2711 ensureInputMethodSurface();
2686 shell.oskEnabled = data.oskEnabled;
2712 shell.oskEnabled = data.oskEnabled;
2714+ var appSurfaceId = topLevelSurfaceList.nextId;
2715+ var app = ApplicationManager.startApplication("unity8-dash")
2716+ waitUntilAppWindowIsFullyLoaded(appSurfaceId);
2688 var oldOSKState = topLevelSurfaceList.inputMethodSurface.state;
2718 var oldOSKState = topLevelSurfaceList.inputMethodSurface.state;
2689 topLevelSurfaceList.inputMethodSurface.requestState(Mir.RestoredState);
2719 topLevelSurfaceList.inputMethodSurface.requestState(Mir.RestoredState);
2690 var appRepeater = findChild(shell, "appRepeater");
2720 var appRepeater = findChild(shell, "appRepeater");
@@ -2957,7 +2987,11 @@ Rectangle {
2957 swipeAwayGreeter();
2987 swipeAwayGreeter();
2959 var appSurfaceId = topLevelSurfaceList.nextId;
2989 var appSurfaceId = topLevelSurfaceList.nextId;
2960− var app = ApplicationManager.startApplication("dialer-app")
2990+ var app = ApplicationManager.startApplication("unity8-dash")
2991+ waitUntilAppWindowIsFullyLoaded(appSurfaceId);
2993+ appSurfaceId = topLevelSurfaceList.nextId;
2994+ app = ApplicationManager.startApplication("dialer-app")
2961 waitUntilAppWindowIsFullyLoaded(appSurfaceId);
2995 waitUntilAppWindowIsFullyLoaded(appSurfaceId);
2963 appSurfaceId = topLevelSurfaceList.nextId;
2997 appSurfaceId = topLevelSurfaceList.nextId;
@@ -2984,12 +3018,6 @@ Rectangle {
2984 // Now the dash should be highlighted
3018 // Now the dash should be highlighted
2985 tryCompareFunction(function() {return appRepeater.itemAt(spread.highlightedIndex).appId == "unity8-dash"}, true);
3019 tryCompareFunction(function() {return appRepeater.itemAt(spread.highlightedIndex).appId == "unity8-dash"}, true);
2987− keyClick(Qt.Key_Q);
2989− // Dash is not closeable, should still be 2
2990− tryCompare(ApplicationManager, "count", 2);
2992− // Move to the next one, should be closable again
2993 keyClick(Qt.Key_Tab);
3021 keyClick(Qt.Key_Tab);
2994 tryCompareFunction(function() {return appRepeater.itemAt(spread.highlightedIndex).appId == "calendar-app"}, true);
3022 tryCompareFunction(function() {return appRepeater.itemAt(spread.highlightedIndex).appId == "calendar-app"}, true);
@@ -3170,6 +3198,96 @@ Rectangle {
3170 tryCompare(menuBarLoader.item, "visible", true);
3198 tryCompare(menuBarLoader.item, "visible", true);
3201+ function test_enforceFocusOnStageOnAltTab() {
3202+ loadShell("desktop");
3203+ shell.usageScenario = "desktop";
3204+ waitForRendering(shell);
3205+ swipeAwayGreeter();
3207+ var appSurfaceId = topLevelSurfaceList.nextId;
3208+ var app = ApplicationManager.startApplication("unity8-dash")
3209+ waitUntilAppWindowIsFullyLoaded(appSurfaceId);
3211+ var appDelegate = startApplication("music-app")
3212+ verify(appDelegate);
3213+ waitForRendering(shell);
3215+ var launcher = findChild(shell, "launcher");
3216+ launcher.focus = true;
3218+ var stage = findChild(shell, "stage");
3220+ var spreadItem = findChild(shell, "spreadItem");
3222+ compare(spreadItem.highlightedIndex, -1);
3224+ keyPress(Qt.Key_Alt);
3225+ keyClick(Qt.Key_Tab);
3227+ tryCompare(spreadItem, "highlightedIndex", 1);
3228+ tryCompare(stage, "focus", true);
3230+ keyClick(Qt.Key_Tab);
3232+ tryCompare(spreadItem, "highlightedIndex", 0);
3234+ keyRelease(Qt.Key_Alt);
3237+ function test_maximizedWindowMenuThenAltTab_data() {
3239+ { tag: "show spread", showSpread: true },
3240+ { tag: "do not show spread", showSpread: false },
3244+ function test_maximizedWindowMenuThenAltTab(data) {
3245+ loadShell("desktop");
3246+ shell.usageScenario = "desktop";
3247+ waitForRendering(shell);
3248+ swipeAwayGreeter();
3250+ var appDelegate = startApplication("gmail-webapp");
3251+ var appDelegate2 = startApplication("dialer-app");
3253+ tryCompare(appDelegate2.surface, "activeFocus", true);
3255+ var maximizeButton = findChild(appDelegate2, "maximizeWindowButton");
3256+ mouseClick(maximizeButton);
3257+ tryCompare(appDelegate2, "state", "maximized");
3259+ var panel = findChild(shell, "panel");
3260+ var panelMouse = findChild(panel, "windowControlArea");
3261+ mouseMove(panelMouse);
3262+ var panelMenu = findChild(panel, "menuBar");
3263+ var menuBarLoader = findChild(panel, "menuBarLoader");
3264+ mouseMove(panelMenu);
3265+ var panelMenuItem = findChild(panelMenu, "menuBar-item0");
3266+ tryCompare(panelMenuItem, "visible", true);
3267+ Util.waitForBehaviors(shell);
3268+ mouseClick(panelMenuItem);
3269+ var panelMenuItemItem = findChild(panelMenu, "menuBar-item0-menu-item0-actionItem");
3270+ mouseMove(panelMenuItemItem, panelMenuItemItem.width/2, panelMenuItemItem.height/2);
3271+ verify(panelMenuItemItem.activeFocus);
3272+ verify(panelMenuItem.__popup);
3274+ keyPress(Qt.Key_Alt);
3275+ keyClick(Qt.Key_Tab);
3276+ if (data.showSpread) {
3277+ tryCompare(stage, "spreadShown", true);
3279+ tryCompareFunction(function() { return menuBarLoader.active === false; }, true);
3280+ keyRelease(Qt.Key_Alt)
3282+ tryCompare(appDelegate.surface, "activeFocus", true);
3284+ keyPress(Qt.Key_Alt);
3285+ keyClick(Qt.Key_Tab);
3286+ keyRelease(Qt.Key_Alt)
3288+ tryCompare(appDelegate2.surface, "activeFocus", true);
3173 function test_maximizedWindowAndMenuInPanel() {
3291 function test_maximizedWindowAndMenuInPanel() {
3174 loadShell("desktop");
3292 loadShell("desktop");
3175 shell.usageScenario = "desktop";
3293 shell.usageScenario = "desktop";