@@ -53,14 +53,10 @@ Item {
54 focus: true
54 focus: true
56− property bool itemDestroyed: false
57 sourceComponent: Component {
56 sourceComponent: Component {
58 DesktopStage {
57 DesktopStage {
59 color: "darkblue"
58 color: "darkblue"
60 anchors.fill: parent
59 anchors.fill: parent
61− Component.onDestruction: {
62− desktopStageLoader.itemDestroyed = true;
@@ -95,16 +91,10 @@ Item {
95 property Item desktopStage: desktopStageLoader.status === Loader.Ready ? desktopStageLoader.item : null
91 property Item desktopStage: desktopStageLoader.status === Loader.Ready ? desktopStageLoader.item : null
97 function cleanup() {
93 function cleanup() {
98− desktopStageLoader.itemDestroyed = false;
99 desktopStageLoader.active = false;
94 desktopStageLoader.active = false;
101 tryCompare(desktopStageLoader, "status", Loader.Null);
96 tryCompare(desktopStageLoader, "status", Loader.Null);
102 tryCompare(desktopStageLoader, "item", null);
97 tryCompare(desktopStageLoader, "item", null);
103− // Loader.status might be Loader.Null and Loader.item might be null but the Loader
104− // actually took place. Likely because Loader waits until the next event loop
105− // iteration to do its work. So to ensure the reload, we will wait until the
106− // Shell instance gets destroyed.
107− tryCompare(desktopStageLoader, "itemDestroyed", true);
109 killAllRunningApps();
99 killAllRunningApps();
@@ -117,7 +107,7 @@ Item {
117 var appIndex = ApplicationManager.get(0).appId == "unity8-dash" ? 1 : 0
107 var appIndex = ApplicationManager.get(0).appId == "unity8-dash" ? 1 : 0
118 ApplicationManager.stopApplication(ApplicationManager.get(appIndex).appId);
108 ApplicationManager.stopApplication(ApplicationManager.get(appIndex).appId);
120− compare(ApplicationManager.count, 1)
110+ compare(ApplicationManager.count, 1);
123 function waitUntilAppSurfaceShowsUp(appId) {
113 function waitUntilAppSurfaceShowsUp(appId) {
@@ -147,10 +137,7 @@ Item {
149 function test_appFocusSwitch(data) {
139 function test_appFocusSwitch(data) {
151− for (i = 0; i < data.apps.length; i++) {
152− startApplication(data.apps[i]);
140+ data.apps.forEach(startApplication);
155 ApplicationManager.requestFocusApplication(data.apps[data.focusfrom]);
142 ApplicationManager.requestFocusApplication(data.apps[data.focusfrom]);
156 tryCompare(ApplicationManager.findApplication(data.apps[data.focusfrom]).session.surface, "activeFocus", true);
143 tryCompare(ApplicationManager.findApplication(data.apps[data.focusfrom]).session.surface, "activeFocus", true);
@@ -167,10 +154,7 @@ Item {
169 function test_tappingOnWindowChangesFocusedApp(data) {
156 function test_tappingOnWindowChangesFocusedApp(data) {
171− for (i = 0; i < data.apps.length; i++) {
172− startApplication(data.apps[i]);
157+ data.apps.forEach(startApplication);
174 var fromAppId = data.apps[data.focusfrom];
158 var fromAppId = data.apps[data.focusfrom];
175 var toAppId = data.apps[data.focusTo]
159 var toAppId = data.apps[data.focusTo]
@@ -187,18 +171,37 @@ Item {
187 compare(ApplicationManager.focusedApplicationId, toAppId);
171 compare(ApplicationManager.focusedApplicationId, toAppId);
174+ function test_clickingOnWindowChangesFocusedApp_data() {
175+ return test_tappingOnWindowChangesFocusedApp_data(); // reuse test data
178+ function test_clickingOnWindowChangesFocusedApp(data) {
179+ data.apps.forEach(startApplication);
180+ var fromAppId = data.apps[data.focusfrom];
181+ var toAppId = data.apps[data.focusTo]
183+ var fromAppWindow = findChild(desktopStage, "appWindow_" + fromAppId);
184+ verify(fromAppWindow);
185+ mouseClick(fromAppWindow);
186+ compare(fromAppWindow.application.session.surface.activeFocus, true);
187+ compare(ApplicationManager.focusedApplicationId, fromAppId);
189+ var toAppWindow = findChild(desktopStage, "appWindow_" + toAppId);
190+ verify(toAppWindow);
191+ mouseClick(toAppWindow);
192+ compare(toAppWindow.application.session.surface.activeFocus, true);
193+ compare(ApplicationManager.focusedApplicationId, toAppId);
190 function test_tappingOnDecorationFocusesApplication_data() {
196 function test_tappingOnDecorationFocusesApplication_data() {
192− {tag: "dash", apps: [ "unity8-dash", "dialer-app", "camera-app" ], focusfrom: 0, focusTo: 1 },
198+ {tag: "dash to dialer", apps: [ "unity8-dash", "dialer-app", "camera-app" ], focusfrom: 0, focusTo: 1 },
193− {tag: "dash", apps: [ "unity8-dash", "dialer-app", "camera-app" ], focusfrom: 1, focusTo: 0 },
199+ {tag: "dialer to dash", apps: [ "unity8-dash", "dialer-app", "camera-app" ], focusfrom: 1, focusTo: 0 },
197 function test_tappingOnDecorationFocusesApplication(data) {
203 function test_tappingOnDecorationFocusesApplication(data) {
199− for (i = 0; i < data.apps.length; i++) {
200− startApplication(data.apps[i]);
204+ data.apps.forEach(startApplication);
203 var fromAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusfrom]);
206 var fromAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusfrom]);
204 verify(fromAppDecoration);
207 verify(fromAppDecoration);
@@ -210,5 +213,109 @@ Item {
210 tap(toAppDecoration);
213 tap(toAppDecoration);
211 tryCompare(ApplicationManager.findApplication(data.apps[data.focusTo]).session.surface, "activeFocus", true);
214 tryCompare(ApplicationManager.findApplication(data.apps[data.focusTo]).session.surface, "activeFocus", true);
217+ function test_clickingOnDecorationFocusesApplication_data() {
218+ return test_tappingOnDecorationFocusesApplication_data(); // reuse test data
221+ function test_clickingOnDecorationFocusesApplication(data) {
222+ data.apps.forEach(startApplication);
224+ var fromAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusfrom]);
225+ verify(fromAppDecoration);
226+ mouseClick(fromAppDecoration);
227+ tryCompare(ApplicationManager.findApplication(data.apps[data.focusfrom]).session.surface, "activeFocus", true);
229+ var toAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusTo]);
230+ verify(toAppDecoration);
231+ mouseClick(toAppDecoration);
232+ tryCompare(ApplicationManager.findApplication(data.apps[data.focusTo]).session.surface, "activeFocus", true);
235+ function test_windowMaximize() {
236+ var apps = ["unity8-dash", "dialer-app", "camera-app"];
237+ apps.forEach(startApplication);
238+ var appName = "dialer-app";
239+ var appDelegate = findChild(desktopStage, "appDelegate_" + appName);
240+ verify(appDelegate);
241+ ApplicationManager.focusApplication(appName);
242+ keyClick(Qt.Key_Up, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+Up shortcut to maximize
243+ tryCompare(appDelegate, "maximized", true);
244+ tryCompare(appDelegate, "minimized", false);
247+ function test_windowMaximizeLeft() {
248+ var apps = ["unity8-dash", "dialer-app", "camera-app"];
249+ apps.forEach(startApplication);
250+ var appName = "dialer-app";
251+ var appDelegate = findChild(desktopStage, "appDelegate_" + appName);
252+ verify(appDelegate);
253+ ApplicationManager.focusApplication(appName);
254+ keyClick(Qt.Key_Left, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+Left shortcut to maximizeLeft
255+ tryCompare(appDelegate, "maximized", false);
256+ tryCompare(appDelegate, "minimized", false);
257+ tryCompare(appDelegate, "maximizedLeft", true);
258+ tryCompare(appDelegate, "maximizedRight", false);
261+ function test_windowMaximizeRight() {
262+ var apps = ["unity8-dash", "dialer-app", "camera-app"];
263+ apps.forEach(startApplication);
264+ var appName = "dialer-app";
265+ var appDelegate = findChild(desktopStage, "appDelegate_" + appName);
266+ verify(appDelegate);
267+ ApplicationManager.focusApplication(appName);
268+ keyClick(Qt.Key_Right, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+Right shortcut to maximizeRight
269+ tryCompare(appDelegate, "maximized", false);
270+ tryCompare(appDelegate, "minimized", false);
271+ tryCompare(appDelegate, "maximizedLeft", false);
272+ tryCompare(appDelegate, "maximizedRight", true);
275+ function test_windowMinimize() {
276+ var apps = ["unity8-dash", "dialer-app", "camera-app"];
277+ apps.forEach(startApplication);
278+ var appName = "dialer-app";
279+ var appDelegate = findChild(desktopStage, "appDelegate_" + appName);
280+ verify(appDelegate);
281+ ApplicationManager.focusApplication(appName);
282+ keyClick(Qt.Key_Down, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+Down shortcut to minimize
283+ tryCompare(appDelegate, "maximized", false);
284+ tryCompare(appDelegate, "minimized", true);
285+ verify(ApplicationManager.focusedApplicationId != ""); // verify we don't lose focus when minimizing an app
288+ function test_windowMinimizeAll() {
289+ var apps = ["unity8-dash", "dialer-app", "camera-app"];
290+ apps.forEach(startApplication);
291+ verify(ApplicationManager.count == 3);
292+ keyClick(Qt.Key_D, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+D shortcut to minimize all
293+ tryCompare(ApplicationManager, "focusedApplicationId", ""); // verify no app is focused
296+ function test_windowClose() {
297+ var apps = ["unity8-dash", "dialer-app", "camera-app"];
298+ apps.forEach(startApplication);
299+ verify(ApplicationManager.count == 3);
300+ var appName = "dialer-app";
301+ var appDelegate = findChild(desktopStage, "appDelegate_" + appName);
302+ verify(appDelegate);
303+ ApplicationManager.focusApplication(appName);
304+ keyClick(Qt.Key_F4, Qt.AltModifier); // Alt+F4 shortcut to close
305+ verify(ApplicationManager.count == 2); // verify the app is gone
306+ verify(ApplicationManager.findApplication(appName) === null); // and it's not in running apps
309+ function test_smashCursorKeys() {
310+ var apps = ["unity8-dash", "dialer-app", "camera-app"];
311+ apps.forEach(startApplication);
312+ verify(ApplicationManager.count == 3);
313+ keyClick(Qt.Key_D, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+D shortcut to minimize all
314+ tryCompare(ApplicationManager, "focusedApplicationId", ""); // verify no app is focused
316+ // now try pressing all 4 arrow keys + ctrl + meta
317+ keyClick(Qt.Key_Up | Qt.Key_Down | Qt.Key_Left | Qt.Key_Right, Qt.MetaModifier|Qt.ControlModifier); // smash it!!!
318+ tryCompare(ApplicationManager, "focusedApplicationId", ""); // verify still no app is focused