diff options
4 files changed, 18 insertions, 2 deletions
diff --git a/src/virtualkeyboard/content/components/Keyboard.qml b/src/virtualkeyboard/content/components/Keyboard.qml index c4e28284..a24fee30 100644 --- a/src/virtualkeyboard/content/components/Keyboard.qml +++ b/src/virtualkeyboard/content/components/Keyboard.qml @@ -471,7 +471,7 @@ Item { Connections { target: wordCandidateView.model ? wordCandidateView.model : null onActiveItemChanged: wordCandidateView.currentIndex = index - onItemSelected: soundEffect.play(wordCandidateView.currentItem.soundEffect) + onItemSelected: if (wordCandidateView.currentItem) soundEffect.play(wordCandidateView.currentItem.soundEffect) } Loader { sourceComponent: style.selectionListBackground diff --git a/src/virtualkeyboard/declarativeselectionlistmodel.cpp b/src/virtualkeyboard/declarativeselectionlistmodel.cpp index a124d1c1..de8599e2 100644 --- a/src/virtualkeyboard/declarativeselectionlistmodel.cpp +++ b/src/virtualkeyboard/declarativeselectionlistmodel.cpp @@ -191,7 +191,7 @@ QHash<int,QByteArray> DeclarativeSelectionListModel::roleNames() const void DeclarativeSelectionListModel::selectItem(int index) { Q_D(DeclarativeSelectionListModel); - if (d->dataSource) { + if (index >= 0 && index < d->rowCount && d->dataSource) { emit itemSelected(index); d->dataSource->selectionListItemSelected(d->type, index); } diff --git a/src/virtualkeyboard/styles/SelectionListItem.qml b/src/virtualkeyboard/styles/SelectionListItem.qml index 74447c33..e196d839 100644 --- a/src/virtualkeyboard/styles/SelectionListItem.qml +++ b/src/virtualkeyboard/styles/SelectionListItem.qml @@ -44,6 +44,8 @@ Item { anchors.fill: parent hoverEnabled: true onClicked: { + if (index === -1) + return selectionListItem.ListView.view.currentIndex = index selectionListItem.ListView.view.model.selectItem(index) } diff --git a/tests/auto/inputpanel/data/tst_inputpanel.qml b/tests/auto/inputpanel/data/tst_inputpanel.qml index 96e820b1..0385e394 100644 --- a/tests/auto/inputpanel/data/tst_inputpanel.qml +++ b/tests/auto/inputpanel/data/tst_inputpanel.qml @@ -608,6 +608,20 @@ Rectangle { compare(textInput.text, data.outputText) } + function test_selectionListSelectInvalidItem() { + prepareTest() + + // Note: This test passes if it does not crash + if (inputPanel.wordCandidateView.model) { + compare(inputPanel.wordCandidateView.count, 0) + inputPanel.wordCandidateView.model.selectItem(-2) + inputPanel.wordCandidateView.model.selectItem(-1) + inputPanel.wordCandidateView.model.selectItem(0) + inputPanel.wordCandidateView.model.selectItem(1) + inputPanel.wordCandidateView.model.selectItem(2) + } + } + function test_pinyinInputMethod_data() { return [ { initInputMethodHints: Qt.ImhNone, initLocale: "zh_CN", inputSequence: "suoer", expectedCandidates: [ "\u7D22\u5C14" ], outputText: "\u7D22\u5C14" }, |