Changeset 74243 in webkit


Ignore:
Timestamp:
Dec 17, 2010 2:51:35 AM (13 years ago)
Author:
commit-queue@webkit.org
Message:

2010-12-17 Yi Shen <yi.4.shen@nokia.com>

Reviewed by Kenneth Rohde Christiansen.

[Qt] QWebPage sends out a RequestSoftwareInputPanel event
incorrectly in particular case
https://bugs.webkit.org/show_bug.cgi?id=50419

Add HitTestResult check before firing RequestSoftwareInputPanel event.

  • Api/qwebpage.cpp: (QWebPagePrivate::mouseReleaseEvent): (QWebPagePrivate::handleSoftwareInputPanel):
  • Api/qwebpage_p.h:
  • tests/qwebpage/tst_qwebpage.cpp: (clickOnPage): (tst_QWebPage::inputMethods):
Location:
trunk/WebKit/qt
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebKit/qt/Api/qwebpage.cpp

    r73867 r74243  
    760760
    761761    handleClipboard(ev, ev->button());
    762     handleSoftwareInputPanel(ev->button());
    763 }
    764 
    765 void QWebPagePrivate::handleSoftwareInputPanel(Qt::MouseButton button)
     762    handleSoftwareInputPanel(ev->button(), QPointF(ev->pos()).toPoint());
     763}
     764
     765void QWebPagePrivate::handleSoftwareInputPanel(Qt::MouseButton button, const QPoint& pos)
    766766{
    767767    Frame* frame = page->focusController()->focusedFrame();
     
    775775            client->ownerWidget()->style()->styleHint(QStyle::SH_RequestSoftwareInputPanel));
    776776        if (!clickCausedFocus || behavior == QStyle::RSIP_OnMouseClick) {
    777             QEvent event(QEvent::RequestSoftwareInputPanel);
    778             QApplication::sendEvent(client->ownerWidget(), &event);
     777            HitTestResult result = frame->eventHandler()->hitTestResultAtPoint(frame->view()->windowToContents(pos), false);
     778            if (result.isContentEditable()) {
     779                QEvent event(QEvent::RequestSoftwareInputPanel);
     780                QApplication::sendEvent(client->ownerWidget(), &event);
     781            }
    779782        }
    780783    }
  • trunk/WebKit/qt/Api/qwebpage_p.h

    r73867 r74243  
    126126    void leaveEvent(QEvent*);
    127127    void handleClipboard(QEvent*, Qt::MouseButton);
    128     void handleSoftwareInputPanel(Qt::MouseButton);
     128    void handleSoftwareInputPanel(Qt::MouseButton, const QPoint&);
    129129    bool handleScrolling(QKeyEvent*, WebCore::Frame*);
    130130
  • trunk/WebKit/qt/ChangeLog

    r74235 r74243  
     12010-12-17  Yi Shen  <yi.4.shen@nokia.com>
     2
     3        Reviewed by Kenneth Rohde Christiansen.
     4
     5        [Qt] QWebPage sends out a RequestSoftwareInputPanel event
     6        incorrectly in particular case
     7        https://bugs.webkit.org/show_bug.cgi?id=50419
     8
     9        Add HitTestResult check before firing RequestSoftwareInputPanel event.
     10
     11        * Api/qwebpage.cpp:
     12        (QWebPagePrivate::mouseReleaseEvent):
     13        (QWebPagePrivate::handleSoftwareInputPanel):
     14        * Api/qwebpage_p.h:
     15        * tests/qwebpage/tst_qwebpage.cpp:
     16        (clickOnPage):
     17        (tst_QWebPage::inputMethods):
     18
    1192010-12-17  Eric Seidel  <eric@webkit.org>
    220
  • trunk/WebKit/qt/tests/qwebpage/tst_qwebpage.cpp

    r74173 r74243  
    13931393}
    13941394
     1395static void clickOnPage(QWebPage* page, const QPoint& position)
     1396{
     1397    QMouseEvent evpres(QEvent::MouseButtonPress, position, Qt::LeftButton, Qt::NoButton, Qt::NoModifier);
     1398    page->event(&evpres);
     1399    QMouseEvent evrel(QEvent::MouseButtonRelease, position, Qt::LeftButton, Qt::NoButton, Qt::NoModifier);
     1400    page->event(&evrel);
     1401}
     1402
    13951403void tst_QWebPage::inputMethods()
    13961404{
     
    14291437
    14301438    QWebElementCollection inputs = page->mainFrame()->documentElement().findAll("input");
    1431 
    1432     QMouseEvent evpres(QEvent::MouseButtonPress, inputs.at(0).geometry().center(), Qt::LeftButton, Qt::NoButton, Qt::NoModifier);
    1433     page->event(&evpres);
    1434     QMouseEvent evrel(QEvent::MouseButtonRelease, inputs.at(0).geometry().center(), Qt::LeftButton, Qt::NoButton, Qt::NoModifier);
    1435     page->event(&evrel);
     1439    QPoint textInputCenter = inputs.at(0).geometry().center();
     1440
     1441    clickOnPage(page, textInputCenter);
    14361442
    14371443    // This part of the test checks if the SIP (Software Input Panel) is triggered,
     
    14581464    viewEventSpy.clear();
    14591465
    1460     page->event(&evpres);
    1461     page->event(&evrel);
     1466    clickOnPage(page, textInputCenter);
    14621467    QVERIFY(viewEventSpy.contains(QEvent::RequestSoftwareInputPanel));
    14631468
     
    15611566    // Deselect the selection by sending MouseButtonPress events
    15621567    // This moves the current cursor to the end of the text
    1563     page->event(&evpres);
    1564     page->event(&evrel);
     1568    clickOnPage(page, textInputCenter);
    15651569
    15661570    {
     
    16101614    //RIGHT to LEFT selection
    16111615    //Deselect the selection (this moves the current cursor to the end of the text)
    1612     page->event(&evpres);
    1613     page->event(&evrel);
     1616    clickOnPage(page, textInputCenter);
    16141617
    16151618    //ImAnchorPosition
     
    16581661
    16591662    //ImhHiddenText
    1660     QMouseEvent evpresPassword(QEvent::MouseButtonPress, inputs.at(1).geometry().center(), Qt::LeftButton, Qt::NoButton, Qt::NoModifier);
    1661     page->event(&evpresPassword);
    1662     QMouseEvent evrelPassword(QEvent::MouseButtonRelease, inputs.at(1).geometry().center(), Qt::LeftButton, Qt::NoButton, Qt::NoModifier);
    1663     page->event(&evrelPassword);
     1663    QPoint passwordInputCenter = inputs.at(1).geometry().center();
     1664    clickOnPage(page, passwordInputCenter);
    16641665
    16651666    QVERIFY(inputMethodEnabled(view));
    16661667    QVERIFY(inputMethodHints(view) & Qt::ImhHiddenText);
    16671668
    1668     page->event(&evpres);
    1669     page->event(&evrel);
     1669    clickOnPage(page, textInputCenter);
    16701670    QVERIFY(!(inputMethodHints(view) & Qt::ImhHiddenText));
    16711671
     
    16741674
    16751675    QWebElement para = page->mainFrame()->findFirstElement("p");
    1676     {
    1677         QMouseEvent evpres(QEvent::MouseButtonPress, para.geometry().center(), Qt::LeftButton, Qt::NoButton, Qt::NoModifier);
    1678         page->event(&evpres);
    1679         QMouseEvent evrel(QEvent::MouseButtonRelease, para.geometry().center(), Qt::LeftButton, Qt::NoButton, Qt::NoModifier);
    1680         page->event(&evrel);
    1681     }
     1676    clickOnPage(page, para.geometry().center());
    16821677
    16831678    QVERIFY(!viewEventSpy.contains(QEvent::RequestSoftwareInputPanel));
     
    20052000    QCOMPARE(anchorPosition, 12);
    20062001
     2002    // Check sending RequestSoftwareInputPanel event
     2003    page->mainFrame()->setHtml("<html><body>" \
     2004                                            "<input type='text' id='input5' value='QtWebKit inputMethod'/>" \
     2005                                            "<div id='btnDiv' onclick='i=document.getElementById(&quot;input5&quot;); i.focus();'>abc</div>"\
     2006                                            "</body></html>");
     2007    QWebElement inputElement = page->mainFrame()->findFirstElement("div");
     2008    clickOnPage(page, inputElement.geometry().center());
     2009
     2010    QVERIFY(!viewEventSpy.contains(QEvent::RequestSoftwareInputPanel));
    20072011    delete container;
    20082012}
Note: See TracChangeset for help on using the changeset viewer.