summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/core/web_event_factory.cpp8
-rw-r--r--tests/auto/widgets/qwebengineview/tst_qwebengineview.cpp26
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"