From 968cec613c0ba5f7f95fc1034551c00f04459fd6 Mon Sep 17 00:00:00 2001 From: "commit-queue@webkit.org" Date: Wed, 24 Nov 2010 21:29:28 +0000 Subject: [PATCH] 2010-11-24 Kristian Amlie Reviewed by Andreas Kling. Fixed handling of QInputMethodEvents with nonzero replacementLength. These types of events replace text that is already in the widget, but WebKit did not check for replacementLength at all. https://bugs.webkit.org/show_bug.cgi?id=49787 * Api/qwebpage.cpp: (QWebPagePrivate::inputMethodEvent): * tests/qwebpage/tst_qwebpage.cpp: (tst_QWebPage::inputMethods): git-svn-id: http://svn.webkit.org/repository/webkit/trunk@72697 268f45cc-cd09-0410-ab3c-d52691b4dbfc --- WebKit/qt/Api/qwebpage.cpp | 8 +++++++- WebKit/qt/ChangeLog | 16 ++++++++++++++++ WebKit/qt/tests/qwebpage/tst_qwebpage.cpp | 14 ++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/WebKit/qt/Api/qwebpage.cpp b/WebKit/qt/Api/qwebpage.cpp index e00b4c64d4a5..94ed62aa78af 100644 --- a/WebKit/qt/Api/qwebpage.cpp +++ b/WebKit/qt/Api/qwebpage.cpp @@ -1080,7 +1080,13 @@ void QWebPagePrivate::inputMethodEvent(QInputMethodEvent *ev) } } - if (!ev->commitString().isEmpty()) + if (node && ev->replacementLength() > 0) { + int cursorPos = frame->selection()->extent().offsetInContainerNode(); + int start = cursorPos + ev->replacementStart(); + setSelectionRange(node, start, start + ev->replacementLength()); + // Commit regardless of whether commitString is empty, to get rid of selection. + editor->confirmComposition(ev->commitString()); + } else if (!ev->commitString().isEmpty()) editor->confirmComposition(ev->commitString()); else if (!hasSelection && !ev->preeditString().isEmpty()) editor->setComposition(ev->preeditString(), underlines, 0, 0); diff --git a/WebKit/qt/ChangeLog b/WebKit/qt/ChangeLog index 993f0e09b1da..42faf2e9ef02 100644 --- a/WebKit/qt/ChangeLog +++ b/WebKit/qt/ChangeLog @@ -1,3 +1,19 @@ +2010-11-24 Kristian Amlie + + Reviewed by Andreas Kling. + + Fixed handling of QInputMethodEvents with nonzero replacementLength. + + These types of events replace text that is already in the widget, but + WebKit did not check for replacementLength at all. + + https://bugs.webkit.org/show_bug.cgi?id=49787 + + * Api/qwebpage.cpp: + (QWebPagePrivate::inputMethodEvent): + * tests/qwebpage/tst_qwebpage.cpp: + (tst_QWebPage::inputMethods): + 2010-11-24 Andras Becsi Reviewed by Kenneth Rohde Christiansen. diff --git a/WebKit/qt/tests/qwebpage/tst_qwebpage.cpp b/WebKit/qt/tests/qwebpage/tst_qwebpage.cpp index 27a36c3320bc..c27ba022ab4e 100644 --- a/WebKit/qt/tests/qwebpage/tst_qwebpage.cpp +++ b/WebKit/qt/tests/qwebpage/tst_qwebpage.cpp @@ -1568,6 +1568,20 @@ void tst_QWebPage::inputMethods() page->event(&evpres); page->event(&evrel); + { + QList attributes; + QInputMethodEvent event(QString(), attributes); + event.setCommitString("XXX", 0, 0); + page->event(&event); + event.setCommitString(QString(), -2, 2); // Erase two characters. + page->event(&event); + event.setCommitString(QString(), -1, 1); // Erase one character. + page->event(&event); + variant = page->inputMethodQuery(Qt::ImSurroundingText); + value = variant.value(); + QCOMPARE(value, QString("QtWebKit")); + } + //Move to the start of the line page->triggerAction(QWebPage::MoveToStartOfLine); -- 2.36.0