Bug 204672 - [Win] 'key' property of keydown KeyboardEvent doesn't have the diacritic for alphabet key following a dead key
Summary: [Win] 'key' property of keydown KeyboardEvent doesn't have the diacritic for ...
Status: NEW
Alias: None
Product: WebKit
Classification: Unclassified
Component: Platform (show other bugs)
Version: WebKit Nightly Build
Hardware: Unspecified Unspecified
: P2 Normal
Assignee: Nobody
URL:
Keywords:
Depends on: 204694
Blocks:
  Show dependency treegraph
 
Reported: 2019-11-28 03:08 PST by Fujii Hironori
Modified: 2019-11-28 23:57 PST (History)
0 users

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Fujii Hironori 2019-11-28 03:08:47 PST
[Win] 'key' property of keydown KeyboardEvent doesn't have the diacritic for alphabet key following a dead key

1. Switch the Windows keyboard layout to German
2. Start MiniBrowser
3. Open https://bug-202183-attachments.webkit.org/attachment.cgi?id=380407
4. typing [^] and [a] keys

Windows port is showing:

type:keydown key:Dead code:Equal
type:keyup key:Dead code:Equal
type:keydown key:a code:KeyA ★
type:keypress key:á code:KeyA
type:keyup key:a code:KeyA

On the other hand, Chrome and Firefox

type:keydown key:Dead code:Equal
type:keyup key:Dead code:Equal
type:keydown key:á code:KeyA ★
type:keypress key:á code:KeyA
type:keyup key:a code:KeyA
Comment 1 Fujii Hironori 2019-11-28 03:10:21 PST
In Chromium, InputMethodWinBase::DispatchKeyEvent retrieves queued WM_CHAR events, and sets a char information from WM_CHAR to the keydown event.

>  std::vector<MSG> char_msgs;
>  // Combines the WM_KEY* and WM_CHAR messages in the event processing flow
>  // which is necessary to let Chrome IME extension to process the key event
>  // and perform corresponding IME actions.
>  // Chrome IME extension may wants to consume certain key events based on
>  // the character information of WM_CHAR messages. Holding WM_KEY* messages
>  // until WM_CHAR is processed by the IME extension is not feasible because
>  // there is no way to know whether there will or not be a WM_CHAR following
>  // the WM_KEY*.
>  // Chrome never handles dead chars so it is safe to remove/ignore
>  // WM_*DEADCHAR messages.
>  MSG msg;
>  while (::PeekMessage(&msg, native_key_event.hwnd, WM_CHAR, WM_DEADCHAR,
>                       PM_REMOVE)) {
>    if (msg.message == WM_CHAR)
>      char_msgs.push_back(msg);
>  }
>  while (::PeekMessage(&msg, native_key_event.hwnd, WM_SYSCHAR, WM_SYSDEADCHAR,
>                       PM_REMOVE)) {
>    if (msg.message == WM_SYSCHAR)
>      char_msgs.push_back(msg);
>  }
(...)
>  // If only 1 WM_CHAR per the key event, set it as the character of it.
>  if (char_msgs.size() == 1 &&
>      !std::iswcntrl(static_cast<wint_t>(char_msgs[0].wParam)))
>    event->set_character(static_cast<base::char16>(char_msgs[0].wParam));

https://cs.chromium.org/chromium/src/ui/base/ime/win/input_method_win_base.cc?type=cs&q=InputMethodWinBase::DispatchKeyEvent&sq=package:chromium&g=0&l=193