diff options
author | Jüri Valdmann <juri.valdmann@qt.io> | 2018-07-30 12:52:00 +0200 |
---|---|---|
committer | Jüri Valdmann <juri.valdmann@qt.io> | 2018-08-27 14:30:13 +0000 |
commit | 088df145283d32d671f2c7d58193b684cc0d4e1f (patch) | |
tree | 1c6511ce82d8ebc339ef9688627d4684ef2ed4f1 | |
parent | e9e79c3f90eed42843b9fc5f7c9dfa40f4cb46a7 (diff) |
WebEventFactory: Fallback for WebKeyboardEvent::dom_code
Usually this field should be computed from the native scan code, but sometimes
we do not have a native scan code (in tests, for example). Add a fallback case
to compute this field from windows_key_code, with test.
Task-number: QTBUG-69442
Change-Id: I046094032576f4215cc8b3a6ced699a86ea148a9
Reviewed-by: Kai Koehne <kai.koehne@qt.io>
-rw-r--r-- | src/core/web_event_factory.cpp | 8 | ||||
-rw-r--r-- | tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp | 26 |
2 files changed, 33 insertions, 1 deletions
diff --git a/src/core/web_event_factory.cpp b/src/core/web_event_factory.cpp index 36860e2db..e20ad9da6 100644 --- a/src/core/web_event_factory.cpp +++ b/src/core/web_event_factory.cpp @@ -69,6 +69,7 @@ #include "ui/events/keycodes/dom/dom_code.h" #include "ui/events/keycodes/dom/dom_key.h" #include "ui/events/keycodes/dom/keycode_converter.h" +#include "ui/events/keycodes/keyboard_code_conversion.h" #include <QtGui/private/qtgui-config_p.h> @@ -1463,10 +1464,15 @@ content::NativeWebKeyboardEvent WebEventFactory::toWebKeyboardEvent(QKeyEvent *e // that was pressed. Physical meaning independent of layout and modifiers. // // Since this information is not available from QKeyEvent in portable form, - // we try to compute it from the native key code. + // we try to compute it from the native key code. If there's no native key + // code available either, then we assume a US layout and convert it from + // windows_key_code. The result will be incorrect on non-US layouts. if (webKitEvent.native_key_code) webKitEvent.dom_code = static_cast<int>( ui::KeycodeConverter::NativeKeycodeToDomCode(webKitEvent.native_key_code)); + else + webKitEvent.dom_code = static_cast<int>( + ui::UsLayoutKeyboardCodeToDomCode(static_cast<ui::KeyboardCode>(webKitEvent.windows_key_code))); const ushort* text = ev->text().utf16(); memcpy(&webKitEvent.text, text, std::min(sizeof(webKitEvent.text), size_t(ev->text().length() * 2))); diff --git a/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp b/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp index d01a5365f..5f30fa6b9 100644 --- a/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp +++ b/tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp @@ -187,6 +187,7 @@ private Q_SLOTS: void webUIURLs_data(); void webUIURLs(); void visibilityState(); + void jsKeyboardEvent(); }; // This will be called before the first test function is executed. @@ -2767,5 +2768,30 @@ void tst_QWebEngineView::visibilityState() QCOMPARE(evaluateJavaScriptSync(view.page(), "document.visibilityState").toString(), QStringLiteral("visible")); } +void tst_QWebEngineView::jsKeyboardEvent() +{ + QWebEngineView view; + evaluateJavaScriptSync( + view.page(), + "var log = '';" + "addEventListener('keydown', (ev) => {" + " log += [ev.keyCode, ev.code, ev.key, ev.ctrlKey, ev.shiftKey, ev.altKey].join(',') + ';';" + "});"); + // Note that this only tests the fallback code path where native scan codes are not used. +#if defined(Q_OS_MACOS) + // See Qt::AA_MacDontSwapCtrlAndMeta + QTest::keyClick(view.focusProxy(), 'A', Qt::MetaModifier | Qt::ShiftModifier); +#else + QTest::keyClick(view.focusProxy(), 'A', Qt::ControlModifier | Qt::ShiftModifier); +#endif + QString expected = QStringLiteral( + "16,ShiftLeft,Shift,false,true,false;" + "17,ControlLeft,Control,true,true,false;" + "65,KeyA,A,true,true,false;" + ); + QTRY_VERIFY(evaluateJavaScriptSync(view.page(), "log") != QVariant(QString())); + QCOMPARE(evaluateJavaScriptSync(view.page(), "log"), expected); +} + QTEST_MAIN(tst_QWebEngineView) #include "tst_qwebengineview.moc" |