⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 252441 in webkit


Ignore:
Timestamp:
Nov 13, 2019, 5:54:21 PM (7 years ago)
Author:
Fujii Hironori
Message:

[Win][DumpRenderTree][WebKitTestRunner] eventSender.keyDown should support function keys
https://bugs.webkit.org/show_bug.cgi?id=204146

Reviewed by Ross Kirsling.

Tools:

Changed eventSender.keyDown of DRT and WTR to support sending
function keys.

In addition to that, this change set correct scan code to LPARAM
for all key events. Unfortunately, there is no API to get a
correct extended scan code from a virtual key because
MapVirtualKey and MapVirtualKeyEx doesn't work as expected.
makeKeyDataForScanCode turns on KF_EXTENDED flag for some keys
explicitly for the workaround.
<http://www.setnode.com/blog/mapvirtualkey-getkeynametext-and-a-story-of-how-to/>

  • DumpRenderTree/win/EventSender.cpp:

(makeKeyDataForScanCode):
(keyDownCallback):

  • WebKitTestRunner/win/EventSenderProxyWin.cpp:

(WTR::makeKeyDataForScanCode):
(WTR::EventSenderProxy::keyDown):

LayoutTests:

  • platform/win/TestExpectations:
  • platform/wincairo/TestExpectations:

