aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/compositionevent.rs4
-rw-r--r--components/script/dom/document.rs32
-rwxr-xr-xcomponents/script/dom/htmlinputelement.rs18
-rwxr-xr-xcomponents/script/dom/htmltextareaelement.rs17
4 files changed, 71 insertions, 0 deletions
diff --git a/components/script/dom/compositionevent.rs b/components/script/dom/compositionevent.rs
index 1ba8a1bf40a..fe5ac7c2450 100644
--- a/components/script/dom/compositionevent.rs
+++ b/components/script/dom/compositionevent.rs
@@ -59,6 +59,10 @@ impl CompositionEvent {
);
Ok(event)
}
+
+ pub fn data(&self) -> &str {
+ &*self.data
+ }
}
impl CompositionEventMethods for CompositionEvent {
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs
index a18da3f112f..fdebc5e69b2 100644
--- a/components/script/dom/document.rs
+++ b/components/script/dom/document.rs
@@ -38,6 +38,7 @@ use crate::dom::bindings::xmlname::{
};
use crate::dom::closeevent::CloseEvent;
use crate::dom::comment::Comment;
+use crate::dom::compositionevent::CompositionEvent;
use crate::dom::cssstylesheet::CSSStyleSheet;
use crate::dom::customelementregistry::CustomElementDefinition;
use crate::dom::customevent::CustomEvent;
@@ -1465,6 +1466,37 @@ impl Document {
self.window.reflow(ReflowGoal::Full, ReflowReason::KeyEvent);
}
+ pub fn dispatch_composition_event(
+ &self,
+ composition_event: ::keyboard_types::CompositionEvent,
+ ) {
+ // spec: https://w3c.github.io/uievents/#compositionstart
+ // spec: https://w3c.github.io/uievents/#compositionupdate
+ // spec: https://w3c.github.io/uievents/#compositionend
+ // > Event.target : focused element processing the composition
+ let focused = self.get_focused_element();
+ let target = if let Some(elem) = &focused {
+ elem.upcast()
+ } else {
+ // Event is only dispatched if there is a focused element.
+ return;
+ };
+
+ let cancelable = composition_event.state == keyboard_types::CompositionState::Start;
+
+ let compositionevent = CompositionEvent::new(
+ &self.window,
+ DOMString::from(composition_event.state.to_string()),
+ true,
+ cancelable,
+ Some(&self.window),
+ 0,
+ DOMString::from(composition_event.data),
+ );
+ let event = compositionevent.upcast::<Event>();
+ event.fire(target);
+ }
+
// https://dom.spec.whatwg.org/#converting-nodes-into-a-node
pub fn node_from_nodes_and_strings(
&self,
diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs
index d7110183c4a..67473fce92d 100755
--- a/components/script/dom/htmlinputelement.rs
+++ b/components/script/dom/htmlinputelement.rs
@@ -17,6 +17,7 @@ use crate::dom::bindings::inheritance::Castable;
use crate::dom::bindings::reflector::DomObject;
use crate::dom::bindings::root::{Dom, DomRoot, LayoutDom, MutNullableDom, RootedReference};
use crate::dom::bindings::str::DOMString;
+use crate::dom::compositionevent::CompositionEvent;
use crate::dom::document::Document;
use crate::dom::element::{
AttributeMutation, Element, LayoutElementHelpers, RawLayoutElementHelpers,
@@ -1526,6 +1527,23 @@ impl VirtualMethods for HTMLInputElement {
&window,
);
}
+ } else if (event.type_() == atom!("compositionstart") ||
+ event.type_() == atom!("compositionupdate") ||
+ event.type_() == atom!("compositionend")) &&
+ self.input_type().is_textual_or_password()
+ {
+ // TODO: Update DOM on start and continue
+ // and generally do proper CompositionEvent handling.
+ if let Some(compositionevent) = event.downcast::<CompositionEvent>() {
+ if event.type_() == atom!("compositionend") {
+ let _ = self
+ .textinput
+ .borrow_mut()
+ .handle_compositionend(compositionevent);
+ self.upcast::<Node>().dirty(NodeDamage::OtherNodeDamage);
+ }
+ event.mark_as_handled();
+ }
}
}
}
diff --git a/components/script/dom/htmltextareaelement.rs b/components/script/dom/htmltextareaelement.rs
index cb4929f4cab..8e9a1e0b2c9 100755
--- a/components/script/dom/htmltextareaelement.rs
+++ b/components/script/dom/htmltextareaelement.rs
@@ -13,6 +13,7 @@ use crate::dom::bindings::error::ErrorResult;
use crate::dom::bindings::inheritance::Castable;
use crate::dom::bindings::root::{DomRoot, LayoutDom, MutNullableDom};
use crate::dom::bindings::str::DOMString;
+use crate::dom::compositionevent::CompositionEvent;
use crate::dom::document::Document;
use crate::dom::element::RawLayoutElementHelpers;
use crate::dom::element::{AttributeMutation, Element};
@@ -576,6 +577,22 @@ impl VirtualMethods for HTMLTextAreaElement {
&window,
);
}
+ } else if event.type_() == atom!("compositionstart") ||
+ event.type_() == atom!("compositionupdate") ||
+ event.type_() == atom!("compositionend")
+ {
+ // TODO: Update DOM on start and continue
+ // and generally do proper CompositionEvent handling.
+ if let Some(compositionevent) = event.downcast::<CompositionEvent>() {
+ if event.type_() == atom!("compositionend") {
+ let _ = self
+ .textinput
+ .borrow_mut()
+ .handle_compositionend(compositionevent);
+ self.upcast::<Node>().dirty(NodeDamage::OtherNodeDamage);
+ }
+ event.mark_as_handled();
+ }
}
}