@@ -53,14 +53,10 @@ Item {
5353
5454 focus: true
5555
56− property bool itemDestroyed: false
5756 sourceComponent: Component {
5857 DesktopStage {
5958 color: "darkblue"
6059 anchors.fill: parent
61− Component.onDestruction: {
62− desktopStageLoader.itemDestroyed = true;
63− }
6460 }
6561 }
6662 }
@@ -95,16 +91,10 @@ Item {
9591 property Item desktopStage: desktopStageLoader.status === Loader.Ready ? desktopStageLoader.item : null
9692
9793 function cleanup() {
98− desktopStageLoader.itemDestroyed = false;
9994 desktopStageLoader.active = false;
10095
10196 tryCompare(desktopStageLoader, "status", Loader.Null);
10297 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);
10898
10999 killAllRunningApps();
110100
@@ -117,7 +107,7 @@ Item {
117107 var appIndex = ApplicationManager.get(0).appId == "unity8-dash" ? 1 : 0
118108 ApplicationManager.stopApplication(ApplicationManager.get(appIndex).appId);
119109 }
120− compare(ApplicationManager.count, 1)
110+ compare(ApplicationManager.count, 1);
121111 }
122112
123113 function waitUntilAppSurfaceShowsUp(appId) {
@@ -147,10 +137,7 @@ Item {
147137 }
148138
149139 function test_appFocusSwitch(data) {
150− var i;
151− for (i = 0; i < data.apps.length; i++) {
152− startApplication(data.apps[i]);
153− }
140+ data.apps.forEach(startApplication);
154141
155142 ApplicationManager.requestFocusApplication(data.apps[data.focusfrom]);
156143 tryCompare(ApplicationManager.findApplication(data.apps[data.focusfrom]).session.surface, "activeFocus", true);
@@ -167,10 +154,7 @@ Item {
167154 }
168155
169156 function test_tappingOnWindowChangesFocusedApp(data) {
170− var i;
171− for (i = 0; i < data.apps.length; i++) {
172− startApplication(data.apps[i]);
173− }
157+ data.apps.forEach(startApplication);
174158 var fromAppId = data.apps[data.focusfrom];
175159 var toAppId = data.apps[data.focusTo]
176160
@@ -187,18 +171,37 @@ Item {
187171 compare(ApplicationManager.focusedApplicationId, toAppId);
188172 }
189173
174+ function test_clickingOnWindowChangesFocusedApp_data() {
175+ return test_tappingOnWindowChangesFocusedApp_data(); // reuse test data
176+ }
177+
178+ function test_clickingOnWindowChangesFocusedApp(data) {
179+ data.apps.forEach(startApplication);
180+ var fromAppId = data.apps[data.focusfrom];
181+ var toAppId = data.apps[data.focusTo]
182+
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);
188+
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);
194+ }
195+
190196 function test_tappingOnDecorationFocusesApplication_data() {
191197 return [
192− {tag: "dash", 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 },
198+ {tag: "dash to dialer", apps: [ "unity8-dash", "dialer-app", "camera-app" ], focusfrom: 0, focusTo: 1 },
199+ {tag: "dialer to dash", apps: [ "unity8-dash", "dialer-app", "camera-app" ], focusfrom: 1, focusTo: 0 },
194200 ]
195201 }
196202
197203 function test_tappingOnDecorationFocusesApplication(data) {
198− var i;
199− for (i = 0; i < data.apps.length; i++) {
200− startApplication(data.apps[i]);
201− }
204+ data.apps.forEach(startApplication);
202205
203206 var fromAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusfrom]);
204207 verify(fromAppDecoration);
@@ -210,5 +213,109 @@ Item {
210213 tap(toAppDecoration);
211214 tryCompare(ApplicationManager.findApplication(data.apps[data.focusTo]).session.surface, "activeFocus", true);
212215 }
216+
217+ function test_clickingOnDecorationFocusesApplication_data() {
218+ return test_tappingOnDecorationFocusesApplication_data(); // reuse test data
219+ }
220+
221+ function test_clickingOnDecorationFocusesApplication(data) {
222+ data.apps.forEach(startApplication);
223+
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);
228+
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);
233+ }
234+
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);
245+ }
246+
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);
259+ }
260+
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);
273+ }
274+
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
286+ }
287+
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
294+ }
295+
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
307+ }
308+
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
315+
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
319+ }
213320 }
214321}