Unskipped fast/events/keydown-function-keys.html and fast/events/keydown-leftright-keys.html.

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r252439 r252441  
     12019-11-13  Fujii Hironori  <Hironori.Fujii@sony.com>
     2
     3        [Win][DumpRenderTree][WebKitTestRunner] eventSender.keyDown should support function keys
     4        https://bugs.webkit.org/show_bug.cgi?id=204146
     5
     6        Reviewed by Ross Kirsling.
     7
     8        * platform/win/TestExpectations:
     9        * platform/wincairo/TestExpectations:
     10        Unskipped fast/events/keydown-function-keys.html and fast/events/keydown-leftright-keys.html.
     11
    1122019-11-13  youenn fablet  <youenn@apple.com>
    213
  • trunk/LayoutTests/platform/win/TestExpectations

    r252406 r252441  
    233233# TODO BlodBuilder is not enabled
    234234http/tests/local/blob/send-data-blob.html [ Skip ]
    235 
    236 # TODO A test that failed because eventSender cannot send function-key events.
    237 fast/events/keydown-function-keys.html [ Skip ]
    238235
    239236# TODO No support for WebArchives in WebKitWin <rdar://problem/6436020>
     
    27872784
    27882785webkit.org/b/103043 fast/events/frame-scroll-fake-mouse-move.html [ Skip ]
    2789 webkit.org/b/97026 [ Release ] fast/events/keydown-leftright-keys.html [ Failure ]
    2790 webkit.org/b/97026 [ Debug ] fast/events/keydown-leftright-keys.html [ Skip ] # Debug Assertion
    27912786# fast/events/page-visibility tests timeout.
    27922787webkit.org/b/121509 fast/events/wheelevent-mousewheel-interaction.html [ Skip ] #  [ Timeout ]
  • trunk/LayoutTests/platform/wincairo/TestExpectations

    r252391 r252441  
    16761676fast/events/keyboardevent-code.html [ Failure ]
    16771677fast/events/keyboardevent-key.html [ Failure ]
    1678 fast/events/keydown-function-keys.html [ Failure ]
    1679 fast/events/keydown-leftright-keys.html [ Failure ]
    16801678fast/events/keydown-numpad-keys.html [ Failure ]
    16811679fast/events/mouse-cursor-image-set.html [ Failure ]
  • trunk/Tools/ChangeLog

    r252440 r252441  
     12019-11-13  Fujii Hironori  <Hironori.Fujii@sony.com>
     2
     3        [Win][DumpRenderTree][WebKitTestRunner] eventSender.keyDown should support function keys
     4        https://bugs.webkit.org/show_bug.cgi?id=204146
     5
     6        Reviewed by Ross Kirsling.
     7
     8        Changed eventSender.keyDown of DRT and WTR to support sending
     9        function keys.
     10
     11        In addition to that, this change set correct scan code to LPARAM
     12        for all key events. Unfortunately, there is no API to get a
     13        correct extended scan code from a virtual key because
     14        MapVirtualKey and MapVirtualKeyEx doesn't work as expected.
     15        makeKeyDataForScanCode turns on KF_EXTENDED flag for some keys
     16        explicitly for the workaround.
     17        <http://www.setnode.com/blog/mapvirtualkey-getkeynametext-and-a-story-of-how-to/>
     18
     19        * DumpRenderTree/win/EventSender.cpp:
     20        (makeKeyDataForScanCode):
     21        (keyDownCallback):
     22        * WebKitTestRunner/win/EventSenderProxyWin.cpp:
     23        (WTR::makeKeyDataForScanCode):
     24        (WTR::EventSenderProxy::keyDown):
     25
    1262019-11-13  Jonathan Bedard  <jbedard@apple.com>
    227
  • trunk/Tools/DumpRenderTree/win/EventSender.cpp

    r248762 r252441  
    442442}
    443443
    444 static int makeKeyDataForScanCode(int virtualKeyCode)
     444static unsigned makeKeyDataForScanCode(int virtualKeyCode)
    445445{
    446446    unsigned scancode = MapVirtualKey(virtualKeyCode, MAPVK_VK_TO_VSC);
    447447    int keyData = scancode & 0xFF;
     448
     449    bool forceExtended = false;
     450    switch (virtualKeyCode) {
     451    case VK_LEFT:
     452    case VK_UP:
     453    case VK_RIGHT:
     454    case VK_DOWN:
     455    case VK_PRIOR:
     456    case VK_NEXT:
     457    case VK_END:
     458    case VK_HOME:
     459    case VK_INSERT:
     460    case VK_DELETE:
     461    case VK_DIVIDE:
     462    case VK_NUMLOCK:
     463    case VK_RCONTROL:
     464    case VK_RMENU:
     465        // Some keys need to turn on KF_EXTENDED explicitly
     466        forceExtended = true;
     467        break;
     468    default:
     469        break;
     470    }
     471
    448472    scancode = scancode >> 8;
    449     if (scancode == 0xe0 || scancode == 0xe1)
     473    if (scancode == 0xe0 || scancode == 0xe1 || forceExtended)
    450474        keyData += KF_EXTENDED;
    451     return keyData << 16;
     475    unsigned repeat = 1;
     476    return keyData << 16 | repeat;
    452477}
    453478
     
    465490    JSStringRef character = JSValueToStringCopy(context, arguments[0], exception);
    466491    ASSERT(!*exception);
    467     int virtualKeyCode;
     492    int virtualKeyCode = 0;
    468493    int charCode = 0;
    469     int keyData = 1;
    470494    bool needsShiftKeyModifier = false;
    471     if (JSStringIsEqualToUTF8CString(character, "leftArrow")) {
     495    if (JSStringIsEqualToUTF8CString(character, "leftArrow"))
    472496        virtualKeyCode = VK_LEFT;
    473         keyData += KF_EXTENDED << 16; // In this case, extended means "not keypad".
    474     } else if (JSStringIsEqualToUTF8CString(character, "rightArrow")) {
     497    else if (JSStringIsEqualToUTF8CString(character, "rightArrow"))
    475498        virtualKeyCode = VK_RIGHT;
    476         keyData += KF_EXTENDED << 16;
    477     } else if (JSStringIsEqualToUTF8CString(character, "upArrow")) {
     499    else if (JSStringIsEqualToUTF8CString(character, "upArrow"))
    478500        virtualKeyCode = VK_UP;
    479         keyData += KF_EXTENDED << 16;
    480     } else if (JSStringIsEqualToUTF8CString(character, "downArrow")) {
     501    else if (JSStringIsEqualToUTF8CString(character, "downArrow"))
    481502        virtualKeyCode = VK_DOWN;
    482         keyData += KF_EXTENDED << 16;
    483     } else if (JSStringIsEqualToUTF8CString(character, "pageUp"))
     503    else if (JSStringIsEqualToUTF8CString(character, "pageUp"))
    484504        virtualKeyCode = VK_PRIOR;
    485505    else if (JSStringIsEqualToUTF8CString(character, "pageDown"))
     
    497517    else if (JSStringIsEqualToUTF8CString(character, "menu"))
    498518        virtualKeyCode = VK_APPS;
    499     else if (JSStringIsEqualToUTF8CString(character, "leftControl")) {
     519    else if (JSStringIsEqualToUTF8CString(character, "leftControl"))
     520        virtualKeyCode = VK_LCONTROL;
     521    else if (JSStringIsEqualToUTF8CString(character, "leftShift"))
     522        virtualKeyCode = VK_LSHIFT;
     523    else if (JSStringIsEqualToUTF8CString(character, "leftAlt"))
     524        virtualKeyCode = VK_LMENU;
     525    else if (JSStringIsEqualToUTF8CString(character, "rightControl"))
     526        virtualKeyCode = VK_RCONTROL;
     527    else if (JSStringIsEqualToUTF8CString(character, "rightShift"))
     528        virtualKeyCode = VK_RSHIFT;
     529    else if (JSStringIsEqualToUTF8CString(character, "rightAlt"))
     530        virtualKeyCode = VK_RMENU;
     531    else {
     532        size_t characterLength = JSStringGetLength(character);
     533        static const char shiftedUSCharacters[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ~!@#$%^&*()_+{}|:\"<>?";
     534        const wchar_t* characterPtr = JSStringGetCharactersPtr(character);
     535        if (characterLength == 1) {
     536            charCode = characterPtr[0];
     537            virtualKeyCode = LOBYTE(VkKeyScan(charCode));
     538            if (strchr(shiftedUSCharacters, charCode))
     539                needsShiftKeyModifier = true;
     540        } else if (characterPtr[0] == 'F') {
     541            if (characterLength == 2 && isASCIIDigit(characterPtr[1]))
     542                virtualKeyCode = VK_F1 + characterPtr[1] - '1';
     543            else if (characterLength == 3 && characterPtr[1] == '1' && isASCIIDigit(characterPtr[2]))
     544                virtualKeyCode = VK_F10 + characterPtr[2] - '0';
     545        }
     546    }
     547    JSStringRelease(character);
     548
     549    unsigned keyData = makeKeyDataForScanCode(virtualKeyCode);
     550
     551    switch (virtualKeyCode) {
     552    case VK_LCONTROL:
     553    case VK_RCONTROL:
    500554        virtualKeyCode = VK_CONTROL;
    501         keyData += makeKeyDataForScanCode(VK_LCONTROL);
    502     } else if (JSStringIsEqualToUTF8CString(character, "leftShift")) {
     555        break;
     556    case VK_LSHIFT:
     557    case VK_RSHIFT:
    503558        virtualKeyCode = VK_SHIFT;
    504         keyData += makeKeyDataForScanCode(VK_LSHIFT);
    505     } else if (JSStringIsEqualToUTF8CString(character, "leftAlt")) {
     559        break;
     560    case VK_LMENU:
     561    case VK_RMENU:
    506562        virtualKeyCode = VK_MENU;
    507         keyData += makeKeyDataForScanCode(VK_LMENU);
    508     } else if (JSStringIsEqualToUTF8CString(character, "rightControl")) {
    509         virtualKeyCode = VK_CONTROL;
    510         keyData += makeKeyDataForScanCode(VK_RCONTROL);
    511     } else if (JSStringIsEqualToUTF8CString(character, "rightShift")) {
    512         virtualKeyCode = VK_SHIFT;
    513         keyData += makeKeyDataForScanCode(VK_RSHIFT);
    514     } else if (JSStringIsEqualToUTF8CString(character, "rightAlt")) {
    515         virtualKeyCode = VK_MENU;
    516         keyData += makeKeyDataForScanCode(VK_RMENU);
    517     } else {
    518         static const char shiftedUSCharacters[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ~!@#$%^&*()_+{}|:\"<>?";
    519         charCode = JSStringGetCharactersPtr(character)[0];
    520         virtualKeyCode = LOBYTE(VkKeyScan(charCode));
    521         if (strchr(shiftedUSCharacters, charCode))
    522             needsShiftKeyModifier = true;
    523     }
    524     JSStringRelease(character);
     563        break;
     564    default:
     565        break;
     566    }
    525567
    526568    BYTE keyState[256];
  • trunk/Tools/WebKitTestRunner/win/EventSenderProxyWin.cpp

    r250279 r252441  
    153153}
    154154
    155 static int makeKeyDataForScanCode(int virtualKeyCode)
     155static unsigned makeKeyDataForScanCode(int virtualKeyCode)
    156156{
    157157    unsigned scancode = MapVirtualKey(virtualKeyCode, MAPVK_VK_TO_VSC);
    158158    int keyData = scancode & 0xFF;
     159
     160    bool forceExtended = false;
     161    switch (virtualKeyCode) {
     162    case VK_LEFT:
     163    case VK_UP:
     164    case VK_RIGHT:
     165    case VK_DOWN:
     166    case VK_PRIOR:
     167    case VK_NEXT:
     168    case VK_END:
     169    case VK_HOME:
     170    case VK_INSERT:
     171    case VK_DELETE:
     172    case VK_DIVIDE:
     173    case VK_NUMLOCK:
     174    case VK_RCONTROL:
     175    case VK_RMENU:
     176        // Some keys need to turn on KF_EXTENDED explicitly
     177        forceExtended = true;
     178        break;
     179    default:
     180        break;
     181    }
     182
    159183    scancode = scancode >> 8;
    160     if (scancode == 0xe0 || scancode == 0xe1)
     184    if (scancode == 0xe0 || scancode == 0xe1 || forceExtended)
    161185        keyData += KF_EXTENDED;
    162     return keyData << 16;
     186    unsigned repeat = 1;
     187    return keyData << 16 | repeat;
    163188}
    164189
     
    174199void EventSenderProxy::keyDown(WKStringRef keyRef, WKEventModifiers wkModifiers, unsigned location)
    175200{
    176     int virtualKeyCode;
     201    int virtualKeyCode = 0;
    177202    int charCode = 0;
    178     int keyData = 1;
     203
    179204    bool needsShiftKeyModifier = false;
    180     if (WKStringIsEqualToUTF8CString(keyRef, "leftArrow")) {
     205    if (WKStringIsEqualToUTF8CString(keyRef, "leftArrow"))
    181206        virtualKeyCode = VK_LEFT;
    182         keyData += KF_EXTENDED << 16; // In this case, extended means "not keypad".
    183     } else if (WKStringIsEqualToUTF8CString(keyRef, "rightArrow")) {
     207    else if (WKStringIsEqualToUTF8CString(keyRef, "rightArrow"))
    184208        virtualKeyCode = VK_RIGHT;
    185         keyData += KF_EXTENDED << 16;
    186     } else if (WKStringIsEqualToUTF8CString(keyRef, "upArrow")) {
     209    else if (WKStringIsEqualToUTF8CString(keyRef, "upArrow"))
    187210        virtualKeyCode = VK_UP;
    188         keyData += KF_EXTENDED << 16;
    189     } else if (WKStringIsEqualToUTF8CString(keyRef, "downArrow")) {
     211    else if (WKStringIsEqualToUTF8CString(keyRef, "downArrow"))
    190212        virtualKeyCode = VK_DOWN;
    191         keyData += KF_EXTENDED << 16;
    192     } else if (WKStringIsEqualToUTF8CString(keyRef, "pageUp"))
     213    else if (WKStringIsEqualToUTF8CString(keyRef, "pageUp"))
    193214        virtualKeyCode = VK_PRIOR;
    194215    else if (WKStringIsEqualToUTF8CString(keyRef, "pageDown"))
     
    206227    else if (WKStringIsEqualToUTF8CString(keyRef, "menu"))
    207228        virtualKeyCode = VK_APPS;
    208     else if (WKStringIsEqualToUTF8CString(keyRef, "leftControl")) {
     229    else if (WKStringIsEqualToUTF8CString(keyRef, "leftControl"))
     230        virtualKeyCode = VK_LCONTROL;
     231    else if (WKStringIsEqualToUTF8CString(keyRef, "leftShift"))
     232        virtualKeyCode = VK_LSHIFT;
     233    else if (WKStringIsEqualToUTF8CString(keyRef, "leftAlt"))
     234        virtualKeyCode = VK_LMENU;
     235    else if (WKStringIsEqualToUTF8CString(keyRef, "rightControl"))
     236        virtualKeyCode = VK_RCONTROL;
     237    else if (WKStringIsEqualToUTF8CString(keyRef, "rightShift"))
     238        virtualKeyCode = VK_RSHIFT;
     239    else if (WKStringIsEqualToUTF8CString(keyRef, "rightAlt"))
     240        virtualKeyCode = VK_RMENU;
     241    else {
     242        size_t keyLength = WKStringGetLength(keyRef);
     243        static const char shiftedUSCharacters[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ~!@#$%^&*()_+{}|:\"<>?";
     244        wchar_t keyStr[3];
     245        WKStringGetCharacters(keyRef, keyStr, _countof(keyStr));
     246        if (keyLength == 1) {
     247            charCode = keyStr[0];
     248            virtualKeyCode = LOBYTE(VkKeyScan(charCode));
     249            if (strchr(shiftedUSCharacters, charCode))
     250                needsShiftKeyModifier = true;
     251        } else if (keyStr[0] == 'F') {
     252            if (keyLength == 2 && isASCIIDigit(keyStr[1]))
     253                virtualKeyCode = VK_F1 + keyStr[1] - '1';
     254            else if (keyLength == 3 && keyStr[1] == '1' && isASCIIDigit(keyStr[2]))
     255                virtualKeyCode = VK_F10 + keyStr[2] - '0';
     256        }
     257    }
     258
     259    unsigned keyData = makeKeyDataForScanCode(virtualKeyCode);
     260
     261    switch (virtualKeyCode) {
     262    case VK_LCONTROL:
     263    case VK_RCONTROL:
    209264        virtualKeyCode = VK_CONTROL;
    210         keyData += makeKeyDataForScanCode(VK_LCONTROL);
    211     } else if (WKStringIsEqualToUTF8CString(keyRef, "leftShift")) {
     265        break;
     266    case VK_LSHIFT:
     267    case VK_RSHIFT:
    212268        virtualKeyCode = VK_SHIFT;
    213         keyData += makeKeyDataForScanCode(VK_LSHIFT);
    214     } else if (WKStringIsEqualToUTF8CString(keyRef, "leftAlt")) {
     269        break;
     270    case VK_LMENU:
     271    case VK_RMENU:
    215272        virtualKeyCode = VK_MENU;
    216         keyData += makeKeyDataForScanCode(VK_LMENU);
    217     } else if (WKStringIsEqualToUTF8CString(keyRef, "rightControl")) {
    218         virtualKeyCode = VK_CONTROL;
    219         keyData += makeKeyDataForScanCode(VK_RCONTROL);
    220     } else if (WKStringIsEqualToUTF8CString(keyRef, "rightShift")) {
    221         virtualKeyCode = VK_SHIFT;
    222         keyData += makeKeyDataForScanCode(VK_RSHIFT);
    223     } else if (WKStringIsEqualToUTF8CString(keyRef, "rightAlt")) {
    224         virtualKeyCode = VK_MENU;
    225         keyData += makeKeyDataForScanCode(VK_RMENU);
    226     } else {
    227         static const char shiftedUSCharacters[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ~!@#$%^&*()_+{}|:\"<>?";
    228         wchar_t buff[1];
    229         WKStringGetCharacters(keyRef, buff, _countof(buff));
    230         charCode = buff[0];
    231         virtualKeyCode = LOBYTE(VkKeyScan(charCode));
    232         if (strchr(shiftedUSCharacters, charCode))
    233             needsShiftKeyModifier = true;
     273        break;
     274    default:
     275        break;
    234276    }
    235277
Note: See TracChangeset for help on using the changeset viewer.