From b2093aad3964fbf2fd9c3fd5b4093596d34651a4 Mon Sep 17 00:00:00 2001 From: Mikolaj Boc Date: Wed, 22 Feb 2023 09:50:54 +0100 Subject: [PATCH] Add keyboard input testcase to the QWasmWindow test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The test checks whether correct windows get correct keyboard input, having been activated with mouse clicks. Also fixes the event propagation error found. Key events would propagate to parent windows, which is something that should not happen with window managers. Change-Id: I18bae8c14cce5ccae151c2a00c84ffdba3b4587f Reviewed-by: Mikołaj Boc Reviewed-by: Piotr Wierciński --- src/plugins/platforms/wasm/qwasmwindow.cpp | 1 + tests/manual/wasm/qwasmwindow/qwasmwindow.py | 49 ++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/src/plugins/platforms/wasm/qwasmwindow.cpp b/src/plugins/platforms/wasm/qwasmwindow.cpp index 466b713b1c..4607330228 100644 --- a/src/plugins/platforms/wasm/qwasmwindow.cpp +++ b/src/plugins/platforms/wasm/qwasmwindow.cpp @@ -129,6 +129,7 @@ QWasmWindow::QWasmWindow(QWindow *w, QWasmDeadKeySupport *deadKeySupport, const auto keyCallback = std::function([this](emscripten::val event) { if (processKey(*KeyEvent::fromWebWithDeadKeyTranslation(event, m_deadKeySupport))) event.call("preventDefault"); + event.call("stopPropagation"); }); m_keyDownCallback = diff --git a/tests/manual/wasm/qwasmwindow/qwasmwindow.py b/tests/manual/wasm/qwasmwindow/qwasmwindow.py index 29186ce2f0..5eca4971ea 100644 --- a/tests/manual/wasm/qwasmwindow/qwasmwindow.py +++ b/tests/manual/wasm/qwasmwindow/qwasmwindow.py @@ -429,6 +429,55 @@ class WidgetTestCase(unittest.TestCase): self.assertEqual(w1_w1_w1.color_at(0, 0), Color(r=255, g=255, b=0)) + def test_keyboard_input(self): + screen = Screen(self._driver, ScreenPosition.FIXED, + x=0, y=0, width=800, height=800) + + bottom = Window(parent=screen, rect=Rect(x=0, y=0, width=800, height=800), title='root') + w1 = Window(parent=screen, rect=Rect(x=100, y=100, width=600, height=600), title='w1') + w1_w1 = Window(parent=w1, rect=Rect(x=100, y=100, width=400, height=400), title='w1_w1') + w1_w1_w1 = Window(parent=w1_w1, rect=Rect(x=100, y=100, width=100, height=100), title='w1_w1_w1') + Window(parent=w1_w1, rect=Rect(x=150, y=150, width=100, height=100), title='w1_w1_w2') + + w1_w1_w1.click(0, 0) + + ActionChains(self._driver).key_down('c').key_up('c').perform() + + events = w1_w1_w1.events + self.assertEqual(len(events), 2) + self.assertEqual(events[-2]['type'], 'keyPress') + self.assertEqual(events[-2]['key'], 'c') + self.assertEqual(events[-1]['type'], 'keyRelease') + self.assertEqual(events[-1]['key'], 'c') + self.assertEqual(len(w1_w1.events), 0) + self.assertEqual(len(w1.events), 0) + + w1_w1.click(0, 0) + + ActionChains(self._driver).key_down('b').key_up('b').perform() + + events = w1_w1.events + self.assertEqual(len(events), 2) + self.assertEqual(events[-2]['type'], 'keyPress') + self.assertEqual(events[-2]['key'], 'b') + self.assertEqual(events[-1]['type'], 'keyRelease') + self.assertEqual(events[-1]['key'], 'b') + self.assertEqual(len(w1_w1_w1.events), 2) + self.assertEqual(len(w1.events), 0) + + w1.click(0, 0) + + ActionChains(self._driver).key_down('a').key_up('a').perform() + + events = w1.events + self.assertEqual(len(events), 2) + self.assertEqual(events[-2]['type'], 'keyPress') + self.assertEqual(events[-2]['key'], 'a') + self.assertEqual(events[-1]['type'], 'keyRelease') + self.assertEqual(events[-1]['key'], 'a') + self.assertEqual(len(w1_w1_w1.events), 2) + self.assertEqual(len(w1_w1.events), 2) + def tearDown(self): self._driver.quit()