Changeset 153884 in webkit


Ignore:
Timestamp:
Aug 9, 2013 5:11:20 AM (11 years ago)
Author:
commit-queue@webkit.org
Message:

[Qt] QtWebKit should allow sending domain specific keycode to HTML applications
https://bugs.webkit.org/show_bug.cgi?id=118445

Patch by Arunprasad Rajkumar <arurajku@cisco.com> on 2013-08-09
Reviewed by Allan Sandfeld Jensen.

Source/WebCore:

No new test required, it is covered by QtWebKit API test.

This fix allows sending QKeyEvent::nativeVirtualKey as the DOM KeyboardEvent keyCode value instead
of Windows virtual key code. It can be enabled/disabled using "_q_useNativeVirtualKeyAsDOMKey"
dynamic property present in QWebPage.

  • platform/PlatformKeyboardEvent.h:

(WebCore::PlatformKeyboardEvent::PlatformKeyboardEvent):

  • platform/qt/PlatformKeyboardEventQt.cpp:

(WebCore::PlatformKeyboardEvent::PlatformKeyboardEvent):
(WebCore::PlatformKeyboardEvent::disambiguateKeyDownEvent):

Source/WebKit/qt:

Added API test.

  • WebCoreSupport/QWebPageAdapter.cpp:

(QWebPageAdapter::QWebPageAdapter):
(QWebPageAdapter::dynamicPropertyChangeEvent):
(QWebPageAdapter::handleKeyEvent):

  • WebCoreSupport/QWebPageAdapter.h:
  • tests/qwebpage/tst_qwebpage.cpp:

(tst_QWebPage::domainSpecificKeyEvent):

