feat: expose location and modifiers on before-input-event (#29850)

* feat: expose location and modifiers on before-input-event

* lint
This commit is contained in:
Jeremy Rose 2021-07-14 04:50:02 -07:00 коммит произвёл GitHub
Родитель 1897b14af3
Коммит 4d0475c9ce
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
4 изменённых файлов: 84 добавлений и 19 удалений

Просмотреть файл

@ -449,6 +449,8 @@ Returns:
* `control` Boolean - Equivalent to [KeyboardEvent.controlKey][keyboardevent].
* `alt` Boolean - Equivalent to [KeyboardEvent.altKey][keyboardevent].
* `meta` Boolean - Equivalent to [KeyboardEvent.metaKey][keyboardevent].
* `location` Number - Equivalent to [KeyboardEvent.location][keyboardevent].
* `modifiers` String[] - See [InputEvent.modifiers](structures/input-event.md).
Emitted before dispatching the `keydown` and `keyup` events in the page.
Calling `event.preventDefault` will prevent the page `keydown`/`keyup` events

Просмотреть файл

@ -144,10 +144,44 @@ struct Converter<blink::WebInputEvent::Modifiers> {
*out = blink::WebInputEvent::Modifiers::kIsLeft;
else if (modifier == "right")
*out = blink::WebInputEvent::Modifiers::kIsRight;
// TODO(nornagon): the rest of the modifiers
return true;
}
};
std::vector<std::string> ModifiersToArray(int modifiers) {
using Modifiers = blink::WebInputEvent::Modifiers;
std::vector<std::string> modifier_strings;
if (modifiers & Modifiers::kShiftKey)
modifier_strings.push_back("shift");
if (modifiers & Modifiers::kControlKey)
modifier_strings.push_back("control");
if (modifiers & Modifiers::kAltKey)
modifier_strings.push_back("alt");
if (modifiers & Modifiers::kMetaKey)
modifier_strings.push_back("meta");
if (modifiers & Modifiers::kIsKeyPad)
modifier_strings.push_back("iskeypad");
if (modifiers & Modifiers::kIsAutoRepeat)
modifier_strings.push_back("isautorepeat");
if (modifiers & Modifiers::kLeftButtonDown)
modifier_strings.push_back("leftbuttondown");
if (modifiers & Modifiers::kMiddleButtonDown)
modifier_strings.push_back("middlebuttondown");
if (modifiers & Modifiers::kRightButtonDown)
modifier_strings.push_back("rightbuttondown");
if (modifiers & Modifiers::kCapsLockOn)
modifier_strings.push_back("capslock");
if (modifiers & Modifiers::kNumLockOn)
modifier_strings.push_back("numlock");
if (modifiers & Modifiers::kIsLeft)
modifier_strings.push_back("left");
if (modifiers & Modifiers::kIsRight)
modifier_strings.push_back("right");
// TODO(nornagon): the rest of the modifiers
return modifier_strings;
}
blink::WebInputEvent::Type GetWebInputEventType(v8::Isolate* isolate,
v8::Local<v8::Value> val) {
blink::WebInputEvent::Type type = blink::WebInputEvent::Type::kUndefined;
@ -219,6 +253,51 @@ bool Converter<blink::WebKeyboardEvent>::FromV8(v8::Isolate* isolate,
return true;
}
int GetKeyLocationCode(const blink::WebInputEvent& key) {
// https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/events/keyboard_event.h;l=46;drc=1ff6437e65b183e673b7b4f25060b74dc2ba5c37
enum KeyLocationCode {
kDomKeyLocationStandard = 0x00,
kDomKeyLocationLeft = 0x01,
kDomKeyLocationRight = 0x02,
kDomKeyLocationNumpad = 0x03
};
using Modifiers = blink::WebInputEvent::Modifiers;
if (key.GetModifiers() & Modifiers::kIsKeyPad)
return kDomKeyLocationNumpad;
if (key.GetModifiers() & Modifiers::kIsLeft)
return kDomKeyLocationLeft;
if (key.GetModifiers() & Modifiers::kIsRight)
return kDomKeyLocationRight;
return kDomKeyLocationStandard;
}
v8::Local<v8::Value> Converter<blink::WebKeyboardEvent>::ToV8(
v8::Isolate* isolate,
const blink::WebKeyboardEvent& in) {
gin_helper::Dictionary dict = gin::Dictionary::CreateEmpty(isolate);
if (in.GetType() == blink::WebInputEvent::Type::kRawKeyDown)
dict.Set("type", "keyDown");
else if (in.GetType() == blink::WebInputEvent::Type::kKeyUp)
dict.Set("type", "keyUp");
dict.Set("key", ui::KeycodeConverter::DomKeyToKeyString(in.dom_key));
dict.Set("code", ui::KeycodeConverter::DomCodeToCodeString(
static_cast<ui::DomCode>(in.dom_code)));
using Modifiers = blink::WebInputEvent::Modifiers;
dict.Set("isAutoRepeat", (in.GetModifiers() & Modifiers::kIsAutoRepeat) != 0);
dict.Set("isComposing", (in.GetModifiers() & Modifiers::kIsComposing) != 0);
dict.Set("shift", (in.GetModifiers() & Modifiers::kShiftKey) != 0);
dict.Set("control", (in.GetModifiers() & Modifiers::kControlKey) != 0);
dict.Set("alt", (in.GetModifiers() & Modifiers::kAltKey) != 0);
dict.Set("meta", (in.GetModifiers() & Modifiers::kMetaKey) != 0);
dict.Set("location", GetKeyLocationCode(in));
dict.Set("_modifiers", in.GetModifiers());
dict.Set("modifiers", ModifiersToArray(in.GetModifiers()));
return dict.GetHandle();
}
bool Converter<blink::WebMouseEvent>::FromV8(v8::Isolate* isolate,
v8::Local<v8::Value> val,
blink::WebMouseEvent* out) {

Просмотреть файл

@ -36,6 +36,8 @@ struct Converter<blink::WebKeyboardEvent> {
static bool FromV8(v8::Isolate* isolate,
v8::Local<v8::Value> val,
blink::WebKeyboardEvent* out);
static v8::Local<v8::Value> ToV8(v8::Isolate* isolate,
const blink::WebKeyboardEvent& in);
};
template <>

Просмотреть файл

@ -303,25 +303,7 @@ bool Converter<content::NativeWebKeyboardEvent>::FromV8(
v8::Local<v8::Value> Converter<content::NativeWebKeyboardEvent>::ToV8(
v8::Isolate* isolate,
const content::NativeWebKeyboardEvent& in) {
gin_helper::Dictionary dict = gin::Dictionary::CreateEmpty(isolate);
if (in.GetType() == blink::WebInputEvent::Type::kRawKeyDown)
dict.Set("type", "keyDown");
else if (in.GetType() == blink::WebInputEvent::Type::kKeyUp)
dict.Set("type", "keyUp");
dict.Set("key", ui::KeycodeConverter::DomKeyToKeyString(in.dom_key));
dict.Set("code", ui::KeycodeConverter::DomCodeToCodeString(
static_cast<ui::DomCode>(in.dom_code)));
using Modifiers = blink::WebInputEvent::Modifiers;
dict.Set("isAutoRepeat", (in.GetModifiers() & Modifiers::kIsAutoRepeat) != 0);
dict.Set("isComposing", (in.GetModifiers() & Modifiers::kIsComposing) != 0);
dict.Set("shift", (in.GetModifiers() & Modifiers::kShiftKey) != 0);
dict.Set("control", (in.GetModifiers() & Modifiers::kControlKey) != 0);
dict.Set("alt", (in.GetModifiers() & Modifiers::kAltKey) != 0);
dict.Set("meta", (in.GetModifiers() & Modifiers::kMetaKey) != 0);
return dict.GetHandle();
return ConvertToV8(isolate, static_cast<blink::WebKeyboardEvent>(in));
}
} // namespace gin