diff --git a/tests/test_link.py b/tests/test_link.py index 2ceb1e1..b16d0d1 100644 --- a/tests/test_link.py +++ b/tests/test_link.py @@ -491,6 +491,9 @@ class Connecting(unittest.TestCase): finally: for e in release.values(): e.set() + for t in tests: + if t.ident: # started + t.join(10) result = self.link.snapshot()["tests"][d["id"]] self.assertTrue(result["done"]) self.assertEqual(result["rows"][0]["detail"], "test 2") diff --git a/ui/index.html b/ui/index.html index a11b031..8375257 100644 --- a/ui/index.html +++ b/ui/index.html @@ -1470,13 +1470,16 @@ let toastTimer; function toast(msg, err = false) { const el = $("toast"); el.textContent = msg.split("\n").slice(-1)[0] || msg; - el.className = "toast show" + (err ? " err" : ""); // A popover, so it shows above an open dialog (a modal one covers everything else): opened - // again when a dialog has opened since, which puts it back on top. + // again when a dialog has opened since, which puts it back on top. Opened hidden first, so + // it still fades in. if (el.showPopover && (!el.matches(":popover-open") || document.querySelector("dialog:modal"))) { + el.className = "toast" + (err ? " err" : ""); try { el.hidePopover(); } catch {} el.showPopover(); + void el.offsetWidth; // the hidden style is in place before .show changes it } + el.className = "toast show" + (err ? " err" : ""); clearTimeout(toastTimer); toastTimer = setTimeout(() => el.className = "toast" + (err ? " err" : ""), 3500); }