@@ -1,5 +1,6 @@
2 * Copyright (C) 2014-2016 Canonical, Ltd.
2 * Copyright (C) 2014-2016 Canonical, Ltd.
3+ * Copyright (C) 2021 UBports Foundation
4 * This program is free software; you can redistribute it and/or modify
5 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * it under the terms of the GNU General Public License as published by
@@ -36,7 +37,6 @@ Item {
36 Component.onCompleted: {
37 Component.onCompleted: {
37 // must set the mock mode before loading the Shell
38 // must set the mock mode before loading the Shell
38 LightDMController.userMode = "single-pin";
39 LightDMController.userMode = "single-pin";
39− shellLoader.active = true;
42 QtObject {
42 QtObject {
@@ -55,35 +55,43 @@ Item {
58+ property var tryShell: null
59 id: contentRow
69 id: contentRow
61− Loader {
71+ Rectangle {
62− id: shellLoader
72+ id: shellRect
63− active: false
73+ color: "black"
65 width: units.gu(40)
74 width: units.gu(40)
66 height: units.gu(71)
75 height: units.gu(71)
68− property bool itemDestroyed: false
69− sourceComponent: Component {
72− Component.onDestruction: {
73− shellLoader.itemDestroyed = true
79 Rectangle {
78 Rectangle {
80 color: "white"
79 color: "white"
81 width: units.gu(30)
80 width: units.gu(30)
82− height: shellLoader.height
81+ height: shellRect.height
85 anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
84 anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
86 spacing: units.gu(1)
85 spacing: units.gu(1)
87+ anchors { left: parent.left; right: parent.right }
90+ if (root.tryShell === null) {
91+ root.tryShell = shellComponent.createObject(shellRect);
88 anchors { left: parent.left; right: parent.right }
96 anchors { left: parent.left; right: parent.right }
89 text: "Show Greeter"
97 text: "Show Greeter"
@@ -122,13 +130,13 @@ Item {
122 name: "ShellWithPin"
130 name: "ShellWithPin"
123 when: windowShown
131 when: windowShown
125− property Item shell: shellLoader.status === Loader.Ready ? shellLoader.item : null
127− function init() {
133+ function createShell() {
134+ var shell = createTemporaryObject(shellComponent, shellRect);
135+ removeTimeConstraintsFromSwipeAreas(shell);
128 tryCompare(shell, "waitingOnGreeter", false); // will be set when greeter is all ready
136 tryCompare(shell, "waitingOnGreeter", false); // will be set when greeter is all ready
129 var greeter = findChild(shell, "greeter");
137 var greeter = findChild(shell, "greeter");
130 sessionSpy.target = greeter;
138 sessionSpy.target = greeter;
131− swipeAwayGreeter(true);
139+ swipeAwayGreeter(true, shell);
132 greeter.failedLoginsDelayAttempts = -1;
140 greeter.failedLoginsDelayAttempts = -1;
134 var launcher = findChild(shell, "launcher");
142 var launcher = findChild(shell, "launcher");
@@ -140,44 +148,20 @@ Item {
140 stage = findChild(shell, "stage");
148 stage = findChild(shell, "stage");
141 topLevelSurfaceList = findInvisibleChild(shell, "topLevelSurfaceList");
149 topLevelSurfaceList = findInvisibleChild(shell, "topLevelSurfaceList");
142 verify(topLevelSurfaceList);
150 verify(topLevelSurfaceList);
145 function cleanup() {
154 function cleanup() {
146− tryCompare(shell, "waitingOnGreeter", false); // make sure greeter didn't leave us in disabled state
148 topLevelSurfaceList = null;
155 topLevelSurfaceList = null;
150− shellLoader.itemDestroyed = false
152− shellLoader.active = false
154− tryCompare(shellLoader, "status", Loader.Null)
155− tryCompare(shellLoader, "item", null)
156− // Loader.status might be Loader.Null and Loader.item might be null but the Loader
157− // item might still be alive. So if we set Loader.active back to true
158− // again right now we will get the very same Shell instance back. So no reload
159− // actually took place. Likely because Loader waits until the next event loop
160− // iteration to do its work. So to ensure the reload, we will wait until the
161− // Shell instance gets destroyed.
162− tryCompare(shellLoader, "itemDestroyed", true)
164− // kill all (fake) running apps
165− killApps()
156+ killApps();
167− AccountsService.enableLauncherWhileLocked = true
157+ AccountsService.enableLauncherWhileLocked = true;
168− AccountsService.enableIndicatorsWhileLocked = true
158+ AccountsService.enableIndicatorsWhileLocked = true;
169− AccountsService.demoEdges = false
159+ AccountsService.demoEdges = false;
170− callManager.foregroundCall = null
160+ callManager.foregroundCall = null;
171 LightDM.Greeter.authenticate(""); // reset greeter
161 LightDM.Greeter.authenticate(""); // reset greeter
173− // reload our test subject to get it in a fresh state once again
174− shellLoader.active = true
176− tryCompare(shellLoader, "status", Loader.Ready)
177− removeTimeConstraintsFromSwipeAreas(shellLoader.item)
180− function swipeAwayGreeter(waitForCoverPage) {
164+ function swipeAwayGreeter(waitForCoverPage, shell) {
181 var greeter = findChild(shell, "greeter");
165 var greeter = findChild(shell, "greeter");
182 waitForRendering(greeter)
166 waitForRendering(greeter)
183 var coverPage = findChild(shell, "coverPage");
167 var coverPage = findChild(shell, "coverPage");
@@ -198,7 +182,7 @@ Item {
198 typeString(pin);
182 typeString(pin);
201− function showGreeter() {
185+ function showGreeter(shell) {
202 LightDM.Greeter.showGreeter();
186 LightDM.Greeter.showGreeter();
203 tryCompare(shell, "waitingOnGreeter", false);
187 tryCompare(shell, "waitingOnGreeter", false);
204 var coverPage = findChild(shell, "coverPage");
188 var coverPage = findChild(shell, "coverPage");
@@ -206,7 +190,7 @@ Item {
206 removeTimeConstraintsFromSwipeAreas(shell);
190 removeTimeConstraintsFromSwipeAreas(shell);
209− function confirmLockedApp(app) {
193+ function confirmLockedApp(app, shell) {
210 var greeter = findChild(shell, "greeter")
194 var greeter = findChild(shell, "greeter")
211 tryCompare(greeter, "shown", false)
195 tryCompare(greeter, "shown", false)
212 tryCompare(greeter, "hasLockedApp", true)
196 tryCompare(greeter, "hasLockedApp", true)
@@ -218,13 +202,14 @@ Item {
218 function test_greeterChangesIndicatorProfile() {
202 function test_greeterChangesIndicatorProfile() {
219 skip("Not supported yet, waiting on design for new settings panel");
203 skip("Not supported yet, waiting on design for new settings panel");
205+ var shell = createShell();
221 var panel = findChild(shell, "panel");
206 var panel = findChild(shell, "panel");
222 tryCompare(panel.indicators.indicatorsModel, "profile", shell.indicatorProfile + "_greeter");
207 tryCompare(panel.indicators.indicatorsModel, "profile", shell.indicatorProfile + "_greeter");
224 LightDM.Greeter.hideGreeter();
209 LightDM.Greeter.hideGreeter();
225 tryCompare(panel.indicators.indicatorsModel, "profile", shell.indicatorProfile);
210 tryCompare(panel.indicators.indicatorsModel, "profile", shell.indicatorProfile);
227− showGreeter();
212+ showGreeter(shell);
228 tryCompare(panel.indicators.indicatorsModel, "profile", shell.indicatorProfile + "_greeter");
213 tryCompare(panel.indicators.indicatorsModel, "profile", shell.indicatorProfile + "_greeter");
230 LightDM.Greeter.hideGreeter();
215 LightDM.Greeter.hideGreeter();
@@ -232,6 +217,7 @@ Item {
234 function test_login() {
219 function test_login() {
220+ var shell = createShell();
235 sessionSpy.clear()
221 sessionSpy.clear()
236 tryCompare(sessionSpy, "count", 0)
222 tryCompare(sessionSpy, "count", 0)
237 enterPin("1234")
223 enterPin("1234")
@@ -239,6 +225,7 @@ Item {
241 function test_disabledEdges() {
227 function test_disabledEdges() {
228+ var shell = createShell();
242 var launcher = findChild(shell, "launcher")
229 var launcher = findChild(shell, "launcher")
243 tryCompare(launcher, "available", true)
230 tryCompare(launcher, "available", true)
244 AccountsService.enableLauncherWhileLocked = false
231 AccountsService.enableLauncherWhileLocked = false
@@ -251,6 +238,7 @@ Item {
253 function test_emergencyCall() {
240 function test_emergencyCall() {
241+ var shell = createShell();
254 var greeter = findChild(shell, "greeter")
242 var greeter = findChild(shell, "greeter")
255 var panel = findChild(shell, "panel")
243 var panel = findChild(shell, "panel")
256 var indicators = findChild(shell, "indicators")
244 var indicators = findChild(shell, "indicators")
@@ -269,7 +257,7 @@ Item {
270 // Cancel emergency mode, and go back to normal
258 // Cancel emergency mode, and go back to normal
271 waitForRendering(greeter)
259 waitForRendering(greeter)
272− showGreeter()
260+ showGreeter(shell);
274 tryCompare(greeter, "shown", true)
262 tryCompare(greeter, "shown", true)
275 tryCompare(greeter, "lockedApp", "")
263 tryCompare(greeter, "lockedApp", "")
@@ -282,7 +270,7 @@ Item {
284 function test_emergencyCallCrash() {
272 function test_emergencyCallCrash() {
285− skip("Failing on Qt 5.12 with other tests skipped");
273+ var shell = createShell();
286 var dialerSurfaceId = topLevelSurfaceList.nextId;
274 var dialerSurfaceId = topLevelSurfaceList.nextId;
287 var greeter = findChild(shell, "greeter");
275 var greeter = findChild(shell, "greeter");
288 var emergencyButton = findChild(greeter, "emergencyCallLabel");
276 var emergencyButton = findChild(greeter, "emergencyCallLabel");
@@ -298,7 +286,7 @@ Item {
300 function test_emergencyCallAppLaunch() {
288 function test_emergencyCallAppLaunch() {
301− skip("Failing on Qt 5.12");
289+ var shell = createShell();
302 var greeter = findChild(shell, "greeter");
290 var greeter = findChild(shell, "greeter");
303 var emergencyButton = findChild(greeter, "emergencyCallLabel");
291 var emergencyButton = findChild(greeter, "emergencyCallLabel");
304 tap(emergencyButton)
292 tap(emergencyButton)
@@ -309,6 +297,7 @@ Item {
311 function test_emergencyCallPausesTutorial() {
299 function test_emergencyCallPausesTutorial() {
300+ var shell = createShell();
312 var greeter = findChild(shell, "greeter");
301 var greeter = findChild(shell, "greeter");
313 var tutorial = findChild(shell, "tutorial");
302 var tutorial = findChild(shell, "tutorial");
@@ -316,15 +305,16 @@ Item {
316 enterPin("1234");
305 enterPin("1234");
317 tryCompare(tutorial, "paused", false);
306 tryCompare(tutorial, "paused", false);
319− showGreeter();
308+ showGreeter(shell);
320 verify(tutorial.paused);
309 verify(tutorial.paused);
322− swipeAwayGreeter(true);
311+ swipeAwayGreeter(true, shell);
323 tap(findChild(greeter, "emergencyCallLabel"));
312 tap(findChild(greeter, "emergencyCallLabel"));
324 verify(tutorial.paused);
313 verify(tutorial.paused);
327 function test_failedLoginsCount() {
316 function test_failedLoginsCount() {
317+ var shell = createShell();
328 AccountsService.failedLogins = 0
318 AccountsService.failedLogins = 0
330 enterPin("1111")
320 enterPin("1111")
@@ -335,6 +325,7 @@ Item {
337 function test_wrongEntries() {
327 function test_wrongEntries() {
328+ var shell = createShell();
338 var greeter = findChild(shell, "greeter");
329 var greeter = findChild(shell, "greeter");
339 greeter.failedLoginsDelayAttempts = 3;
330 greeter.failedLoginsDelayAttempts = 3;
@@ -359,14 +350,14 @@ Item {
359 // dialer to a side stage and give access to other apps. So just
350 // dialer to a side stage and give access to other apps. So just
360 // confirm that such an attack doesn't work.
351 // confirm that such an attack doesn't work.
362− skip("Failing on Qt 5.12 with other tests skipped");
353+ var shell = createShell();
363 var stage = findChild(shell, "stage")
354 var stage = findChild(shell, "stage")
365 // We start in phone mode
356 // We start in phone mode
366 compare(stage.usageScenario, "phone");
357 compare(stage.usageScenario, "phone");
368 tap(findChild(shell, "emergencyCallLabel"));
359 tap(findChild(shell, "emergencyCallLabel"));
369− confirmLockedApp("dialer-app")
360+ confirmLockedApp("dialer-app", shell);
371 // OK, we're in. Now try (but fail) to switch to tablet mode
362 // OK, we're in. Now try (but fail) to switch to tablet mode
372 shell.usageScenario = "tablet";
363 shell.usageScenario = "tablet";
@@ -380,9 +371,9 @@ Item {
382 function test_emergencyDialerIncoming() {
373 function test_emergencyDialerIncoming() {
383− skip("Failing on Qt 5.12 with other tests skipped");
374+ var shell = createShell();
384 callManager.foregroundCall = phoneCall
375 callManager.foregroundCall = phoneCall
385− confirmLockedApp("dialer-app")
376+ confirmLockedApp("dialer-app", shell);
388 function test_emergencyDialerActiveCallPanel() {
379 function test_emergencyDialerActiveCallPanel() {
@@ -392,14 +383,14 @@ Item {
392 // - Click on active call panel
383 // - Click on active call panel
393 // - Should be back in emergency mode dialer
384 // - Should be back in emergency mode dialer
395− skip("Failing on Qt 5.12");
386+ var shell = createShell();
396 var greeter = findChild(shell, "greeter");
387 var greeter = findChild(shell, "greeter");
398 tap(findChild(shell, "emergencyCallLabel"));
389 tap(findChild(shell, "emergencyCallLabel"));
399− confirmLockedApp("dialer-app");
390+ confirmLockedApp("dialer-app", shell);
400 callManager.foregroundCall = phoneCall;
391 callManager.foregroundCall = phoneCall;
402− showGreeter();
393+ showGreeter(shell);
403 var lockscreen = findChild(shell, "lockscreen");
394 var lockscreen = findChild(shell, "lockscreen");
404 tryCompare(lockscreen, "shown", true);
395 tryCompare(lockscreen, "shown", true);
405 tryCompare(greeter, "hasLockedApp", false);
396 tryCompare(greeter, "hasLockedApp", false);
@@ -407,7 +398,7 @@ Item {
407 // simulate a callHint press, the real thing requires dialer: url support
398 // simulate a callHint press, the real thing requires dialer: url support
408 ApplicationManager.requestFocusApplication("dialer-app");
399 ApplicationManager.requestFocusApplication("dialer-app");
410− confirmLockedApp("dialer-app");
401+ confirmLockedApp("dialer-app", shell);
413 function test_normalDialerActiveCallPanel() {
404 function test_normalDialerActiveCallPanel() {
@@ -419,7 +410,7 @@ Item {
419 // - Should be back in normal dialer
410 // - Should be back in normal dialer
420 // (we've had a bug where we locked screen in this case)
411 // (we've had a bug where we locked screen in this case)
422− skip("Failing on Qt 5.12");
413+ var shell = createShell();
423 startApplication("gallery-app");
414 startApplication("gallery-app");
425 var greeter = findChild(shell, "greeter");
416 var greeter = findChild(shell, "greeter");
@@ -448,8 +439,8 @@ Item {
450 function test_focusRequestedHidesCoverPage() {
441 function test_focusRequestedHidesCoverPage() {
451− skip("Failing on Qt 5.12");
442+ var shell = createShell();
452− showGreeter();
443+ showGreeter(shell);
454 startApplication("gallery-app");
445 startApplication("gallery-app");
@@ -459,7 +450,7 @@ Item {
459 tryCompare(coverPage, "showProgress", 0);
450 tryCompare(coverPage, "showProgress", 0);
460 tryCompare(greeter, "fullyShown", true);
451 tryCompare(greeter, "fullyShown", true);
462− showGreeter();
453+ showGreeter(shell);
464 // Make sure focusing same app triggers same behavior
455 // Make sure focusing same app triggers same behavior
465 ApplicationManager.requestFocusApplication("gallery-app");
456 ApplicationManager.requestFocusApplication("gallery-app");
@@ -468,6 +459,7 @@ Item {
470 function test_suspend() {
461 function test_suspend() {
462+ var shell = createShell();
471 var greeter = findChild(shell, "greeter");
463 var greeter = findChild(shell, "greeter");
472 var stage = findChild(shell, "stage")
464 var stage = findChild(shell, "stage")
@@ -482,7 +474,7 @@ Item {
482 tryCompare(greeter, "fullyShown", true);
474 tryCompare(greeter, "fullyShown", true);
484 // Swipe away greeter to focus app
476 // Swipe away greeter to focus app
485− swipeAwayGreeter(true);
477+ swipeAwayGreeter(true, shell);
487 // We have a lockscreen, make sure we're still suspended
479 // We have a lockscreen, make sure we're still suspended
488 tryCompare(stage, "suspended", true);
480 tryCompare(stage, "suspended", true);
@@ -497,14 +489,7 @@ Item {
497 loaded, they would be able to get into the session before the
489 loaded, they would be able to get into the session before the
498 lockscreen appeared. Make sure that doesn't happen. */
490 lockscreen appeared. Make sure that doesn't happen. */
499 function test_earlyDisable() {
491 function test_earlyDisable() {
500− // Kill current shell
492+ var shell = createTemporaryObject(shellComponent, shellRect);
501− shellLoader.itemDestroyed = false;
502− shellLoader.active = false;
503− tryCompare(shellLoader, "itemDestroyed", true);
506− shellLoader.active = true;
507− tryCompareFunction(function() {return shell !== null}, true);
509 // Confirm that we start disabled
494 // Confirm that we start disabled
510 compare(LightDM.Prompts.count, 0);
495 compare(LightDM.Prompts.count, 0);
@@ -520,6 +505,7 @@ Item {
522 function test_bfbOnLockedDevice() {
507 function test_bfbOnLockedDevice() {
508+ var shell = createShell();
523 var launcher = findChild(shell, "launcher");
509 var launcher = findChild(shell, "launcher");
524 touchFlick(shell, units.gu(.5), shell.height / 2, units.gu(10), shell.height / 2);
510 touchFlick(shell, units.gu(.5), shell.height / 2, units.gu(10), shell.height / 2);
@@ -541,7 +527,7 @@ Item {
541 appear over the Greeter. This was caused by logic that would normally
527 appear over the Greeter. This was caused by logic that would normally
542 cause the Launcher to be shown over the empty Background. */
528 cause the Launcher to be shown over the empty Background. */
543 function test_launcherShowCulledWhenLocked() {
529 function test_launcherShowCulledWhenLocked() {
544− skip("Failing on Qt 5.12");
530+ var shell = createShell();
545 var launcher = findChild(shell, "launcher");
531 var launcher = findChild(shell, "launcher");
547 // Ensure the Launcher is sane
533 // Ensure the Launcher is sane