diff options
author | Paul Rouget <me@paulrouget.com> | 2020-07-02 10:38:36 +0200 |
---|---|---|
committer | Paul Rouget <me@paulrouget.com> | 2020-07-02 10:57:34 +0200 |
commit | 34265c872e8be99bf09df432e5293a2baa8947a6 (patch) | |
tree | 60eaf6d95a9ba4397700812b1e42cfca94a117a0 /components/script/dom/document.rs | |
parent | 19b36bd7952630d2e4a749565c570d3cca217658 (diff) | |
download | servo-34265c872e8be99bf09df432e5293a2baa8947a6.tar.gz servo-34265c872e8be99bf09df432e5293a2baa8947a6.zip |
UWP: support virtual keyboard
Diffstat (limited to 'components/script/dom/document.rs')
-rw-r--r-- | components/script/dom/document.rs | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 09b802b20e5..d4968bd2871 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -15,6 +15,8 @@ use crate::dom::bindings::codegen::Bindings::DocumentBinding::{ }; use crate::dom::bindings::codegen::Bindings::EventBinding::EventBinding::EventMethods; use crate::dom::bindings::codegen::Bindings::HTMLIFrameElementBinding::HTMLIFrameElementBinding::HTMLIFrameElementMethods; +use crate::dom::bindings::codegen::Bindings::HTMLInputElementBinding::HTMLInputElementMethods; +use crate::dom::bindings::codegen::Bindings::HTMLTextAreaElementBinding::HTMLTextAreaElementMethods; use crate::dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; use crate::dom::bindings::codegen::Bindings::NodeFilterBinding::NodeFilter; use crate::dom::bindings::codegen::Bindings::PerformanceBinding::PerformanceMethods; @@ -67,7 +69,9 @@ use crate::dom::htmlheadelement::HTMLHeadElement; use crate::dom::htmlhtmlelement::HTMLHtmlElement; use crate::dom::htmliframeelement::HTMLIFrameElement; use crate::dom::htmlimageelement::HTMLImageElement; +use crate::dom::htmlinputelement::HTMLInputElement; use crate::dom::htmlscriptelement::{HTMLScriptElement, ScriptResult}; +use crate::dom::htmltextareaelement::HTMLTextAreaElement; use crate::dom::htmltitleelement::HTMLTitleElement; use crate::dom::keyboardevent::KeyboardEvent; use crate::dom::location::Location; @@ -113,7 +117,7 @@ use devtools_traits::ScriptToDevtoolsControlMsg; use dom_struct::dom_struct; use embedder_traits::EmbedderMsg; use encoding_rs::{Encoding, UTF_8}; -use euclid::default::Point2D; +use euclid::default::{Point2D, Rect, Size2D}; use html5ever::{LocalName, Namespace, QualName}; use hyper_serde::Serde; use ipc_channel::ipc::{self, IpcSender}; @@ -168,6 +172,7 @@ use style::stylesheet_set::DocumentStylesheetSet; use style::stylesheets::{Origin, OriginSet, Stylesheet}; use url::Host; use uuid::Uuid; +use webrender_api::units::DeviceIntRect; /// The number of times we are allowed to see spurious `requestAnimationFrame()` calls before /// falling back to fake ones. @@ -1105,7 +1110,23 @@ impl Document { // Notify the embedder to display an input method. if let Some(kind) = elem.input_method_type() { - self.send_to_embedder(EmbedderMsg::ShowIME(kind)); + let rect = elem.upcast::<Node>().bounding_content_box_or_zero(); + let rect = Rect::new( + Point2D::new(rect.origin.x.to_px(), rect.origin.y.to_px()), + Size2D::new(rect.size.width.to_px(), rect.size.height.to_px()), + ); + let text = if let Some(input) = elem.downcast::<HTMLInputElement>() { + Some((&input.Value()).to_string()) + } else if let Some(textarea) = elem.downcast::<HTMLTextAreaElement>() { + Some((&textarea.Value()).to_string()) + } else { + None + }; + self.send_to_embedder(EmbedderMsg::ShowIME( + kind, + text, + DeviceIntRect::from_untyped(&rect), + )); } } } |