From 2143657e0331df9ef8fdedd7b653aca763e0539c Mon Sep 17 00:00:00 2001 From: Pyfisch Date: Sun, 11 Nov 2018 21:57:45 +0100 Subject: [PATCH] Use keyboard-types::webdriver::send_keys This improves the quality of KeyboardEvents sent by WebDriver. Now key, code, location and modifiers are set according to spec. CompositionEvents are discarded as servo does not handle them at all. --- Cargo.lock | 23 +++--- components/compositing/Cargo.toml | 2 +- components/constellation/Cargo.toml | 2 +- components/embedder_traits/Cargo.toml | 2 +- components/malloc_size_of/Cargo.toml | 2 +- components/script/Cargo.toml | 2 +- components/script_traits/Cargo.toml | 2 +- components/webdriver_server/Cargo.toml | 2 +- components/webdriver_server/keys.rs | 106 ------------------------- components/webdriver_server/lib.rs | 13 ++- ports/servo/Cargo.toml | 2 +- tests/unit/script/Cargo.toml | 2 +- 12 files changed, 30 insertions(+), 130 deletions(-) delete mode 100644 components/webdriver_server/keys.rs diff --git a/Cargo.lock b/Cargo.lock index b1e23405138c..35f998defa3d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -512,7 +512,7 @@ dependencies = [ "gleam 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "image 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", "ipc-channel 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)", - "keyboard-types 0.4.2-servo (registry+https://github.com/rust-lang/crates.io-index)", + "keyboard-types 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "msg 0.0.1", @@ -549,7 +549,7 @@ dependencies = [ "gfx_traits 0.0.1", "http 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", "ipc-channel 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)", - "keyboard-types 0.4.2-servo (registry+https://github.com/rust-lang/crates.io-index)", + "keyboard-types 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "layout_traits 0.0.1", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "metrics 0.0.1", @@ -943,7 +943,7 @@ name = "embedder_traits" version = "0.0.1" dependencies = [ "ipc-channel 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)", - "keyboard-types 0.4.2-servo (registry+https://github.com/rust-lang/crates.io-index)", + "keyboard-types 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "msg 0.0.1", @@ -1898,11 +1898,12 @@ dependencies = [ [[package]] name = "keyboard-types" -version = "0.4.2-servo" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-segmentation 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2210,7 +2211,7 @@ dependencies = [ "hashglobe 0.1.0", "hyper 0.12.12 (registry+https://github.com/rust-lang/crates.io-index)", "hyper_serde 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "keyboard-types 0.4.2-servo (registry+https://github.com/rust-lang/crates.io-index)", + "keyboard-types 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "mozjs 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", "selectors 0.20.0", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3200,7 +3201,7 @@ dependencies = [ "ipc-channel 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)", "jstraceable_derive 0.0.1", - "keyboard-types 0.4.2-servo (registry+https://github.com/rust-lang/crates.io-index)", + "keyboard-types 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3304,7 +3305,7 @@ name = "script_tests" version = "0.0.1" dependencies = [ "euclid 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", - "keyboard-types 0.4.2-servo (registry+https://github.com/rust-lang/crates.io-index)", + "keyboard-types 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "script 0.0.1", "servo_url 0.0.1", ] @@ -3324,7 +3325,7 @@ dependencies = [ "hyper 0.12.12 (registry+https://github.com/rust-lang/crates.io-index)", "hyper_serde 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "ipc-channel 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)", - "keyboard-types 0.4.2-servo (registry+https://github.com/rust-lang/crates.io-index)", + "keyboard-types 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", "malloc_size_of 0.0.1", "malloc_size_of_derive 0.0.1", @@ -3408,7 +3409,7 @@ dependencies = [ "gdi32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "gleam 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "glutin 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", - "keyboard-types 0.4.2-servo (registry+https://github.com/rust-lang/crates.io-index)", + "keyboard-types 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "libservo 0.0.1", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4457,7 +4458,7 @@ dependencies = [ "hyper 0.12.12 (registry+https://github.com/rust-lang/crates.io-index)", "image 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", "ipc-channel 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)", - "keyboard-types 0.4.2-servo (registry+https://github.com/rust-lang/crates.io-index)", + "keyboard-types 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "msg 0.0.1", "net_traits 0.0.1", @@ -4902,7 +4903,7 @@ dependencies = [ "checksum jni-sys 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" "checksum jpeg-decoder 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "0dfe27a6c0dabd772d0f9b9f8701c4ca12c4d1eebcadf2be1f6f70396f6a1434" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" -"checksum keyboard-types 0.4.2-servo (registry+https://github.com/rust-lang/crates.io-index)" = "75082c134a78e0fc2232d2f30bf3dfdea1cd28591846b85a73b4b46cd776b482" +"checksum keyboard-types 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "823bf0e5ec01b80424a318e79a0d1375725281acf311c47543ab3413f704dc25" "checksum khronos_api 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d9ef23fcc4059260c5936f638c9805ebfc87cb172fa6661d130cba7f97d58f55" "checksum lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c8f31047daa365f19be14b47c29df4f7c3b581832407daabe6ae77397619237d" "checksum lazycell 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d33a48d0365c96081958cc663eef834975cb1e8d8bea3378513fc72bdbf11e50" diff --git a/components/compositing/Cargo.toml b/components/compositing/Cargo.toml index ed991671c9f6..54b665ea0f16 100644 --- a/components/compositing/Cargo.toml +++ b/components/compositing/Cargo.toml @@ -22,7 +22,7 @@ gleam = {version = "0.6", optional = true} image = "0.19" ipc-channel = "0.11" libc = "0.2" -keyboard-types = {version = "0.4.2-servo", features = ["serde"]} +keyboard-types = "0.4.3" log = "0.4" msg = {path = "../msg"} net_traits = {path = "../net_traits"} diff --git a/components/constellation/Cargo.toml b/components/constellation/Cargo.toml index 1e57a10e6f28..9af85bd5939a 100644 --- a/components/constellation/Cargo.toml +++ b/components/constellation/Cargo.toml @@ -26,7 +26,7 @@ gfx_traits = {path = "../gfx_traits"} http = "0.1" ipc-channel = "0.11" layout_traits = {path = "../layout_traits"} -keyboard-types = {version = "0.4.2-servo", features = ["serde"]} +keyboard-types = "0.4.3" log = "0.4" metrics = {path = "../metrics"} msg = {path = "../msg"} diff --git a/components/embedder_traits/Cargo.toml b/components/embedder_traits/Cargo.toml index 68f2917e2c2d..6d9fef7f8e06 100644 --- a/components/embedder_traits/Cargo.toml +++ b/components/embedder_traits/Cargo.toml @@ -12,7 +12,7 @@ path = "lib.rs" [dependencies] ipc-channel = "0.11" -keyboard-types = {version = "0.4.2-servo", features = ["serde"]} +keyboard-types = "0.4.3" lazy_static = "1" log = "0.4" msg = {path = "../msg"} diff --git a/components/malloc_size_of/Cargo.toml b/components/malloc_size_of/Cargo.toml index 252185fd0c66..2b62d7180eb2 100644 --- a/components/malloc_size_of/Cargo.toml +++ b/components/malloc_size_of/Cargo.toml @@ -31,7 +31,7 @@ euclid = "0.19" hashglobe = { path = "../hashglobe" } hyper = { version = "0.12", optional = true } hyper_serde = { version = "0.9", optional = true } -keyboard-types = {version = "0.4.2-servo", features = ["serde"], optional = true} +keyboard-types = {version = "0.4.3", optional = true} mozjs = { version = "0.9.3", optional = true } selectors = { path = "../selectors" } serde = { version = "1.0.27", optional = true } diff --git a/components/script/Cargo.toml b/components/script/Cargo.toml index 8b5a03991414..a862caadc598 100644 --- a/components/script/Cargo.toml +++ b/components/script/Cargo.toml @@ -65,7 +65,7 @@ ipc-channel = "0.11" itertools = "0.7.6" js = {package = "mozjs", version = "0.9.3"} jstraceable_derive = {path = "../jstraceable_derive"} -keyboard-types = {version = "0.4.2-servo", features = ["serde"]} +keyboard-types = "0.4.3" lazy_static = "1" libc = "0.2" log = "0.4" diff --git a/components/script_traits/Cargo.toml b/components/script_traits/Cargo.toml index 3b8430e4922c..3faaeec0de9c 100644 --- a/components/script_traits/Cargo.toml +++ b/components/script_traits/Cargo.toml @@ -22,7 +22,7 @@ http = "0.1" hyper = "0.12" hyper_serde = "0.9" ipc-channel = "0.11" -keyboard-types = {version = "0.4.2-servo", features = ["serde"]} +keyboard-types = "0.4.3" libc = "0.2" malloc_size_of = { path = "../malloc_size_of" } malloc_size_of_derive = { path = "../malloc_size_of_derive" } diff --git a/components/webdriver_server/Cargo.toml b/components/webdriver_server/Cargo.toml index d3ccfcc05dc0..b3b2c178812d 100644 --- a/components/webdriver_server/Cargo.toml +++ b/components/webdriver_server/Cargo.toml @@ -17,7 +17,7 @@ euclid = "0.19" hyper = "0.12" image = "0.19" ipc-channel = "0.11" -keyboard-types = {version = "0.4.2-servo", features = ["serde"]} +keyboard-types = "0.4.3" log = "0.4" msg = {path = "../msg"} net_traits = {path = "../net_traits"} diff --git a/components/webdriver_server/keys.rs b/components/webdriver_server/keys.rs deleted file mode 100644 index 212a3b56815d..000000000000 --- a/components/webdriver_server/keys.rs +++ /dev/null @@ -1,106 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -use keyboard_types::{Key, KeyboardEvent}; - -// spec: https://w3c.github.io/webdriver/#keyboard-actions -// normalised (sic) as in british spelling -fn get_normalised_key_value(key: char) -> Key { - match key { - '\u{E000}' => Key::Unidentified, - '\u{E001}' => Key::Cancel, - '\u{E002}' => Key::Help, - '\u{E003}' => Key::Backspace, - '\u{E004}' => Key::Tab, - '\u{E005}' => Key::Clear, - // FIXME(pyfisch): spec says "Return" - '\u{E006}' => Key::Enter, - '\u{E007}' => Key::Enter, - '\u{E008}' => Key::Shift, - '\u{E009}' => Key::Control, - '\u{E00A}' => Key::Alt, - '\u{E00B}' => Key::Pause, - '\u{E00C}' => Key::Escape, - '\u{E00D}' => Key::Character(" ".to_string()), - '\u{E00E}' => Key::PageUp, - '\u{E00F}' => Key::PageDown, - '\u{E010}' => Key::End, - '\u{E011}' => Key::Home, - '\u{E012}' => Key::ArrowLeft, - '\u{E013}' => Key::ArrowUp, - '\u{E014}' => Key::ArrowRight, - '\u{E015}' => Key::ArrowDown, - '\u{E016}' => Key::Insert, - '\u{E017}' => Key::Delete, - '\u{E018}' => Key::Character(";".to_string()), - '\u{E019}' => Key::Character("=".to_string()), - '\u{E01A}' => Key::Character("0".to_string()), - '\u{E01B}' => Key::Character("1".to_string()), - '\u{E01C}' => Key::Character("2".to_string()), - '\u{E01D}' => Key::Character("3".to_string()), - '\u{E01E}' => Key::Character("4".to_string()), - '\u{E01F}' => Key::Character("5".to_string()), - '\u{E020}' => Key::Character("6".to_string()), - '\u{E021}' => Key::Character("7".to_string()), - '\u{E022}' => Key::Character("8".to_string()), - '\u{E023}' => Key::Character("9".to_string()), - '\u{E024}' => Key::Character("*".to_string()), - '\u{E025}' => Key::Character("+".to_string()), - '\u{E026}' => Key::Character(",".to_string()), - '\u{E027}' => Key::Character("-".to_string()), - '\u{E028}' => Key::Character(".".to_string()), - '\u{E029}' => Key::Character("/".to_string()), - '\u{E031}' => Key::F1, - '\u{E032}' => Key::F2, - '\u{E033}' => Key::F3, - '\u{E034}' => Key::F4, - '\u{E035}' => Key::F5, - '\u{E036}' => Key::F6, - '\u{E037}' => Key::F7, - '\u{E038}' => Key::F8, - '\u{E039}' => Key::F9, - '\u{E03A}' => Key::F10, - '\u{E03B}' => Key::F11, - '\u{E03C}' => Key::F12, - '\u{E03D}' => Key::Meta, - '\u{E040}' => Key::ZenkakuHankaku, - '\u{E050}' => Key::Shift, - '\u{E051}' => Key::Control, - '\u{E052}' => Key::Alt, - '\u{E053}' => Key::Meta, - '\u{E054}' => Key::PageUp, - '\u{E055}' => Key::PageDown, - '\u{E056}' => Key::End, - '\u{E057}' => Key::Home, - '\u{E058}' => Key::ArrowLeft, - '\u{E059}' => Key::ArrowUp, - '\u{E05A}' => Key::ArrowRight, - '\u{E05B}' => Key::ArrowDown, - '\u{E05C}' => Key::Insert, - '\u{E05D}' => Key::Delete, - _ => Key::Character(key.to_string()), - } -} - -pub fn keycodes_to_keys(key_codes: &str) -> Vec { - let mut rv = vec![]; - - for char_code in key_codes.chars() { - // TODO(pyfisch): compute code, location, modifiers according to spec - let key = get_normalised_key_value(char_code); - let mut event = KeyboardEvent { - state: ::keyboard_types::KeyState::Down, - key, - code: ::keyboard_types::Code::Unidentified, - location: ::keyboard_types::Location::Standard, - modifiers: ::keyboard_types::Modifiers::empty(), - repeat: false, - is_composing: false, - }; - rv.push(event.clone()); - event.state = ::keyboard_types::KeyState::Up; - rv.push(event); - } - rv -} diff --git a/components/webdriver_server/lib.rs b/components/webdriver_server/lib.rs index 7e9de23b66ce..347c53151008 100644 --- a/components/webdriver_server/lib.rs +++ b/components/webdriver_server/lib.rs @@ -11,14 +11,12 @@ extern crate log; #[macro_use] extern crate serde; -mod keys; - use base64; -use crate::keys::keycodes_to_keys; use euclid::TypedSize2D; use hyper::Method; use image::{DynamicImage, ImageFormat, RgbImage}; use ipc_channel::ipc::{self, IpcReceiver, IpcSender}; +use keyboard_types::webdriver::{send_keys, Event as KeyEvent}; use msg::constellation_msg::{BrowsingContextId, TopLevelBrowsingContextId, TraversalDirection}; use net_traits::image::base::PixelFormat; use regex::Captures; @@ -1038,7 +1036,14 @@ impl Handler { )) })?; - let keys = keycodes_to_keys(&keys.text); + // FIXME: Don't discard composition events. + let keys = send_keys(&keys.text) + .drain(..) + .filter_map(|event| match event { + KeyEvent::Keyboard(v) => Some(v), + _ => None, + }) + .collect(); // TODO: there's a race condition caused by the focus command and the // send keys command being two separate messages, diff --git a/ports/servo/Cargo.toml b/ports/servo/Cargo.toml index 35d55e2ebe73..faa4eded4d80 100644 --- a/ports/servo/Cargo.toml +++ b/ports/servo/Cargo.toml @@ -45,7 +45,7 @@ crossbeam-channel = "0.2" euclid = "0.19" gleam = "0.6" glutin = "0.18" -keyboard-types = {version = "0.4.2-servo", features = ["serde"]} +keyboard-types = "0.4.3" lazy_static = "1" libservo = {path = "../../components/servo"} log = "0.4" diff --git a/tests/unit/script/Cargo.toml b/tests/unit/script/Cargo.toml index a59179ce3e5b..e772e776bc57 100644 --- a/tests/unit/script/Cargo.toml +++ b/tests/unit/script/Cargo.toml @@ -11,6 +11,6 @@ path = "lib.rs" [dependencies] euclid = "0.19" -keyboard-types = "0.4.2-servo" +keyboard-types = "0.4.3" script = {path = "../../../components/script"} servo_url = {path = "../../../components/url"}