Improve IME messaging to embedder with insertion point index and multiline flag.

This commit is contained in:
Philip Lamb 2021-03-29 17:55:54 +13:00
parent 0539043e35
commit b8a74e89cf
8 changed files with 57 additions and 15 deletions

View file

@ -197,7 +197,10 @@ pub enum EmbedderMsg {
/// Open interface to request permission specified by prompt.
PromptPermission(PermissionPrompt, IpcSender<PermissionRequest>),
/// Request to present an IME to the user when an editable element is focused.
ShowIME(InputMethodType, Option<String>, DeviceIntRect),
/// If the input is text, the second parameter defines the pre-existing string
/// text content and the zero-based index into the string locating the insertion point.
/// bool is true for multi-line and false otherwise.
ShowIME(InputMethodType, Option<(String, i32)>, bool, DeviceIntRect),
/// Request to hide the IME when the editable element is blurred.
HideIME,
/// Servo has shut down

View file

@ -1122,16 +1122,29 @@ impl Document {
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())
let (text, multiline) = if let Some(input) = elem.downcast::<HTMLInputElement>() {
(
Some((
(&input.Value()).to_string(),
input.GetSelectionEnd().unwrap_or(0) as i32,
)),
false,
)
} else if let Some(textarea) = elem.downcast::<HTMLTextAreaElement>() {
Some((&textarea.Value()).to_string())
(
Some((
(&textarea.Value()).to_string(),
textarea.GetSelectionEnd().unwrap_or(0) as i32,
)),
true,
)
} else {
None
(None, false)
};
self.send_to_embedder(EmbedderMsg::ShowIME(
kind,
text,
multiline,
DeviceIntRect::from_untyped(&rect),
));
}