@@ -322,8 +322,9 @@ Rectangle {
322322
323323 function loadDesktopShellWithApps() {
324324 loadShell("desktop");
325+ waitForRendering(shell)
325326 shell.usageScenario = "desktop"
326− waitForRendering(root)
327+ waitForRendering(shell)
327328 var app1 = ApplicationManager.startApplication("dialer-app")
328329 var app2 = ApplicationManager.startApplication("webbrowser-app")
329330 var app3 = ApplicationManager.startApplication("camera-app")
@@ -590,19 +591,19 @@ Rectangle {
590591
591592 // Display off while call is active...
592593 callManager.foregroundCall = phoneCall;
593− Powerd.status = Powerd.Off;
594+ Powerd.setStatus(Powerd.Off, Powerd.Unknown);
594595 tryCompare(greeter, "shown", false);
595596
596597 // Now try again after ending call
597598 callManager.foregroundCall = null;
598− Powerd.status = Powerd.On;
599− Powerd.status = Powerd.Off;
599+ Powerd.setStatus(Powerd.On, Powerd.Unknown);
600+ Powerd.setStatus(Powerd.Off, Powerd.Unknown);
600601 tryCompare(greeter, "fullyShown", true);
601602
602603 compare(mainApp.requestedState, ApplicationInfoInterface.RequestedSuspended);
603604
604605 // And wake up
605− Powerd.status = Powerd.On;
606+ Powerd.setStatus(Powerd.On, Powerd.Unknown);
606607 tryCompare(greeter, "fullyShown", true);
607608
608609 // Swipe away greeter to focus app
@@ -795,6 +796,7 @@ Rectangle {
795796 function test_launchedAppHasActiveFocus(data) {
796797 loadShell(data.formFactor);
797798 shell.usageScenario = data.usageScenario;
799+ waitForGreeterToStabilize();
798800 swipeAwayGreeter();
799801
800802 var webApp = ApplicationManager.startApplication("webbrowser-app");
@@ -1104,6 +1106,19 @@ Rectangle {
11041106 compare(tutorialLeft, null); // should be destroyed with tutorial
11051107 }
11061108
1109+ function test_tutorialPausedDuringGreeter() {
1110+ loadShell("phone");
1111+
1112+ var tutorial = findChild(shell, "tutorial");
1113+
1114+ AccountsService.demoEdges = true;
1115+ tryCompare(tutorial, "running", true);
1116+ tryCompare(tutorial, "paused", true);
1117+
1118+ swipeAwayGreeter();
1119+ tryCompare(tutorial, "paused", false);
1120+ }
1121+
11071122 function test_tapOnRightEdgeReachesApplicationSurface() {
11081123 loadShell("phone");
11091124 swipeAwayGreeter();
@@ -1393,17 +1408,18 @@ Rectangle {
13931408 keyClick(Qt.Key_Tab, Qt.ControlModifier)
13941409 tryCompare(app2.session.surface, "activeFocus", true)
13951410
1411+ var desktopSpread = findChild(shell, "spread")
13961412
1397− tryCompare(desktopStage, "state", "")
1413+ tryCompare(desktopSpread, "state", "")
13981414
13991415 // Just press Alt, make sure the spread comes up
14001416 keyPress(Qt.Key_Control);
14011417 keyClick(Qt.Key_Tab);
1402− tryCompare(desktopStage, "state", "altTab")
1418+ tryCompare(desktopSpread, "state", "altTab")
14031419
14041420 // Release control, check if spread disappears
14051421 keyRelease(Qt.Key_Control)
1406− tryCompare(desktopStage, "state", "")
1422+ tryCompare(desktopSpread, "state", "")
14071423
14081424 // Focus should have switched back now
14091425 tryCompare(app3.session.surface, "activeFocus", true)
@@ -1415,41 +1431,44 @@ Rectangle {
14151431 var desktopStage = findChild(shell, "stage");
14161432 verify(desktopStage !== null)
14171433
1418− var appContainer = findInvisibleChild(shell, "appContainer")
1419− verify(appContainer !== null)
1434+ var desktopSpread = findChild(shell, "spread");
1435+ verify(desktopSpread !== null)
1436+
1437+ var spreadContainer = findInvisibleChild(shell, "spreadContainer")
1438+ verify(spreadContainer !== null)
14201439
1421− var appRepeater = findInvisibleChild(shell, "appRepeater")
1422− verify(appRepeater !== null)
1440+ var spreadRepeater = findInvisibleChild(shell, "spreadRepeater")
1441+ verify(spreadRepeater !== null)
14231442
14241443 // remember the focused appId
14251444 var focused = ApplicationManager.get(ApplicationManager.findApplication(ApplicationManager.focusedApplicationId));
14261445
1427− tryCompare(desktopStage, "state", "")
1446+ tryCompare(desktopSpread, "state", "")
14281447
14291448 // Just press Alt, make sure the spread comes up
14301449 keyPress(Qt.Key_Control);
14311450 keyClick(Qt.Key_Tab);
1432− tryCompare(desktopStage, "state", "altTab")
1433− tryCompare(appRepeater, "highlightedIndex", 1)
1451+ tryCompare(desktopSpread, "state", "altTab")
1452+ tryCompare(spreadRepeater, "highlightedIndex", 1)
14341453 waitForRendering(shell)
14351454
14361455 // Now press and hold Tab, make sure the highlight moves all the way but stops at the last one
14371456 // We can't simulate a pressed key with keyPress() currently, so let's inject the events
14381457 // at API level. Jump for 10 times, verify that it's still at the last one and didn't wrap around.
14391458 for (var i = 0; i < 10; i++) {
1440− appContainer.selectNext(true); // true == isAutoRepeat
1459+ desktopSpread.selectNext(true); // true == isAutoRepeat
14411460 wait(0); // Trigger the event loop to make sure all the things happen
14421461 }
1443− tryCompare(appRepeater, "highlightedIndex", 6)
1462+ tryCompare(spreadRepeater, "highlightedIndex", 6)
14441463
14451464 // Now release it once, and verify that it does wrap around with an additional Tab press
14461465 keyRelease(Qt.Key_Tab);
14471466 keyClick(Qt.Key_Tab);
1448− tryCompare(appRepeater, "highlightedIndex", 0)
1467+ tryCompare(spreadRepeater, "highlightedIndex", 0)
14491468
14501469 // Release control, check if spread disappears
14511470 keyRelease(Qt.Key_Control)
1452− tryCompare(desktopStage, "state", "")
1471+ tryCompare(desktopSpread, "state", "")
14531472
14541473 // Make sure that after wrapping around once, we have the same one focused as at the beginning
14551474 tryCompare(focused.session.surface, "activeFocus", true)
@@ -1458,30 +1477,30 @@ Rectangle {
14581477 function test_altBackTabNavigation() {
14591478 loadDesktopShellWithApps();
14601479
1461− var appRepeater = findInvisibleChild(shell, "appRepeater");
1462− verify(appRepeater !== null);
1480+ var spreadRepeater = findInvisibleChild(shell, "spreadRepeater");
1481+ verify(spreadRepeater !== null);
14631482
14641483 keyPress(Qt.Key_Control)
14651484 keyClick(Qt.Key_Tab);
1466− tryCompare(appRepeater, "highlightedIndex", 1);
1485+ tryCompare(spreadRepeater, "highlightedIndex", 1);
14671486
14681487 keyClick(Qt.Key_Tab);
1469− tryCompare(appRepeater, "highlightedIndex", 2);
1488+ tryCompare(spreadRepeater, "highlightedIndex", 2);
14701489
14711490 keyClick(Qt.Key_Tab);
1472− tryCompare(appRepeater, "highlightedIndex", 3);
1491+ tryCompare(spreadRepeater, "highlightedIndex", 3);
14731492
14741493 keyClick(Qt.Key_Tab);
1475− tryCompare(appRepeater, "highlightedIndex", 4);
1494+ tryCompare(spreadRepeater, "highlightedIndex", 4);
14761495
14771496 keyClick(Qt.Key_Backtab);
1478− tryCompare(appRepeater, "highlightedIndex", 3);
1497+ tryCompare(spreadRepeater, "highlightedIndex", 3);
14791498
14801499 keyClick(Qt.Key_Backtab);
1481− tryCompare(appRepeater, "highlightedIndex", 2);
1500+ tryCompare(spreadRepeater, "highlightedIndex", 2);
14821501
14831502 keyClick(Qt.Key_Backtab);
1484− tryCompare(appRepeater, "highlightedIndex", 1);
1503+ tryCompare(spreadRepeater, "highlightedIndex", 1);
14851504
14861505 keyRelease(Qt.Key_Control);
14871506 }
@@ -1489,20 +1508,20 @@ Rectangle {
14891508 function test_highlightFollowsMouse() {
14901509 loadDesktopShellWithApps()
14911510
1492− var appRepeater = findInvisibleChild(shell, "appRepeater");
1493− verify(appRepeater !== null);
1511+ var spreadRepeater = findInvisibleChild(shell, "spreadRepeater");
1512+ verify(spreadRepeater !== null);
14941513
14951514 keyPress(Qt.Key_Control)
14961515 keyClick(Qt.Key_Tab);
14971516
1498− tryCompare(appRepeater, "highlightedIndex", 1);
1517+ tryCompare(spreadRepeater, "highlightedIndex", 1);
14991518
15001519 var x = 0;
15011520 var y = shell.height * .75;
15021521 mouseMove(shell, x, y)
15031522
15041523 for (var i = 0; i < 7; i++) {
1505− while (appRepeater.highlightedIndex != i && x <= 4000) {
1524+ while (spreadRepeater.highlightedIndex != i && x <= 4000) {
15061525 x+=10;
15071526 mouseMove(shell, x, y)
15081527 wait(0); // spin the loop so bindings get evaluated
@@ -1517,8 +1536,8 @@ Rectangle {
15171536 function test_closeFromSpread() {
15181537 loadDesktopShellWithApps()
15191538
1520− var appRepeater = findInvisibleChild(shell, "appRepeater");
1521− verify(appRepeater !== null);
1539+ var spreadRepeater = findInvisibleChild(shell, "spreadRepeater");
1540+ verify(spreadRepeater !== null);
15221541
15231542 keyPress(Qt.Key_Control)
15241543 keyClick(Qt.Key_Tab);
@@ -1526,14 +1545,14 @@ Rectangle {
15261545 appRemovedSpy.clear();
15271546
15281547 var closedAppId = ApplicationManager.get(2).appId;
1529− var appDelegate2 = appRepeater.itemAt(2);
1530− var closeMouseArea = findChild(appDelegate2, "closeMouseArea");
1548+ var spreadDelegate2 = spreadRepeater.itemAt(2);
1549+ var closeMouseArea = findChild(spreadDelegate2, "closeMouseArea");
15311550
15321551 // Move the mosue over tile 2 and verify the close button becomes visible
15331552 var x = 0;
15341553 var y = shell.height * .5;
15351554 mouseMove(shell, x, y)
1536− while (appRepeater.highlightedIndex !== 2 && x <= 4000) {
1555+ while (spreadRepeater.highlightedIndex !== 2 && x <= 4000) {
15371556 x+=10;
15381557 mouseMove(shell, x, y)
15391558 wait(0); // spin the loop so bindings get evaluated
@@ -1560,32 +1579,35 @@ Rectangle {
15601579 function test_selectFromSpreadWithMouse(data) {
15611580 loadDesktopShellWithApps()
15621581
1563− var appRepeater = findInvisibleChild(shell, "appRepeater");
1564− verify(appRepeater !== null);
1582+ var stage = findChild(shell, "stage");
1583+ var spread = findChild(stage, "spread");
1584+ waitForRendering(spread)
1585+
1586+ var spreadRepeater = findInvisibleChild(shell, "spreadRepeater");
1587+ verify(spreadRepeater !== null);
15651588
15661589 keyPress(Qt.Key_Control)
15671590 keyClick(Qt.Key_Tab);
15681591
15691592 var focusAppId = ApplicationManager.get(2).appId;
1570− var appDelegate2 = appRepeater.itemAt(2);
1571− var decoratedWindow = findChild(appDelegate2, "decoratedWindow");
1572− var stage = findChild(shell, "stage");
1593+ var spreadDelegate2 = spreadRepeater.itemAt(2);
1594+ var clippedSpreadDelegate = findChild(spreadDelegate2, "clippedSpreadDelegate");
15731595
1574− tryCompare(stage, "state", "altTab");
1596+ tryCompare(spread, "state", "altTab");
15751597
15761598 // Move the mouse over tile 2 and verify the highlight becomes visible
15771599 var x = 0;
15781600 var y = shell.height * (data.tileInfo ? .95 : 0.5)
15791601 mouseMove(shell, x, y)
1580− while (appRepeater.highlightedIndex !== 2 && x <= 4000) {
1602+ while (spreadRepeater.highlightedIndex !== 2 && x <= 4000) {
15811603 x+=10;
15821604 mouseMove(shell, x, y)
15831605 wait(0); // spin the loop so bindings get evaluated
15841606 }
1585− tryCompare(decoratedWindow, "highlightShown", true);
1607+ tryCompare(clippedSpreadDelegate, "highlightShown", true);
15861608
15871609 // Click the tile
1588− mouseClick(decoratedWindow, decoratedWindow.width / 2, decoratedWindow.height / 2)
1610+ mouseClick(clippedSpreadDelegate, clippedSpreadDelegate.width / 2, clippedSpreadDelegate.height / 2)
15891611
15901612 // Verify that we left the spread and app2 is the focused one now
15911613 tryCompare(stage, "state", "");
@@ -1604,7 +1626,6 @@ Rectangle {
16041626 keyClick(Qt.Key_Tab);
16051627
16061628 var spreadFlickable = findChild(shell, "spreadFlickable")
1607− print("have flickable", spreadFlickable, spreadFlickable.contentX)
16081629
16091630 compare(spreadFlickable.contentX, 0);
16101631
@@ -1629,5 +1650,86 @@ Rectangle {
16291650
16301651 keyRelease(Qt.Key_Control);
16311652 }
1653+
1654+ // This makes sure the hoverMouseArea is set to invisible AND disabled
1655+ // when not needed. Otherwise it'll eat mouse hover events for the rest of the shell/apps
1656+ function test_hoverMouseAreaDisabledAndInvisible() {
1657+ loadDesktopShellWithApps()
1658+
1659+ var hoverMouseArea = findChild(shell, "hoverMouseArea");
1660+ tryCompare(hoverMouseArea, "enabled", false)
1661+ tryCompare(hoverMouseArea, "visible", false)
1662+
1663+ keyPress(Qt.Key_Control)
1664+ keyClick(Qt.Key_Tab);
1665+
1666+ tryCompare(hoverMouseArea, "enabled", true)
1667+ tryCompare(hoverMouseArea, "visible", true)
1668+
1669+ keyRelease(Qt.Key_Control)
1670+
1671+ tryCompare(hoverMouseArea, "enabled", false)
1672+ tryCompare(hoverMouseArea, "visible", false)
1673+ }
1674+
1675+ function test_workspacePreviewsHighlightedApp() {
1676+ loadDesktopShellWithApps()
1677+
1678+ var targetZ = ApplicationManager.count + 1;
1679+
1680+ var spreadRepeater = findInvisibleChild(shell, "spreadRepeater");
1681+ verify(spreadRepeater !== null);
1682+
1683+ var appRepeater = findInvisibleChild(shell, "appRepeater");
1684+ verify(appRepeater !== null);
1685+
1686+ keyPress(Qt.Key_Control)
1687+ keyClick(Qt.Key_Tab);
1688+
1689+ tryCompare(spreadRepeater, "highlightedIndex", 1);
1690+ tryCompare(appRepeater.itemAt(1), "z", targetZ)
1691+
1692+ var x = 0;
1693+ var y = shell.height * .75;
1694+ mouseMove(shell, x, y)
1695+
1696+ for (var i = 0; i < 7; i++) {
1697+ while (spreadRepeater.highlightedIndex != i && x <= 4000) {
1698+ tryCompare(appRepeater.itemAt(spreadRepeater.highlightedIndex), "z", targetZ)
1699+ x+=10;
1700+ mouseMove(shell, x, y)
1701+ wait(0); // spin the loop so bindings get evaluated
1702+ }
1703+ }
1704+
1705+ verify(y < 4000);
1706+
1707+ keyRelease(Qt.Key_Control);
1708+ }
1709+
1710+ function test_focusAppFromLauncherExitsSpread() {
1711+ loadDesktopShellWithApps()
1712+
1713+ var desktopSpread = findChild(shell, "spread");
1714+ var launcher = findChild(shell, "launcher");
1715+ var bfb = findChild(launcher, "buttonShowDashHome");
1716+
1717+ keyPress(Qt.Key_Control)
1718+ keyClick(Qt.Key_Tab);
1719+
1720+
1721+ tryCompare(desktopSpread, "state", "altTab")
1722+
1723+ mouseMove(shell, 0, 0);
1724+ tryCompare(launcher, "state", "visibleTemporary")
1725+
1726+ mouseClick(bfb, bfb.width / 2, bfb.height / 2)
1727+ tryCompare(launcher, "state", "")
1728+ tryCompare(desktopSpread, "state", "")
1729+
1730+ tryCompare(ApplicationManager, "focusedApplicationId", "unity8-dash")
1731+
1732+ keyRelease(Qt.Key_Control);
1733+ }
16321734 }
16331735}