Location:
trunk/Source
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r153883 r153884  
     12013-08-09  Arunprasad Rajkumar  <arurajku@cisco.com>
     2
     3        [Qt] QtWebKit should allow sending domain specific keycode to HTML applications
     4        https://bugs.webkit.org/show_bug.cgi?id=118445
     5
     6        Reviewed by Allan Sandfeld Jensen.
     7
     8        No new test required, it is covered by QtWebKit API test.
     9
     10        This fix allows sending QKeyEvent::nativeVirtualKey as the DOM KeyboardEvent keyCode value instead
     11        of Windows virtual key code. It can be enabled/disabled using "_q_useNativeVirtualKeyAsDOMKey"
     12        dynamic property present in QWebPage.
     13
     14        * platform/PlatformKeyboardEvent.h:
     15        (WebCore::PlatformKeyboardEvent::PlatformKeyboardEvent):
     16        * platform/qt/PlatformKeyboardEventQt.cpp:
     17        (WebCore::PlatformKeyboardEvent::PlatformKeyboardEvent):
     18        (WebCore::PlatformKeyboardEvent::disambiguateKeyDownEvent):
     19
    1202013-08-09  Renata Hodovan  <reni@webkit.org>
    221
  • trunk/Source/WebCore/platform/PlatformKeyboardEvent.h

    r153483 r153884  
    8282#if PLATFORM(QT)
    8383            , m_qtEvent(0)
     84            , m_useNativeVirtualKeyAsDOMKey(false)
    8485#endif
    8586        {
     
    156157
    157158#if PLATFORM(QT)
    158         PlatformKeyboardEvent(QKeyEvent*);
     159        PlatformKeyboardEvent(QKeyEvent*, bool);
    159160        QKeyEvent* qtEvent() const { return m_qtEvent; }
    160161        uint32_t nativeModifiers() const;
     
    195196#if PLATFORM(QT)
    196197        QKeyEvent* m_qtEvent;
     198        bool m_useNativeVirtualKeyAsDOMKey;
    197199#endif
    198200    };
  • trunk/Source/WebCore/platform/qt/PlatformKeyboardEventQt.cpp

    r152961 r153884  
    815815}
    816816
    817 PlatformKeyboardEvent::PlatformKeyboardEvent(QKeyEvent* event)
     817PlatformKeyboardEvent::PlatformKeyboardEvent(QKeyEvent* event, bool useNativeVirtualKeyAsDOMKey)
    818818{
    819819    const int state = event->modifiers();
     
    830830        m_modifiers |= MetaKey;
    831831
     832    m_useNativeVirtualKeyAsDOMKey = useNativeVirtualKeyAsDOMKey;
    832833    m_text = keyTextForKeyEvent(event);
    833834    m_unmodifiedText = m_text; // FIXME: not correct
     
    836837    m_isKeypad = (state & Qt::KeypadModifier);
    837838    m_isSystemKey = false;
    838     m_windowsVirtualKeyCode = windowsKeyCodeForKeyEvent(event->key(), m_isKeypad);
    839839    m_nativeVirtualKeyCode = event->nativeVirtualKey();
     840    // If QKeyEvent::nativeVirtualKey() is valid (!=0) and useNativeVirtualKeyAsDOMKey is set,
     841    // then it is a special case desired by QtWebKit embedder to send domain specific keys
     842    // to Web Applications intented for platforms like HbbTV,CE-HTML,OIPF,..etc.
     843    if (useNativeVirtualKeyAsDOMKey && m_nativeVirtualKeyCode)
     844        m_windowsVirtualKeyCode = m_nativeVirtualKeyCode;
     845    else
     846        m_windowsVirtualKeyCode = windowsKeyCodeForKeyEvent(event->key(), m_isKeypad);
     847
    840848    m_macCharCode = 0;
    841849    m_qtEvent = event;
     
    859867            general event handling sends a key press event after this disambiguation.
    860868        */
    861         if (m_text.isEmpty() && m_windowsVirtualKeyCode && isVirtualKeyCodeRepresentingCharacter(m_windowsVirtualKeyCode))
     869        if (!m_useNativeVirtualKeyAsDOMKey && m_text.isEmpty() && m_windowsVirtualKeyCode && isVirtualKeyCodeRepresentingCharacter(m_windowsVirtualKeyCode))
    862870            m_text.append(UChar(m_windowsVirtualKeyCode));
    863871
  • trunk/Source/WebKit/qt/ChangeLog

    r153880 r153884  
     12013-08-09  Arunprasad Rajkumar  <arurajku@cisco.com>
     2
     3        [Qt] QtWebKit should allow sending domain specific keycode to HTML applications
     4        https://bugs.webkit.org/show_bug.cgi?id=118445
     5
     6        Reviewed by Allan Sandfeld Jensen.
     7
     8        Added API test.
     9
     10        * WebCoreSupport/QWebPageAdapter.cpp:
     11        (QWebPageAdapter::QWebPageAdapter):
     12        (QWebPageAdapter::dynamicPropertyChangeEvent):
     13        (QWebPageAdapter::handleKeyEvent):
     14        * WebCoreSupport/QWebPageAdapter.h:
     15        * tests/qwebpage/tst_qwebpage.cpp:
     16        (tst_QWebPage::domainSpecificKeyEvent):
     17
    1182013-08-09  Andreas Kling  <akling@apple.com>
    219
  • trunk/Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp

    r153782 r153884  
    210210    , insideOpenCall(false)
    211211    , clickCausedFocus(false)
     212    , m_useNativeVirtualKeyAsDOMKey(false)
    212213    , m_totalBytes(0)
    213214    , m_bytesReceived()
     
    839840        double interval = obj->property("_q_deadDecodedDataDeletionInterval").toDouble();
    840841        memoryCache()->setDeadDecodedDataDeletionInterval(interval);
     842    }  else if (event->propertyName() == "_q_useNativeVirtualKeyAsDOMKey") {
     843        m_useNativeVirtualKeyAsDOMKey = obj->property("_q_useNativeVirtualKeyAsDOMKey").toBool();
    841844    }
    842845}
     
    12961299{
    12971300    Frame* frame = page->focusController()->focusedOrMainFrame();
    1298     return frame->eventHandler()->keyEvent(ev);
     1301    return frame->eventHandler()->keyEvent(PlatformKeyboardEvent(ev, m_useNativeVirtualKeyAsDOMKey));
    12991302}
    13001303
  • trunk/Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.h

    r153751 r153884  
    360360
    361361    bool clickCausedFocus;
     362    bool m_useNativeVirtualKeyAsDOMKey;
    362363    quint64 m_totalBytes;
    363364    quint64 m_bytesReceived;
  • trunk/Source/WebKit/qt/tests/qwebpage/tst_qwebpage.cpp

    r153751 r153884  
    115115    void contextMenuPopulatedOnce();
    116116    void acceptNavigationRequest();
     117    void domainSpecificKeyEvent();
    117118    void geolocationRequestJS();
    118119    void loadFinished();
     
    284285}
    285286
     287void tst_QWebPage::domainSpecificKeyEvent()
     288{
     289    QWebView webView;
     290    webView.show();
     291    QTest::qWaitForWindowExposed(&webView);
     292
     293    webView.setHtml(QLatin1String("<html><head>"
     294        "<script>"
     295        "var receivedKeyArray = new Array();"
     296        "function keyEvent(e) {"
     297        "receivedKeyArray.push(e.type+':'+e.keyCode+':'+e.charCode);"
     298        "};"
     299        "window.onkeyup = keyEvent; window.onkeypress = keyEvent; window.onkeydown = keyEvent;"
     300        "</script></head><body>test</body></html>"));
     301
     302    // Enable settings to use nativeVirtualKey as DOM key value.
     303    webView.page()->setProperty("_q_useNativeVirtualKeyAsDOMKey", true);
     304    // Simulate domain specific keyevent to WebKit by passing it as nativeVirtualKey in QKeyEvent.
     305    // Qt::Key_Pause --> 0x51
     306    QKeyEvent keyEvent(QEvent::KeyPress, Qt::Key_Pause, Qt::NoModifier, 0, 81, 0);
     307    QApplication::sendEvent(&webView, &keyEvent);
     308    keyEvent = QKeyEvent(QEvent::KeyRelease, Qt::Key_Pause, Qt::NoModifier, 0, 81, 0);
     309    QApplication::sendEvent(&webView, &keyEvent);
     310    const QLatin1String expectedReceivedKeyArray1("keydown:81:0,keyup:81:0");
     311    QString receivedKeyArray = webView.page()->mainFrame()->evaluateJavaScript(QLatin1String("receivedKeyArray")).toStringList().join(",");
     312    QVERIFY(receivedKeyArray == expectedReceivedKeyArray1);
     313
     314    // Normal PC keyboard key converstion flow shouldn't be affected when sending nativeVirtual key as 0.
     315    // Qt::Key_Pause --> VK_PAUSE(0x13)
     316    webView.page()->mainFrame()->evaluateJavaScript(QLatin1String("receivedKeyArray = new Array()")); // Reset
     317    keyEvent = QKeyEvent(QEvent::KeyPress, Qt::Key_Pause, Qt::NoModifier, 0, 0, 0);
     318    QApplication::sendEvent(&webView, &keyEvent);
     319    keyEvent = QKeyEvent(QEvent::KeyRelease, Qt::Key_Pause, Qt::NoModifier, 0, 0, 0);
     320    QApplication::sendEvent(&webView, &keyEvent);
     321    const QLatin1String expectedReceivedKeyArray2("keydown:19:0,keyup:19:0");
     322    receivedKeyArray = webView.page()->mainFrame()->evaluateJavaScript(QLatin1String("receivedKeyArray")).toStringList().join(",");
     323    QVERIFY(receivedKeyArray == expectedReceivedKeyArray2);
     324
     325    // Negative case.
     326    // Disable settings to use nativeVirtualKey as DOM key value.
     327    webView.page()->setProperty("_q_useNativeVirtualKeyAsDOMKey", false);
     328    // Qt::Key_Pause --> VK_PAUSE(0x13)
     329    webView.page()->mainFrame()->evaluateJavaScript(QLatin1String("receivedKeyArray = new Array()")); // Reset
     330    keyEvent = QKeyEvent(QEvent::KeyPress, Qt::Key_Pause, Qt::NoModifier, 0, 81, 0);
     331    QApplication::sendEvent(&webView, &keyEvent);
     332    keyEvent = QKeyEvent(QEvent::KeyRelease, Qt::Key_Pause, Qt::NoModifier, 0, 81, 0);
     333    QApplication::sendEvent(&webView, &keyEvent);
     334    const QLatin1String expectedReceivedKeyArray3("keydown:19:0,keyup:19:0");
     335    receivedKeyArray = webView.page()->mainFrame()->evaluateJavaScript(QLatin1String("receivedKeyArray")).toStringList().join(",");
     336    QVERIFY(receivedKeyArray == expectedReceivedKeyArray3);
     337}
     338
    286339class JSTestPage : public QWebPage
    287340{
Note: See TracChangeset for help on using the changeset viewer.