@@ -60,14 +60,10 @@ Item {
61 focus: true
61 focus: true
63− property bool itemDestroyed: false
64 sourceComponent: Component {
63 sourceComponent: Component {
65 DesktopStage {
64 DesktopStage {
66 color: "darkblue"
65 color: "darkblue"
67 anchors.fill: parent
66 anchors.fill: parent
68− Component.onDestruction: {
69− desktopStageLoader.itemDestroyed = true;
71 orientations: Orientations {}
67 orientations: Orientations {}
@@ -103,16 +99,10 @@ Item {
103 property Item desktopStage: desktopStageLoader.status === Loader.Ready ? desktopStageLoader.item : null
99 property Item desktopStage: desktopStageLoader.status === Loader.Ready ? desktopStageLoader.item : null
105 function cleanup() {
101 function cleanup() {
106− desktopStageLoader.itemDestroyed = false;
107 desktopStageLoader.active = false;
102 desktopStageLoader.active = false;
109 tryCompare(desktopStageLoader, "status", Loader.Null);
104 tryCompare(desktopStageLoader, "status", Loader.Null);
110 tryCompare(desktopStageLoader, "item", null);
105 tryCompare(desktopStageLoader, "item", null);
111− // Loader.status might be Loader.Null and Loader.item might be null but the Loader
112− // actually took place. Likely because Loader waits until the next event loop
113− // iteration to do its work. So to ensure the reload, we will wait until the
114− // Shell instance gets destroyed.
115− tryCompare(desktopStageLoader, "itemDestroyed", true);
117 killAllRunningApps();
107 killAllRunningApps();
@@ -155,10 +145,7 @@ Item {
157 function test_appFocusSwitch(data) {
147 function test_appFocusSwitch(data) {
159− for (i = 0; i < data.apps.length; i++) {
160− startApplication(data.apps[i]);
148+ data.apps.forEach(startApplication);
163 ApplicationManager.requestFocusApplication(data.apps[data.focusfrom]);
150 ApplicationManager.requestFocusApplication(data.apps[data.focusfrom]);
164 tryCompare(ApplicationManager.findApplication(data.apps[data.focusfrom]).session.surface, "activeFocus", true);
151 tryCompare(ApplicationManager.findApplication(data.apps[data.focusfrom]).session.surface, "activeFocus", true);
@@ -175,10 +162,7 @@ Item {
177 function test_tappingOnWindowChangesFocusedApp(data) {
164 function test_tappingOnWindowChangesFocusedApp(data) {
179− for (i = 0; i < data.apps.length; i++) {
180− startApplication(data.apps[i]);
165+ data.apps.forEach(startApplication);
182 var fromAppId = data.apps[data.focusfrom];
166 var fromAppId = data.apps[data.focusfrom];
183 var toAppId = data.apps[data.focusTo]
167 var toAppId = data.apps[data.focusTo]
@@ -195,18 +179,37 @@ Item {
195 compare(ApplicationManager.focusedApplicationId, toAppId);
179 compare(ApplicationManager.focusedApplicationId, toAppId);
182+ function test_clickingOnWindowChangesFocusedApp_data() {
183+ return test_tappingOnWindowChangesFocusedApp_data(); // reuse test data
186+ function test_clickingOnWindowChangesFocusedApp(data) {
187+ data.apps.forEach(startApplication);
188+ var fromAppId = data.apps[data.focusfrom];
189+ var toAppId = data.apps[data.focusTo]
191+ var fromAppWindow = findChild(desktopStage, "appWindow_" + fromAppId);
192+ verify(fromAppWindow);
193+ mouseClick(fromAppWindow);
194+ compare(fromAppWindow.application.session.surface.activeFocus, true);
195+ compare(ApplicationManager.focusedApplicationId, fromAppId);
197+ var toAppWindow = findChild(desktopStage, "appWindow_" + toAppId);
198+ verify(toAppWindow);
199+ mouseClick(toAppWindow);
200+ compare(toAppWindow.application.session.surface.activeFocus, true);
201+ compare(ApplicationManager.focusedApplicationId, toAppId);
198 function test_tappingOnDecorationFocusesApplication_data() {
204 function test_tappingOnDecorationFocusesApplication_data() {
200− {tag: "dash", apps: [ "unity8-dash", "dialer-app", "camera-app" ], focusfrom: 0, focusTo: 1 },
206+ {tag: "dash to dialer", apps: [ "unity8-dash", "dialer-app", "camera-app" ], focusfrom: 0, focusTo: 1 },
201− {tag: "dash", apps: [ "unity8-dash", "dialer-app", "camera-app" ], focusfrom: 1, focusTo: 0 },
207+ {tag: "dialer to dash", apps: [ "unity8-dash", "dialer-app", "camera-app" ], focusfrom: 1, focusTo: 0 },
205 function test_tappingOnDecorationFocusesApplication(data) {
211 function test_tappingOnDecorationFocusesApplication(data) {
207− for (i = 0; i < data.apps.length; i++) {
208− startApplication(data.apps[i]);
212+ data.apps.forEach(startApplication);
211 var fromAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusfrom]);
214 var fromAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusfrom]);
212 verify(fromAppDecoration);
215 verify(fromAppDecoration);
@@ -219,10 +222,114 @@ Item {
219 tryCompare(ApplicationManager.findApplication(data.apps[data.focusTo]).session.surface, "activeFocus", true);
222 tryCompare(ApplicationManager.findApplication(data.apps[data.focusTo]).session.surface, "activeFocus", true);
225+ function test_clickingOnDecorationFocusesApplication_data() {
226+ return test_tappingOnDecorationFocusesApplication_data(); // reuse test data
229+ function test_clickingOnDecorationFocusesApplication(data) {
230+ data.apps.forEach(startApplication);
232+ var fromAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusfrom]);
233+ verify(fromAppDecoration);
234+ mouseClick(fromAppDecoration);
235+ tryCompare(ApplicationManager.findApplication(data.apps[data.focusfrom]).session.surface, "activeFocus", true);
237+ var toAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusTo]);
238+ verify(toAppDecoration);
239+ mouseClick(toAppDecoration);
240+ tryCompare(ApplicationManager.findApplication(data.apps[data.focusTo]).session.surface, "activeFocus", true);
243+ function test_windowMaximize() {
244+ var apps = ["unity8-dash", "dialer-app", "camera-app"];
245+ apps.forEach(startApplication);
246+ var appName = "dialer-app";
247+ var appDelegate = findChild(desktopStage, "appDelegate_" + appName);
248+ verify(appDelegate);
249+ ApplicationManager.focusApplication(appName);
250+ keyClick(Qt.Key_Up, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+Up shortcut to maximize
251+ tryCompare(appDelegate, "maximized", true);
252+ tryCompare(appDelegate, "minimized", false);
255+ function test_windowMaximizeLeft() {
256+ var apps = ["unity8-dash", "dialer-app", "camera-app"];
257+ apps.forEach(startApplication);
258+ var appName = "dialer-app";
259+ var appDelegate = findChild(desktopStage, "appDelegate_" + appName);
260+ verify(appDelegate);
261+ ApplicationManager.focusApplication(appName);
262+ keyClick(Qt.Key_Left, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+Left shortcut to maximizeLeft
263+ tryCompare(appDelegate, "maximized", false);
264+ tryCompare(appDelegate, "minimized", false);
265+ tryCompare(appDelegate, "maximizedLeft", true);
266+ tryCompare(appDelegate, "maximizedRight", false);
269+ function test_windowMaximizeRight() {
270+ var apps = ["unity8-dash", "dialer-app", "camera-app"];
271+ apps.forEach(startApplication);
272+ var appName = "dialer-app";
273+ var appDelegate = findChild(desktopStage, "appDelegate_" + appName);
274+ verify(appDelegate);
275+ ApplicationManager.focusApplication(appName);
276+ keyClick(Qt.Key_Right, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+Right shortcut to maximizeRight
277+ tryCompare(appDelegate, "maximized", false);
278+ tryCompare(appDelegate, "minimized", false);
279+ tryCompare(appDelegate, "maximizedLeft", false);
280+ tryCompare(appDelegate, "maximizedRight", true);
283+ function test_windowMinimize() {
284+ var apps = ["unity8-dash", "dialer-app", "camera-app"];
285+ apps.forEach(startApplication);
286+ var appName = "dialer-app";
287+ var appDelegate = findChild(desktopStage, "appDelegate_" + appName);
288+ verify(appDelegate);
289+ ApplicationManager.focusApplication(appName);
290+ keyClick(Qt.Key_Down, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+Down shortcut to minimize
291+ tryCompare(appDelegate, "maximized", false);
292+ tryCompare(appDelegate, "minimized", true);
293+ verify(ApplicationManager.focusedApplicationId != ""); // verify we don't lose focus when minimizing an app
296+ function test_windowMinimizeAll() {
297+ var apps = ["unity8-dash", "dialer-app", "camera-app"];
298+ apps.forEach(startApplication);
299+ verify(ApplicationManager.count == 3);
300+ keyClick(Qt.Key_D, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+D shortcut to minimize all
301+ tryCompare(ApplicationManager, "focusedApplicationId", ""); // verify no app is focused
304+ function test_windowClose() {
305+ var apps = ["unity8-dash", "dialer-app", "camera-app"];
306+ apps.forEach(startApplication);
307+ verify(ApplicationManager.count == 3);
308+ var appName = "dialer-app";
309+ var appDelegate = findChild(desktopStage, "appDelegate_" + appName);
310+ verify(appDelegate);
311+ ApplicationManager.focusApplication(appName);
312+ keyClick(Qt.Key_F4, Qt.AltModifier); // Alt+F4 shortcut to close
313+ verify(ApplicationManager.count == 2); // verify the app is gone
314+ verify(ApplicationManager.findApplication(appName) === null); // and it's not in running apps
317+ function test_smashCursorKeys() {
318+ var apps = ["unity8-dash", "dialer-app", "camera-app"];
319+ apps.forEach(startApplication);
320+ verify(ApplicationManager.count == 3);
321+ keyClick(Qt.Key_D, Qt.MetaModifier|Qt.ControlModifier); // Ctrl+Super+D shortcut to minimize all
322+ tryCompare(ApplicationManager, "focusedApplicationId", ""); // verify no app is focused
324+ // now try pressing all 4 arrow keys + ctrl + meta
325+ keyClick(Qt.Key_Up | Qt.Key_Down | Qt.Key_Left | Qt.Key_Right, Qt.MetaModifier|Qt.ControlModifier); // smash it!!!
326+ tryCompare(ApplicationManager, "focusedApplicationId", ""); // verify still no app is focused
222 function test_minimizeApplicationHidesSurface() {
329 function test_minimizeApplicationHidesSurface() {
223 var dashApp = startApplication("unity8-dash");
330 var dashApp = startApplication("unity8-dash");
225− var dashDelegate = findChild(desktopStage, "stageDelegate_unity8-dash");
332+ var dashDelegate = findChild(desktopStage, "appDelegate_unity8-dash");
226 verify(dashDelegate);
333 verify(dashDelegate);
228 findChild(dashDelegate, "decoratedWindow").minimize();
335 findChild(dashDelegate, "decoratedWindow").minimize();
@@ -234,11 +341,11 @@ Item {
234 var dialerApp = startApplication("dialer-app");
341 var dialerApp = startApplication("dialer-app");
235 var cameraApp = startApplication("camera-app");
342 var cameraApp = startApplication("camera-app");
237− var dashDelegate = findChild(desktopStage, "stageDelegate_unity8-dash");
344+ var dashDelegate = findChild(desktopStage, "appDelegate_unity8-dash");
238 verify(dashDelegate);
345 verify(dashDelegate);
239− var dialerDelegate = findChild(desktopStage, "stageDelegate_dialer-app");
346+ var dialerDelegate = findChild(desktopStage, "appDelegate_dialer-app");
240 verify(dialerDelegate);
347 verify(dialerDelegate);
241− var cameraDelegate = findChild(desktopStage, "stageDelegate_camera-app");
348+ var cameraDelegate = findChild(desktopStage, "appDelegate_camera-app");
242 verify(cameraDelegate);
349 verify(cameraDelegate);
244 // maximize
351 // maximize
@@ -256,20 +363,20 @@ Item {
257 function test_applicationsBecomeVisibleWhenOccludingAppRemoved() {
364 function test_applicationsBecomeVisibleWhenOccludingAppRemoved() {
258 var dashApp = startApplication("unity8-dash");
365 var dashApp = startApplication("unity8-dash");
259− var dashDelegate = findChild(desktopStage, "stageDelegate_unity8-dash");
366+ var dashDelegate = findChild(desktopStage, "appDelegate_unity8-dash");
260 verify(dashDelegate);
367 verify(dashDelegate);
262 var dialerApp = startApplication("dialer-app");
369 var dialerApp = startApplication("dialer-app");
263− var dialerDelegate = findChild(desktopStage, "stageDelegate_dialer-app");
370+ var dialerDelegate = findChild(desktopStage, "appDelegate_dialer-app");
264 verify(dialerDelegate);
371 verify(dialerDelegate);
266 var cameraApp = startApplication("camera-app");
373 var cameraApp = startApplication("camera-app");
267− var cameraDelegate = findChild(desktopStage, "stageDelegate_camera-app");
374+ var cameraDelegate = findChild(desktopStage, "appDelegate_camera-app");
268 verify(cameraDelegate);
375 verify(cameraDelegate);
269 findChild(dialerDelegate, "decoratedWindow").maximize();
376 findChild(dialerDelegate, "decoratedWindow").maximize();
271 var galleryApp = startApplication("gallery-app");
378 var galleryApp = startApplication("gallery-app");
272− var galleryDelegate = findChild(desktopStage, "stageDelegate_gallery-app");
379+ var galleryDelegate = findChild(desktopStage, "appDelegate_gallery-app");
273 verify(galleryDelegate);
380 verify(galleryDelegate);
274 findChild(galleryDelegate, "decoratedWindow").maximize();
381 findChild(galleryDelegate, "decoratedWindow").maximize();